--- rpl/src/chiffrement.c 2010/03/07 17:03:29 1.1 +++ rpl/src/chiffrement.c 2015/02/19 11:01:18 1.20 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.12 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.21 + Copyright (C) 1989-2015 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,23 +20,86 @@ */ -#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(struct_processus *s_etat_processus, + const EVP_CIPHER *type_chiffrement, logical1 encodage, + unsigned char *message, integer8 longueur_message, + unsigned char *clef, integer8 longueur_clef, + unsigned char *vecteur_initialisation, + integer8 *longueur_message_chiffre) +{ + int i; + int longueur_bloc_de_chiffrement; + int longueur_message_1; + int longueur_message_2; + + unsigned char *message_chiffre; + + EVP_CIPHER_CTX contexte; + + EVP_CIPHER_CTX_init(&contexte); + + longueur_bloc_de_chiffrement = EVP_CIPHER_block_size(type_chiffrement); + + 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(((size_t) (*longueur_message_chiffre)) * + sizeof(unsigned char))) == NULL) + { + return(NULL); + } + + if (EVP_CipherUpdate(&contexte, message_chiffre, &longueur_message_1, + message, (int) 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; + + // Mise à jour du vecteur d'initialisation + + for(i = 0; i < EVP_CIPHER_iv_length(type_chiffrement); i++) + { + vecteur_initialisation[i] = contexte.iv[i]; + } + + EVP_CIPHER_CTX_cleanup(&contexte); + + return(message_chiffre); +} + // vim: ts=4