--- rpl/src/instructions_c8.c 2018/05/30 09:27:34 1.29 +++ rpl/src/instructions_c8.c 2025/04/15 10:17:52 1.41 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.29 - Copyright (C) 1989-2018 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. @@ -59,6 +59,7 @@ instruction_cipher(struct_processus *s_e struct_objet *s_objet_argument_1; struct_objet *s_objet_argument_2; + struct_objet *s_objet_padding; struct_objet *s_objet_resultat_1; struct_objet *s_objet_resultat_2; @@ -73,6 +74,7 @@ instruction_cipher(struct_processus *s_e unsigned char *iv_binaire; unsigned char *message; unsigned char *message_chiffre; + unsigned char padding; unsigned char *tampon; if ((*s_etat_processus).affichage_arguments == 'Y') @@ -94,10 +96,11 @@ instruction_cipher(struct_processus *s_e printf("-> 1: { \"cipher type\" \"generated key\" \"iv\" }\n\n"); printf(" 2: \"text\"\n", d_CHN); - printf(" 1: { \"direction\" \"cipher type\" \"key\" \"iv\" }\n"); + printf(" 1: { \"direction\" \"cipher type\" \"key\" \"iv\" " + "padding }\n"); printf("-> 2: \"encrypted or decrypted text\"\n", d_CHN); printf(" 1: { \"direction\" \"cipher type\" \"key\" " - "\"updated iv\" }\n\n", d_LST); + "\"updated iv\" padding }\n\n", d_LST); if ((*s_etat_processus).langue == 'F') { @@ -280,9 +283,9 @@ instruction_cipher(struct_processus *s_e printf(" \"password\" { \"KEY\" \"DES-EDE-OFB\" \"SHA1\" " "# 0h 3 } CIPHER\n"); printf(" \"text\" { \"ENCRYPT\" \"AES-128-CBC\" \"key\" " - "\"iv\" } CIPHER\n"); + "\"iv\" \"PADDING\" } CIPHER\n"); printf(" \"text\" { \"DECRYPT\" \"AES-128-EBC\" \"key\" " - "\"iv\" } CIPHER\n"); + "\"iv\" \"NO PADDING\" } CIPHER\n"); return; } else if ((*s_etat_processus).test_instruction == 'Y') @@ -352,6 +355,7 @@ instruction_cipher(struct_processus *s_e free(instruction); + s_objet_padding = NULL; l_element_courant = (*l_element_courant).suivant; if (l_element_courant == NULL) @@ -922,6 +926,55 @@ instruction_cipher(struct_processus *s_e iv = (unsigned char *) (*(*l_element_courant).donnee).objet; + // On attend le drapeau concernant le padding. + + if ((l_element_courant = (*l_element_courant).suivant) == NULL) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + (*s_etat_processus).erreur_execution = + d_ex_manque_argument; + return; + } + + if ((*(*l_element_courant).donnee).type != CHN) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_type_argument; + return; + } + + tampon = conversion_majuscule(s_etat_processus, + (unsigned char *) (*(*l_element_courant).donnee).objet); + + if (strcmp(tampon, "PADDING") == 0) + { + padding = 'Y'; + } + else if (strcmp(tampon, "NO PADDING") == 0) + { + padding = 'N'; + } + else + { + free(tampon); + + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + (*s_etat_processus).erreur_execution = d_ex_argument_invalide; + return; + } + + free(tampon); + + s_objet_padding = copie_objet(s_etat_processus, + (*l_element_courant).donnee, 'P'); + if ((*l_element_courant).suivant != NULL) { liberation(s_etat_processus, s_objet_argument_1); @@ -1513,7 +1566,7 @@ instruction_cipher(struct_processus *s_e if ((message_chiffre = chiffrement(s_etat_processus, EVP_chiffrement, encodage, message, longueur_message, clef_binaire, longueur_clef_binaire, - iv_binaire, &longueur_message_chiffre)) == NULL) + iv_binaire, &longueur_message_chiffre, padding)) == NULL) { free(clef_binaire); free(iv_binaire); @@ -1640,7 +1693,6 @@ instruction_cipher(struct_processus *s_e } l_element_courant = (*l_element_courant).suivant; - (*l_element_courant).suivant = NULL; if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN)) == NULL) @@ -1657,6 +1709,19 @@ instruction_cipher(struct_processus *s_e free(iv_binaire); + // Padding + + if (((*l_element_courant).suivant = allocation_maillon( + s_etat_processus)) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + l_element_courant = (*l_element_courant).suivant; + (*l_element_courant).donnee = s_objet_padding; + (*l_element_courant).suivant = NULL; + liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2);