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

Annotation of /trunk/Gnupg/md.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (hide annotations)
Mon Jan 31 11:02:21 2005 UTC (20 years, 1 month ago) by twoaday
File MIME type: text/plain
File size: 5707 byte(s)
WinPT initial checkin.


1 twoaday 2 /* 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     #include <windows.h>
22     #include <stdio.h>
23     #include <malloc.h>
24     #include <sys/types.h>
25    
26     #include "openpgp.h"
27     #include "md.h"
28    
29     struct gpgm_md_s {
30     void * ctx;
31     int algo;
32     void (*write)( void *, unsigned char *inbuf, size_t inlen );
33     };
34    
35    
36     gpg_md_t
37     gpg_md_open( int algo )
38     {
39     gpg_md_t md;
40    
41     if (algo != MD_SHA1 && algo != MD_MD5 && algo != MD_RMD160
42     && algo != MD_SHA256 && algo != MD_SHA384 && algo != MD_SHA512)
43     return NULL;
44     md = calloc (1, sizeof * md);
45     if( !md )
46     return NULL;
47     switch( algo ) {
48     case MD_MD5:
49     md->ctx = calloc( 1, sizeof (MD5_CONTEXT) );
50     if( !md->ctx ) {
51     free( md );
52     return NULL;
53     }
54     md5_init( (MD5_CONTEXT *)md->ctx );
55     md->write = md5_write;
56     break;
57    
58     case MD_SHA1:
59     md->ctx = calloc( 1, sizeof (SHA1_CONTEXT) );
60     if( !md->ctx ) {
61     free( md );
62     return NULL;
63     }
64     sha1_init( (SHA1_CONTEXT *)md->ctx );
65     md->write = sha1_write;
66     break;
67    
68     case MD_RMD160:
69     md->ctx = calloc( 1, sizeof (RMD160_CONTEXT) );
70     if( !md->ctx ) {
71     free( md );
72     return NULL;
73     }
74     rmd160_init( (RMD160_CONTEXT *)md->ctx );
75     md->write = rmd160_write;
76     break;
77    
78     case MD_SHA256:
79     md->ctx = calloc (1, sizeof (sha256_context));
80     if (!md->ctx) {
81     free (md);
82     return NULL;
83     }
84     sha256_init ((sha256_context *)md->ctx);
85     md->write = sha256_write;
86     break;
87    
88     case MD_SHA384:
89     case MD_SHA512:
90     md->ctx = calloc (1, sizeof (sha512_context));
91     if (!md->ctx) {
92     free (md);
93     return NULL;
94     }
95     sha512_init ((sha512_context *)md->ctx);
96     md->write = sha512_write;
97     break;
98    
99     default:
100     free( md );
101     return NULL;
102     }
103     md->algo = algo;
104     return md;
105     }
106    
107    
108     void
109     gpg_md_close( gpg_md_t md )
110     {
111     if( md ) {
112     md->algo = 0;
113     md->write = NULL;
114     free( md->ctx ); md->ctx = NULL;
115     free( md );
116     }
117     }
118    
119    
120     void
121     gpg_md_final( gpg_md_t md )
122     {
123     switch( md->algo ) {
124     case MD_MD5 : md5_final( (MD5_CONTEXT *)md->ctx ); break;
125     case MD_SHA1 : sha1_final( (SHA1_CONTEXT *) md->ctx ); break;
126     case MD_RMD160: rmd160_final( (RMD160_CONTEXT *) md->ctx ); break;
127     case MD_SHA256: sha256_final ((sha256_context *)md->ctx); break;
128     case MD_SHA384:
129     case MD_SHA512: sha512_final ((sha512_context *)md->ctx); break;
130     }
131     }
132    
133    
134     const unsigned char *
135     gpg_md_read (gpg_md_t md)
136     {
137     switch( md->algo ) {
138     case MD_MD5 : return md5_read( (MD5_CONTEXT *)md->ctx ); break;
139     case MD_SHA1 : return sha1_read( (SHA1_CONTEXT *)md->ctx ); break;
140     case MD_RMD160: return rmd160_read( (RMD160_CONTEXT *)md->ctx ); break;
141     case MD_SHA256: return sha256_read ((sha256_context *)md->ctx); break;
142     case MD_SHA384:
143     case MD_SHA512: return sha512_read ((sha512_context *)md->ctx); break;
144     }
145     return NULL;
146     }
147    
148    
149     void
150     gpg_md_putc( gpg_md_t md, int c )
151     {
152     unsigned char buf[1];
153     buf[0] = c & 0xff;
154     md->write( md->ctx, buf, 1 );
155     }
156    
157    
158     size_t
159     _md_get_digest_len (gpg_md_t md)
160     {
161     switch (md->algo) {
162     case MD_MD5:
163     return 16;
164     case MD_SHA1:
165     case MD_RMD160:
166     return 20;
167     case MD_SHA256:
168     return 32;
169     case MD_SHA384:
170     return 48;
171     case MD_SHA512:
172     return 64;
173     }
174     return 0;
175     }
176    
177    
178     void
179     gpg_md_write( gpg_md_t md, unsigned char *inbuf, size_t len )
180     {
181     if( md )
182     md->write( md->ctx, inbuf, len );
183     }
184    
185    
186     int
187     gpg_md_hash_file( int mdalgo, const char *file, unsigned char *digest, size_t *nlen )
188     {
189     gpg_md_t md;
190     FILE * fp;
191     char buf[8192];
192     int n;
193    
194     md = gpg_md_open( mdalgo );
195     if( !md )
196     return -1;
197     fp = fopen( file, "rb" );
198     if( !fp ) {
199     gpg_md_close( md );
200     return -2;
201     }
202     while( !feof( fp ) ) {
203     n = fread( buf, 1, sizeof buf-1, fp );
204     if( !n )
205     break;
206     md->write( md->ctx, buf, n );
207     }
208     *nlen = _md_get_digest_len( md );
209     gpg_md_final( md );
210     memcpy( digest, gpg_md_read( md ), *nlen );
211     fclose( fp );
212     gpg_md_close( md );
213     return 0;
214     }
215    
216    
217     static int
218     do_check_md (int algo, char * msg, const unsigned char * digest, size_t nlen)
219     {
220     const unsigned char * tmp;
221     int check=0;
222     gpg_md_t md;
223    
224     md = gpg_md_open (algo);
225     if (!md)
226     return -1;
227     gpg_md_write (md, msg, strlen (msg));
228     gpg_md_final (md);
229     tmp = gpg_md_read (md);
230     check = memcmp (digest, tmp, nlen);
231     gpg_md_close (md);
232    
233     return check;
234     }
235    
236     struct {
237     int algo;
238     int dlen;
239     char * msg;
240     const unsigned char * md;
241     } md_test [] = {
242     {MD_RMD160, 20, "abc", "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04\x4a\x8e\x98\xc6\xb0\x87\xf1\x5a\x0b\xfc"},
243     {0, 0, NULL, NULL}
244     };
245    
246    
247     int
248     gpg_md_selftest (void)
249     {
250     int i, rc=0;
251    
252     for (i=0; md_test[i].algo; i++) {
253     rc = do_check_md (md_test[i].algo, md_test[i].msg, md_test[i].md,
254     md_test[i].dlen);
255     if (rc)
256     return rc;
257     }
258     return 0;
259     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26