1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.21
4: Copyright (C) 1989-2011 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: Calcul des sommes de contrôle avant le lancement d'un exécutable
29: de la famille RPL/2 (rpliconv, rplconvert, rplfile et rplpp).
30: ================================================================================
31: Entrée :
32: - chaîne de caractères sur le fichier à contrôler
33: - chaîne de caractères contenant la somme à contrôler
34: - type de somme de contrôle
35: --------------------------------------------------------------------------------
36: Sortie : drapeau
37: --------------------------------------------------------------------------------
38: Effets de bord : néant
39: ================================================================================
40: */
41:
42: logical1
43: controle(struct_processus *s_etat_processus, unsigned char *fichier,
44: unsigned char *type, unsigned char *somme_candidate)
45: {
46: EVP_MD_CTX contexte;
47:
48: int in_fd;
49:
50: logical1 drapeau;
51:
52: off_t taille_fichier;
53:
54: ssize_t octets_lus;
55:
56: struct stat stat_buf;
57:
58: unsigned char *chaine;
59: unsigned char *registre;
60: unsigned char somme[EVP_MAX_MD_SIZE];
61: unsigned char somme_hexadecimale[2 * EVP_MAX_MD_SIZE];
62:
63: unsigned int i;
64: unsigned int longueur_somme;
65:
66: registre = fichier;
67:
68: # ifdef OS2
69: unsigned char *tampon;
70:
71: if ((tampon = malloc((strlen(fichier) + 5) * sizeof(unsigned char)))
72: == NULL)
73: {
74: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
75: return(d_faux);
76: }
77:
78: sprintf(tampon, "%s.exe", fichier);
79: fichier = tampon;
80: # endif
81:
82: if (stat(fichier, &stat_buf) != 0)
83: {
84: # ifdef OS2
85: free(fichier);
86: # endif
87:
88: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
89: return(d_faux);
90: }
91:
92: taille_fichier = stat_buf.st_size;
93:
94: if ((chaine = malloc(taille_fichier)) == NULL)
95: {
96: # ifdef OS2
97: free(fichier);
98: # endif
99:
100: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
101: return(d_faux);
102: }
103:
104: if ((in_fd = open(fichier, 0, O_RDONLY)) < 0)
105: {
106: # ifdef OS2
107: free(fichier);
108: # endif
109:
110: free(chaine);
111:
112: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
113: return(d_faux);
114: }
115:
116: # ifdef OS2
117: free(fichier);
118: # endif
119:
120: if ((octets_lus = read(in_fd, chaine, taille_fichier)) != taille_fichier)
121: {
122: # ifndef OS2
123: close(in_fd);
124: free(chaine);
125:
126: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
127: return(d_faux);
128: # endif
129: }
130:
131: close(in_fd);
132:
133: if (strcmp(type, "md5") == 0)
134: {
135: if (EVP_DigestInit(&contexte, EVP_md5()) != 1)
136: {
137: close(in_fd);
138: free(chaine);
139:
140: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
141: return(d_faux);
142: }
143:
144: if (EVP_DigestUpdate(&contexte, chaine, taille_fichier) != 1)
145: {
146: close(in_fd);
147: free(chaine);
148:
149: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
150: return(d_faux);
151: }
152:
153: if (EVP_DigestFinal_ex(&contexte, somme, &longueur_somme) != 1)
154: {
155: close(in_fd);
156: free(chaine);
157:
158: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
159: return(d_faux);
160: }
161: }
162: else if (strcmp(type, "sha1") == 0)
163: {
164: if (EVP_DigestInit(&contexte, EVP_sha1()) != 1)
165: {
166: close(in_fd);
167: free(chaine);
168:
169: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
170: return(d_faux);
171: }
172:
173: if (EVP_DigestUpdate(&contexte, chaine, taille_fichier) != 1)
174: {
175: close(in_fd);
176: free(chaine);
177:
178: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
179: return(d_faux);
180: }
181:
182: if (EVP_DigestFinal_ex(&contexte, somme, &longueur_somme) != 1)
183: {
184: close(in_fd);
185: free(chaine);
186:
187: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
188: return(d_faux);
189: }
190: }
191: else
192: {
193: return(d_faux);
194: }
195:
196: EVP_MD_CTX_cleanup(&contexte);
197: free(chaine);
198:
199: for(i = 0; i < longueur_somme; i++)
200: {
201: sprintf(&(somme_hexadecimale[2 * i]), "%02x", somme[i]);
202: }
203:
204: if (strcmp(somme_candidate, somme_hexadecimale) == 0)
205: {
206: drapeau = d_vrai;
207: }
208: else
209: {
210: if ((*s_etat_processus).langue == 'F')
211: {
212: printf("+++Fatal : Somme de contrôle invalide\n");
213: printf("Fonction %s(%s)\n", type, registre);
214: printf("Résultat obtenu : %s\n", somme_hexadecimale);
215: printf("Résultat attendu : %s\n", somme_candidate);
216: }
217: else
218: {
219: printf("+++Fatal : Hash code mismatch\n");
220: printf("Function %s(%s)\n", type, registre);
221: printf("Computed hash code : %s\n", somme_hexadecimale);
222: printf("Expected hasd code : %s\n", somme_candidate);
223: }
224:
225: drapeau = d_faux;
226: }
227:
228: return(drapeau);
229: }
230:
231: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>