Programmation c

Messages postés
8
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
17 juin 2003
-
Messages postés
340
Date d'inscription
vendredi 11 octobre 2002
Statut
Membre
Dernière intervention
14 février 2005
-
Je travaille sous linux, avec la programmation c.
Voilà, j'ai un programme de signature numérique qui entre un fichier en lecture afin de le signer. Mais, j'ai remarqué que même si je fais entrer un fichier vide j'ai comme même la signature, sinon si je fais un mv fichier_initiale fichier_nouveau pour changer son contenu celà engendre un problème au niveau du terminal (bash ilisible).
Ici le code :
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <string.h>
int main ()
{
int err;
int sig_len;
unsigned char sig_buf [4096];
static char certfile[] = "cert.pem";
static char keyfile[] = "key.pem";
static char fichierfile[] = "ter" ;
EVP_MD_CTX md_ctx;
EVP_PKEY * pkey;
FILE * fp;
X509 * x509;
char szBuffer[1024];
unsigned int n;
/* Just load the crypto library error strings,
* SSL_load_error_strings() loads the crypto AND the SSL ones */
/* SSL_load_error_strings();*/
ERR_load_crypto_strings();
/* Read private key */
fp = fopen (keyfile, "r");
if (fp == NULL) exit (1);
pkey = PEM_read_PrivateKey(fp, NULL, 0, NULL);
fclose (fp);
if (pkey == NULL) {
ERR_print_errors_fp (stderr);
exit (1); }
/* Do the signature */
if((fp = fopen(fichierfile, "r")) != NULL) /*on ouvre le fichier et verifie si on y arrive*/
{ while (!feof(fp)) {
fread(&szBuffer, sizeof(szBuffer),1, fp); /*on range les caractere dans le buffer */
if(szBuffer == '\0') //si c'est la fin de la ligne
printf("\n"); //on "affiche" un saut de ligne
printf("%s",szBuffer); /*on affiche ce que contient le buffer */ } }
EVP_SignInit (&md_ctx, EVP_sha1());
n = strlen(szBuffer) ;
printf("la valeur de n: %u \n ", n);
EVP_SignUpdate (&md_ctx, szBuffer, n);
sig_len = sizeof(sig_buf);
err = EVP_SignFinal (&md_ctx, sig_buf, &sig_len, pkey);
fclose(fp);
printf("la signature est: %s \n ", sig_buf);
if (err != 1) {
ERR_print_errors_fp(stderr);
exit (1); }
EVP_PKEY_free (pkey);
/* Read public key */
fp = fopen (certfile, "r");
if (fp == NULL) exit (1);
x509 = PEM_read_X509(fp, NULL, 0, NULL);
fclose (fp);
if (x509 == NULL) {
ERR_print_errors_fp (stderr);
exit (1); }
/* Get public key - eay */
pkey=X509_get_pubkey(x509);
if (pkey == NULL) {
ERR_print_errors_fp (stderr);
exit (1); }
/* Verify the signature */
if((fp = fopen(fichierfile, "r")) != NULL) /*on ouvre le fichier et verifie si on y arrive*/
{ while (!feof(fp))
fread(&szBuffer, sizeof(szBuffer),1, fp);
EVP_VerifyInit (&md_ctx, EVP_sha1());
n = strlen(szBuffer) ;
printf("la valeur de n: %u \n ", n);
EVP_VerifyUpdate (&md_ctx,szBuffer,n );
} fclose (fp);
err = EVP_VerifyFinal (&md_ctx, sig_buf, sig_len, pkey);
EVP_PKEY_free (pkey);
if (err != 1) {
ERR_print_errors_fp (stderr);
exit (1); }
printf("la vérification donne : %s \n ", sig_buf);
printf("la valeur finale de sig_buf : %s \n ", sig_buf);
printf ("Signature Verified Ok. \n");
printf ("la valeur de err : %d \n ", err);
return(0); }
Voilà, si quelqu'un peut m'aider, vraiment c'est très important et urgent :( Merci.

1 réponse

Messages postés
340
Date d'inscription
vendredi 11 octobre 2002
Statut
Membre
Dernière intervention
14 février 2005

Ici c'est pour VB, et pis en plus, j'y connais rien au C !!!

:-p Bricomix :-p