1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.12
4: Copyright (C) 1989-2012 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 'dupcntxt'
29: ================================================================================
30: Entrées : pointeur sur une structure struct_processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_dupcntxt(struct_processus *s_etat_processus)
40: {
41: struct_objet *s_objet;
42: struct_objet *s_pile;
43:
44: (*s_etat_processus).erreur_execution = d_ex;
45:
46: if ((*s_etat_processus).affichage_arguments == 'Y')
47: {
48: printf("\n DUPCNTXT ");
49:
50: if ((*s_etat_processus).langue == 'F')
51: {
52: printf("(duplication du contexte)\n\n");
53: printf(" Aucun argument\n");
54: }
55: else
56: {
57: printf("(context duplication)\n\n");
58: printf(" No argument\n");
59: }
60:
61: return;
62: }
63: else if ((*s_etat_processus).test_instruction == 'Y')
64: {
65: (*s_etat_processus).nombre_arguments = -1;
66: return;
67: }
68:
69: if (test_cfsf(s_etat_processus, 31) == d_vrai)
70: {
71: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
72: {
73: return;
74: }
75: }
76:
77: if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
78: {
79: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
80: return;
81: }
82:
83: (*s_objet).objet = (*s_etat_processus).l_base_pile;
84:
85: if ((s_pile = copie_objet(s_etat_processus, s_objet, 'N')) == NULL)
86: {
87: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
88: return;
89: }
90:
91: if (empilement(s_etat_processus, &((*s_etat_processus).
92: l_base_pile_contextes), s_objet) == d_erreur)
93: {
94: return;
95: }
96:
97: if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
98: {
99: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
100: return;
101: }
102:
103: (*((integer8 *) (*s_objet).objet)) = (*s_etat_processus)
104: .hauteur_pile_operationnelle;
105:
106: if (empilement(s_etat_processus, &((*s_etat_processus)
107: .l_base_pile_taille_contextes), s_objet) == d_erreur)
108: {
109: return;
110: }
111:
112: /*
113: * Copie de la pile opérationnelle
114: */
115:
116: (*s_etat_processus).l_base_pile = (*s_pile).objet;
117:
118: (*s_pile).objet = NULL;
119: liberation(s_etat_processus, s_pile);
120:
121: return;
122: }
123:
124:
125: /*
126: ================================================================================
127: Fonction 'dropcntxt'
128: ================================================================================
129: Entrées : pointeur sur une structure struct_processus
130: --------------------------------------------------------------------------------
131: Sorties :
132: --------------------------------------------------------------------------------
133: Effets de bord : néant
134: ================================================================================
135: */
136:
137: void
138: instruction_dropcntxt(struct_processus *s_etat_processus)
139: {
140: struct_objet *s_objet;
141:
142: (*s_etat_processus).erreur_execution = d_ex;
143:
144: if ((*s_etat_processus).affichage_arguments == 'Y')
145: {
146: printf("\n DROPCNTXT ");
147:
148: if ((*s_etat_processus).langue == 'F')
149: {
150: printf("(effacement d'un contexte)\n\n");
151: printf(" Aucun argument\n");
152: }
153: else
154: {
155: printf("(drops context)\n\n");
156: printf(" No argument\n");
157: }
158:
159: return;
160: }
161: else if ((*s_etat_processus).test_instruction == 'Y')
162: {
163: (*s_etat_processus).nombre_arguments = -1;
164: return;
165: }
166:
167: if (test_cfsf(s_etat_processus, 31) == d_vrai)
168: {
169: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
170: {
171: return;
172: }
173: }
174:
175: if (((*s_etat_processus).l_base_pile_contextes == NULL) ||
176: ((*s_etat_processus).l_base_pile_taille_contextes == NULL))
177: {
178: (*s_etat_processus).erreur_execution = d_ex_contexte;
179: return;
180: }
181:
182: if (depilement(s_etat_processus, &((*s_etat_processus)
183: .l_base_pile_contextes), &s_objet) == d_erreur)
184: {
185: return;
186: }
187:
188: liberation(s_etat_processus, s_objet);
189:
190: if (depilement(s_etat_processus, &((*s_etat_processus)
191: .l_base_pile_taille_contextes), &s_objet) == d_erreur)
192: {
193: return;
194: }
195:
196: liberation(s_etat_processus, s_objet);
197:
198: return;
199: }
200:
201:
202: /*
203: ================================================================================
204: Fonction 'dgtiz'
205: ================================================================================
206: Entrées : pointeur sur une structure struct_processus
207: --------------------------------------------------------------------------------
208: Sorties :
209: --------------------------------------------------------------------------------
210: Effets de bord : néant
211: ================================================================================
212: */
213:
214: void
215: instruction_dgtiz(struct_processus *s_etat_processus)
216: {
217: (*s_etat_processus).erreur_execution = d_ex;
218:
219: if ((*s_etat_processus).affichage_arguments == 'Y')
220: {
221: printf("\n DGTIZ ");
222:
223: if ((*s_etat_processus).langue == 'F')
224: {
225: printf("(mouse support in plot functions)\n\n");
226: printf(" Aucun argument\n");
227: }
228: else
229: {
230: printf("(support de la souris dans les fonctions graphiques)\n\n");
231: printf(" No argument\n");
232: }
233:
234: return;
235: }
236: else if ((*s_etat_processus).test_instruction == 'Y')
237: {
238: (*s_etat_processus).nombre_arguments = -1;
239: return;
240: }
241:
242: if (test_cfsf(s_etat_processus, 31) == d_vrai)
243: {
244: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
245: {
246: return;
247: }
248: }
249:
250: if ((*s_etat_processus).fichiers_graphiques != NULL)
251: {
252: (*s_etat_processus).souris_active = d_vrai;
253: appel_gnuplot(s_etat_processus, 'N');
254: (*s_etat_processus).souris_active = d_faux;
255: }
256:
257: return;
258: }
259:
260:
261: /*
262: ================================================================================
263: Fonction 'daemonize'
264: ================================================================================
265: Entrées : pointeur sur une structure struct_processus
266: --------------------------------------------------------------------------------
267: Sorties :
268: --------------------------------------------------------------------------------
269: Effets de bord : néant
270: ================================================================================
271: */
272:
273: void
274: instruction_daemonize(struct_processus *s_etat_processus)
275: {
276: (*s_etat_processus).erreur_execution = d_ex;
277:
278: if ((*s_etat_processus).affichage_arguments == 'Y')
279: {
280: printf("\n DAEMONIZE ");
281:
282: if ((*s_etat_processus).langue == 'F')
283: {
284: printf("(basculement en mode daemon)\n\n");
285: printf(" Aucun argument\n");
286: }
287: else
288: {
289: printf("(convert to daemon)\n\n");
290: printf(" No argument\n");
291: }
292:
293: return;
294: }
295: else if ((*s_etat_processus).test_instruction == 'Y')
296: {
297: (*s_etat_processus).nombre_arguments = -1;
298: return;
299: }
300:
301: if (test_cfsf(s_etat_processus, 31) == d_vrai)
302: {
303: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
304: {
305: return;
306: }
307: }
308:
309: if (((*s_etat_processus).var_volatile_processus_pere == -1) &&
310: ((*s_etat_processus).l_base_pile_processus == NULL))
311: {
312: lancement_daemon(s_etat_processus);
313: }
314: else
315: {
316: (*s_etat_processus).erreur_execution = d_ex_daemon;
317: return;
318: }
319:
320: return;
321: }
322:
323:
324: /*
325: ================================================================================
326: Fonction 'diag->'
327: ================================================================================
328: Entrées : pointeur sur une structure struct_processus
329: --------------------------------------------------------------------------------
330: Sorties :
331: --------------------------------------------------------------------------------
332: Effets de bord : néant
333: ================================================================================
334: */
335:
336: void
337: instruction_diag_fleche(struct_processus *s_etat_processus)
338: {
339: struct_objet *s_objet_argument;
340: struct_objet *s_objet_resultat;
341:
342: unsigned long i;
343: unsigned long j;
344:
345: (*s_etat_processus).erreur_execution = d_ex;
346:
347: if ((*s_etat_processus).affichage_arguments == 'Y')
348: {
349: printf("\n DIAG-> ");
350:
351: if ((*s_etat_processus).langue == 'F')
352: {
353: printf("(conversion d'une matrice diagonale en vecteur)\n\n");
354: }
355: else
356: {
357: printf("(diagonal matrix to vector conversion)\n\n");
358: }
359:
360: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
361: printf("-> 1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
362:
363: return;
364: }
365: else if ((*s_etat_processus).test_instruction == 'Y')
366: {
367: (*s_etat_processus).nombre_arguments = -1;
368: return;
369: }
370:
371: if (test_cfsf(s_etat_processus, 31) == d_vrai)
372: {
373: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
374: {
375: return;
376: }
377: }
378:
379: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
380: &s_objet_argument) == d_erreur)
381: {
382: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
383: return;
384: }
385:
386: /*
387: * Conversion d'une matrice
388: */
389:
390: if ((*s_objet_argument).type == MIN)
391: {
392: if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes !=
393: (*((struct_matrice *) (*s_objet_argument).objet))
394: .nombre_colonnes)
395: {
396: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
397:
398: liberation(s_etat_processus, s_objet_argument);
399: return;
400: }
401:
402: if ((s_objet_resultat = allocation(s_etat_processus, VIN)) == NULL)
403: {
404: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
405: return;
406: }
407:
408: (*((struct_vecteur *) (*s_objet_resultat).objet)).taille =
409: (*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes;
410:
411: if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau
412: = malloc((*((struct_vecteur *) (*s_objet_resultat).objet))
413: .taille * sizeof(integer8))) == NULL)
414: {
415: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
416: return;
417: }
418:
419: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
420: .nombre_lignes; i++)
421: {
422: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
423: .nombre_colonnes; j++)
424: {
425: if (i != j)
426: {
427: if (((integer8 **) (*((struct_matrice *) (*s_objet_argument)
428: .objet)).tableau)[i][j] != 0)
429: {
430: liberation(s_etat_processus, s_objet_argument);
431: liberation(s_etat_processus, s_objet_resultat);
432:
433: (*s_etat_processus).erreur_execution =
434: d_ex_matrice_non_diagonale;
435: return;
436: }
437: }
438: else
439: {
440: ((integer8 *) (*((struct_vecteur *) (*s_objet_resultat)
441: .objet)).tableau)[i] = ((integer8 **)
442: (*((struct_matrice *) (*s_objet_argument)
443: .objet)).tableau)[i][j];
444: }
445: }
446: }
447: }
448: else if ((*s_objet_argument).type == MRL)
449: {
450: if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes !=
451: (*((struct_matrice *) (*s_objet_argument).objet))
452: .nombre_colonnes)
453: {
454: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
455:
456: liberation(s_etat_processus, s_objet_argument);
457: return;
458: }
459:
460: if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL)
461: {
462: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
463: return;
464: }
465:
466: (*((struct_vecteur *) (*s_objet_resultat).objet)).taille =
467: (*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes;
468:
469: if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau
470: = malloc((*((struct_vecteur *) (*s_objet_resultat).objet))
471: .taille * sizeof(real8))) == NULL)
472: {
473: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
474: return;
475: }
476:
477: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
478: .nombre_lignes; i++)
479: {
480: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
481: .nombre_colonnes; j++)
482: {
483: if (i != j)
484: {
485: if (((real8 **) (*((struct_matrice *) (*s_objet_argument)
486: .objet)).tableau)[i][j] != 0)
487: {
488: liberation(s_etat_processus, s_objet_argument);
489: liberation(s_etat_processus, s_objet_resultat);
490:
491: (*s_etat_processus).erreur_execution =
492: d_ex_matrice_non_diagonale;
493: return;
494: }
495: }
496: else
497: {
498: ((real8 *) (*((struct_vecteur *) (*s_objet_resultat)
499: .objet)).tableau)[i] = ((real8 **)
500: (*((struct_matrice *) (*s_objet_argument)
501: .objet)).tableau)[i][j];
502: }
503: }
504: }
505: }
506: else if ((*s_objet_argument).type == MCX)
507: {
508: if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes !=
509: (*((struct_matrice *) (*s_objet_argument).objet))
510: .nombre_colonnes)
511: {
512: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
513:
514: liberation(s_etat_processus, s_objet_argument);
515: return;
516: }
517:
518: if ((s_objet_resultat = allocation(s_etat_processus, VCX)) == NULL)
519: {
520: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
521: return;
522: }
523:
524: (*((struct_vecteur *) (*s_objet_resultat).objet)).taille =
525: (*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes;
526:
527: if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau
528: = malloc((*((struct_vecteur *) (*s_objet_resultat).objet))
529: .taille * sizeof(complex16))) == NULL)
530: {
531: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
532: return;
533: }
534:
535: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet))
536: .nombre_lignes; i++)
537: {
538: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet))
539: .nombre_colonnes; j++)
540: {
541: if (i != j)
542: {
543: if ((((complex16 **) (*((struct_matrice *)
544: (*s_objet_argument).objet)).tableau)[i][j]
545: .partie_reelle != 0) ||
546: (((complex16 **) (*((struct_matrice *)
547: (*s_objet_argument).objet)).tableau)[i][j]
548: .partie_imaginaire != 0))
549: {
550: liberation(s_etat_processus, s_objet_argument);
551: liberation(s_etat_processus, s_objet_resultat);
552:
553: (*s_etat_processus).erreur_execution =
554: d_ex_matrice_non_diagonale;
555: return;
556: }
557: }
558: else
559: {
560: ((complex16 *) (*((struct_vecteur *) (*s_objet_resultat)
561: .objet)).tableau)[i] = ((complex16 **)
562: (*((struct_matrice *) (*s_objet_argument)
563: .objet)).tableau)[i][j];
564: }
565: }
566: }
567: }
568:
569: /*
570: * Conversion impossible impossible
571: */
572:
573: else
574: {
575: liberation(s_etat_processus, s_objet_argument);
576:
577: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
578: return;
579: }
580:
581: liberation(s_etat_processus, s_objet_argument);
582:
583: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
584: s_objet_resultat) == d_erreur)
585: {
586: return;
587: }
588:
589: return;
590: }
591:
592:
593: /*
594: ================================================================================
595: Fonction 'digest'
596: ================================================================================
597: Entrées : pointeur sur une structure struct_processus
598: --------------------------------------------------------------------------------
599: Sorties :
600: --------------------------------------------------------------------------------
601: Effets de bord : néant
602: ================================================================================
603: */
604:
605: void
606: instruction_digest(struct_processus *s_etat_processus)
607: {
608: EVP_MD_CTX contexte;
609:
610: const EVP_MD * (*EVP_sum)();
611:
612: logical1 somme_invalide;
613:
614: long i;
615: long longueur_chaine;
616:
617: struct_liste_chainee *l_element_courant;
618:
619: struct_objet *s_objet_argument_1;
620: struct_objet *s_objet_argument_2;
621: struct_objet *s_objet_resultat;
622:
623: unsigned char *chaine;
624: unsigned char *clef;
625: unsigned char *fonction;
626: unsigned char somme[EVP_MAX_MD_SIZE];
627: unsigned char *tampon;
628:
629: unsigned int longueur_bloc;
630: unsigned int longueur_somme;
631: unsigned int longueur_tampon;
632:
633: unsigned long longueur_clef;
634:
635: (*s_etat_processus).erreur_execution = d_ex;
636:
637: if ((*s_etat_processus).affichage_arguments == 'Y')
638: {
639: printf("\n DIGEST ");
640:
641: if ((*s_etat_processus).langue == 'F')
642: {
643: printf("(somme d'authentification)\n\n");
644: }
645: else
646: {
647: printf("(hash algorithm)\n\n");
648: }
649:
650: printf(" 2: %s\n", d_CHN);
651: printf(" 1: %s\n", d_CHN);
652: printf("-> 1: %s\n\n", d_CHN);
653:
654: printf(" 2: %s\n", d_CHN);
655: printf(" 1: %s\n", d_LST);
656: printf("-> 1: %s\n\n", d_CHN);
657:
658: if ((*s_etat_processus).langue == 'F')
659: {
660: printf(" Algorithmes :\n\n");
661: }
662: else
663: {
664: printf(" Algorithms:\n\n");
665: }
666:
667: # ifndef OPENSSL_NO_SHA
668: printf(" - DSS\n");
669: printf(" - DSS1\n");
670: printf(" - ECDSA\n");
671: # endif
672: # ifndef OPENSSL_NO_MD2
673: printf(" - MD2\n");
674: # endif
675: # ifndef OPENSSL_NO_MD4
676: printf(" - MD4\n");
677: # endif
678: # ifndef OPENSSL_NO_MD5
679: printf(" - MD5\n");
680: # endif
681: # ifndef OPENSSL_NO_MDC2
682: printf(" - MDC2\n");
683: # endif
684: # ifndef OPENSSL_NO_RIPEMD
685: printf(" - RIPEMD160\n");
686: # endif
687: # ifndef OPENSSL_NO_SHA
688: printf(" - SHA\n");
689: printf(" - SHA1\n");
690: # endif
691: # ifndef OPENSSL_NO_SHA256
692: printf(" - SHA224\n");
693: printf(" - SHA256\n");
694: # endif
695: # ifndef OPENSSL_NO_SHA512
696: printf(" - SHA384\n");
697: printf(" - SHA512\n");
698: # endif
699: # ifndef OPENSSL_NO_WHIRLPOOL
700: printf(" - WHIRLPOOL\n");
701: # endif
702:
703: printf("\n");
704:
705: if ((*s_etat_processus).langue == 'F')
706: {
707: printf(" Utilisation :\n\n");
708: }
709: else
710: {
711: printf(" Usage:\n\n");
712: }
713:
714: printf(" \"text\" \"MD5\" DIGEST\n");
715: printf(" \"text\" { \"SHA384\" \"key\" } DIGEST\n");
716: printf(" \"text\" { \"AES-CBC\" \"key\" } DIGEST\n");
717: return;
718: }
719: else if ((*s_etat_processus).test_instruction == 'Y')
720: {
721: (*s_etat_processus).nombre_arguments = -1;
722: return;
723: }
724:
725: if (test_cfsf(s_etat_processus, 31) == d_vrai)
726: {
727: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
728: {
729: return;
730: }
731: }
732:
733: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
734: &s_objet_argument_1) == d_erreur)
735: {
736: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
737: return;
738: }
739:
740: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
741: &s_objet_argument_2) == d_erreur)
742: {
743: liberation(s_etat_processus, s_objet_argument_1);
744:
745: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
746: return;
747: }
748:
749: if (((*s_objet_argument_1).type == CHN) &&
750: ((*s_objet_argument_2).type == CHN))
751: {
752: // Liste des sommes disponibles :
753: // - EVP_dss
754: // - EVP_dss1
755: // - EVP_ecdsa
756: // - EVP_md2
757: // - EVP_md4
758: // - EVP_md5
759: // - EVP_mdc2
760: // - EVP_ripemd160
761: // - EVP_sha
762: // - EVP_sha1
763: // - EVP_sha224
764: // - EVP_sha256
765: // - EVP_sha384
766: // - EVP_sha512
767: // - EVP_whirlpool
768:
769: if ((fonction = conversion_majuscule((unsigned char *)
770: (*s_objet_argument_1).objet)) == NULL)
771: {
772: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
773: return;
774: }
775:
776: somme_invalide = d_faux;
777:
778: switch(fonction[0])
779: {
780: case 'D':
781: {
782: switch(fonction[1])
783: {
784: case 'S': // ds
785: {
786: switch(fonction[2])
787: {
788: # ifndef OPENSSL_NO_SHA
789: case 'S': // dss
790: {
791: switch(fonction[3])
792: {
793: case d_code_fin_chaine:
794: {
795: EVP_sum = EVP_dss;
796: break;
797: }
798:
799: case '1': // dss1
800: {
801: if (fonction[4] == d_code_fin_chaine)
802: {
803: EVP_sum = EVP_dss1;
804: }
805: else
806: {
807: somme_invalide = d_vrai;
808: }
809:
810: break;
811: }
812:
813: default:
814: {
815: somme_invalide = d_vrai;
816: break;
817: }
818: }
819:
820: break;
821: }
822: # endif
823:
824: default:
825: {
826: somme_invalide = d_vrai;
827: break;
828: }
829: }
830:
831: break;
832: }
833:
834: default:
835: {
836: somme_invalide = d_vrai;
837: break;
838: }
839: }
840:
841: break;
842: }
843:
844: case 'E':
845: {
846: switch(fonction[1])
847: {
848: case 'C': // ec
849: {
850: switch(fonction[2])
851: {
852: case 'D': // ecd
853: {
854: switch(fonction[3])
855: {
856: case 'S': // ecds
857: {
858: switch(fonction[4])
859: {
860: # ifndef OPENSSL_NO_SHA
861: case 'A': // ecdsa
862: {
863: if (fonction[5] ==
864: d_code_fin_chaine)
865: {
866: EVP_sum = EVP_ecdsa;
867: }
868: else
869: {
870: somme_invalide = d_vrai;
871: }
872:
873: break;
874: }
875: # endif
876:
877: default:
878: {
879: somme_invalide = d_vrai;
880: break;
881: }
882: }
883:
884: break;
885: }
886:
887: default:
888: {
889: somme_invalide = d_vrai;
890: break;
891: }
892: }
893:
894: break;
895: }
896:
897: default:
898: {
899: somme_invalide = d_vrai;
900: break;
901: }
902: }
903:
904: break;
905: }
906:
907: default:
908: {
909: somme_invalide = d_vrai;
910: break;
911: }
912: }
913:
914: break;
915: }
916:
917: case 'M':
918: {
919: switch(fonction[1])
920: {
921: case 'D': // md
922: {
923: switch(fonction[2])
924: {
925: # ifndef OPENSSL_NO_MD2
926: case '2': // md2
927: {
928: if (fonction[3] == d_code_fin_chaine)
929: {
930: EVP_sum = EVP_md2;
931: }
932: else
933: {
934: somme_invalide = d_vrai;
935: }
936:
937: break;
938: }
939: # endif
940:
941: # ifndef OPENSSL_NO_MD4
942: case '4': // md4
943: {
944: if (fonction[3] == d_code_fin_chaine)
945: {
946: EVP_sum = EVP_md4;
947: }
948: else
949: {
950: somme_invalide = d_vrai;
951: }
952:
953: break;
954: }
955: # endif
956:
957: # ifndef OPENSSL_NO_MD5
958: case '5': // md5
959: {
960: if (fonction[3] == d_code_fin_chaine)
961: {
962: EVP_sum = EVP_md5;
963: }
964: else
965: {
966: somme_invalide = d_vrai;
967: }
968:
969: break;
970: }
971: # endif
972:
973: case 'C': // mdc
974: {
975: switch(fonction[3])
976: {
977: # ifndef OPENSSL_NO_MDC2
978: case '2': // mdc2
979: {
980: if (fonction[4] == d_code_fin_chaine)
981: {
982: EVP_sum = EVP_mdc2;
983: }
984: else
985: {
986: somme_invalide = d_vrai;
987: }
988:
989: break;
990: }
991: # endif
992:
993: default:
994: {
995: somme_invalide = d_vrai;
996: break;
997: }
998: }
999:
1000: break;
1001: }
1002:
1003: default:
1004: {
1005: somme_invalide = d_vrai;
1006: break;
1007: }
1008: }
1009:
1010: break;
1011: }
1012:
1013: default:
1014: {
1015: somme_invalide = d_vrai;
1016: break;
1017: }
1018: }
1019:
1020: break;
1021: }
1022:
1023: # ifndef OPENSSL_NO_RIPEMD
1024: case 'R':
1025: {
1026: if (strcmp(fonction, "RIPEMD160") == 0)
1027: {
1028: EVP_sum = EVP_ripemd160;
1029: }
1030: else
1031: {
1032: somme_invalide = d_vrai;
1033: }
1034:
1035: break;
1036: }
1037: # endif
1038:
1039: case 'S':
1040: {
1041: switch(fonction[1])
1042: {
1043: case 'H': // sh
1044: {
1045: switch(fonction[2])
1046: {
1047: # ifndef OPENSSL_NO_SHA
1048: case 'A':
1049: {
1050: switch(fonction[3])
1051: {
1052: case d_code_fin_chaine:
1053: {
1054: EVP_sum = EVP_sha;
1055: break;
1056: }
1057:
1058: case '1': // sha1
1059: {
1060: if (fonction[4] == d_code_fin_chaine)
1061: {
1062: EVP_sum = EVP_sha1;
1063: }
1064: else
1065: {
1066: somme_invalide = d_vrai;
1067: }
1068:
1069: break;
1070: }
1071:
1072: # ifndef OPENSSL_NO_SHA256
1073: case '2': // sha2
1074: {
1075: switch(fonction[4])
1076: {
1077: case '2': // sha22
1078: {
1079: switch(fonction[5])
1080: {
1081: case '4': // sha224
1082: {
1083: if (fonction[6] ==
1084: d_code_fin_chaine)
1085: {
1086: EVP_sum =
1087: EVP_sha224;
1088: }
1089: else
1090: {
1091: somme_invalide =
1092: d_vrai;
1093: }
1094:
1095: break;
1096: }
1097:
1098: default:
1099: {
1100: somme_invalide = d_vrai;
1101: break;
1102: }
1103: }
1104:
1105: break;
1106: }
1107:
1108: case '5':
1109: {
1110: switch(fonction[5])
1111: {
1112: case '6': // sha256
1113: {
1114: if (fonction[6] ==
1115: d_code_fin_chaine)
1116: {
1117: EVP_sum =
1118: EVP_sha256;
1119: }
1120: else
1121: {
1122: somme_invalide =
1123: d_vrai;
1124: }
1125:
1126: break;
1127: }
1128:
1129: default:
1130: {
1131: somme_invalide = d_vrai;
1132: break;
1133: }
1134: }
1135:
1136: break;
1137: }
1138:
1139: default:
1140: {
1141: somme_invalide = d_vrai;
1142: break;
1143: }
1144: }
1145:
1146: break;
1147: }
1148: # endif
1149:
1150: # ifndef OPENSSL_NO_SHA512
1151: case '3': // sha3
1152: {
1153: switch(fonction[4])
1154: {
1155: case '8': // sha38
1156: {
1157: switch(fonction[5])
1158: {
1159: case '4': // sha384
1160: {
1161: if (fonction[6] ==
1162: d_code_fin_chaine)
1163: {
1164: EVP_sum =
1165: EVP_sha384;
1166: }
1167: else
1168: {
1169: somme_invalide =
1170: d_vrai;
1171: }
1172:
1173: break;
1174: }
1175:
1176: default:
1177: {
1178: somme_invalide = d_vrai;
1179: break;
1180: }
1181: }
1182:
1183: break;
1184: }
1185:
1186: default:
1187: {
1188: somme_invalide = d_vrai;
1189: break;
1190: }
1191: }
1192:
1193: break;
1194: }
1195:
1196: case '5': // sha5
1197: {
1198: switch(fonction[4])
1199: {
1200: case '1': // sha51
1201: {
1202: switch(fonction[5])
1203: {
1204: case '2': // sha512
1205: {
1206: if (fonction[6] ==
1207: d_code_fin_chaine)
1208: {
1209: EVP_sum =
1210: EVP_sha512;
1211: }
1212: else
1213: {
1214: somme_invalide =
1215: d_vrai;
1216: }
1217:
1218: break;
1219: }
1220:
1221: default:
1222: {
1223: somme_invalide = d_vrai;
1224: break;
1225: }
1226: }
1227:
1228: break;
1229: }
1230:
1231: default:
1232: {
1233: somme_invalide = d_vrai;
1234: break;
1235: }
1236: }
1237:
1238: break;
1239: }
1240: # endif
1241:
1242: default:
1243: {
1244: somme_invalide = d_vrai;
1245: break;
1246: }
1247: }
1248:
1249: break;
1250: }
1251: # endif
1252:
1253: default:
1254: {
1255: somme_invalide = d_vrai;
1256: break;
1257: }
1258: }
1259:
1260: break;
1261: }
1262:
1263: default:
1264: {
1265: somme_invalide = d_vrai;
1266: break;
1267: }
1268: }
1269:
1270: break;
1271: }
1272:
1273: # ifndef OPENSSL_NO_WHIRLPOOL
1274: case 'W':
1275: {
1276: if (strcmp(fonction, "WHIRLPOOL") == 0)
1277: {
1278: EVP_sum = EVP_whirlpool;
1279: }
1280: else
1281: {
1282: somme_invalide = d_vrai;
1283: }
1284:
1285: break;
1286: }
1287: # endif
1288:
1289: default:
1290: {
1291: somme_invalide = d_vrai;
1292: break;
1293: }
1294: }
1295:
1296: free(fonction);
1297:
1298: if (somme_invalide == d_vrai)
1299: {
1300: liberation(s_etat_processus, s_objet_argument_1);
1301: liberation(s_etat_processus, s_objet_argument_2);
1302:
1303: (*s_etat_processus).erreur_execution =
1304: d_ex_chiffrement_indisponible;
1305: return;
1306: }
1307:
1308: if (EVP_DigestInit(&contexte, EVP_sum()) != 1)
1309: {
1310: EVP_MD_CTX_cleanup(&contexte);
1311:
1312: liberation(s_etat_processus, s_objet_argument_1);
1313: liberation(s_etat_processus, s_objet_argument_2);
1314:
1315: (*s_etat_processus).erreur_execution = d_ex_chiffrement;
1316: return;
1317: }
1318:
1319: if ((chaine = formateur_flux(s_etat_processus, (unsigned char *)
1320: (*s_objet_argument_2).objet, &longueur_chaine)) == NULL)
1321: {
1322: EVP_MD_CTX_cleanup(&contexte);
1323:
1324: liberation(s_etat_processus, s_objet_argument_1);
1325: liberation(s_etat_processus, s_objet_argument_2);
1326:
1327: return;
1328: }
1329:
1330: if (EVP_DigestUpdate(&contexte, chaine, longueur_chaine) != 1)
1331: {
1332: free(chaine);
1333: EVP_MD_CTX_cleanup(&contexte);
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 = d_ex_chiffrement;
1339: return;
1340: }
1341:
1342: if (EVP_DigestFinal_ex(&contexte, somme, &longueur_somme) != 1)
1343: {
1344: free(chaine);
1345: EVP_MD_CTX_cleanup(&contexte);
1346:
1347: liberation(s_etat_processus, s_objet_argument_1);
1348: liberation(s_etat_processus, s_objet_argument_2);
1349:
1350: (*s_etat_processus).erreur_execution = d_ex_chiffrement;
1351: return;
1352: }
1353:
1354: free(chaine);
1355: EVP_MD_CTX_cleanup(&contexte);
1356:
1357: if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
1358: {
1359: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1360: return;
1361: }
1362:
1363: if (((*s_objet_resultat).objet = analyse_flux(s_etat_processus,
1364: somme, longueur_somme)) == NULL)
1365: {
1366: liberation(s_etat_processus, s_objet_argument_1);
1367: liberation(s_etat_processus, s_objet_argument_2);
1368:
1369: return;
1370: }
1371: }
1372: else if (((*s_objet_argument_1).type == LST) &&
1373: ((*s_objet_argument_2).type == CHN))
1374: {
1375: l_element_courant = (*s_objet_argument_1).objet;
1376:
1377: if ((*(*l_element_courant).donnee).type != CHN)
1378: {
1379: liberation(s_etat_processus, s_objet_argument_1);
1380: liberation(s_etat_processus, s_objet_argument_2);
1381:
1382: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1383: return;
1384: }
1385:
1386: l_element_courant = (*l_element_courant).suivant;
1387:
1388: if (l_element_courant == NULL)
1389: {
1390: liberation(s_etat_processus, s_objet_argument_1);
1391: liberation(s_etat_processus, s_objet_argument_2);
1392:
1393: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1394: return;
1395: }
1396:
1397: if ((*(*l_element_courant).donnee).type != CHN)
1398: {
1399: liberation(s_etat_processus, s_objet_argument_1);
1400: liberation(s_etat_processus, s_objet_argument_2);
1401:
1402: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1403: return;
1404: }
1405:
1406: if ((*l_element_courant).suivant != NULL)
1407: {
1408: liberation(s_etat_processus, s_objet_argument_1);
1409: liberation(s_etat_processus, s_objet_argument_2);
1410:
1411: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1412: return;
1413: }
1414:
1415: // Test du type de somme de contrôle
1416: // - les sommes classiques suivent la RFC 2104
1417: // - les autres sont formées sur des algorithmes de type CBC
1418:
1419: l_element_courant = (*s_objet_argument_1).objet;
1420:
1421: if ((fonction = conversion_majuscule((unsigned char *)
1422: (*(*l_element_courant).donnee).objet)) == NULL)
1423: {
1424: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1425: return;
1426: }
1427:
1428: somme_invalide = d_faux;
1429:
1430: switch(fonction[0])
1431: {
1432: case 'D':
1433: {
1434: switch(fonction[1])
1435: {
1436: case 'S': // ds
1437: {
1438: switch(fonction[2])
1439: {
1440: # ifndef OPENSSL_NO_SHA
1441: case 'S': // dss
1442: {
1443: switch(fonction[3])
1444: {
1445: case d_code_fin_chaine:
1446: {
1447: EVP_sum = EVP_dss;
1448: longueur_bloc = SHA_CBLOCK;
1449: break;
1450: }
1451:
1452: case '1': // dss1
1453: {
1454: if (fonction[4] == d_code_fin_chaine)
1455: {
1456: EVP_sum = EVP_dss1;
1457: longueur_bloc = SHA_CBLOCK;
1458: }
1459: else
1460: {
1461: somme_invalide = d_vrai;
1462: }
1463:
1464: break;
1465: }
1466:
1467: default:
1468: {
1469: somme_invalide = d_vrai;
1470: break;
1471: }
1472: }
1473:
1474: break;
1475: }
1476: # endif
1477:
1478: default:
1479: {
1480: somme_invalide = d_vrai;
1481: break;
1482: }
1483: }
1484:
1485: break;
1486: }
1487:
1488: default:
1489: {
1490: somme_invalide = d_vrai;
1491: break;
1492: }
1493: }
1494:
1495: break;
1496: }
1497:
1498: case 'E':
1499: {
1500: switch(fonction[1])
1501: {
1502: case 'C': // ec
1503: {
1504: switch(fonction[2])
1505: {
1506: case 'D': // ecd
1507: {
1508: switch(fonction[3])
1509: {
1510: case 'S': // ecds
1511: {
1512: switch(fonction[4])
1513: {
1514: # ifndef OPENSSL_NO_SHA
1515: case 'A': // ecdsa
1516: {
1517: if (fonction[5] ==
1518: d_code_fin_chaine)
1519: {
1520: EVP_sum = EVP_ecdsa;
1521: longueur_bloc = SHA_CBLOCK;
1522: }
1523: else
1524: {
1525: somme_invalide = d_vrai;
1526: }
1527:
1528: break;
1529: }
1530: # endif
1531:
1532: default:
1533: {
1534: somme_invalide = d_vrai;
1535: break;
1536: }
1537: }
1538:
1539: break;
1540: }
1541:
1542: default:
1543: {
1544: somme_invalide = d_vrai;
1545: break;
1546: }
1547: }
1548:
1549: break;
1550: }
1551:
1552: default:
1553: {
1554: somme_invalide = d_vrai;
1555: break;
1556: }
1557: }
1558:
1559: break;
1560: }
1561:
1562: default:
1563: {
1564: somme_invalide = d_vrai;
1565: break;
1566: }
1567: }
1568:
1569: break;
1570: }
1571:
1572: case 'M':
1573: {
1574: switch(fonction[1])
1575: {
1576: case 'D': // md
1577: {
1578: switch(fonction[2])
1579: {
1580: # ifndef OPENSSL_NO_MD2
1581: case '2': // md2
1582: {
1583: if (fonction[3] == d_code_fin_chaine)
1584: {
1585: EVP_sum = EVP_md2;
1586: longueur_bloc = MD2_BLOCK;
1587: }
1588: else
1589: {
1590: somme_invalide = d_vrai;
1591: }
1592:
1593: break;
1594: }
1595: # endif
1596:
1597: # ifndef OPENSSL_NO_MD4
1598: case '4': // md4
1599: {
1600: if (fonction[3] == d_code_fin_chaine)
1601: {
1602: EVP_sum = EVP_md4;
1603: longueur_bloc = MD4_CBLOCK;
1604: }
1605: else
1606: {
1607: somme_invalide = d_vrai;
1608: }
1609:
1610: break;
1611: }
1612: # endif
1613:
1614: # ifndef OPENSSL_NO_MD5
1615: case '5': // md5
1616: {
1617: if (fonction[3] == d_code_fin_chaine)
1618: {
1619: EVP_sum = EVP_md5;
1620: longueur_bloc = MD5_CBLOCK;
1621: }
1622: else
1623: {
1624: somme_invalide = d_vrai;
1625: }
1626:
1627: break;
1628: }
1629: # endif
1630:
1631: case 'C': // mdc
1632: {
1633: switch(fonction[3])
1634: {
1635: # ifndef OPENSSL_NO_MDC2
1636: case '2': // mdc2
1637: {
1638: if (fonction[4] == d_code_fin_chaine)
1639: {
1640: EVP_sum = EVP_mdc2;
1641: longueur_bloc = MDC2_BLOCK;
1642: }
1643: else
1644: {
1645: somme_invalide = d_vrai;
1646: }
1647:
1648: break;
1649: }
1650: # endif
1651:
1652: default:
1653: {
1654: somme_invalide = d_vrai;
1655: break;
1656: }
1657: }
1658:
1659: break;
1660: }
1661:
1662: default:
1663: {
1664: somme_invalide = d_vrai;
1665: break;
1666: }
1667: }
1668:
1669: break;
1670: }
1671:
1672: default:
1673: {
1674: somme_invalide = d_vrai;
1675: break;
1676: }
1677: }
1678:
1679: break;
1680: }
1681:
1682: # ifndef OPENSSL_NO_RIPEMD
1683: case 'R':
1684: {
1685: if (strcmp(fonction, "RIPEMD160") == 0)
1686: {
1687: EVP_sum = EVP_ripemd160;
1688: longueur_bloc = RIPEMD160_CBLOCK;
1689: }
1690: else
1691: {
1692: somme_invalide = d_vrai;
1693: }
1694:
1695: break;
1696: }
1697: # endif
1698:
1699: case 'S':
1700: {
1701: switch(fonction[1])
1702: {
1703: case 'H': // sh
1704: {
1705: switch(fonction[2])
1706: {
1707: # ifndef OPENSSL_NO_SHA
1708: case 'A':
1709: {
1710: switch(fonction[3])
1711: {
1712: case d_code_fin_chaine:
1713: {
1714: EVP_sum = EVP_sha;
1715: longueur_bloc = SHA_CBLOCK;
1716: break;
1717: }
1718:
1719: case '1': // sha1
1720: {
1721: if (fonction[4] == d_code_fin_chaine)
1722: {
1723: EVP_sum = EVP_sha1;
1724: longueur_bloc = SHA_CBLOCK;
1725: }
1726: else
1727: {
1728: somme_invalide = d_vrai;
1729: }
1730:
1731: break;
1732: }
1733:
1734: # ifndef OPENSSL_NO_SHA256
1735: case '2': // sha2
1736: {
1737: switch(fonction[4])
1738: {
1739: case '2': // sha22
1740: {
1741: switch(fonction[5])
1742: {
1743: case '4': // sha224
1744: {
1745: if (fonction[6] ==
1746: d_code_fin_chaine)
1747: {
1748: EVP_sum =
1749: EVP_sha224;
1750: longueur_bloc =
1751: SHA256_CBLOCK;
1752: }
1753: else
1754: {
1755: somme_invalide =
1756: d_vrai;
1757: }
1758:
1759: break;
1760: }
1761:
1762: default:
1763: {
1764: somme_invalide = d_vrai;
1765: break;
1766: }
1767: }
1768:
1769: break;
1770: }
1771:
1772: case '5':
1773: {
1774: switch(fonction[5])
1775: {
1776: case '6': // sha256
1777: {
1778: if (fonction[6] ==
1779: d_code_fin_chaine)
1780: {
1781: EVP_sum =
1782: EVP_sha256;
1783: longueur_bloc =
1784: SHA256_CBLOCK;
1785: }
1786: else
1787: {
1788: somme_invalide =
1789: d_vrai;
1790: }
1791:
1792: break;
1793: }
1794:
1795: default:
1796: {
1797: somme_invalide = d_vrai;
1798: break;
1799: }
1800: }
1801:
1802: break;
1803: }
1804:
1805: default:
1806: {
1807: somme_invalide = d_vrai;
1808: break;
1809: }
1810: }
1811:
1812: break;
1813: }
1814: # endif
1815:
1816: # ifndef OPENSSL_NO_SHA512
1817: case '3': // sha3
1818: {
1819: switch(fonction[4])
1820: {
1821: case '8': // sha38
1822: {
1823: switch(fonction[5])
1824: {
1825: case '4': // sha384
1826: {
1827: if (fonction[6] ==
1828: d_code_fin_chaine)
1829: {
1830: EVP_sum =
1831: EVP_sha384;
1832: longueur_bloc =
1833: SHA512_CBLOCK;
1834: }
1835: else
1836: {
1837: somme_invalide =
1838: d_vrai;
1839: }
1840:
1841: break;
1842: }
1843:
1844: default:
1845: {
1846: somme_invalide = d_vrai;
1847: break;
1848: }
1849: }
1850:
1851: break;
1852: }
1853:
1854: default:
1855: {
1856: somme_invalide = d_vrai;
1857: break;
1858: }
1859: }
1860:
1861: break;
1862: }
1863:
1864: case '5': // sha5
1865: {
1866: switch(fonction[4])
1867: {
1868: case '1': // sha51
1869: {
1870: switch(fonction[5])
1871: {
1872: case '2': // sha512
1873: {
1874: if (fonction[6] ==
1875: d_code_fin_chaine)
1876: {
1877: EVP_sum =
1878: EVP_sha512;
1879: longueur_bloc =
1880: SHA512_CBLOCK;
1881: }
1882: else
1883: {
1884: somme_invalide =
1885: d_vrai;
1886: }
1887:
1888: break;
1889: }
1890:
1891: default:
1892: {
1893: somme_invalide = d_vrai;
1894: break;
1895: }
1896: }
1897:
1898: break;
1899: }
1900:
1901: default:
1902: {
1903: somme_invalide = d_vrai;
1904: break;
1905: }
1906: }
1907:
1908: break;
1909: }
1910: # endif
1911:
1912: default:
1913: {
1914: somme_invalide = d_vrai;
1915: break;
1916: }
1917: }
1918:
1919: break;
1920: }
1921: # endif
1922:
1923: default:
1924: {
1925: somme_invalide = d_vrai;
1926: break;
1927: }
1928: }
1929:
1930: break;
1931: }
1932:
1933: default:
1934: {
1935: somme_invalide = d_vrai;
1936: break;
1937: }
1938: }
1939:
1940: break;
1941: }
1942:
1943: # ifndef OPENSSL_NO_WHIRLPOOL
1944: case 'W':
1945: {
1946: if (strcmp(fonction, "WHIRLPOOL") == 0)
1947: {
1948: EVP_sum = EVP_whirlpool;
1949: longueur_bloc = WHIRLPOOL_BBLOCK / 8;
1950: }
1951: else
1952: {
1953: somme_invalide = d_vrai;
1954: }
1955:
1956: break;
1957: }
1958: # endif
1959:
1960: default:
1961: {
1962: somme_invalide = d_vrai;
1963: break;
1964: }
1965: }
1966:
1967: free(fonction);
1968:
1969: if (somme_invalide == d_vrai)
1970: {
1971: // Le chiffrement est de type CBC-MAC
1972: BUG(1, uprintf("Oops!"));
1973: exit(0);
1974: }
1975: else
1976: {
1977: // Le chiffrement est de type HMAC
1978: // Le second élément de la chaîne contient la clef utilisée pour
1979: // la signature.
1980:
1981: l_element_courant = (*s_objet_argument_1).objet;
1982: l_element_courant = (*l_element_courant).suivant;
1983:
1984: if ((clef = formateur_flux(s_etat_processus, (unsigned char *)
1985: (*(*l_element_courant).donnee).objet, &longueur_clef))
1986: == NULL)
1987: {
1988: liberation(s_etat_processus, s_objet_argument_1);
1989: liberation(s_etat_processus, s_objet_argument_2);
1990: return;
1991: }
1992:
1993: if (longueur_clef < longueur_bloc)
1994: {
1995: longueur_tampon = longueur_clef;
1996: tampon = clef;
1997:
1998: if ((clef = malloc(longueur_bloc * sizeof(unsigned char)))
1999: == NULL)
2000: {
2001: (*s_etat_processus).erreur_systeme =
2002: d_es_allocation_memoire;
2003: return;
2004: }
2005:
2006: memset(clef, 0, longueur_bloc);
2007: memcpy(clef, tampon, longueur_tampon);
2008: longueur_clef = longueur_bloc;
2009: free(tampon);
2010: }
2011: else if (longueur_clef > longueur_bloc)
2012: {
2013: longueur_tampon = longueur_clef;
2014: tampon = clef;
2015:
2016: if ((clef = malloc(longueur_bloc * sizeof(unsigned char)))
2017: == NULL)
2018: {
2019: (*s_etat_processus).erreur_systeme =
2020: d_es_allocation_memoire;
2021: return;
2022: }
2023:
2024: memcpy(clef, tampon, longueur_bloc);
2025: longueur_clef = longueur_bloc;
2026: free(tampon);
2027: }
2028:
2029: for(i = 0; i < longueur_bloc; i++)
2030: {
2031: clef[i] ^= 0x36;
2032: }
2033:
2034: if ((chaine = formateur_flux(s_etat_processus, (unsigned char *)
2035: (*s_objet_argument_2).objet, &longueur_chaine)) == NULL)
2036: {
2037: EVP_MD_CTX_cleanup(&contexte);
2038:
2039: liberation(s_etat_processus, s_objet_argument_1);
2040: liberation(s_etat_processus, s_objet_argument_2);
2041:
2042: return;
2043: }
2044:
2045: if ((tampon = malloc((longueur_bloc + longueur_chaine) *
2046: sizeof(unsigned char))) == NULL)
2047: {
2048: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2049: return;
2050: }
2051:
2052: memcpy(tampon, clef, longueur_bloc);
2053: memcpy(tampon + longueur_bloc, chaine, longueur_chaine);
2054: longueur_tampon = longueur_bloc + longueur_chaine;
2055:
2056: if (EVP_DigestInit(&contexte, EVP_sum()) != 1)
2057: {
2058: free(tampon);
2059: free(clef);
2060: free(chaine);
2061:
2062: EVP_MD_CTX_cleanup(&contexte);
2063:
2064: liberation(s_etat_processus, s_objet_argument_1);
2065: liberation(s_etat_processus, s_objet_argument_2);
2066:
2067: (*s_etat_processus).erreur_execution = d_ex_chiffrement;
2068: return;
2069: }
2070:
2071: if (EVP_DigestUpdate(&contexte, tampon, longueur_tampon) != 1)
2072: {
2073: free(tampon);
2074: free(clef);
2075: free(chaine);
2076:
2077: EVP_MD_CTX_cleanup(&contexte);
2078:
2079: liberation(s_etat_processus, s_objet_argument_1);
2080: liberation(s_etat_processus, s_objet_argument_2);
2081:
2082: (*s_etat_processus).erreur_execution = d_ex_chiffrement;
2083: return;
2084: }
2085:
2086: free(tampon);
2087:
2088: if (EVP_DigestFinal_ex(&contexte, somme, &longueur_somme) != 1)
2089: {
2090: free(chaine);
2091: EVP_MD_CTX_cleanup(&contexte);
2092:
2093: liberation(s_etat_processus, s_objet_argument_1);
2094: liberation(s_etat_processus, s_objet_argument_2);
2095:
2096: (*s_etat_processus).erreur_execution = d_ex_chiffrement;
2097: return;
2098: }
2099:
2100: EVP_MD_CTX_cleanup(&contexte);
2101:
2102: for(i = 0; i < longueur_bloc; i++)
2103: {
2104: clef[i] ^= (0x36 ^ 0x5c);
2105: }
2106:
2107: if ((tampon = malloc((longueur_bloc + longueur_somme) *
2108: sizeof(unsigned char))) == NULL)
2109: {
2110: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2111: return;
2112: }
2113:
2114: memcpy(tampon, clef, longueur_bloc);
2115: memcpy(tampon + longueur_bloc, somme, longueur_somme);
2116: longueur_tampon = longueur_bloc + longueur_somme;
2117:
2118: if (EVP_DigestInit(&contexte, EVP_sum()) != 1)
2119: {
2120: free(tampon);
2121: free(clef);
2122: free(chaine);
2123:
2124: EVP_MD_CTX_cleanup(&contexte);
2125:
2126: liberation(s_etat_processus, s_objet_argument_1);
2127: liberation(s_etat_processus, s_objet_argument_2);
2128:
2129: (*s_etat_processus).erreur_execution = d_ex_chiffrement;
2130: return;
2131: }
2132:
2133: if (EVP_DigestUpdate(&contexte, tampon, longueur_tampon) != 1)
2134: {
2135: free(tampon);
2136: free(clef);
2137: free(chaine);
2138:
2139: EVP_MD_CTX_cleanup(&contexte);
2140:
2141: liberation(s_etat_processus, s_objet_argument_1);
2142: liberation(s_etat_processus, s_objet_argument_2);
2143:
2144: (*s_etat_processus).erreur_execution = d_ex_chiffrement;
2145: return;
2146: }
2147:
2148: free(tampon);
2149:
2150: if (EVP_DigestFinal_ex(&contexte, somme, &longueur_somme) != 1)
2151: {
2152: free(chaine);
2153: EVP_MD_CTX_cleanup(&contexte);
2154:
2155: liberation(s_etat_processus, s_objet_argument_1);
2156: liberation(s_etat_processus, s_objet_argument_2);
2157:
2158: (*s_etat_processus).erreur_execution = d_ex_chiffrement;
2159: return;
2160: }
2161:
2162: EVP_MD_CTX_cleanup(&contexte);
2163:
2164: free(chaine);
2165: free(clef);
2166:
2167: if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
2168: {
2169: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2170: return;
2171: }
2172:
2173: if (((*s_objet_resultat).objet = analyse_flux(s_etat_processus,
2174: somme, longueur_somme)) == NULL)
2175: {
2176: liberation(s_etat_processus, s_objet_argument_1);
2177: liberation(s_etat_processus, s_objet_argument_2);
2178:
2179: return;
2180: }
2181: }
2182: }
2183: else
2184: {
2185: liberation(s_etat_processus, s_objet_argument_1);
2186: liberation(s_etat_processus, s_objet_argument_2);
2187:
2188: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2189: return;
2190: }
2191:
2192: liberation(s_etat_processus, s_objet_argument_1);
2193: liberation(s_etat_processus, s_objet_argument_2);
2194:
2195: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2196: s_objet_resultat) == d_erreur)
2197: {
2198: return;
2199: }
2200:
2201: return;
2202: }
2203:
2204: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>