2003-02-23 Moritz Schulte <moritz@g10code.com>
[libgcrypt.git] / cipher / md.c
index 8be1126..40bf6e6 100644 (file)
@@ -1,5 +1,5 @@
 /* md.c  -  message digest dispatcher
- * Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
@@ -45,7 +45,18 @@ static struct {
   { "1.3.14.3.2.26",         GCRY_MD_SHA1 },
   /* rsaSignatureWithripemd160 */
   { "1.3.36.3.3.1.2",       GCRY_MD_RMD160 },
-
+  /* RSADSI digestAlgorithm MD5 */
+  { "1.2.840.113549.2.5",   GCRY_MD_MD5 },
+  /* GNU.digestAlgorithm TIGER */
+  { "1.3.6.1.4.1.11591.12.2", GCRY_MD_TIGER },
+  /* iso.member-body.us.rsadsi.digestAlgorithm.md4 */
+  { "1.2.840.113549.2.4", GCRY_MD_MD4 },
+  /* from NIST OIW (sha-1WithRSAEncryption) */
+  { "1.3.14.3.2.29", GCRY_MD_SHA1 },
+  /* According to the OpenPGG draft rfc2440-bis06 */
+  { "2.16.840.1.101.3.4.2.1", GCRY_MD_SHA256 }, 
+  { "2.16.840.1.101.3.4.2.2", GCRY_MD_SHA384 }, 
+  { "2.16.840.1.101.3.4.2.3", GCRY_MD_SHA512 }, 
   {NULL}
 };
 
@@ -103,9 +114,6 @@ struct md_digest_list_s {
 
 static struct md_digest_list_s *digest_list;
 
-#define digitp(p)   (*(p) >= 0 && *(p) <= '9')
-
-
 
 \f
 static struct md_digest_list_s *
@@ -140,7 +148,7 @@ static int
 load_digest_module( int req_algo )
 {
     static int initialized = 0;
-    static u32 checked_algos[256/32];
+    static u32 checked_algos[512/32];
     static int checked_all = 0;
     struct md_digest_list_s *r;
     void *context = NULL;
@@ -156,7 +164,7 @@ load_digest_module( int req_algo )
        initialized = 1;
     }
     algo = req_algo;
-    if( algo > 255 || !algo )
+    if( algo > 511 || !algo )
        return 0; /* algorithm number too high (does not fit into out bitmap)*/
     if( checked_all )
        return 0; /* already called with -1 */
@@ -343,15 +351,23 @@ md_open( int algo, int secure, int hmac )
 }
 
 
-GCRY_MD_HD
-gcry_md_open( int algo, unsigned int flags )
+/* Create a message digest object for algorithm ALGO.  FLAGS may be
+   given as an bitwise OR of the gcry_md_flags values.  ALGO may be
+   given as 0 if the algorithms to be used are later set using
+   gcry_md_enable. */
+GcryMDHd
+gcry_md_open (int algo, unsigned int flags)
 {
-    GCRY_MD_HD hd;
-    /* fixme: check that algo is available and that only valid
-     * flag values are used */
-    hd = md_open( algo, (flags & GCRY_MD_FLAG_SECURE),
-                       (flags & GCRY_MD_FLAG_HMAC) );
-    return hd;
+  GCRY_MD_HD hd;
+
+  if ((flags & ~(GCRY_MD_FLAG_SECURE | GCRY_MD_FLAG_HMAC)))
+    {
+      set_lasterr (GCRYERR_INV_ARG);
+      return NULL;
+    }
+  hd = md_open (algo, (flags & GCRY_MD_FLAG_SECURE),
+                (flags & GCRY_MD_FLAG_HMAC));
+  return hd;
 }
 
 
@@ -520,9 +536,9 @@ md_write( GCRY_MD_HD a, byte *inbuf, size_t inlen)
 
 
 void
-gcry_md_write( GCRY_MD_HD hd, const byte *inbuf, size_t inlen)
+gcry_md_write( GCRY_MD_HD hd, const void *inbuf, size_t inlen)
 {
-    md_write( hd, (byte*)inbuf, inlen );
+    md_write( hd, (unsigned char *)inbuf, inlen );
 }
 
 
@@ -617,7 +633,7 @@ gcry_md_ctl( GCRY_MD_HD hd, int cmd, byte *buffer, size_t buflen)
 
 
 int
-gcry_md_setkey( GCRY_MD_HD hd, const char *key, size_t keylen )
+gcry_md_setkey( GCRY_MD_HD hd, const void *key, size_t keylen )
 {
     int rc = 0;
 
@@ -736,7 +752,7 @@ gcry_md_get( GCRY_MD_HD hd, int algo, byte *buffer, int buflen )
  * abort on an invalid algo.  DISABLED_ALGOS are ignored here.
  */
 void
-gcry_md_hash_buffer( int algo, char *digest, const char *buffer, size_t length)
+gcry_md_hash_buffer( int algo, void *digest, const void *buffer, size_t length)
 {
     if( algo == GCRY_MD_RMD160 )
        _gcry_rmd160_hash_buffer( digest, buffer, length );
@@ -767,9 +783,15 @@ md_get_algo( GCRY_MD_HD a )
 
 
 int
-gcry_md_get_algo( GCRY_MD_HD hd )
+gcry_md_get_algo (GCRY_MD_HD hd)
 {
-    return md_get_algo( hd ); /* fixme: we need error handling */
+  int algo = md_get_algo (hd);
+  if (!algo)
+    {
+      set_lasterr (GCRYERR_GENERAL);
+      return 0;
+    }
+  return algo;
 }
 
 
@@ -797,18 +819,26 @@ md_digest_length( int algo )
 unsigned int
 gcry_md_get_algo_dlen( int algo )
 {
-    /* we do some very quick checks here */
-    switch( algo )
+  /* we cheat a little bit */
+  switch( algo )
     {
-      case GCRY_MD_MD5: return 16;
-      case GCRY_MD_SHA1:
-      case GCRY_MD_RMD160: return 20;
-      default: {
-           int len = md_digest_length( algo );
-           if( !len )
-               set_lasterr( GCRYERR_INV_MD_ALGO );
-           return 0;
-       }
+    case GCRY_MD_MD4:
+    case GCRY_MD_MD5: return 16;
+    case GCRY_MD_SHA1:
+    case GCRY_MD_RMD160: return 20;
+    case GCRY_MD_SHA256: return 32;
+    case GCRY_MD_SHA384: return 48;
+    case GCRY_MD_SHA512: return 64;
+    case GCRY_MD_CRC32:
+    case GCRY_MD_CRC32_RFC1510: return 4;
+    case GCRY_MD_CRC24_RFC2440: return 3;
+    default: 
+      {
+        int len = md_digest_length( algo );
+        if( !len )
+          set_lasterr( GCRYERR_INV_MD_ALGO );
+        return 0;
+      }
     }
 }
 
@@ -976,3 +1006,6 @@ gcry_md_info( GCRY_MD_HD h, int cmd, void *buffer, size_t *nbytes)
     return 0;
 }
 
+
+
+