--- rpl/src/chiffrement.c 2013/12/03 09:36:10 1.13 +++ rpl/src/chiffrement.c 2025/04/15 10:17:49 1.45 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.17 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.36 + Copyright (C) 1989-2025 Dr. BERTRAND Joël This file is part of RPL/2. @@ -36,54 +36,93 @@ */ unsigned char * -chiffrement(const EVP_CIPHER *type_chiffrement, logical1 encodage, +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) + integer8 *longueur_message_chiffre, + unsigned char padding) { - int i; int longueur_bloc_de_chiffrement; int longueur_message_1; int longueur_message_2; + integer8 nombre_blocs; + unsigned char *message_chiffre; - EVP_CIPHER_CTX contexte; + EVP_CIPHER_CTX *contexte; + + if ((contexte = EVP_CIPHER_CTX_new()) == NULL) + { + return(NULL); + } - EVP_CIPHER_CTX_init(&contexte); + EVP_CIPHER_CTX_reset(contexte); longueur_bloc_de_chiffrement = EVP_CIPHER_block_size(type_chiffrement); - if (EVP_CipherInit_ex(&contexte, type_chiffrement, NULL, clef, + if (EVP_CipherInit_ex(contexte, type_chiffrement, NULL, clef, vecteur_initialisation, (encodage == d_vrai) ? 1 : 0) != 1) { - EVP_CIPHER_CTX_cleanup(&contexte); + EVP_CIPHER_CTX_free(contexte); return(NULL); } - (*longueur_message_chiffre) = ((longueur_message / - longueur_bloc_de_chiffrement) + 1) * longueur_bloc_de_chiffrement; + nombre_blocs = longueur_message / longueur_bloc_de_chiffrement; - if ((message_chiffre = malloc(((size_t) (*longueur_message_chiffre)) * - sizeof(unsigned char))) == NULL) + if ((longueur_message % longueur_bloc_de_chiffrement) != 0) { - return(NULL); + nombre_blocs++; + } + else if (padding == 'N') + { + // Pas de padding si la longueur du message est un multiple + // entier de la longueur du bloc. + + EVP_CIPHER_CTX_set_padding(contexte, 0); } - if (EVP_CipherUpdate(&contexte, message_chiffre, &longueur_message_1, + (*longueur_message_chiffre) = nombre_blocs * longueur_bloc_de_chiffrement; + + if (padding == 'Y') + { + // On prévoit une zone de garde pour EVP_CipherFinal_ex() qui rajoute + // TOUJOURS un bloc complet même s'il la taille chiffrée par + // EVP_CipherUpdate() est un nombre exact de blocs ! + + if ((message_chiffre = malloc(((size_t) ((*longueur_message_chiffre) + + longueur_bloc_de_chiffrement)) * + sizeof(unsigned char))) == NULL) + { + EVP_CIPHER_CTX_free(contexte); + return(NULL); + } + } + else + { + if ((message_chiffre = malloc(((size_t) (*longueur_message_chiffre) + ) * sizeof(unsigned char))) == NULL) + { + EVP_CIPHER_CTX_free(contexte); + return(NULL); + } + } + + if (EVP_CipherUpdate(contexte, message_chiffre, &longueur_message_1, message, (int) longueur_message) != 1) { free(message_chiffre); - EVP_CIPHER_CTX_cleanup(&contexte); + EVP_CIPHER_CTX_free(contexte); return(NULL); } - if (EVP_CipherFinal_ex(&contexte, message_chiffre + longueur_message_1, + if (EVP_CipherFinal_ex(contexte, message_chiffre + longueur_message_1, &longueur_message_2) != 1) { free(message_chiffre); - EVP_CIPHER_CTX_cleanup(&contexte); + EVP_CIPHER_CTX_free(contexte); return(NULL); } @@ -91,12 +130,10 @@ chiffrement(const EVP_CIPHER *type_chiff // 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_get_updated_iv(contexte, vecteur_initialisation, + (size_t) EVP_CIPHER_iv_length(type_chiffrement)); - EVP_CIPHER_CTX_cleanup(&contexte); + EVP_CIPHER_CTX_free(contexte); return(message_chiffre); }