File:  [local] / rpl / src / instructions_c8.c
Revision 1.41: download - view: text, annotated - select for diffs - revision graph
Tue Apr 15 10:17:52 2025 UTC (2 weeks, 4 days ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Mise à jour du copyright.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.36
    4:   Copyright (C) 1989-2025 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'cipher'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_cipher(struct_processus *s_etat_processus)
   40: {
   41:     const EVP_CIPHER                *EVP_chiffrement;
   42:     const EVP_MD                    *EVP_sum;
   43: 
   44:     int                             longueur_clef;
   45: 
   46:     integer8                        longueur_clef_binaire;
   47:     integer8                        longueur_iv_binaire;
   48:     integer8                        longueur_message;
   49:     integer8                        longueur_message_chiffre;
   50:     integer8                        nombre_cycles;
   51: 
   52:     logical1                        encodage;
   53:     logical1                        generation_clef;
   54:     logical1                        somme_invalide;
   55: 
   56:     logical8                        sel;
   57: 
   58:     struct_liste_chainee            *l_element_courant;
   59: 
   60:     struct_objet                    *s_objet_argument_1;
   61:     struct_objet                    *s_objet_argument_2;
   62:     struct_objet                    *s_objet_padding;
   63:     struct_objet                    *s_objet_resultat_1;
   64:     struct_objet                    *s_objet_resultat_2;
   65: 
   66:     unsigned char                   *algorithme_chiffrement;
   67:     unsigned char                   *clef;
   68:     unsigned char                   *clef_binaire;
   69:     unsigned char                   *controle;
   70:     unsigned char                   *direction;
   71:     unsigned char                   *fonction;
   72:     unsigned char                   *instruction;
   73:     unsigned char                   *iv;
   74:     unsigned char                   *iv_binaire;
   75:     unsigned char                   *message;
   76:     unsigned char                   *message_chiffre;
   77:     unsigned char                   padding;
   78:     unsigned char                   *tampon;
   79: 
   80:     if ((*s_etat_processus).affichage_arguments == 'Y')
   81:     {
   82:         printf("\n  CIPHER ");
   83: 
   84:         if ((*s_etat_processus).langue == 'F')
   85:         {
   86:             printf("(opérations de chiffrement)\n\n");
   87:         }
   88:         else
   89:         {
   90:             printf("(cryptographic operations)\n\n");
   91:         }
   92: 
   93:         printf("    2: \"password\"\n", d_CHN);
   94:         printf("    1: { \"KEY\" \"cipher type\" \"digest type\" "
   95:                 "salt nround }\n");
   96:         printf("->  1: { \"cipher type\" \"generated key\" \"iv\" }\n\n");
   97: 
   98:         printf("    2: \"text\"\n", d_CHN);
   99:         printf("    1: { \"direction\" \"cipher type\" \"key\" \"iv\" "
  100:                 "padding }\n");
  101:         printf("->  2: \"encrypted or decrypted text\"\n", d_CHN);
  102:         printf("    1: { \"direction\" \"cipher type\" \"key\" "
  103:                 "\"updated iv\" padding }\n\n", d_LST);
  104: 
  105:         if ((*s_etat_processus).langue == 'F')
  106:         {
  107:             printf("  Algorithmes de chiffrement :\n\n");
  108:         }
  109:         else
  110:         {
  111:             printf("  Chipher algorithms:\n\n");
  112:         }
  113: 
  114: #       ifndef OPENSSL_NO_AES
  115:         printf("    - AES-128-CBC\n");
  116:         printf("    - AES-128-CCM\n");
  117:         printf("    - AES-128-CFB1\n");
  118:         printf("    - AES-128-CFB8\n");
  119:         printf("    - AES-128-CFB128\n");
  120:         printf("    - AES-128-CTR\n");
  121:         printf("    - AES-128-ECB\n");
  122:         printf("    - AES-128-GCM\n");
  123:         printf("    - AES-128-OFB\n");
  124:         printf("    - AES-128-XTS\n");
  125:         printf("    - AES-192-CBC\n");
  126:         printf("    - AES-192-CCM\n");
  127:         printf("    - AES-192-CFB1\n");
  128:         printf("    - AES-192-CFB8\n");
  129:         printf("    - AES-192-CFB128\n");
  130:         printf("    - AES-192-CTR\n");
  131:         printf("    - AES-192-ECB\n");
  132:         printf("    - AES-192-GCM\n");
  133:         printf("    - AES-192-OFB\n");
  134:         printf("    - AES-256-CBC\n");
  135:         printf("    - AES-256-CCM\n");
  136:         printf("    - AES-256-CFB1\n");
  137:         printf("    - AES-256-CFB8\n");
  138:         printf("    - AES-256-CFB128\n");
  139:         printf("    - AES-256-CTR\n");
  140:         printf("    - AES-256-ECB\n");
  141:         printf("    - AES-256-GCM\n");
  142:         printf("    - AES-256-OFB\n");
  143:         printf("    - AES-256-XTS\n");
  144: #       endif
  145: 
  146: #       ifndef OPENSSL_NO_BF
  147:         printf("    - BF-CBC\n");
  148:         printf("    - BF-CFB64\n");
  149:         printf("    - BF-ECB\n");
  150:         printf("    - BF-OFB\n");
  151: #       endif
  152: 
  153: #       ifndef OPENSSL_NO_CAMELLIA
  154:         printf("    - CAMELLIA-128-CBC\n");
  155:         printf("    - CAMELLIA-128-CFB1\n");
  156:         printf("    - CAMELLIA-128-CFB8\n");
  157:         printf("    - CAMELLIA-128-CFB128\n");
  158:         printf("    - CAMELLIA-128-ECB\n");
  159:         printf("    - CAMELLIA-128-OFB\n");
  160:         printf("    - CAMELLIA-192-CBC\n");
  161:         printf("    - CAMELLIA-192-CFB1\n");
  162:         printf("    - CAMELLIA-192-CFB8\n");
  163:         printf("    - CAMELLIA-192-CFB128\n");
  164:         printf("    - CAMELLIA-192-ECB\n");
  165:         printf("    - CAMELLIA-192-OFB\n");
  166:         printf("    - CAMELLIA-256-CBC\n");
  167:         printf("    - CAMELLIA-256-CFB1\n");
  168:         printf("    - CAMELLIA-256-CFB8\n");
  169:         printf("    - CAMELLIA-256-CFB128\n");
  170:         printf("    - CAMELLIA-256-ECB\n");
  171:         printf("    - CAMELLIA-256-OFB\n");
  172: #       endif
  173: 
  174: #       ifndef OPENSSL_NO_CAST
  175:         printf("    - CAST5-CBC\n");
  176:         printf("    - CAST5-ECB\n");
  177:         printf("    - CAST5-CFB64\n");
  178:         printf("    - CAST5-OFB\n");
  179: #       endif
  180: 
  181: #       ifndef OPENSSL_NO_DES
  182:         printf("    - DES-CBC\n");
  183:         printf("    - DES-CFB1\n");
  184:         printf("    - DES-CFB8\n");
  185:         printf("    - DES-CFB64\n");
  186:         printf("    - DES-ECB\n");
  187:         printf("    - DES-EDE\n");
  188:         printf("    - DES-EDE-CBC\n");
  189:         printf("    - DES-EDE-CFB1\n");
  190:         printf("    - DES-EDE-CFB8\n");
  191:         printf("    - DES-EDE-CFB64\n");
  192:         printf("    - DES-EDE-ECB\n");
  193:         printf("    - DES-EDE-OFB\n");
  194:         printf("    - DES-EDE3\n");
  195:         printf("    - DES-EDE3-CBC\n");
  196:         printf("    - DES-EDE3-ECB\n");
  197:         printf("    - DES-EDE3-OFB\n");
  198:         printf("    - DES-OFB\n");
  199:         printf("    - DESX-CBC\n");
  200: #       endif
  201: 
  202: #       ifndef OPENSSL_NO_IDEA
  203:         printf("    - IDEA-CBC\n");
  204:         printf("    - IDEA-CFB64\n");
  205:         printf("    - IDEA-ECB\n");
  206:         printf("    - IDEA-OFB\n");
  207: #       endif
  208: 
  209: #       ifndef OPENSSL_NO_RC2
  210:         printf("    - RC2-CBC\n");
  211:         printf("    - RC2-CFB64\n");
  212:         printf("    - RC2-ECB\n");
  213:         printf("    - RC2-OFB\n");
  214:         printf("    - RC2-40-CBC\n");
  215:         printf("    - RC2-64-CBC\n");
  216: #       endif
  217: 
  218: #       ifndef OPENSSL_NO_RC4
  219:         printf("    - RC4\n");
  220:         printf("    - RC4-40\n");
  221: #       endif
  222: 
  223: #       ifndef OPENSSL_NO_RC5
  224:         printf("    - RC5-32-12-16-CBC\n");
  225:         printf("    - RC5-32-12-16-CFB64\n");
  226:         printf("    - RC5-32-12-16-ECB\n");
  227:         printf("    - RC5-32-12-16-OFB\n");
  228: #       endif
  229: 
  230: #       ifndef OPENSSL_NO_SEED
  231:         printf("    - SEED-CBC\n");
  232:         printf("    - SEED-CFB128\n");
  233:         printf("    - SEED-ECB\n");
  234:         printf("    - SEED-OFB\n");
  235: #       endif
  236: 
  237:         printf("\n");
  238: 
  239:         if ((*s_etat_processus).langue == 'F')
  240:         {
  241:             printf("  Algorithmes de signature :\n\n");
  242:         }
  243:         else
  244:         {
  245:             printf("  Digest algorithms:\n\n");
  246:         }
  247: 
  248: #       ifndef OPENSSL_NO_MD2
  249:         printf("    - MD2\n");
  250: #       endif
  251: #       ifndef OPENSSL_NO_MD4
  252:         printf("    - MD4\n");
  253: #       endif
  254: #       ifndef OPENSSL_NO_MD5
  255:         printf("    - MD5\n");
  256: #       endif
  257: #       ifndef OPENSSL_NO_MDC2
  258:         printf("    - MDC2\n");
  259: #       endif
  260: #       ifndef OPENSSL_NO_RIPEMD
  261:         printf("    - RIPEMD160\n");
  262: #       endif
  263:         printf("    - SHA1\n");
  264:         printf("    - SHA224\n");
  265:         printf("    - SHA256\n");
  266:         printf("    - SHA384\n");
  267:         printf("    - SHA512\n");
  268: #       ifndef OPENSSL_NO_WHIRLPOOL
  269:         printf("    - WHIRLPOOL\n");
  270: #       endif
  271: 
  272:         printf("\n");
  273: 
  274:         if ((*s_etat_processus).langue == 'F')
  275:         {
  276:             printf("  Utilisation :\n\n");
  277:         }
  278:         else
  279:         {
  280:             printf("  Usage:\n\n");
  281:         }
  282: 
  283:         printf("    \"password\" { \"KEY\" \"DES-EDE-OFB\" \"SHA1\" "
  284:                 "# 0h 3 } CIPHER\n");
  285:         printf("    \"text\" { \"ENCRYPT\" \"AES-128-CBC\" \"key\" "
  286:                 "\"iv\" \"PADDING\" } CIPHER\n");
  287:         printf("    \"text\" { \"DECRYPT\" \"AES-128-EBC\" \"key\" "
  288:                 "\"iv\" \"NO PADDING\" } CIPHER\n");
  289:         return;
  290:     }
  291:     else if ((*s_etat_processus).test_instruction == 'Y')
  292:     {
  293:         (*s_etat_processus).nombre_arguments = -1;
  294:         return;
  295:     }
  296: 
  297:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  298:     {
  299:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  300:         {
  301:             return;
  302:         }
  303:     }
  304: 
  305:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  306:             &s_objet_argument_1) == d_erreur)
  307:     {
  308:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  309:         return;
  310:     }
  311: 
  312:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  313:             &s_objet_argument_2) == d_erreur)
  314:     {
  315:         liberation(s_etat_processus, s_objet_argument_1);
  316: 
  317:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  318:         return;
  319:     }
  320: 
  321:     if (((*s_objet_argument_1).type == LST) &&
  322:             ((*s_objet_argument_2).type == CHN))
  323:     {
  324:         l_element_courant = (*s_objet_argument_1).objet;
  325: 
  326:         if (l_element_courant == NULL)
  327:         {
  328:             liberation(s_etat_processus, s_objet_argument_1);
  329:             liberation(s_etat_processus, s_objet_argument_2);
  330: 
  331:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide; 
  332:             return;
  333:         }
  334: 
  335:         if ((*(*l_element_courant).donnee).type != CHN)
  336:         {
  337:             liberation(s_etat_processus, s_objet_argument_1);
  338:             liberation(s_etat_processus, s_objet_argument_2);
  339: 
  340:             (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  341:             return;
  342:         }
  343: 
  344:         if ((instruction = conversion_majuscule(s_etat_processus,
  345:                 (unsigned char *) (*(*l_element_courant).donnee).objet))
  346:                 == NULL)
  347:         {
  348:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  349:             return;
  350:         }
  351: 
  352:         if (strcmp(instruction, "KEY") == 0)
  353:         {
  354:             // Dérivation d'une clef
  355: 
  356:             free(instruction);
  357: 
  358:             s_objet_padding = NULL;
  359:             l_element_courant = (*l_element_courant).suivant;
  360: 
  361:             if (l_element_courant == NULL)
  362:             {
  363:                 liberation(s_etat_processus, s_objet_argument_1);
  364:                 liberation(s_etat_processus, s_objet_argument_2);
  365: 
  366:                 (*s_etat_processus).erreur_execution = d_ex_manque_argument; 
  367:                 return;
  368:             }
  369: 
  370:             // On attend l'algorithme de chiffrement.
  371: 
  372:             if ((*(*l_element_courant).donnee).type != CHN)
  373:             {
  374:                 liberation(s_etat_processus, s_objet_argument_1);
  375:                 liberation(s_etat_processus, s_objet_argument_2);
  376: 
  377:                 (*s_etat_processus).erreur_execution =
  378:                         d_ex_erreur_type_argument;
  379:                 return;
  380:             }
  381: 
  382:             algorithme_chiffrement = (unsigned char *) (*(*l_element_courant)
  383:                     .donnee).objet;
  384: 
  385:             if ((l_element_courant = (*l_element_courant).suivant) == NULL)
  386:             {
  387:                 liberation(s_etat_processus, s_objet_argument_1);
  388:                 liberation(s_etat_processus, s_objet_argument_2);
  389: 
  390:                 (*s_etat_processus).erreur_execution = d_ex_manque_argument; 
  391:                 return;
  392:             }   
  393: 
  394:             // On attend la somme de contrôle.
  395: 
  396:             if ((*(*l_element_courant).donnee).type != CHN)
  397:             {
  398:                 liberation(s_etat_processus, s_objet_argument_1);
  399:                 liberation(s_etat_processus, s_objet_argument_2);
  400: 
  401:                 (*s_etat_processus).erreur_execution =
  402:                         d_ex_erreur_type_argument;
  403:                 return;
  404:             }
  405: 
  406:             controle = (unsigned char *) (*(*l_element_courant).donnee).objet;
  407: 
  408:             // Test de la validité de la somme de contrôle.
  409: 
  410:             if ((fonction = conversion_majuscule(s_etat_processus, controle))
  411:                     == NULL)
  412:             {
  413:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  414:                 return;
  415:             }
  416: 
  417:             somme_invalide = d_faux;
  418: 
  419:             switch(fonction[0])
  420:             {
  421:                 case 'M':
  422:                 {
  423:                     switch(fonction[1])
  424:                     {
  425:                         case 'D': // md
  426:                         {
  427:                             switch(fonction[2])
  428:                             {
  429: #                               ifndef OPENSSL_NO_MD2
  430:                                 case '2': // md2
  431:                                 {
  432:                                     if (fonction[3] == d_code_fin_chaine)
  433:                                     {
  434:                                         EVP_sum = EVP_md2();
  435:                                     }
  436:                                     else
  437:                                     {
  438:                                         somme_invalide = d_vrai;
  439:                                     }
  440: 
  441:                                     break;
  442:                                 }
  443: #                               endif
  444: 
  445: #                               ifndef OPENSSL_NO_MD4
  446:                                 case '4': // md4
  447:                                 {
  448:                                     if (fonction[3] == d_code_fin_chaine)
  449:                                     {
  450:                                         EVP_sum = EVP_md4();
  451:                                     }
  452:                                     else
  453:                                     {
  454:                                         somme_invalide = d_vrai;
  455:                                     }
  456: 
  457:                                     break;
  458:                                 }
  459: #                               endif
  460: 
  461: #                               ifndef OPENSSL_NO_MD5
  462:                                 case '5': // md5
  463:                                 {
  464:                                     if (fonction[3] == d_code_fin_chaine)
  465:                                     {
  466:                                         EVP_sum = EVP_md5();
  467:                                     }
  468:                                     else
  469:                                     {
  470:                                         somme_invalide = d_vrai;
  471:                                     }
  472: 
  473:                                     break;
  474:                                 }
  475: #                               endif
  476: 
  477:                                 case 'C': // mdc
  478:                                 {
  479:                                     switch(fonction[3])
  480:                                     {
  481: #                                       ifndef OPENSSL_NO_MDC2
  482:                                         case '2': // mdc2
  483:                                         {
  484:                                             if (fonction[4] ==
  485:                                                     d_code_fin_chaine)
  486:                                             {
  487:                                                 EVP_sum = EVP_mdc2();
  488:                                             }
  489:                                             else
  490:                                             {
  491:                                                 somme_invalide = d_vrai;
  492:                                             }
  493: 
  494:                                             break;
  495:                                         }
  496: #                                       endif
  497: 
  498:                                         default:
  499:                                         {
  500:                                             somme_invalide = d_vrai;
  501:                                             break;
  502:                                         }
  503:                                     }
  504: 
  505:                                     break;
  506:                                 }
  507: 
  508:                                 default:
  509:                                 {
  510:                                     somme_invalide = d_vrai;
  511:                                     break;
  512:                                 }
  513:                             }
  514: 
  515:                             break;
  516:                         }
  517: 
  518:                         default:
  519:                         {
  520:                             somme_invalide = d_vrai;
  521:                             break;
  522:                         }
  523:                     }
  524: 
  525:                     break;
  526:                 }
  527: 
  528: #               ifndef OPENSSL_NO_RIPEMD
  529:                 case 'R':
  530:                 {
  531:                     if (strcmp(fonction, "RIPEMD160") == 0)
  532:                     {
  533:                         EVP_sum = EVP_ripemd160();
  534:                     }
  535:                     else
  536:                     {
  537:                         somme_invalide = d_vrai;
  538:                     }
  539: 
  540:                     break;
  541:                 }
  542: #               endif
  543: 
  544:                 case 'S':
  545:                 {
  546:                     switch(fonction[1])
  547:                     {
  548:                         case 'H': // sh
  549:                         {
  550:                             switch(fonction[2])
  551:                             {
  552:                                 case 'A':
  553:                                 {
  554:                                     switch(fonction[3])
  555:                                     {
  556:                                         case '1': // sha1
  557:                                         {
  558:                                             if (fonction[4] ==
  559:                                                     d_code_fin_chaine)
  560:                                             {
  561:                                                 EVP_sum = EVP_sha1();
  562:                                             }
  563:                                             else
  564:                                             {
  565:                                                 somme_invalide = d_vrai;
  566:                                             }
  567: 
  568:                                             break;
  569:                                         }
  570: 
  571:                                         case '2': // sha2
  572:                                         {
  573:                                             switch(fonction[4])
  574:                                             {
  575:                                                 case '2': // sha22
  576:                                                 {
  577:                                                     switch(fonction[5])
  578:                                                     {
  579:                                                         case '4': // sha224
  580:                                                         {
  581:                                                             if (fonction[6] ==
  582:                                                             d_code_fin_chaine)
  583:                                                             {
  584:                                                                 EVP_sum =
  585:                                                                 EVP_sha224();
  586:                                                             }
  587:                                                             else
  588:                                                             {
  589:                                                                 somme_invalide =
  590:                                                                         d_vrai;
  591:                                                             }
  592: 
  593:                                                             break;
  594:                                                         }
  595: 
  596:                                                         default:
  597:                                                         {
  598:                                                             somme_invalide =
  599:                                                                     d_vrai;
  600:                                                             break;
  601:                                                         }
  602:                                                     }
  603: 
  604:                                                     break;
  605:                                                 }
  606: 
  607:                                                 case '5':
  608:                                                 {
  609:                                                     switch(fonction[5])
  610:                                                     {
  611:                                                         case '6': // sha256
  612:                                                         {
  613:                                                             if (fonction[6] ==
  614:                                                             d_code_fin_chaine)
  615:                                                             {
  616:                                                                 EVP_sum =
  617:                                                                 EVP_sha256();
  618:                                                             }
  619:                                                             else
  620:                                                             {
  621:                                                                 somme_invalide =
  622:                                                                         d_vrai;
  623:                                                             }
  624: 
  625:                                                             break;
  626:                                                         }
  627: 
  628:                                                         default:
  629:                                                         {
  630:                                                             somme_invalide =
  631:                                                                     d_vrai;
  632:                                                             break;
  633:                                                         }
  634:                                                     }
  635: 
  636:                                                     break;
  637:                                                 }
  638: 
  639:                                                 default:
  640:                                                 {
  641:                                                     somme_invalide = d_vrai;
  642:                                                     break;
  643:                                                 }
  644:                                             }
  645: 
  646:                                             break;
  647:                                         }
  648: 
  649:                                         case '3': // sha3
  650:                                         {
  651:                                             switch(fonction[4])
  652:                                             {
  653:                                                 case '8': // sha38
  654:                                                 {
  655:                                                     switch(fonction[5])
  656:                                                     {
  657:                                                         case '4': // sha384
  658:                                                         {
  659:                                                             if (fonction[6] ==
  660:                                                             d_code_fin_chaine)
  661:                                                             {
  662:                                                                 EVP_sum =
  663:                                                                 EVP_sha384();
  664:                                                             }
  665:                                                             else
  666:                                                             {
  667:                                                                 somme_invalide =
  668:                                                                         d_vrai;
  669:                                                             }
  670: 
  671:                                                             break;
  672:                                                         }
  673: 
  674:                                                         default:
  675:                                                         {
  676:                                                             somme_invalide =
  677:                                                                     d_vrai;
  678:                                                             break;
  679:                                                         }
  680:                                                     }
  681: 
  682:                                                     break;
  683:                                                 }
  684: 
  685:                                                 default:
  686:                                                 {
  687:                                                     somme_invalide = d_vrai;
  688:                                                     break;
  689:                                                 }
  690:                                             }
  691: 
  692:                                             break;
  693:                                         }
  694: 
  695:                                         case '5': // sha5
  696:                                         {
  697:                                             switch(fonction[4])
  698:                                             {
  699:                                                 case '1': // sha51
  700:                                                 {
  701:                                                     switch(fonction[5])
  702:                                                     {
  703:                                                         case '2': // sha512
  704:                                                         {
  705:                                                             if (fonction[6] ==
  706:                                                             d_code_fin_chaine)
  707:                                                             {
  708:                                                                 EVP_sum =
  709:                                                                 EVP_sha512();
  710:                                                             }
  711:                                                             else
  712:                                                             {
  713:                                                                 somme_invalide =
  714:                                                                         d_vrai;
  715:                                                             }
  716: 
  717:                                                             break;
  718:                                                         }
  719: 
  720:                                                         default:
  721:                                                         {
  722:                                                             somme_invalide =
  723:                                                                     d_vrai;
  724:                                                             break;
  725:                                                         }
  726:                                                     }
  727: 
  728:                                                     break;
  729:                                                 }
  730: 
  731:                                                 default:
  732:                                                 {
  733:                                                     somme_invalide = d_vrai;
  734:                                                     break;
  735:                                                 }
  736:                                             }
  737: 
  738:                                             break;
  739:                                         }
  740: 
  741:                                         default:
  742:                                         {
  743:                                             somme_invalide = d_vrai;
  744:                                             break;
  745:                                         }
  746:                                     }
  747: 
  748:                                     break;
  749:                                 }
  750: 
  751:                                 default:
  752:                                 {
  753:                                     somme_invalide = d_vrai;
  754:                                     break;
  755:                                 }
  756:                             }
  757: 
  758:                             break;
  759:                         }
  760: 
  761:                         default:
  762:                         {
  763:                             somme_invalide = d_vrai;
  764:                             break;
  765:                         }
  766:                     }
  767: 
  768:                     break;
  769:                 }
  770: 
  771: #               ifndef OPENSSL_NO_WHIRLPOOL
  772:                 case 'W':
  773:                 {
  774:                     if (strcmp(fonction, "WHIRLPOOL") == 0)
  775:                     {
  776:                         EVP_sum = EVP_whirlpool();
  777:                     }
  778:                     else
  779:                     {
  780:                         somme_invalide = d_vrai;
  781:                     }
  782: 
  783:                     break;
  784:                 }
  785: #               endif
  786: 
  787:                 default:
  788:                 {
  789:                     somme_invalide = d_vrai;
  790:                     break;
  791:                 }
  792:             }
  793: 
  794:             free(fonction);
  795: 
  796:             if (somme_invalide == d_vrai)
  797:             {
  798:                 liberation(s_etat_processus, s_objet_argument_1);
  799:                 liberation(s_etat_processus, s_objet_argument_2);
  800: 
  801:                 (*s_etat_processus).erreur_execution =
  802:                         d_ex_chiffrement_indisponible;
  803:                 return;
  804:             }
  805: 
  806:             if ((l_element_courant = (*l_element_courant).suivant) == NULL)
  807:             {
  808:                 liberation(s_etat_processus, s_objet_argument_1);
  809:                 liberation(s_etat_processus, s_objet_argument_2);
  810: 
  811:                 (*s_etat_processus).erreur_execution = d_ex_manque_argument; 
  812:                 return;
  813:             }   
  814: 
  815:             // On attend le sel, donc un entier binaire de 64 bits.
  816: 
  817:             if ((*(*l_element_courant).donnee).type != BIN)
  818:             {
  819:                 liberation(s_etat_processus, s_objet_argument_1);
  820:                 liberation(s_etat_processus, s_objet_argument_2);
  821: 
  822:                 (*s_etat_processus).erreur_execution =
  823:                         d_ex_erreur_type_argument;
  824:                 return;
  825:             }
  826: 
  827:             sel = (*((logical8 *) (*(*l_element_courant).donnee).objet));
  828: 
  829:             if ((l_element_courant = (*l_element_courant).suivant) == NULL)
  830:             {
  831:                 liberation(s_etat_processus, s_objet_argument_1);
  832:                 liberation(s_etat_processus, s_objet_argument_2);
  833: 
  834:                 (*s_etat_processus).erreur_execution = d_ex_manque_argument; 
  835:                 return;
  836:             }   
  837: 
  838:             // On attend le nombre de cycles.
  839: 
  840:             if ((*(*l_element_courant).donnee).type != INT)
  841:             {
  842:                 liberation(s_etat_processus, s_objet_argument_1);
  843:                 liberation(s_etat_processus, s_objet_argument_2);
  844: 
  845:                 (*s_etat_processus).erreur_execution =
  846:                         d_ex_erreur_type_argument;
  847:                 return;
  848:             }
  849: 
  850:             nombre_cycles = (*((integer8 *) (*(*l_element_courant)
  851:                     .donnee).objet));
  852: 
  853:             // On a dû atteindre la fin de la liste.
  854: 
  855:             if ((*l_element_courant).suivant != NULL)
  856:             {
  857:                 liberation(s_etat_processus, s_objet_argument_1);
  858:                 liberation(s_etat_processus, s_objet_argument_2);
  859: 
  860:                 (*s_etat_processus).erreur_execution = d_ex_argument_invalide; 
  861:                 return;
  862:             }
  863: 
  864:             clef = NULL;
  865:             iv = NULL;
  866: 
  867:             generation_clef = d_vrai;
  868:         }
  869:         else
  870:         {
  871:             // Chiffrement ou déchiffrement d'un message
  872: 
  873:             direction = instruction;
  874: 
  875:             l_element_courant = (*l_element_courant).suivant;
  876: 
  877:             if (l_element_courant == NULL)
  878:             {
  879:                 liberation(s_etat_processus, s_objet_argument_1);
  880:                 liberation(s_etat_processus, s_objet_argument_2);
  881: 
  882:                 (*s_etat_processus).erreur_execution = d_ex_manque_argument; 
  883:                 return;
  884:             }
  885: 
  886:             // On attend le type de chiffrement.
  887: 
  888:             if ((*(*l_element_courant).donnee).type != CHN)
  889:             {
  890:                 liberation(s_etat_processus, s_objet_argument_1);
  891:                 liberation(s_etat_processus, s_objet_argument_2);
  892: 
  893:                 (*s_etat_processus).erreur_execution =
  894:                         d_ex_erreur_type_argument;
  895:                 return;
  896:             }
  897: 
  898:             algorithme_chiffrement = (unsigned char *) (*(*l_element_courant)
  899:                     .donnee).objet;
  900: 
  901:             // On attend la clef.
  902: 
  903:             if ((l_element_courant = (*l_element_courant).suivant) == NULL)
  904:             {
  905:                 liberation(s_etat_processus, s_objet_argument_1);
  906:                 liberation(s_etat_processus, s_objet_argument_2);
  907: 
  908:                 (*s_etat_processus).erreur_execution =
  909:                         d_ex_manque_argument;
  910:                 return;
  911:             }
  912: 
  913:             clef = (unsigned char *) (*(*l_element_courant).donnee).objet;
  914: 
  915:             // On attend le vecteur d'initialisation.
  916: 
  917:             if ((l_element_courant = (*l_element_courant).suivant) == NULL)
  918:             {
  919:                 liberation(s_etat_processus, s_objet_argument_1);
  920:                 liberation(s_etat_processus, s_objet_argument_2);
  921: 
  922:                 (*s_etat_processus).erreur_execution =
  923:                         d_ex_manque_argument;
  924:                 return;
  925:             }
  926: 
  927:             iv = (unsigned char *) (*(*l_element_courant).donnee).objet;
  928: 
  929:             // On attend le drapeau concernant le padding.
  930: 
  931:             if ((l_element_courant = (*l_element_courant).suivant) == NULL)
  932:             {
  933:                 liberation(s_etat_processus, s_objet_argument_1);
  934:                 liberation(s_etat_processus, s_objet_argument_2);
  935: 
  936:                 (*s_etat_processus).erreur_execution =
  937:                         d_ex_manque_argument;
  938:                 return;
  939:             }
  940: 
  941:             if ((*(*l_element_courant).donnee).type != CHN)
  942:             {
  943:                 liberation(s_etat_processus, s_objet_argument_1);
  944:                 liberation(s_etat_processus, s_objet_argument_2);
  945: 
  946:                 (*s_etat_processus).erreur_execution =
  947:                         d_ex_erreur_type_argument;
  948:                 return;
  949:             }
  950: 
  951:             tampon = conversion_majuscule(s_etat_processus,
  952:                     (unsigned char *) (*(*l_element_courant).donnee).objet);
  953: 
  954:             if (strcmp(tampon, "PADDING") == 0)
  955:             {
  956:                 padding = 'Y';
  957:             }
  958:             else if (strcmp(tampon, "NO PADDING") == 0)
  959:             {
  960:                 padding = 'N';
  961:             }
  962:             else
  963:             {
  964:                 free(tampon);
  965: 
  966:                 liberation(s_etat_processus, s_objet_argument_1);
  967:                 liberation(s_etat_processus, s_objet_argument_2);
  968: 
  969:                 (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  970:                 return;
  971:             }
  972: 
  973:             free(tampon);
  974: 
  975:             s_objet_padding = copie_objet(s_etat_processus,
  976:                     (*l_element_courant).donnee, 'P');
  977: 
  978:             if ((*l_element_courant).suivant != NULL)
  979:             {
  980:                 liberation(s_etat_processus, s_objet_argument_1);
  981:                 liberation(s_etat_processus, s_objet_argument_2);
  982: 
  983:                 (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  984:                 return;
  985:             }
  986: 
  987:             generation_clef = d_faux;
  988:         }
  989:     }
  990:     else
  991:     {
  992:         liberation(s_etat_processus, s_objet_argument_1);
  993:         liberation(s_etat_processus, s_objet_argument_2);
  994: 
  995:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  996:         return;
  997:     }
  998: 
  999:     if ((tampon = conversion_majuscule(s_etat_processus,
 1000:             algorithme_chiffrement)) == NULL)
 1001:     {
 1002:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1003:         return;
 1004:     }
 1005: 
 1006: #   define TEST_CIPHER(string, value) \
 1007:             if (strcmp(tampon, string) == 0) EVP_chiffrement = value();
 1008: 
 1009:     if (strncmp(tampon, "DES", 3) == 0)
 1010:     {
 1011: #       ifndef OPENSSL_NO_DES
 1012:             TEST_CIPHER("DES-ECB", EVP_des_ecb)
 1013:             else TEST_CIPHER("DES-EDE", EVP_des_ede)
 1014:             else TEST_CIPHER("DES-EDE3", EVP_des_ede3)
 1015:             else TEST_CIPHER("DES-EDE-ECB", EVP_des_ede_ecb)
 1016:             else TEST_CIPHER("DES-EDE3-ECB", EVP_des_ede3_ecb)
 1017:             else TEST_CIPHER("DES-CFB64", EVP_des_cfb64)
 1018:             else TEST_CIPHER("DES-CFB1", EVP_des_cfb1)
 1019:             else TEST_CIPHER("DES-CFB8", EVP_des_cfb8)
 1020:             else TEST_CIPHER("DES-EDE-CFB64", EVP_des_ede_cfb64)
 1021:             else TEST_CIPHER("DES-EDE3-CFB64", EVP_des_ede3_cfb64)
 1022:             else TEST_CIPHER("DES-EDE3-CFB1", EVP_des_ede3_cfb1)
 1023:             else TEST_CIPHER("DES-EDE3-CFB8", EVP_des_ede3_cfb8)
 1024:             else TEST_CIPHER("DES-OFB", EVP_des_ofb)
 1025:             else TEST_CIPHER("DES-EDE-OFB", EVP_des_ede_ofb)
 1026:             else TEST_CIPHER("DES-EDE3-OFB", EVP_des_ede3_ofb)
 1027:             else TEST_CIPHER("DES-CBC", EVP_des_cbc)
 1028:             else TEST_CIPHER("DES-EDE-CBC", EVP_des_ede_cbc)
 1029:             else TEST_CIPHER("DES-EDE3-CBC", EVP_des_ede3_cbc)
 1030:             else TEST_CIPHER("DESX-CBC", EVP_desx_cbc)
 1031:             else
 1032:             {
 1033:                 free(tampon);
 1034: 
 1035:                 liberation(s_etat_processus, s_objet_argument_1);
 1036:                 liberation(s_etat_processus, s_objet_argument_2);
 1037: 
 1038:                 (*s_etat_processus).erreur_execution =
 1039:                         d_ex_chiffrement_indisponible;
 1040:                 return;
 1041:             }
 1042: #       else
 1043:             free(tampon);
 1044: 
 1045:             liberation(s_etat_processus, s_objet_argument_1);
 1046:             liberation(s_etat_processus, s_objet_argument_2);
 1047: 
 1048:             (*s_etat_processus).erreur_execution =
 1049:                     d_ex_chiffrement_indisponible;
 1050:             return;
 1051: #       endif
 1052:     }
 1053:     else if (strncmp(tampon, "RC4", 3) == 0)
 1054:     {
 1055: #       ifndef OPENSSL_NO_RC4
 1056:             TEST_CIPHER("RC4", EVP_rc4)
 1057:             else TEST_CIPHER("RC4-40", EVP_rc4_40)
 1058:             else
 1059:             {
 1060:                 free(tampon);
 1061: 
 1062:                 liberation(s_etat_processus, s_objet_argument_1);
 1063:                 liberation(s_etat_processus, s_objet_argument_2);
 1064: 
 1065:                 (*s_etat_processus).erreur_execution =
 1066:                         d_ex_chiffrement_indisponible;
 1067:                 return;
 1068:             }
 1069: #       else
 1070:             free(tampon);
 1071: 
 1072:             liberation(s_etat_processus, s_objet_argument_1);
 1073:             liberation(s_etat_processus, s_objet_argument_2);
 1074: 
 1075:             (*s_etat_processus).erreur_execution =
 1076:                     d_ex_chiffrement_indisponible;
 1077:             return;
 1078: #       endif
 1079:     }
 1080:     else if (strncmp(tampon, "IDEA", 4) == 0)
 1081:     {
 1082: #       ifndef OPENSSL_NO_IDEA
 1083:             TEST_CIPHER("IDEA-ECB", EVP_idea_ecb)
 1084:             else TEST_CIPHER("IDEA-CFB64", EVP_idea_cfb64)
 1085:             else TEST_CIPHER("IDEA-OFB", EVP_idea_ofb)
 1086:             else TEST_CIPHER("IDEA-CBC", EVP_idea_cbc)
 1087:             else
 1088:             {
 1089:                 free(tampon);
 1090: 
 1091:                 liberation(s_etat_processus, s_objet_argument_1);
 1092:                 liberation(s_etat_processus, s_objet_argument_2);
 1093: 
 1094:                 (*s_etat_processus).erreur_execution =
 1095:                         d_ex_chiffrement_indisponible;
 1096:                 return;
 1097:             }
 1098: #       else
 1099:             free(tampon);
 1100: 
 1101:             liberation(s_etat_processus, s_objet_argument_1);
 1102:             liberation(s_etat_processus, s_objet_argument_2);
 1103: 
 1104:             (*s_etat_processus).erreur_execution =
 1105:                     d_ex_chiffrement_indisponible;
 1106:             return;
 1107: #       endif
 1108:     }
 1109:     else if (strncmp(tampon, "RC2", 3) == 0)
 1110:     {
 1111: #       ifndef OPENSSL_NO_RC2
 1112:             TEST_CIPHER("RC2-ECB", EVP_rc2_ecb)
 1113:             else TEST_CIPHER("RC2-CBC", EVP_rc2_cbc)
 1114:             else TEST_CIPHER("RC2-40-CBC", EVP_rc2_40_cbc)
 1115:             else TEST_CIPHER("RC2-64-CBC", EVP_rc2_64_cbc)
 1116:             else TEST_CIPHER("RC2-CFB64", EVP_rc2_cfb64)
 1117:             else TEST_CIPHER("RC2-OFB", EVP_rc2_ofb)
 1118:             else
 1119:             {
 1120:                 free(tampon);
 1121: 
 1122:                 liberation(s_etat_processus, s_objet_argument_1);
 1123:                 liberation(s_etat_processus, s_objet_argument_2);
 1124: 
 1125:                 (*s_etat_processus).erreur_execution =
 1126:                         d_ex_chiffrement_indisponible;
 1127:                 return;
 1128:             }
 1129: #       else
 1130:             free(tampon);
 1131: 
 1132:             liberation(s_etat_processus, s_objet_argument_1);
 1133:             liberation(s_etat_processus, s_objet_argument_2);
 1134: 
 1135:             (*s_etat_processus).erreur_execution =
 1136:                     d_ex_chiffrement_indisponible;
 1137:             return;
 1138: #       endif
 1139:     }
 1140:     else if (strncmp(tampon, "BF", 2) == 0)
 1141:     {
 1142: #       ifndef OPENSSL_NO_BF
 1143:             TEST_CIPHER("BF-ECB", EVP_bf_ecb)
 1144:             else TEST_CIPHER("BF-CBC", EVP_bf_cbc)
 1145:             else TEST_CIPHER("BF-CFB64", EVP_bf_cfb64)
 1146:             else TEST_CIPHER("BF-OFB", EVP_bf_ofb)
 1147:             else
 1148:             {
 1149:                 free(tampon);
 1150: 
 1151:                 liberation(s_etat_processus, s_objet_argument_1);
 1152:                 liberation(s_etat_processus, s_objet_argument_2);
 1153: 
 1154:                 (*s_etat_processus).erreur_execution =
 1155:                         d_ex_chiffrement_indisponible;
 1156:                 return;
 1157:             }
 1158: #       else
 1159:             free(tampon);
 1160: 
 1161:             liberation(s_etat_processus, s_objet_argument_1);
 1162:             liberation(s_etat_processus, s_objet_argument_2);
 1163: 
 1164:             (*s_etat_processus).erreur_execution =
 1165:                     d_ex_chiffrement_indisponible;
 1166:             return;
 1167: #       endif
 1168:     }
 1169:     else if (strncmp(tampon, "CAST5", 5) == 0)
 1170:     {
 1171: #       ifndef OPENSSL_NO_CAST
 1172:             TEST_CIPHER("CAST5-ECB", EVP_cast5_ecb)
 1173:             else TEST_CIPHER("CAST5-CBC", EVP_cast5_cbc)
 1174:             else TEST_CIPHER("CAST5-CFB64", EVP_cast5_cfb64)
 1175:             else TEST_CIPHER("CAST5-OFB", EVP_cast5_ofb)
 1176:             else
 1177:             {
 1178:                 free(tampon);
 1179: 
 1180:                 liberation(s_etat_processus, s_objet_argument_1);
 1181:                 liberation(s_etat_processus, s_objet_argument_2);
 1182: 
 1183:                 (*s_etat_processus).erreur_execution =
 1184:                         d_ex_chiffrement_indisponible;
 1185:                 return;
 1186:             }
 1187: #       else
 1188:             free(tampon);
 1189: 
 1190:             liberation(s_etat_processus, s_objet_argument_1);
 1191:             liberation(s_etat_processus, s_objet_argument_2);
 1192: 
 1193:             (*s_etat_processus).erreur_execution =
 1194:                     d_ex_chiffrement_indisponible;
 1195:             return;
 1196: #       endif
 1197:     }
 1198:     else if (strncmp(tampon, "RC5", 3) == 0)
 1199:     {
 1200: #       ifndef OPENSSL_NO_RC5
 1201:             TEST_CIPHER("RC5-32-12-16-ECB", EVP_rc5_32_12_16_ebc)
 1202:             else TEST_CIPHER("RC5-32-12-16-CBC", EVP_rc5_32_12_16_cbc)
 1203:             else TEST_CIPHER("RC5-32-12-16-CFB64", EVP_rc5_32_12_16_cfb64)
 1204:             else TEST_CIPHER("RC5-32-12-16-OFB", EVP_rc5_32_12_16_ofb)
 1205:             else
 1206:             {
 1207:                 free(tampon);
 1208: 
 1209:                 liberation(s_etat_processus, s_objet_argument_1);
 1210:                 liberation(s_etat_processus, s_objet_argument_2);
 1211: 
 1212:                 (*s_etat_processus).erreur_execution =
 1213:                         d_ex_chiffrement_indisponible;
 1214:                 return;
 1215:             }
 1216: #       else
 1217:             free(tampon);
 1218: 
 1219:             liberation(s_etat_processus, s_objet_argument_1);
 1220:             liberation(s_etat_processus, s_objet_argument_2);
 1221: 
 1222:             (*s_etat_processus).erreur_execution =
 1223:                     d_ex_chiffrement_indisponible;
 1224:             return;
 1225: #       endif
 1226:     }
 1227:     else if (strncmp(tampon, "AES", 3) == 0)
 1228:     {
 1229: #       ifndef OPENSSL_NO_AES
 1230:             TEST_CIPHER("AES-128-ECB", EVP_aes_128_ecb)
 1231:             else TEST_CIPHER("AES-128-CBC", EVP_aes_128_cbc)
 1232:             else TEST_CIPHER("AES-128-CFB1", EVP_aes_128_cfb1)
 1233:             else TEST_CIPHER("AES-128-CFB8", EVP_aes_128_cfb8)
 1234:             else TEST_CIPHER("AES-128-CFB128", EVP_aes_128_cfb128)
 1235:             else TEST_CIPHER("AES-128-OFB", EVP_aes_128_ofb)
 1236:             else TEST_CIPHER("AES-128-CTR", EVP_aes_128_ctr)
 1237:             else TEST_CIPHER("AES-128-CCM", EVP_aes_128_ccm)
 1238:             else TEST_CIPHER("AES-128-GCM", EVP_aes_128_gcm)
 1239:             else TEST_CIPHER("AES-128-XTS", EVP_aes_128_xts)
 1240:             else TEST_CIPHER("AES-192-ECB", EVP_aes_192_ecb)
 1241:             else TEST_CIPHER("AES-192-CBC", EVP_aes_192_cbc)
 1242:             else TEST_CIPHER("AES-192-CFB1", EVP_aes_192_cfb1)
 1243:             else TEST_CIPHER("AES-192-CFB8", EVP_aes_192_cfb8)
 1244:             else TEST_CIPHER("AES-192-CFB128", EVP_aes_192_cfb128)
 1245:             else TEST_CIPHER("AES-192-OFB", EVP_aes_192_ofb)
 1246:             else TEST_CIPHER("AES-192-CTR", EVP_aes_192_ctr)
 1247:             else TEST_CIPHER("AES-192-CCM", EVP_aes_192_ccm)
 1248:             else TEST_CIPHER("AES-192-GCM", EVP_aes_192_gcm)
 1249:             else TEST_CIPHER("AES-256-ECB", EVP_aes_256_ecb)
 1250:             else TEST_CIPHER("AES-256-CBC", EVP_aes_256_cbc)
 1251:             else TEST_CIPHER("AES-256-CFB1", EVP_aes_256_cfb1)
 1252:             else TEST_CIPHER("AES-256-CFB8", EVP_aes_256_cfb8)
 1253:             else TEST_CIPHER("AES-256-CFB128", EVP_aes_256_cfb128)
 1254:             else TEST_CIPHER("AES-256-OFB", EVP_aes_256_ofb)
 1255:             else TEST_CIPHER("AES-256-CTR", EVP_aes_256_ctr)
 1256:             else TEST_CIPHER("AES-256-CCM", EVP_aes_256_ccm)
 1257:             else TEST_CIPHER("AES-256-GCM", EVP_aes_256_gcm)
 1258:             else TEST_CIPHER("AES-256-XTS", EVP_aes_256_xts)
 1259:             else
 1260:             {
 1261:                 free(tampon);
 1262: 
 1263:                 liberation(s_etat_processus, s_objet_argument_1);
 1264:                 liberation(s_etat_processus, s_objet_argument_2);
 1265: 
 1266:                 (*s_etat_processus).erreur_execution =
 1267:                         d_ex_chiffrement_indisponible;
 1268:                 return;
 1269:             }
 1270: #       else
 1271:             free(tampon);
 1272: 
 1273:             liberation(s_etat_processus, s_objet_argument_1);
 1274:             liberation(s_etat_processus, s_objet_argument_2);
 1275: 
 1276:             (*s_etat_processus).erreur_execution =
 1277:                     d_ex_chiffrement_indisponible;
 1278:             return;
 1279: #       endif
 1280:     }
 1281:     else if (strncmp(tampon, "CAMELLIA", 8) == 0)
 1282:     {
 1283: #       ifndef OPENSSL_NO_CAMELLIA
 1284:             TEST_CIPHER("CAMELLIA-128-ECB", EVP_camellia_128_ecb)
 1285:             else TEST_CIPHER("CAMELLIA-128-CBC", EVP_camellia_128_cbc)
 1286:             else TEST_CIPHER("CAMELLIA-128-CFB1", EVP_camellia_128_cfb1)
 1287:             else TEST_CIPHER("CAMELLIA-128-CFB8", EVP_camellia_128_cfb8)
 1288:             else TEST_CIPHER("CAMELLIA-128-CFB128", EVP_camellia_128_cfb128)
 1289:             else TEST_CIPHER("CAMELLIA-128-OFB", EVP_camellia_128_ofb)
 1290:             else TEST_CIPHER("CAMELLIA-192-ECB", EVP_camellia_128_ecb)
 1291:             else TEST_CIPHER("CAMELLIA-192-CBC", EVP_camellia_192_cbc)
 1292:             else TEST_CIPHER("CAMELLIA-192-CFB1", EVP_camellia_192_cfb1)
 1293:             else TEST_CIPHER("CAMELLIA-192-CFB8", EVP_camellia_192_cfb8)
 1294:             else TEST_CIPHER("CAMELLIA-192-CFB128", EVP_camellia_192_cfb128)
 1295:             else TEST_CIPHER("CAMELLIA-192-OFB", EVP_camellia_192_ofb)
 1296:             else TEST_CIPHER("CAMELLIA-256-ECB", EVP_camellia_256_ecb)
 1297:             else TEST_CIPHER("CAMELLIA-256-CBC", EVP_camellia_256_cbc)
 1298:             else TEST_CIPHER("CAMELLIA-256-CFB1", EVP_camellia_256_cfb1)
 1299:             else TEST_CIPHER("CAMELLIA-256-CFB8", EVP_camellia_256_cfb8)
 1300:             else TEST_CIPHER("CAMELLIA-256-CFB128", EVP_camellia_256_cfb128)
 1301:             else TEST_CIPHER("CAMELLIA-256-OFB", EVP_camellia_256_ofb)
 1302:             else
 1303:             {
 1304:                 free(tampon);
 1305: 
 1306:                 liberation(s_etat_processus, s_objet_argument_1);
 1307:                 liberation(s_etat_processus, s_objet_argument_2);
 1308: 
 1309:                 (*s_etat_processus).erreur_execution =
 1310:                         d_ex_chiffrement_indisponible;
 1311:                 return;
 1312:             }
 1313: #       else
 1314:             free(tampon);
 1315: 
 1316:             liberation(s_etat_processus, s_objet_argument_1);
 1317:             liberation(s_etat_processus, s_objet_argument_2);
 1318: 
 1319:             (*s_etat_processus).erreur_execution =
 1320:                     d_ex_chiffrement_indisponible;
 1321:             return;
 1322: #       endif
 1323:     }
 1324:     else if (strncmp(tampon, "SEED", 4) == 0)
 1325:     {
 1326: #       ifndef OPENSSL_NO_SEED
 1327:             TEST_CIPHER("SEED-ECB", EVP_seed_ecb)
 1328:             else TEST_CIPHER("SEED-CBC", EVP_seed_cbc)
 1329:             else TEST_CIPHER("SEED-CFB128", EVP_seed_cfb128)
 1330:             else TEST_CIPHER("SEED-OFB", EVP_seed_ofb)
 1331:             else
 1332:             {
 1333:                 free(tampon);
 1334: 
 1335:                 liberation(s_etat_processus, s_objet_argument_1);
 1336:                 liberation(s_etat_processus, s_objet_argument_2);
 1337: 
 1338:                 (*s_etat_processus).erreur_execution =
 1339:                         d_ex_chiffrement_indisponible;
 1340:                 return;
 1341:             }
 1342: #       else
 1343:             free(tampon);
 1344: 
 1345:             liberation(s_etat_processus, s_objet_argument_1);
 1346:             liberation(s_etat_processus, s_objet_argument_2);
 1347: 
 1348:             (*s_etat_processus).erreur_execution =
 1349:                     d_ex_chiffrement_indisponible;
 1350:             return;
 1351: #       endif
 1352:     }
 1353:     else
 1354:     {
 1355:         free(tampon);
 1356: 
 1357:         liberation(s_etat_processus, s_objet_argument_1);
 1358:         liberation(s_etat_processus, s_objet_argument_2);
 1359: 
 1360:         (*s_etat_processus).erreur_execution = d_ex_chiffrement_indisponible;
 1361:         return;
 1362:     }
 1363: 
 1364:     free(tampon);
 1365: 
 1366:     if (generation_clef == d_vrai)
 1367:     {
 1368:         if ((iv = malloc(((size_t) EVP_CIPHER_iv_length(EVP_chiffrement))
 1369:                 * sizeof(unsigned char))) == NULL)
 1370:         {
 1371:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1372:             return;
 1373:         }
 1374: 
 1375:         if ((clef = malloc(((size_t) EVP_CIPHER_key_length(EVP_chiffrement))
 1376:                 * sizeof(unsigned char))) == NULL)
 1377:         {
 1378:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1379:             return;
 1380:         }
 1381: 
 1382:         longueur_clef = EVP_BytesToKey(EVP_chiffrement, EVP_sum,
 1383:                 (unsigned char *) &sel, (unsigned char *)
 1384:                 (*s_objet_argument_2).objet,
 1385:                 (int) longueur_chaine(s_etat_processus,
 1386:                 (unsigned char *) (*s_objet_argument_2).objet),
 1387:                 (int) nombre_cycles, clef, iv);
 1388: 
 1389:         if (longueur_clef != EVP_CIPHER_key_length(EVP_chiffrement))
 1390:         {
 1391:             free(iv);
 1392:             free(clef);
 1393: 
 1394:             liberation(s_etat_processus, s_objet_argument_1);
 1395:             liberation(s_etat_processus, s_objet_argument_2);
 1396: 
 1397:             (*s_etat_processus).erreur_execution = d_ex_chiffrement;
 1398:             return;
 1399:         }
 1400: 
 1401:         if ((s_objet_resultat_1 = allocation(s_etat_processus, LST)) == NULL)
 1402:         {
 1403:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1404:             return;
 1405:         }
 1406: 
 1407:         if (((*s_objet_resultat_1).objet = allocation_maillon(s_etat_processus))
 1408:                 == NULL)
 1409:         {
 1410:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1411:             return;
 1412:         }
 1413: 
 1414:         l_element_courant = (*s_objet_resultat_1).objet;
 1415: 
 1416:         if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
 1417:                 == NULL)
 1418:         {
 1419:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1420:             return;
 1421:         }
 1422: 
 1423:         if (((*(*l_element_courant).donnee).objet = malloc(
 1424:                 (strlen(algorithme_chiffrement) + 1) * sizeof(unsigned char)))
 1425:                 == NULL)
 1426:         {
 1427:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1428:             return;
 1429:         }
 1430: 
 1431:         strcpy((*(*l_element_courant).donnee).objet, algorithme_chiffrement);
 1432: 
 1433:         if (((*l_element_courant).suivant = allocation_maillon(
 1434:                 s_etat_processus)) == NULL)
 1435:         {
 1436:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1437:             return;
 1438:         }
 1439: 
 1440:         l_element_courant = (*l_element_courant).suivant;
 1441: 
 1442:         if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
 1443:                 == NULL)
 1444:         {
 1445:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1446:             return;
 1447:         }
 1448: 
 1449:         if (((*(*l_element_courant).donnee).objet = analyse_flux(
 1450:                 s_etat_processus, clef,
 1451:                 EVP_CIPHER_key_length(EVP_chiffrement))) == NULL)
 1452:         {
 1453:             return;
 1454:         }
 1455: 
 1456:         free(clef);
 1457: 
 1458:         if (((*l_element_courant).suivant = allocation_maillon(
 1459:                 s_etat_processus)) == NULL)
 1460:         {
 1461:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1462:             return;
 1463:         }
 1464: 
 1465:         l_element_courant = (*l_element_courant).suivant;
 1466:         (*l_element_courant).suivant = NULL;
 1467: 
 1468:         if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
 1469:                 == NULL)
 1470:         {
 1471:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1472:             return;
 1473:         }
 1474: 
 1475:         if (((*(*l_element_courant).donnee).objet = analyse_flux(
 1476:                 s_etat_processus, iv,
 1477:                 EVP_CIPHER_iv_length(EVP_chiffrement))) == NULL)
 1478:         {
 1479:             return;
 1480:         }
 1481: 
 1482:         free(iv);
 1483: 
 1484:         liberation(s_etat_processus, s_objet_argument_1);
 1485:         liberation(s_etat_processus, s_objet_argument_2);
 1486: 
 1487:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1488:                 s_objet_resultat_1) == d_erreur)
 1489:         {
 1490:             return;
 1491:         }
 1492:     }
 1493:     else
 1494:     {
 1495:         // Chiffrement ou déchiffrement
 1496: 
 1497:         if (strcmp(direction, "ENCRYPT") == 0)
 1498:         {
 1499:             encodage = d_vrai;
 1500:         }
 1501:         else if (strcmp(direction, "DECRYPT") == 0)
 1502:         {
 1503:             encodage = d_faux;
 1504:         }
 1505:         else
 1506:         {
 1507:             free(direction);
 1508:             liberation(s_etat_processus, s_objet_argument_1);
 1509:             liberation(s_etat_processus, s_objet_argument_2);
 1510: 
 1511:             (*s_etat_processus).erreur_execution =
 1512:                     d_ex_argument_invalide;
 1513:             return;
 1514:         }
 1515: 
 1516:         free(direction);
 1517: 
 1518:         // Conversion des clefs
 1519: 
 1520:         if ((clef_binaire = formateur_flux(s_etat_processus, clef,
 1521:                 &longueur_clef_binaire)) == NULL)
 1522:         {
 1523:             return;
 1524:         }
 1525: 
 1526:         if ((iv_binaire = formateur_flux(s_etat_processus, iv,
 1527:                 &longueur_iv_binaire)) == NULL)
 1528:         {
 1529:             return;
 1530:         }
 1531: 
 1532:         // Vérification de la longueur des clef et vecteur d'initialisation
 1533: 
 1534:         if (longueur_clef_binaire != EVP_CIPHER_key_length(EVP_chiffrement))
 1535:         {
 1536:             free(clef_binaire);
 1537:             free(iv_binaire);
 1538: 
 1539:             liberation(s_etat_processus, s_objet_argument_1);
 1540:             liberation(s_etat_processus, s_objet_argument_2);
 1541: 
 1542:             (*s_etat_processus).erreur_execution =
 1543:                     d_ex_longueur_clef_chiffrement;
 1544:             return;
 1545:         }
 1546: 
 1547:         if (longueur_iv_binaire != EVP_CIPHER_iv_length(EVP_chiffrement))
 1548:         {
 1549:             free(clef_binaire);
 1550:             free(iv_binaire);
 1551: 
 1552:             liberation(s_etat_processus, s_objet_argument_1);
 1553:             liberation(s_etat_processus, s_objet_argument_2);
 1554: 
 1555:             (*s_etat_processus).erreur_execution =
 1556:                     d_ex_longueur_clef_chiffrement;
 1557:             return;
 1558:         }
 1559: 
 1560:         if ((message = formateur_flux(s_etat_processus, (unsigned char *)
 1561:                 (*s_objet_argument_2).objet, &longueur_message)) == NULL)
 1562:         {
 1563:             return;
 1564:         }
 1565: 
 1566:         if ((message_chiffre = chiffrement(s_etat_processus,
 1567:                 EVP_chiffrement, encodage, message,
 1568:                 longueur_message, clef_binaire, longueur_clef_binaire,
 1569:                 iv_binaire, &longueur_message_chiffre, padding)) == NULL)
 1570:         {
 1571:             free(clef_binaire);
 1572:             free(iv_binaire);
 1573:             free(message);
 1574: 
 1575:             liberation(s_etat_processus, s_objet_argument_1);
 1576:             liberation(s_etat_processus, s_objet_argument_2);
 1577: 
 1578:             (*s_etat_processus).erreur_execution = d_ex_chiffrement;
 1579:             return;
 1580:         }
 1581: 
 1582:         free(clef_binaire);
 1583:         free(message);
 1584: 
 1585:         if ((s_objet_resultat_2 = allocation(s_etat_processus, CHN)) == NULL)
 1586:         {
 1587:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1588:             return;
 1589:         }
 1590: 
 1591:         if (((*s_objet_resultat_2).objet = analyse_flux(s_etat_processus,
 1592:                 message_chiffre, longueur_message_chiffre)) == NULL)
 1593:         {
 1594:             return;
 1595:         }
 1596: 
 1597:         free(message_chiffre);
 1598: 
 1599:         if ((s_objet_resultat_1 = allocation(s_etat_processus, LST)) == NULL)
 1600:         {
 1601:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1602:             return;
 1603:         }
 1604: 
 1605:         if (((*s_objet_resultat_1).objet = allocation_maillon(s_etat_processus))
 1606:                 == NULL)
 1607:         {
 1608:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1609:             return;
 1610:         }
 1611: 
 1612:         l_element_courant = (*s_objet_resultat_1).objet;
 1613: 
 1614:         // Direction
 1615: 
 1616:         if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
 1617:                 == NULL)
 1618:         {
 1619:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1620:             return;
 1621:         }
 1622: 
 1623:         if (((*(*l_element_courant).donnee).objet =
 1624:                 malloc(8 * sizeof(unsigned char))) == NULL)
 1625:         {
 1626:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1627:             return;
 1628:         }
 1629: 
 1630:         strcpy((*(*l_element_courant).donnee).objet,
 1631:                 (encodage == d_vrai) ? "ENCRYPT" : "DECRYPT");
 1632: 
 1633:         // Type de chiffrement
 1634: 
 1635:         if (((*l_element_courant).suivant = allocation_maillon(
 1636:                 s_etat_processus)) == NULL)
 1637:         {
 1638:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1639:             return;
 1640:         }
 1641: 
 1642:         l_element_courant = (*l_element_courant).suivant;
 1643: 
 1644:         if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
 1645:                 == NULL)
 1646:         {
 1647:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1648:             return;
 1649:         }
 1650: 
 1651:         if (((*(*l_element_courant).donnee).objet =
 1652:                 conversion_majuscule(s_etat_processus, algorithme_chiffrement))
 1653:                 == NULL)
 1654:         {
 1655:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1656:             return;
 1657:         }
 1658: 
 1659:         // Clef
 1660: 
 1661:         if (((*l_element_courant).suivant = allocation_maillon(
 1662:                 s_etat_processus)) == NULL)
 1663:         {
 1664:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1665:             return;
 1666:         }
 1667: 
 1668:         l_element_courant = (*l_element_courant).suivant;
 1669: 
 1670:         if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
 1671:                 == NULL)
 1672:         {
 1673:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1674:             return;
 1675:         }
 1676: 
 1677:         if (((*(*l_element_courant).donnee).objet =
 1678:                 malloc((strlen(clef) + 1) * sizeof(unsigned char))) == NULL)
 1679:         {
 1680:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1681:             return;
 1682:         }
 1683: 
 1684:         strcpy((*(*l_element_courant).donnee).objet, clef);
 1685: 
 1686:         // Vecteur d'initialisation
 1687: 
 1688:         if (((*l_element_courant).suivant = allocation_maillon(
 1689:                 s_etat_processus)) == NULL)
 1690:         {
 1691:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1692:             return;
 1693:         }
 1694: 
 1695:         l_element_courant = (*l_element_courant).suivant;
 1696: 
 1697:         if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
 1698:                 == NULL)
 1699:         {
 1700:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1701:             return;
 1702:         }
 1703: 
 1704:         if (((*(*l_element_courant).donnee).objet = analyse_flux(
 1705:                 s_etat_processus, iv_binaire, longueur_iv_binaire)) == NULL)
 1706:         {
 1707:             return;
 1708:         }
 1709:         
 1710:         free(iv_binaire);
 1711: 
 1712:         // Padding
 1713: 
 1714:         if (((*l_element_courant).suivant = allocation_maillon(
 1715:                 s_etat_processus)) == NULL)
 1716:         {
 1717:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1718:             return;
 1719:         }
 1720: 
 1721:         l_element_courant = (*l_element_courant).suivant;
 1722:         (*l_element_courant).donnee = s_objet_padding;
 1723:         (*l_element_courant).suivant = NULL;
 1724: 
 1725:         liberation(s_etat_processus, s_objet_argument_1);
 1726:         liberation(s_etat_processus, s_objet_argument_2);
 1727: 
 1728:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1729:                 s_objet_resultat_2) == d_erreur)
 1730:         {
 1731:             return;
 1732:         }
 1733: 
 1734:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1735:                 s_objet_resultat_1) == d_erreur)
 1736:         {
 1737:             return;
 1738:         }
 1739:     }
 1740: 
 1741:     return;
 1742: }
 1743: 
 1744: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>