File:
[local] /
rpl /
rplsums /
rplsum.c
Revision
1.5:
download - view:
text,
annotated -
select for diffs -
revision graph
Fri Aug 6 15:32:56 2010 UTC (14 years, 9 months ago) by
bertrand
Branches:
MAIN
CVS tags:
rpl-4_1_2,
rpl-4_1_1,
rpl-4_1_0,
rpl-4_0_24,
rpl-4_0_22,
rpl-4_0_21,
rpl-4_0_20,
rpl-4_0_19,
rpl-4_0_18,
rpl-4_0,
HEAD
Cohérence
1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.12
4: Copyright (C) 1989-2010 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 <stdio.h>
24: #include <stdlib.h>
25: #include <unistd.h>
26: #include "openssl/evp.h"
27: #include <sys/stat.h>
28: #include <fcntl.h>
29:
30: int
31: main(int argc, char *argv[])
32: {
33: EVP_MD_CTX contexte;
34:
35: int in_fd;
36:
37: off_t taille_fichier;
38:
39: ssize_t octets_lus;
40:
41: struct stat stat_buf;
42:
43: unsigned char *chaine;
44: unsigned char *fichier;
45: unsigned char somme[EVP_MAX_MD_SIZE];
46: unsigned char somme_hexadecimale[2 * EVP_MAX_MD_SIZE];
47:
48: unsigned int i;
49: unsigned int longueur_somme;
50:
51: if (argc != 2)
52: {
53: printf("Usage: rplmd5sum filename\n");
54: exit(EXIT_FAILURE);
55: }
56:
57: fichier = argv[1];
58:
59: if (stat(fichier, &stat_buf) != 0)
60: {
61: fprintf(stderr, "stat() failed\n");
62: perror("stat");
63: exit(EXIT_FAILURE);
64: }
65:
66: taille_fichier = stat_buf.st_size;
67:
68: if ((chaine = malloc(taille_fichier)) == NULL)
69: {
70: fprintf(stderr, "malloc() failed\n");
71: exit(EXIT_FAILURE);
72: }
73:
74: if ((in_fd = open(fichier, 0, O_RDONLY)) < 0)
75: {
76: fprintf(stderr, "open() failed\n");
77: perror("open");
78: free(chaine);
79: exit(EXIT_FAILURE);
80: }
81:
82: if ((octets_lus = read(in_fd, chaine, taille_fichier)) != taille_fichier)
83: {
84: # ifndef OS2
85: // Sur des fichiers binaires et sous OS/2, le nombre d'octets lus peut
86: // etre inferieur … la taille du fichier sur le disque.
87:
88: fprintf(stderr, "read() failed\n");
89: fprintf(stderr, "Meditation: %d < %d\n", octets_lus, taille_fichier);
90: perror("read");
91: close(in_fd);
92: free(chaine);
93: exit(EXIT_FAILURE);
94: # endif
95: }
96:
97: close(in_fd);
98:
99: if (EVP_DigestInit(&contexte, EVP_sum()) != 1)
100: {
101: fprintf(stderr, "EVP_DigestInit() failed\n");
102: close(in_fd);
103: free(chaine);
104: exit(EXIT_FAILURE);
105: }
106:
107: if (EVP_DigestUpdate(&contexte, chaine, taille_fichier) != 1)
108: {
109: fprintf(stderr, "EVP_DigestUpdate() failed\n");
110: close(in_fd);
111: free(chaine);
112: exit(EXIT_FAILURE);
113: }
114:
115: if (EVP_DigestFinal_ex(&contexte, somme, &longueur_somme) != 1)
116: {
117: fprintf(stderr, "EVP_DigestFinal_ex() failed\n");
118: close(in_fd);
119: free(chaine);
120: exit(EXIT_FAILURE);
121: }
122:
123: EVP_MD_CTX_cleanup(&contexte);
124: free(chaine);
125:
126: for(i = 0; i < longueur_somme; i++)
127: {
128: sprintf(&(somme_hexadecimale[2 * i]), "%02x", somme[i]);
129: }
130:
131: printf("%s\n", somme_hexadecimale);
132:
133: return(EXIT_SUCCESS);
134: }
135:
136: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>