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

Diff of /trunk/Gnupg/md.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 438 by werner, Fri Oct 28 12:57:05 2005 UTC revision 439 by twoaday, Thu Apr 12 18:41:31 2012 UTC
# Line 43  gpg_md_open( int algo ) Line 43  gpg_md_open( int algo )
43  {  {
44      gpg_md_t md;      gpg_md_t md;
45    
46      if (algo != MD_SHA1 && algo != MD_MD5 && algo != MD_RMD160      if (algo != MD_SHA1 && algo != MD_MD5 && algo != MD_RMD160)
         && algo != MD_SHA256 && algo != MD_SHA384 && algo != MD_SHA512)  
47          return NULL;          return NULL;
48      md = calloc (1, sizeof * md);      md = calloc (1, sizeof * md);
49      if( !md )      if (!md)
50          return NULL;          return NULL;
51      switch( algo ) {      switch (algo) {
52      case MD_MD5:      case MD_MD5:
53          md->ctx = calloc( 1, sizeof (MD5_CONTEXT) );          md->ctx = calloc( 1, sizeof (MD5_CONTEXT) );
54          if( !md->ctx ) {          if( !md->ctx ) {
# Line 79  gpg_md_open( int algo ) Line 78  gpg_md_open( int algo )
78          rmd160_init( (RMD160_CONTEXT *)md->ctx );          rmd160_init( (RMD160_CONTEXT *)md->ctx );
79          md->write = rmd160_write;          md->write = rmd160_write;
80          break;          break;
81            
     case MD_SHA256:  
         md->ctx = calloc (1, sizeof (sha256_context));  
         if (!md->ctx) {  
             free (md);  
             return NULL;  
         }  
         sha256_init ((sha256_context *)md->ctx);  
         md->write = sha256_write;  
         break;  
   
     case MD_SHA384:  
     case MD_SHA512:  
         md->ctx = calloc (1, sizeof (sha512_context));  
         if (!md->ctx) {  
             free (md);  
             return NULL;  
         }  
         sha512_init ((sha512_context *)md->ctx);  
         md->write = sha512_write;  
         break;  
   
82      default:      default:
83          free( md );          free( md );
84          return NULL;          return NULL;
# Line 129  gpg_md_final( gpg_md_t md ) Line 107  gpg_md_final( gpg_md_t md )
107      case MD_MD5   : md5_final( (MD5_CONTEXT *)md->ctx ); break;      case MD_MD5   : md5_final( (MD5_CONTEXT *)md->ctx ); break;
108      case MD_SHA1  : sha1_final( (SHA1_CONTEXT *) md->ctx ); break;      case MD_SHA1  : sha1_final( (SHA1_CONTEXT *) md->ctx ); break;
109      case MD_RMD160: rmd160_final( (RMD160_CONTEXT *) md->ctx ); break;      case MD_RMD160: rmd160_final( (RMD160_CONTEXT *) md->ctx ); break;
     case MD_SHA256: sha256_final ((sha256_context *)md->ctx); break;  
     case MD_SHA384:  
     case MD_SHA512: sha512_final ((sha512_context *)md->ctx); break;  
110      }      }
111  }  }
112    
# Line 143  gpg_md_read (gpg_md_t md) Line 118  gpg_md_read (gpg_md_t md)
118      case MD_MD5   : return md5_read( (MD5_CONTEXT *)md->ctx ); break;      case MD_MD5   : return md5_read( (MD5_CONTEXT *)md->ctx ); break;
119      case MD_SHA1  : return sha1_read( (SHA1_CONTEXT *)md->ctx ); break;      case MD_SHA1  : return sha1_read( (SHA1_CONTEXT *)md->ctx ); break;
120      case MD_RMD160: return rmd160_read( (RMD160_CONTEXT *)md->ctx ); break;      case MD_RMD160: return rmd160_read( (RMD160_CONTEXT *)md->ctx ); break;
     case MD_SHA256: return sha256_read ((sha256_context *)md->ctx); break;  
     case MD_SHA384:  
     case MD_SHA512: return sha512_read ((sha512_context *)md->ctx); break;  
121      }      }
122      return NULL;      return NULL;
123  }  }
# Line 169  _md_get_digest_len (gpg_md_t md) Line 141  _md_get_digest_len (gpg_md_t md)
141      case MD_SHA1:      case MD_SHA1:
142      case MD_RMD160:      case MD_RMD160:
143          return 20;          return 20;
     case MD_SHA256:  
         return 32;  
     case MD_SHA384:  
         return 48;  
     case MD_SHA512:  
         return 64;  
144      }      }
145      return 0;      return 0;
146  }  }
# Line 186  gpg_md_write( gpg_md_t md, unsigned char Line 152  gpg_md_write( gpg_md_t md, unsigned char
152      if( md )      if( md )
153          md->write( md->ctx, inbuf, len );          md->write( md->ctx, inbuf, len );
154  }  }
   
   
 int  
 gpg_md_hash_file( int mdalgo, const char *file, unsigned char *digest, size_t *nlen )  
 {  
     gpg_md_t md;  
     FILE * fp;  
     char buf[8192];  
     int n;  
   
     md = gpg_md_open( mdalgo );  
     if( !md )  
         return -1;  
     fp = fopen( file, "rb" );  
     if( !fp ) {  
         gpg_md_close( md );  
         return -2;  
     }  
     while( !feof( fp ) ) {  
         n = fread( buf, 1, sizeof buf-1, fp );  
         if( !n )  
             break;  
         md->write( md->ctx, buf, n );  
     }  
     *nlen = _md_get_digest_len( md );  
     gpg_md_final( md );  
     memcpy( digest, gpg_md_read( md ), *nlen );  
     fclose( fp );  
     gpg_md_close( md );  
     return 0;  
 }  
   
   
 static int  
 do_check_md (int algo, char * msg, const unsigned char * digest, size_t nlen)  
 {  
     const unsigned char * tmp;  
     int check=0;  
     gpg_md_t md;  
   
     md = gpg_md_open (algo);  
     if (!md)  
         return -1;  
     gpg_md_write (md, msg, strlen (msg));  
     gpg_md_final (md);  
     tmp = gpg_md_read (md);  
     check = memcmp (digest, tmp, nlen);  
     gpg_md_close (md);  
   
     return check;  
 }  
   
 struct {  
     int algo;  
     int dlen;  
     char * msg;  
     const unsigned char * md;  
 } md_test [] = {  
     {MD_RMD160, 20, "abc", "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04\x4a\x8e\x98\xc6\xb0\x87\xf1\x5a\x0b\xfc"},  
     {0, 0, NULL, NULL}  
 };  
   
   
 int  
 gpg_md_selftest (void)  
 {  
     int i, rc=0;  
   
     for (i=0; md_test[i].algo; i++) {  
         rc = do_check_md (md_test[i].algo, md_test[i].msg, md_test[i].md,  
                           md_test[i].dlen);  
         if (rc)  
             return rc;  
     }  
     return 0;  
 }  

Legend:
Removed from v.438  
changed lines
  Added in v.439

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26