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 'cipher'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_cipher(struct_processus *s_etat_processus)
40: {
41: const EVP_CIPHER *EVP_chiffrement;
42: const EVP_MD *EVP_sum;
43:
44: integer8 nombre_cycles;
45:
46: logical1 somme_invalide;
47: logical1 generation_clef;
48:
49: logical8 sel;
50:
51: struct_liste_chainee *l_element_courant;
52:
53: struct_objet *s_objet_argument_1;
54: struct_objet *s_objet_argument_2;
55: struct_objet *s_objet_resultat_1;
56: struct_objet *s_objet_resultat_2;
57:
58: unsigned char *chiffrement;
59: unsigned char *clef;
60: unsigned char *controle;
61: unsigned char *direction;
62: unsigned char *fonction;
63: unsigned char *instruction;
64: unsigned char *iv;
65: unsigned char *tampon;
66:
67: if ((*s_etat_processus).affichage_arguments == 'Y')
68: {
69: printf("\n CIPHER ");
70:
71: if ((*s_etat_processus).langue == 'F')
72: {
73: printf("(opérations de chiffrement)\n\n");
74: }
75: else
76: {
77: printf("(cryptographic operations)\n\n");
78: }
79:
80: printf(" 2: %s \"password\"\n", d_CHN);
81: printf(" 1: %s { \"KEY\" \"cipher type\" \"digest type\" "
82: "salt nround }\n", d_LST);
83: printf("-> 1: %s { \"generated key\" \"iv\" }\n\n", d_LST);
84:
85: printf(" 2: %s \"text\"\n", d_CHN);
86: printf(" 1: %s { \"cipher type\" \"direction\" \"key\" \"iv\" }\n",
87: d_LST);
88: printf("-> 2: %s \"encrypted or decrypted text\"\n", d_CHN);
89: printf(" 1: %s { \"cipher type\" \"direction\" \"key\" "
90: "\"updated iv\" }\n\n", d_LST);
91:
92: if ((*s_etat_processus).langue == 'F')
93: {
94: printf(" Algorithmes de signature :\n\n");
95: }
96: else
97: {
98: printf(" Digest algorithms:\n\n");
99: }
100:
101: # ifndef OPENSSL_NO_SHA
102: printf(" - DSS\n");
103: printf(" - DSS1\n");
104: printf(" - ECDSA\n");
105: # endif
106: # ifndef OPENSSL_NO_MD2
107: printf(" - MD2\n");
108: # endif
109: # ifndef OPENSSL_NO_MD4
110: printf(" - MD4\n");
111: # endif
112: # ifndef OPENSSL_NO_MD5
113: printf(" - MD5\n");
114: # endif
115: # ifndef OPENSSL_NO_MDC2
116: printf(" - MDC2\n");
117: # endif
118: # ifndef OPENSSL_NO_RIPEMD
119: printf(" - RIPEMD160\n");
120: # endif
121: # ifndef OPENSSL_NO_SHA
122: printf(" - SHA\n");
123: printf(" - SHA1\n");
124: # endif
125: # ifndef OPENSSL_NO_SHA256
126: printf(" - SHA224\n");
127: printf(" - SHA256\n");
128: # endif
129: # ifndef OPENSSL_NO_SHA512
130: printf(" - SHA384\n");
131: printf(" - SHA512\n");
132: # endif
133: # ifndef OPENSSL_NO_WHIRLPOOL
134: printf(" - WHIRLPOOL\n");
135: # endif
136:
137: printf("\n");
138:
139: if ((*s_etat_processus).langue == 'F')
140: {
141: printf(" Utilisation :\n\n");
142: }
143: else
144: {
145: printf(" Usage:\n\n");
146: }
147:
148: printf(" \"password\" { \"key\" \"SHA1\" # 0h 3 } CIPHER\n");
149: printf(" \"text\" { \"AES-128-CBC\" \"DECRYPT\" \"key\" "
150: "\"iv\" } CIPHER\n");
151: printf(" \"text\" { \"AES-128-EBC\" \"ENCRYPT\" \"key\" "
152: "\"iv\" } CIPHER\n");
153: return;
154: }
155: else if ((*s_etat_processus).test_instruction == 'Y')
156: {
157: (*s_etat_processus).nombre_arguments = -1;
158: return;
159: }
160:
161: if (test_cfsf(s_etat_processus, 31) == d_vrai)
162: {
163: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
164: {
165: return;
166: }
167: }
168:
169: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
170: &s_objet_argument_1) == d_erreur)
171: {
172: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
173: return;
174: }
175:
176: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
177: &s_objet_argument_2) == d_erreur)
178: {
179: liberation(s_etat_processus, s_objet_argument_1);
180:
181: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
182: return;
183: }
184:
185: if (((*s_objet_argument_1).type == LST) &&
186: ((*s_objet_argument_2).type == CHN))
187: {
188: l_element_courant = (*s_objet_argument_1).objet;
189:
190: if (l_element_courant == NULL)
191: {
192: liberation(s_etat_processus, s_objet_argument_1);
193: liberation(s_etat_processus, s_objet_argument_2);
194:
195: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
196: return;
197: }
198:
199: if ((*(*l_element_courant).donnee).type != CHN)
200: {
201: liberation(s_etat_processus, s_objet_argument_1);
202: liberation(s_etat_processus, s_objet_argument_2);
203:
204: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
205: return;
206: }
207:
208: if ((instruction = conversion_majuscule((unsigned char *)
209: (*(*l_element_courant).donnee).objet)) == NULL)
210: {
211: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
212: return;
213: }
214:
215: if (strcmp(instruction, "KEY") == 0)
216: {
217: // Dérivation d'une clef
218:
219: free(instruction);
220:
221: l_element_courant = (*l_element_courant).suivant;
222:
223: if (l_element_courant == NULL)
224: {
225: liberation(s_etat_processus, s_objet_argument_1);
226: liberation(s_etat_processus, s_objet_argument_2);
227:
228: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
229: return;
230: }
231:
232: // On attend l'algorithme de chiffrement.
233:
234: if ((*(*l_element_courant).donnee).type != CHN)
235: {
236: liberation(s_etat_processus, s_objet_argument_1);
237: liberation(s_etat_processus, s_objet_argument_2);
238:
239: (*s_etat_processus).erreur_execution =
240: d_ex_erreur_type_argument;
241: return;
242: }
243:
244: chiffrement = (unsigned char *) (*(*l_element_courant)
245: .donnee).objet;
246:
247: if ((l_element_courant = (*l_element_courant).suivant) == NULL)
248: {
249: liberation(s_etat_processus, s_objet_argument_1);
250: liberation(s_etat_processus, s_objet_argument_2);
251:
252: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
253: return;
254: }
255:
256: // On attend la somme de contrôle.
257:
258: if ((*(*l_element_courant).donnee).type != CHN)
259: {
260: liberation(s_etat_processus, s_objet_argument_1);
261: liberation(s_etat_processus, s_objet_argument_2);
262:
263: (*s_etat_processus).erreur_execution =
264: d_ex_erreur_type_argument;
265: return;
266: }
267:
268: controle = (unsigned char *) (*(*l_element_courant).donnee).objet;
269:
270: if ((l_element_courant = (*l_element_courant).suivant) == NULL)
271: {
272: liberation(s_etat_processus, s_objet_argument_1);
273: liberation(s_etat_processus, s_objet_argument_2);
274:
275: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
276: return;
277: }
278:
279:
280: // On attend le sel, donc un entier binaire de 64 bits.
281:
282: if ((*(*l_element_courant).donnee).type != BIN)
283: {
284: liberation(s_etat_processus, s_objet_argument_1);
285: liberation(s_etat_processus, s_objet_argument_2);
286:
287: (*s_etat_processus).erreur_execution =
288: d_ex_erreur_type_argument;
289: return;
290: }
291:
292: sel = (*((logical8 *) (*(*l_element_courant).donnee).objet));
293:
294: if ((l_element_courant = (*l_element_courant).suivant) == NULL)
295: {
296: liberation(s_etat_processus, s_objet_argument_1);
297: liberation(s_etat_processus, s_objet_argument_2);
298:
299: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
300: return;
301: }
302:
303: // On attend le nombre de cycles.
304:
305: if ((*(*l_element_courant).donnee).type != INT)
306: {
307: liberation(s_etat_processus, s_objet_argument_1);
308: liberation(s_etat_processus, s_objet_argument_2);
309:
310: (*s_etat_processus).erreur_execution =
311: d_ex_erreur_type_argument;
312: return;
313: }
314:
315: nombre_cycles = (*((integer8 *) (*(*l_element_courant)
316: .donnee).objet));
317:
318: // On a dû atteindre la fin de la liste.
319:
320: if ((*l_element_courant).suivant != NULL)
321: {
322: liberation(s_etat_processus, s_objet_argument_1);
323: liberation(s_etat_processus, s_objet_argument_2);
324:
325: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
326: return;
327: }
328:
329: // Test de la validité de la somme de contrôle.
330:
331: if ((fonction = conversion_majuscule(controle)) == NULL)
332: {
333: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
334: return;
335: }
336:
337: somme_invalide = d_faux;
338:
339: switch(fonction[0])
340: {
341: case 'D':
342: {
343: switch(fonction[1])
344: {
345: case 'S': // ds
346: {
347: switch(fonction[2])
348: {
349: # ifndef OPENSSL_NO_SHA
350: case 'S': // dss
351: {
352: switch(fonction[3])
353: {
354: case d_code_fin_chaine:
355: {
356: EVP_sum = EVP_dss();
357: break;
358: }
359:
360: case '1': // dss1
361: {
362: if (fonction[4] ==
363: d_code_fin_chaine)
364: {
365: EVP_sum = EVP_dss1();
366: }
367: else
368: {
369: somme_invalide = d_vrai;
370: }
371:
372: break;
373: }
374:
375: default:
376: {
377: somme_invalide = d_vrai;
378: break;
379: }
380: }
381:
382: break;
383: }
384: # endif
385:
386: default:
387: {
388: somme_invalide = d_vrai;
389: break;
390: }
391: }
392:
393: break;
394: }
395:
396: default:
397: {
398: somme_invalide = d_vrai;
399: break;
400: }
401: }
402:
403: break;
404: }
405:
406: case 'E':
407: {
408: switch(fonction[1])
409: {
410: case 'C': // ec
411: {
412: switch(fonction[2])
413: {
414: case 'D': // ecd
415: {
416: switch(fonction[3])
417: {
418: case 'S': // ecds
419: {
420: switch(fonction[4])
421: {
422: # ifndef OPENSSL_NO_SHA
423: case 'A': // ecdsa
424: {
425: if (fonction[5] ==
426: d_code_fin_chaine)
427: {
428: EVP_sum = EVP_ecdsa();
429: }
430: else
431: {
432: somme_invalide = d_vrai;
433: }
434:
435: break;
436: }
437: # endif
438:
439: default:
440: {
441: somme_invalide = d_vrai;
442: break;
443: }
444: }
445:
446: break;
447: }
448:
449: default:
450: {
451: somme_invalide = d_vrai;
452: break;
453: }
454: }
455:
456: break;
457: }
458:
459: default:
460: {
461: somme_invalide = d_vrai;
462: break;
463: }
464: }
465:
466: break;
467: }
468:
469: default:
470: {
471: somme_invalide = d_vrai;
472: break;
473: }
474: }
475:
476: break;
477: }
478:
479: case 'M':
480: {
481: switch(fonction[1])
482: {
483: case 'D': // md
484: {
485: switch(fonction[2])
486: {
487: # ifndef OPENSSL_NO_MD2
488: case '2': // md2
489: {
490: if (fonction[3] == d_code_fin_chaine)
491: {
492: EVP_sum = EVP_md2();
493: }
494: else
495: {
496: somme_invalide = d_vrai;
497: }
498:
499: break;
500: }
501: # endif
502:
503: # ifndef OPENSSL_NO_MD4
504: case '4': // md4
505: {
506: if (fonction[3] == d_code_fin_chaine)
507: {
508: EVP_sum = EVP_md4();
509: }
510: else
511: {
512: somme_invalide = d_vrai;
513: }
514:
515: break;
516: }
517: # endif
518:
519: # ifndef OPENSSL_NO_MD5
520: case '5': // md5
521: {
522: if (fonction[3] == d_code_fin_chaine)
523: {
524: EVP_sum = EVP_md5();
525: }
526: else
527: {
528: somme_invalide = d_vrai;
529: }
530:
531: break;
532: }
533: # endif
534:
535: case 'C': // mdc
536: {
537: switch(fonction[3])
538: {
539: # ifndef OPENSSL_NO_MDC2
540: case '2': // mdc2
541: {
542: if (fonction[4] ==
543: d_code_fin_chaine)
544: {
545: EVP_sum = EVP_mdc2();
546: }
547: else
548: {
549: somme_invalide = d_vrai;
550: }
551:
552: break;
553: }
554: # endif
555:
556: default:
557: {
558: somme_invalide = d_vrai;
559: break;
560: }
561: }
562:
563: break;
564: }
565:
566: default:
567: {
568: somme_invalide = d_vrai;
569: break;
570: }
571: }
572:
573: break;
574: }
575:
576: default:
577: {
578: somme_invalide = d_vrai;
579: break;
580: }
581: }
582:
583: break;
584: }
585:
586: # ifndef OPENSSL_NO_RIPEMD
587: case 'R':
588: {
589: if (strcmp(fonction, "RIPEMD160") == 0)
590: {
591: EVP_sum = EVP_ripemd160();
592: }
593: else
594: {
595: somme_invalide = d_vrai;
596: }
597:
598: break;
599: }
600: # endif
601:
602: case 'S':
603: {
604: switch(fonction[1])
605: {
606: case 'H': // sh
607: {
608: switch(fonction[2])
609: {
610: # ifndef OPENSSL_NO_SHA
611: case 'A':
612: {
613: switch(fonction[3])
614: {
615: case d_code_fin_chaine:
616: {
617: EVP_sum = EVP_sha();
618: break;
619: }
620:
621: case '1': // sha1
622: {
623: if (fonction[4] ==
624: d_code_fin_chaine)
625: {
626: EVP_sum = EVP_sha1();
627: }
628: else
629: {
630: somme_invalide = d_vrai;
631: }
632:
633: break;
634: }
635:
636: # ifndef OPENSSL_NO_SHA256
637: case '2': // sha2
638: {
639: switch(fonction[4])
640: {
641: case '2': // sha22
642: {
643: switch(fonction[5])
644: {
645: case '4': // sha224
646: {
647: if (fonction[6] ==
648: d_code_fin_chaine)
649: {
650: EVP_sum =
651: EVP_sha224();
652: }
653: else
654: {
655: somme_invalide =
656: d_vrai;
657: }
658:
659: break;
660: }
661:
662: default:
663: {
664: somme_invalide =
665: d_vrai;
666: break;
667: }
668: }
669:
670: break;
671: }
672:
673: case '5':
674: {
675: switch(fonction[5])
676: {
677: case '6': // sha256
678: {
679: if (fonction[6] ==
680: d_code_fin_chaine)
681: {
682: EVP_sum =
683: EVP_sha256();
684: }
685: else
686: {
687: somme_invalide =
688: d_vrai;
689: }
690:
691: break;
692: }
693:
694: default:
695: {
696: somme_invalide =
697: d_vrai;
698: break;
699: }
700: }
701:
702: break;
703: }
704:
705: default:
706: {
707: somme_invalide = d_vrai;
708: break;
709: }
710: }
711:
712: break;
713: }
714: # endif
715:
716: # ifndef OPENSSL_NO_SHA512
717: case '3': // sha3
718: {
719: switch(fonction[4])
720: {
721: case '8': // sha38
722: {
723: switch(fonction[5])
724: {
725: case '4': // sha384
726: {
727: if (fonction[6] ==
728: d_code_fin_chaine)
729: {
730: EVP_sum =
731: EVP_sha384();
732: }
733: else
734: {
735: somme_invalide =
736: d_vrai;
737: }
738:
739: break;
740: }
741:
742: default:
743: {
744: somme_invalide =
745: d_vrai;
746: break;
747: }
748: }
749:
750: break;
751: }
752:
753: default:
754: {
755: somme_invalide = d_vrai;
756: break;
757: }
758: }
759:
760: break;
761: }
762:
763: case '5': // sha5
764: {
765: switch(fonction[4])
766: {
767: case '1': // sha51
768: {
769: switch(fonction[5])
770: {
771: case '2': // sha512
772: {
773: if (fonction[6] ==
774: d_code_fin_chaine)
775: {
776: EVP_sum =
777: EVP_sha512();
778: }
779: else
780: {
781: somme_invalide =
782: d_vrai;
783: }
784:
785: break;
786: }
787:
788: default:
789: {
790: somme_invalide =
791: d_vrai;
792: break;
793: }
794: }
795:
796: break;
797: }
798:
799: default:
800: {
801: somme_invalide = d_vrai;
802: break;
803: }
804: }
805:
806: break;
807: }
808: # endif
809:
810: default:
811: {
812: somme_invalide = d_vrai;
813: break;
814: }
815: }
816:
817: break;
818: }
819: # endif
820:
821: default:
822: {
823: somme_invalide = d_vrai;
824: break;
825: }
826: }
827:
828: break;
829: }
830:
831: default:
832: {
833: somme_invalide = d_vrai;
834: break;
835: }
836: }
837:
838: break;
839: }
840:
841: # ifndef OPENSSL_NO_WHIRLPOOL
842: case 'W':
843: {
844: if (strcmp(fonction, "WHIRLPOOL") == 0)
845: {
846: EVP_sum = EVP_whirlpool();
847: }
848: else
849: {
850: somme_invalide = d_vrai;
851: }
852:
853: break;
854: }
855: # endif
856:
857: default:
858: {
859: somme_invalide = d_vrai;
860: break;
861: }
862: }
863:
864: free(fonction);
865:
866: if (somme_invalide == d_vrai)
867: {
868: liberation(s_etat_processus, s_objet_argument_1);
869: liberation(s_etat_processus, s_objet_argument_2);
870:
871: (*s_etat_processus).erreur_execution =
872: d_ex_chiffrement_indisponible;
873: return;
874: }
875:
876: generation_clef = d_vrai;
877: }
878: else
879: {
880: // Chiffrement ou déchiffrement d'un message
881:
882: chiffrement = fonction;
883:
884: l_element_courant = (*l_element_courant).suivant;
885:
886: if (l_element_courant == NULL)
887: {
888: liberation(s_etat_processus, s_objet_argument_1);
889: liberation(s_etat_processus, s_objet_argument_2);
890:
891: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
892: return;
893: }
894:
895: // On attend la direction.
896:
897: if ((*(*l_element_courant).donnee).type != CHN)
898: {
899: liberation(s_etat_processus, s_objet_argument_1);
900: liberation(s_etat_processus, s_objet_argument_2);
901:
902: (*s_etat_processus).erreur_execution =
903: d_ex_erreur_type_argument;
904: return;
905: }
906:
907: direction = (unsigned char *) (*(*l_element_courant)
908: .donnee).objet;
909:
910: // On attend la clef.
911:
912: if ((l_element_courant = (*l_element_courant).suivant) == NULL)
913: {
914: liberation(s_etat_processus, s_objet_argument_1);
915: liberation(s_etat_processus, s_objet_argument_2);
916:
917: (*s_etat_processus).erreur_execution =
918: d_ex_manque_argument;
919: return;
920: }
921:
922: clef = (unsigned char *) (*(*l_element_courant).donnee).objet;
923:
924: // On attend le vecteur d'initialisation.
925:
926: if ((l_element_courant = (*l_element_courant).suivant) == NULL)
927: {
928: liberation(s_etat_processus, s_objet_argument_1);
929: liberation(s_etat_processus, s_objet_argument_2);
930:
931: (*s_etat_processus).erreur_execution =
932: d_ex_manque_argument;
933: return;
934: }
935:
936: iv = (unsigned char *) (*(*l_element_courant).donnee).objet;
937:
938: if ((*l_element_courant).suivant != NULL)
939: {
940: liberation(s_etat_processus, s_objet_argument_1);
941: liberation(s_etat_processus, s_objet_argument_2);
942:
943: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
944: return;
945: }
946: }
947: }
948: else
949: {
950: liberation(s_etat_processus, s_objet_argument_1);
951: liberation(s_etat_processus, s_objet_argument_2);
952:
953: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
954: return;
955: }
956:
957: if ((tampon = conversion_majuscule(chiffrement)) == NULL)
958: {
959: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
960: return;
961: }
962:
963: if (strncmp(tampon, "AES", 3) == 0)
964: {
965: }
966:
967: free(tampon);
968:
969: if (generation_clef == d_vrai)
970: {
971: }
972: else
973: {
974: }
975:
976: liberation(s_etat_processus, s_objet_argument_1);
977: liberation(s_etat_processus, s_objet_argument_2);
978: return;
979: }
980:
981: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>