/[winpt]/trunk/Gnupg/md.c
ViewVC logotype

Annotation of /trunk/Gnupg/md.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 46 - (hide annotations)
Fri Oct 28 12:57:05 2005 UTC (19 years, 4 months ago) by werner
File MIME type: text/plain
File size: 5523 byte(s)
Second set of changes to use autotools for building.
1 werner 46 /* md.c - message digest wrapper
2     * Copyright (C) 2003, 2004 Timo Schulz
3     *
4     * This file is part of GPGLIB.
5     *
6     * GPGLIB is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * GPGLIB is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with GPGLIB; if not, write to the Free Software Foundation,
18     * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19     */
20    
21     #ifdef HAVE_CONFIG_H
22     #include <config.h>
23     #endif
24    
25     #include <windows.h>
26     #include <windows.h>
27     #include <stdio.h>
28     #include <malloc.h>
29     #include <sys/types.h>
30    
31     #include "openpgp.h"
32     #include "md.h"
33    
34     struct gpgm_md_s {
35     void * ctx;
36     int algo;
37     void (*write)( void *ctx, unsigned char *inbuf, size_t inlen );
38     };
39    
40    
41     gpg_md_t
42     gpg_md_open( int algo )
43     {
44     gpg_md_t md;
45    
46     if (algo != MD_SHA1 && algo != MD_MD5 && algo != MD_RMD160
47     && algo != MD_SHA256 && algo != MD_SHA384 && algo != MD_SHA512)
48     return NULL;
49     md = calloc (1, sizeof * md);
50     if( !md )
51     return NULL;
52     switch( algo ) {
53     case MD_MD5:
54     md->ctx = calloc( 1, sizeof (MD5_CONTEXT) );
55     if( !md->ctx ) {
56     free( md );
57     return NULL;
58     }
59     md5_init( (MD5_CONTEXT *)md->ctx );
60     md->write = md5_write;
61     break;
62    
63     case MD_SHA1:
64     md->ctx = calloc( 1, sizeof (SHA1_CONTEXT) );
65     if( !md->ctx ) {
66     free( md );
67     return NULL;
68     }
69     sha1_init( (SHA1_CONTEXT *)md->ctx );
70     md->write = sha1_write;
71     break;
72    
73     case MD_RMD160:
74     md->ctx = calloc( 1, sizeof (RMD160_CONTEXT) );
75     if( !md->ctx ) {
76     free( md );
77     return NULL;
78     }
79     rmd160_init( (RMD160_CONTEXT *)md->ctx );
80     md->write = rmd160_write;
81     break;
82    
83     case MD_SHA256:
84     md->ctx = calloc (1, sizeof (sha256_context));
85     if (!md->ctx) {
86     free (md);
87     return NULL;
88     }
89     sha256_init ((sha256_context *)md->ctx);
90     md->write = sha256_write;
91     break;
92    
93     case MD_SHA384:
94     case MD_SHA512:
95     md->ctx = calloc (1, sizeof (sha512_context));
96     if (!md->ctx) {
97     free (md);
98     return NULL;
99     }
100     sha512_init ((sha512_context *)md->ctx);
101     md->write = sha512_write;
102     break;
103    
104     default:
105     free( md );
106     return NULL;
107     }
108     md->algo = algo;
109     return md;
110     }
111    
112    
113     void
114     gpg_md_close( gpg_md_t md )
115     {
116     if( md ) {
117     md->algo = 0;
118     md->write = NULL;
119     free( md->ctx ); md->ctx = NULL;
120     free( md );
121     }
122     }
123    
124    
125     void
126     gpg_md_final( gpg_md_t md )
127     {
128     switch( md->algo ) {
129     case MD_MD5 : md5_final( (MD5_CONTEXT *)md->ctx ); break;
130     case MD_SHA1 : sha1_final( (SHA1_CONTEXT *) md->ctx ); break;
131     case MD_RMD160: rmd160_final( (RMD160_CONTEXT *) md->ctx ); break;
132     case MD_SHA256: sha256_final ((sha256_context *)md->ctx); break;
133     case MD_SHA384:
134     case MD_SHA512: sha512_final ((sha512_context *)md->ctx); break;
135     }
136     }
137    
138    
139     const unsigned char *
140     gpg_md_read (gpg_md_t md)
141     {
142     switch( md->algo ) {
143     case MD_MD5 : return md5_read( (MD5_CONTEXT *)md->ctx ); break;
144     case MD_SHA1 : return sha1_read( (SHA1_CONTEXT *)md->ctx ); break;
145     case MD_RMD160: return rmd160_read( (RMD160_CONTEXT *)md->ctx ); break;
146     case MD_SHA256: return sha256_read ((sha256_context *)md->ctx); break;
147     case MD_SHA384:
148     case MD_SHA512: return sha512_read ((sha512_context *)md->ctx); break;
149     }
150     return NULL;
151     }
152    
153    
154     void
155     gpg_md_putc( gpg_md_t md, int c )
156     {
157     unsigned char buf[1];
158     buf[0] = c & 0xff;
159     md->write( md->ctx, buf, 1 );
160     }
161    
162    
163     size_t
164     _md_get_digest_len (gpg_md_t md)
165     {
166     switch (md->algo) {
167     case MD_MD5:
168     return 16;
169     case MD_SHA1:
170     case MD_RMD160:
171     return 20;
172     case MD_SHA256:
173     return 32;
174     case MD_SHA384:
175     return 48;
176     case MD_SHA512:
177     return 64;
178     }
179     return 0;
180     }
181    
182    
183     void
184     gpg_md_write( gpg_md_t md, unsigned char *inbuf, size_t len )
185     {
186     if( md )
187     md->write( md->ctx, inbuf, len );
188     }
189    
190    
191     int
192     gpg_md_hash_file( int mdalgo, const char *file, unsigned char *digest, size_t *nlen )
193     {
194     gpg_md_t md;
195     FILE * fp;
196     char buf[8192];
197     int n;
198    
199     md = gpg_md_open( mdalgo );
200     if( !md )
201     return -1;
202     fp = fopen( file, "rb" );
203     if( !fp ) {
204     gpg_md_close( md );
205     return -2;
206     }
207     while( !feof( fp ) ) {
208     n = fread( buf, 1, sizeof buf-1, fp );
209     if( !n )
210     break;
211     md->write( md->ctx, buf, n );
212     }
213     *nlen = _md_get_digest_len( md );
214     gpg_md_final( md );
215     memcpy( digest, gpg_md_read( md ), *nlen );
216     fclose( fp );
217     gpg_md_close( md );
218     return 0;
219     }
220    
221    
222     static int
223     do_check_md (int algo, char * msg, const unsigned char * digest, size_t nlen)
224     {
225     const unsigned char * tmp;
226     int check=0;
227     gpg_md_t md;
228    
229     md = gpg_md_open (algo);
230     if (!md)
231     return -1;
232     gpg_md_write (md, msg, strlen (msg));
233     gpg_md_final (md);
234     tmp = gpg_md_read (md);
235     check = memcmp (digest, tmp, nlen);
236     gpg_md_close (md);
237    
238     return check;
239     }
240    
241     struct {
242     int algo;
243     int dlen;
244     char * msg;
245     const unsigned char * md;
246     } md_test [] = {
247     {MD_RMD160, 20, "abc", "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04\x4a\x8e\x98\xc6\xb0\x87\xf1\x5a\x0b\xfc"},
248     {0, 0, NULL, NULL}
249     };
250    
251    
252     int
253     gpg_md_selftest (void)
254     {
255     int i, rc=0;
256    
257     for (i=0; md_test[i].algo; i++) {
258     rc = do_check_md (md_test[i].algo, md_test[i].msg, md_test[i].md,
259     md_test[i].dlen);
260     if (rc)
261     return rc;
262     }
263     return 0;
264     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26