Annotation of rpl/src/instructions_d6.c, revision 1.40
1.1 bertrand 1: /*
2: ================================================================================
1.37 bertrand 3: RPL/2 (R) version 4.1.12
1.30 bertrand 4: Copyright (C) 1989-2012 Dr. BERTRAND Joël
1.1 bertrand 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:
1.11 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 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:
1.39 bertrand 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 longueur_chaine;
615:
616: struct_objet *s_objet_argument_1;
617: struct_objet *s_objet_argument_2;
618: struct_objet *s_objet_resultat;
619:
620: unsigned char *chaine;
621: unsigned char *fonction;
622: unsigned char somme[EVP_MAX_MD_SIZE];
623:
624: unsigned int longueur_somme;
625:
626: (*s_etat_processus).erreur_execution = d_ex;
627:
628: if ((*s_etat_processus).affichage_arguments == 'Y')
629: {
630: printf("\n DIGEST ");
631:
632: if ((*s_etat_processus).langue == 'F')
633: {
634: printf("(somme d'authentification)\n\n");
635: }
636: else
637: {
638: printf("(hash algorithm)\n\n");
639: }
640:
641: printf(" 2: %s\n", d_CHN);
642: printf(" 1: %s\n", d_CHN);
643: printf("-> 1: %s\n\n", d_CHN);
644:
645: printf(" 2: %s\n", d_CHN);
646: printf(" 1: %s\n", d_LST);
647: printf("-> 1: %s\n\n", d_CHN);
648:
649: if ((*s_etat_processus).langue == 'F')
650: {
651: printf(" Algorithmes :\n\n");
652: }
653: else
654: {
655: printf(" Algorithms:\n\n");
656: }
657:
658: # ifndef OPENSSL_NO_SHA
659: printf(" - DSS\n");
660: printf(" - DSS1\n");
661: printf(" - ECDSA\n");
662: # endif
663: # ifndef OPENSSL_NO_MD2
664: printf(" - MD2\n");
665: # endif
666: # ifndef OPENSSL_NO_MD4
667: printf(" - MD4\n");
668: # endif
669: # ifndef OPENSSL_NO_MD5
670: printf(" - MD5\n");
671: # endif
1.40 ! bertrand 672: # ifndef OPENSSL_NO_MDC2
! 673: printf(" - MDC2\n");
! 674: # endif
! 675: # ifndef OPENSSL_NO_RIPEMD
! 676: printf(" - RIPEMD160\n");
! 677: # endif
1.39 bertrand 678: # ifndef OPENSSL_NO_SHA
679: printf(" - SHA\n");
680: printf(" - SHA1\n");
681: # endif
1.40 ! bertrand 682: # ifndef OPENSSL_NO_SHA256
! 683: printf(" - SHA224\n");
! 684: printf(" - SHA256\n");
! 685: # endif
! 686: # ifndef OPENSSL_NO_SHA512
! 687: printf(" - SHA384\n");
! 688: printf(" - SHA512\n");
! 689: # endif
! 690: # ifndef OPENSSL_NO_WHIRLPOOL
! 691: printf(" - WHIRLPOOL\n");
! 692: # endif
1.39 bertrand 693:
694: return;
695: }
696: else if ((*s_etat_processus).test_instruction == 'Y')
697: {
698: (*s_etat_processus).nombre_arguments = -1;
699: return;
700: }
701:
702: if (test_cfsf(s_etat_processus, 31) == d_vrai)
703: {
704: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
705: {
706: return;
707: }
708: }
709:
710: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
711: &s_objet_argument_1) == d_erreur)
712: {
713: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
714: return;
715: }
716:
717: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
718: &s_objet_argument_2) == d_erreur)
719: {
720: liberation(s_etat_processus, s_objet_argument_1);
721:
722: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
723: return;
724: }
725:
726: if (((*s_objet_argument_1).type == CHN) &&
727: ((*s_objet_argument_2).type == CHN))
728: {
729: // Liste des sommes disponibles :
730: // - EVP_dss
731: // - EVP_dss1
732: // - EVP_ecdsa
733: // - EVP_md2
734: // - EVP_md4
735: // - EVP_md5
736: // - EVP_mdc2
737: // - EVP_ripemd160
738: // - EVP_sha
739: // - EVP_sha1
740: // - EVP_sha224
741: // - EVP_sha256
742: // - EVP_sha384
743: // - EVP_sha512
744: // - EVP_whirlpool
745:
746: if ((fonction = conversion_majuscule((unsigned char *)
747: (*s_objet_argument_1).objet)) == NULL)
748: {
749: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
750: return;
751: }
752:
753: somme_invalide = d_faux;
754:
755: switch(fonction[0])
756: {
757: case 'D':
758: {
759: switch(fonction[1])
760: {
761: case 'S': // ds
762: {
763: switch(fonction[2])
764: {
765: # ifndef OPENSSL_NO_SHA
766: case 'S': // dss
767: {
768: switch(fonction[3])
769: {
770: case d_code_fin_chaine:
771: {
772: EVP_sum = EVP_dss;
773: break;
774: }
775:
776: case '1': // dss1
777: {
778: if (fonction[4] == d_code_fin_chaine)
779: {
780: EVP_sum = EVP_dss1;
781: }
782: else
783: {
784: somme_invalide = d_vrai;
785: }
786:
787: break;
788: }
789:
790: default:
791: {
792: somme_invalide = d_vrai;
793: break;
794: }
795: }
796:
797: break;
798: }
799: # endif
800:
801: default:
802: {
803: somme_invalide = d_vrai;
804: break;
805: }
806: }
807:
808: break;
809: }
810:
811: default:
812: {
813: somme_invalide = d_vrai;
814: break;
815: }
816: }
817:
818: break;
819: }
820:
821: case 'E':
822: {
823: switch(fonction[1])
824: {
825: case 'C': // ec
826: {
827: switch(fonction[2])
828: {
829: case 'D': // ecd
830: {
831: switch(fonction[3])
832: {
833: case 'S': // ecds
834: {
835: switch(fonction[4])
836: {
837: # ifndef OPENSSL_NO_SHA
838: case 'A': // ecdsa
839: {
840: if (fonction[5] ==
841: d_code_fin_chaine)
842: {
843: EVP_sum = EVP_ecdsa;
844: }
845: else
846: {
847: somme_invalide = d_vrai;
848: }
849:
850: break;
851: }
852: # endif
853:
854: default:
855: {
856: somme_invalide = d_vrai;
857: break;
858: }
859: }
860:
861: break;
862: }
863:
864: default:
865: {
866: somme_invalide = d_vrai;
867: break;
868: }
869: }
870:
871: break;
872: }
873:
874: default:
875: {
876: somme_invalide = d_vrai;
877: break;
878: }
879: }
880:
881: break;
882: }
883:
884: default:
885: {
886: somme_invalide = d_vrai;
887: break;
888: }
889: }
890:
891: break;
892: }
893:
894: case 'M':
895: {
896: switch(fonction[1])
897: {
898: case 'D': // md
899: {
900: switch(fonction[2])
901: {
902: # ifndef OPENSSL_NO_MD2
903: case '2': // md2
904: {
905: if (fonction[3] == d_code_fin_chaine)
906: {
907: EVP_sum = EVP_md2;
908: }
909: else
910: {
911: somme_invalide = d_vrai;
912: }
913:
914: break;
915: }
916: # endif
917:
918: # ifndef OPENSSL_NO_MD4
919: case '4': // md4
920: {
921: if (fonction[3] == d_code_fin_chaine)
922: {
923: EVP_sum = EVP_md4;
924: }
925: else
926: {
927: somme_invalide = d_vrai;
928: }
929:
930: break;
931: }
932: # endif
933:
934: # ifndef OPENSSL_NO_MD4
935: case '5': // md5
936: {
937: if (fonction[3] == d_code_fin_chaine)
938: {
939: EVP_sum = EVP_md5;
940: }
941: else
942: {
943: somme_invalide = d_vrai;
944: }
945:
946: break;
947: }
948: # endif
949:
950: case 'C': // mdc
951: {
952: switch(fonction[3])
953: {
954: # ifndef OPENSSL_NO_MDC2
955: case '2': // mdc2
956: {
957: if (fonction[4] == d_code_fin_chaine)
958: {
959: EVP_sum = EVP_mdc2;
960: }
961: else
962: {
963: somme_invalide = d_vrai;
964: }
965:
966: break;
967: }
968: # endif
969:
970: default:
971: {
972: somme_invalide = d_vrai;
973: break;
974: }
975: }
976:
977: break;
978: }
979:
980: default:
981: {
982: somme_invalide = d_vrai;
983: break;
984: }
985: }
986:
987: break;
988: }
989:
990: default:
991: {
992: somme_invalide = d_vrai;
993: break;
994: }
995: }
996:
997: break;
998: }
999:
1000: # ifndef OPENSSL_NO_RIPEMD
1001: case 'R':
1002: {
1003: if (strcmp(fonction, "RIPEMD160") == 0)
1004: {
1005: EVP_sum = EVP_ripemd160;
1006: }
1007: else
1008: {
1009: somme_invalide = d_vrai;
1010: }
1011:
1012: break;
1013: }
1014: # endif
1015:
1016: case 'S':
1017: {
1018: switch(fonction[1])
1019: {
1020: case 'H': // sh
1021: {
1022: switch(fonction[2])
1023: {
1024: # ifndef OPENSSL_NO_SHA
1025: case 'A':
1026: {
1027: switch(fonction[3])
1028: {
1029: case d_code_fin_chaine:
1030: {
1031: EVP_sum = EVP_sha;
1032: break;
1033: }
1034:
1035: case '1': // sha1
1036: {
1037: if (fonction[4] == d_code_fin_chaine)
1038: {
1039: EVP_sum = EVP_sha1;
1040: }
1041: else
1042: {
1043: somme_invalide = d_vrai;
1044: }
1045:
1046: break;
1047: }
1048:
1049: # ifndef OPENSSL_NO_SHA256
1050: case '2': // sha2
1051: {
1052: switch(fonction[4])
1053: {
1054: case '2': // sha22
1055: {
1056: switch(fonction[5])
1057: {
1058: case '4': // sha224
1059: {
1060: if (fonction[6] ==
1061: d_code_fin_chaine)
1062: {
1063: EVP_sum =
1064: EVP_sha224;
1065: }
1066: else
1067: {
1068: somme_invalide =
1069: d_vrai;
1070: }
1071:
1072: break;
1073: }
1074:
1075: default:
1076: {
1077: somme_invalide = d_vrai;
1078: break;
1079: }
1080: }
1081:
1082: break;
1083: }
1084:
1085: case '5':
1086: {
1087: switch(fonction[5])
1088: {
1089: case '6': // sha256
1090: {
1091: if (fonction[6] ==
1092: d_code_fin_chaine)
1093: {
1094: EVP_sum =
1095: EVP_sha256;
1096: }
1097: else
1098: {
1099: somme_invalide =
1100: d_vrai;
1101: }
1102:
1103: break;
1104: }
1105:
1106: default:
1107: {
1108: somme_invalide = d_vrai;
1109: break;
1110: }
1111: }
1112:
1113: break;
1114: }
1115:
1116: default:
1117: {
1118: somme_invalide = d_vrai;
1119: break;
1120: }
1121: }
1122:
1123: break;
1124: }
1125: # endif
1126:
1127: # ifndef OPENSSL_NO_SHA512
1128: case '3': // sha3
1129: {
1130: switch(fonction[4])
1131: {
1132: case '8': // sha38
1133: {
1134: switch(fonction[5])
1135: {
1136: case '4': // sha384
1137: {
1138: if (fonction[6] ==
1139: d_code_fin_chaine)
1140: {
1141: EVP_sum =
1142: EVP_sha384;
1143: }
1144: else
1145: {
1146: somme_invalide =
1147: d_vrai;
1148: }
1149:
1150: break;
1151: }
1152:
1153: default:
1154: {
1155: somme_invalide = d_vrai;
1156: break;
1157: }
1158: }
1159:
1160: break;
1161: }
1162:
1163: default:
1164: {
1165: somme_invalide = d_vrai;
1166: break;
1167: }
1168: }
1169:
1170: break;
1171: }
1172:
1173: case '5': // sha5
1174: {
1175: switch(fonction[4])
1176: {
1177: case '1': // sha51
1178: {
1179: switch(fonction[5])
1180: {
1181: case '2': // sha512
1182: {
1183: if (fonction[6] ==
1184: d_code_fin_chaine)
1185: {
1186: EVP_sum =
1187: EVP_sha512;
1188: }
1189: else
1190: {
1191: somme_invalide =
1192: d_vrai;
1193: }
1194:
1195: break;
1196: }
1197:
1198: default:
1199: {
1200: somme_invalide = d_vrai;
1201: break;
1202: }
1203: }
1204:
1205: break;
1206: }
1207:
1208: default:
1209: {
1210: somme_invalide = d_vrai;
1211: break;
1212: }
1213: }
1214:
1215: break;
1216: }
1217: # endif
1218:
1219: default:
1220: {
1221: somme_invalide = d_vrai;
1222: break;
1223: }
1224: }
1225:
1226: break;
1227: }
1228: # endif
1229:
1230: default:
1231: {
1232: somme_invalide = d_vrai;
1233: break;
1234: }
1235: }
1236:
1237: break;
1238: }
1239:
1240: default:
1241: {
1242: somme_invalide = d_vrai;
1243: break;
1244: }
1245: }
1246:
1247: break;
1248: }
1249:
1250: # ifndef OPENSSL_NO_WHIRLPOOL
1251: case 'W':
1252: {
1253: if (strcmp(fonction, "WHIRLPOOL") == 0)
1254: {
1255: EVP_sum = EVP_whirlpool;
1256: }
1257: else
1258: {
1259: somme_invalide = d_vrai;
1260: }
1261:
1262: break;
1263: }
1264: # endif
1265:
1266: default:
1267: {
1268: somme_invalide = d_vrai;
1269: break;
1270: }
1271: }
1272:
1273: free(fonction);
1274:
1275: if (somme_invalide == d_vrai)
1276: {
1277: liberation(s_etat_processus, s_objet_argument_1);
1278: liberation(s_etat_processus, s_objet_argument_2);
1279:
1280: (*s_etat_processus).erreur_execution =
1281: d_ex_chiffrement_indisponible;
1282: return;
1283: }
1284:
1285: if (EVP_DigestInit(&contexte, EVP_sum()) != 1)
1286: {
1287: EVP_MD_CTX_cleanup(&contexte);
1288:
1289: liberation(s_etat_processus, s_objet_argument_1);
1290: liberation(s_etat_processus, s_objet_argument_2);
1291:
1292: (*s_etat_processus).erreur_execution = d_ex_chiffrement;
1293: return;
1294: }
1295:
1296: if ((chaine = formateur_flux(s_etat_processus, (unsigned char *)
1297: (*s_objet_argument_2).objet, &longueur_chaine)) == NULL)
1298: {
1299: EVP_MD_CTX_cleanup(&contexte);
1300:
1301: liberation(s_etat_processus, s_objet_argument_1);
1302: liberation(s_etat_processus, s_objet_argument_2);
1303:
1304: return;
1305: }
1306:
1307: if (EVP_DigestUpdate(&contexte, chaine, longueur_chaine) != 1)
1308: {
1309: free(chaine);
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 (EVP_DigestFinal_ex(&contexte, somme, &longueur_somme) != 1)
1320: {
1321: free(chaine);
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: (*s_etat_processus).erreur_execution = d_ex_chiffrement;
1328: return;
1329: }
1330:
1331: free(chaine);
1332: EVP_MD_CTX_cleanup(&contexte);
1333:
1334: if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
1335: {
1336: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1337: return;
1338: }
1339:
1340: if (((*s_objet_resultat).objet = analyse_flux(s_etat_processus,
1341: somme, longueur_somme)) == NULL)
1342: {
1343: liberation(s_etat_processus, s_objet_argument_1);
1344: liberation(s_etat_processus, s_objet_argument_2);
1345:
1346: return;
1347: }
1348: }
1349: else if (((*s_objet_argument_1).type == CHN) &&
1350: ((*s_objet_argument_2).type == LST))
1351: {
1352: BUG(1, uprintf("Oops\n"));
1353: s_objet_resultat = NULL;
1354: }
1355: else
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_erreur_type_argument;
1361: return;
1362: }
1363:
1364: liberation(s_etat_processus, s_objet_argument_1);
1365: liberation(s_etat_processus, s_objet_argument_2);
1366:
1367: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1368: s_objet_resultat) == d_erreur)
1369: {
1370: return;
1371: }
1372:
1373: return;
1374: }
1375:
1.1 bertrand 1376: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>