--- rpl/src/chiffrement.c 2010/04/01 14:00:46 1.3 +++ rpl/src/chiffrement.c 2013/02/25 19:14:01 1.4 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.13 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.12 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,23 +20,75 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* ================================================================================ - Calcul des sommes de contrôle avant le lancement d'un exécutable - de la famille RPL/2 (rpliconv, rplconvert, rplfile et rplpp). + Fonction de chiffrement d'un séquence d'octets ================================================================================ - Entrée : - - chaîne de caractères sur le fichier à contrôler - - chaîne de caractères contenant la somme à contrôler - - type de somme de contrôle + Entrées : pointeur sur une structure -------------------------------------------------------------------------------- - Sortie : drapeau + Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ +unsigned char * +chiffrement(const EVP_CIPHER *type_chiffrement, logical1 encodage, + unsigned char *message, unsigned int longueur_message, + unsigned char *clef, unsigned int longueur_clef, + unsigned char *vecteur_initialisation, + unsigned int longueur_vecteur_initialisation, + unsigned int longueur_bloc_de_chiffrement, + unsigned int *longueur_message_chiffre) +{ + int longueur_message_1; + int longueur_message_2; + + unsigned char *message_chiffre; + + EVP_CIPHER_CTX contexte; + + EVP_CIPHER_CTX_init(&contexte); + + if (EVP_CipherInit_ex(&contexte, type_chiffrement, NULL, clef, + vecteur_initialisation, (encodage == d_vrai) ? 1 : 0) != 1) + { + EVP_CIPHER_CTX_cleanup(&contexte); + return(NULL); + } + + (*longueur_message_chiffre) = ((longueur_message / + longueur_bloc_de_chiffrement) + 1) * longueur_bloc_de_chiffrement; + + if ((message_chiffre = malloc((*longueur_message_chiffre) * + sizeof(unsigned char))) == NULL) + { + return(NULL); + } + + if (EVP_CipherUpdate(&contexte, message_chiffre, &longueur_message_1, + message, longueur_message) != 1) + { + free(message_chiffre); + EVP_CIPHER_CTX_cleanup(&contexte); + return(NULL); + } + + if (EVP_CipherFinal_ex(&contexte, message_chiffre + longueur_message_1, + &longueur_message_2) != 1) + { + free(message_chiffre); + EVP_CIPHER_CTX_cleanup(&contexte); + return(NULL); + } + + (*longueur_message_chiffre) = longueur_message_1 + longueur_message_2; + EVP_CIPHER_CTX_cleanup(&contexte); + + return(message_chiffre); +} + // vim: ts=4