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