2003-06-17 Moritz Schulte <moritz@g10code.com>
[libgcrypt.git] / cipher / md.c
1 /* md.c  -  message digest dispatcher
2  * Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
3  *
4  * This file is part of Libgcrypt.
5  *
6  * Libgcrypt is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser general Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Libgcrypt 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 Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <errno.h>
26 #include <assert.h>
27
28 #include "g10lib.h"
29 #include "cipher.h"
30 #include "ath.h"
31
32 #include "rmd.h"
33
34 static struct {
35   const char *oidstring;
36   int algo;
37 } oid_table[] = {
38   /* iso.member-body.us.rsadsi.pkcs.pkcs-1.5 (sha1WithRSAEncryption) */
39   { "1.2.840.113549.1.1.5",  GCRY_MD_SHA1 },
40   /* iso.member-body.us.rsadsi.pkcs.pkcs-1.4 (md5WithRSAEncryption) */
41   { "1.2.840.113549.1.1.4",  GCRY_MD_MD5 },
42   /* iso.member-body.us.x9-57.x9cm.3 (dsaWithSha1)*/
43   { "1.2.840.10040.4.3",     GCRY_MD_SHA1 },
44   /* from NIST's OIW  (sha1) */
45   { "1.3.14.3.2.26",         GCRY_MD_SHA1 },
46   /* rsaSignatureWithripemd160 */
47   { "1.3.36.3.3.1.2",       GCRY_MD_RMD160 },
48   /* RSADSI digestAlgorithm MD5 */
49   { "1.2.840.113549.2.5",   GCRY_MD_MD5 },
50   /* GNU.digestAlgorithm TIGER */
51   { "1.3.6.1.4.1.11591.12.2", GCRY_MD_TIGER },
52   /* iso.member-body.us.rsadsi.digestAlgorithm.md4 */
53   { "1.2.840.113549.2.4", GCRY_MD_MD4 },
54   /* from NIST OIW (sha-1WithRSAEncryption) */
55   { "1.3.14.3.2.29", GCRY_MD_SHA1 },
56   /* According to the OpenPGG draft rfc2440-bis06 */
57   { "2.16.840.1.101.3.4.2.1", GCRY_MD_SHA256 }, 
58   { "2.16.840.1.101.3.4.2.2", GCRY_MD_SHA384 }, 
59   { "2.16.840.1.101.3.4.2.3", GCRY_MD_SHA512 }, 
60   {NULL}
61 };
62
63 static struct
64 {
65   GcryDigestSpec *digest;
66   int flags;
67 } digest_table[] =
68   {
69 #if USE_CRC    
70     { &digest_spec_crc32, 0 },
71     { &digest_spec_crc32_rfc1510, 0 },
72     { &digest_spec_crc24_rfc2440, 0 },
73 #endif
74 #if USE_MD4
75     { &digest_spec_md4, 0 },
76 #endif
77 #if USE_MD5
78     { &digest_spec_md5, 0 },
79 #endif
80 #if USE_RMD160
81     { &digest_spec_rmd160, 0 },
82 #endif
83 #if USE_SHA1
84     { &digest_spec_sha1, 0 },
85 #endif
86 #if USE_SHA256
87     { &digest_spec_sha256, 0 },
88 #endif
89 #if USE_SHA512
90     { &digest_spec_sha512, 0 },
91     { &digest_spec_sha384, 0 },
92 #endif
93 #if USE_TIGER
94     { &digest_spec_tiger, 0 },
95 #endif
96     { NULL },
97   };
98
99 /* List of registered digests.  */
100 static GcryModule *digests_registered;
101
102 /* This is the lock protecting DIGESTS_REGISTERED.  */
103 static ath_mutex_t digests_registered_lock = ATH_MUTEX_INITIALIZER;
104
105 /* Flag to check wether the default ciphers have already been
106    registered.  */
107 static int default_digests_registered;
108
109 /* Convenient macro for registering the default digests.  */
110 #define REGISTER_DEFAULT_DIGESTS                   \
111   do                                               \
112     {                                              \
113       ath_mutex_lock (&digests_registered_lock);   \
114       if (! default_digests_registered)            \
115         {                                          \
116           gcry_digest_register_default ();         \
117           default_digests_registered = 1;          \
118         }                                          \
119       ath_mutex_unlock (&digests_registered_lock); \
120     }                                              \
121   while (0)
122
123 /* Internal function.  Register all the ciphers included in
124    CIPHER_TABLE.  Returns zero on success or an error code.  */
125 static void
126 gcry_digest_register_default (void)
127 {
128   gpg_err_code_t err = 0;
129   int i;
130   
131   for (i = 0; (! err) && digest_table[i].digest; i++)
132     err = _gcry_module_add (&digests_registered,
133                             (void *) digest_table[i].digest,
134                             NULL);
135
136   if (err)
137     BUG ();
138 }
139
140 /* Internal callback function.  */
141 static int
142 gcry_digest_lookup_func_id (void *spec, void *data)
143 {
144   GcryDigestSpec *digest = (GcryDigestSpec *) spec;
145   int id = *((int *) data);
146
147   return (digest->id == id);
148 }
149
150 /* Internal callback function.  */
151 static int
152 gcry_digest_lookup_func_name (void *spec, void *data)
153 {
154   GcryDigestSpec *digest = (GcryDigestSpec *) spec;
155   char *name = (char *) data;
156
157   return (! stricmp (digest->name, name));
158 }
159
160 /* Internal function.  Lookup a digest entry by it's ID.  */
161 static GcryModule *
162 gcry_digest_lookup_id (int id)
163 {
164   GcryModule *digest;
165
166   digest = _gcry_module_lookup (digests_registered, (void *) &id,
167                                 gcry_digest_lookup_func_id);
168
169   return digest;
170 }
171
172 /* Internal function.  Lookup a digest entry by it's name.  */
173 static GcryModule *
174 gcry_digest_lookup_name (const char *name)
175 {
176   GcryModule *digest;
177
178   digest = _gcry_module_lookup (digests_registered, (void *) name,
179                                 gcry_digest_lookup_func_name);
180
181   return digest;
182 }
183
184 /* Return a new, unused digest ID for a user-provided digest
185    implementation.  */
186 static int
187 gcry_digest_id_new (void)
188 {
189   int id, id_start = 500, id_end = 600; /* FIXME.  */
190   
191   for (id = id_start; id < id_end; id++)
192     if (! gcry_digest_lookup_id (id))
193       return id;
194
195   return 0;
196 }
197
198 /* Public function.  Register a provided DIGEST.  Returns zero on
199    success, in which case the chosen digest ID has been stored in
200    DIGEST, or an error code.  */
201 gpg_error_t
202 gcry_digest_register (GcryDigestSpec *digest, GcryModule **module)
203 {
204   gpg_err_code_t err = 0;
205   int id;
206   GcryModule *mod;
207
208   ath_mutex_lock (&digests_registered_lock);
209   id = gcry_digest_id_new ();
210   if (! id)
211     err = GPG_ERR_INTERNAL;     /* FIXME.  */
212   else
213     {
214       digest->id = id;
215       err = _gcry_module_add (&digests_registered, (void *) digest,
216                               &mod);
217     }
218   ath_mutex_unlock (&digests_registered_lock);
219   
220   if (! err)
221     *module = mod;
222
223   return gpg_error (err);
224 }
225
226 /* Public function.  Unregister the digest identified by ID, which
227    must have been registered with gcry_digest_register.  */
228 void
229 gcry_digest_unregister (GcryModule *module)
230 {
231   ath_mutex_lock (&digests_registered_lock);
232   _gcry_module_release (module);
233   ath_mutex_unlock (&digests_registered_lock);
234 }
235
236 typedef struct gcry_md_list
237 {
238   GcryDigestSpec *digest;
239   GcryModule *module;
240   struct gcry_md_list *next;
241   PROPERLY_ALIGNED_TYPE context;
242 } GcryDigestEntry;
243
244 /* this structure is put right after the gcry_md_hd_t buffer, so that
245  * only one memory block is needed. */
246 struct gcry_md_context
247 {
248   int  magic;
249   int  secure;
250   FILE  *debug;
251   int finalized;
252   GcryDigestEntry *list;
253   byte *macpads;
254 };
255
256 #define CTX_MAGIC_NORMAL 0x11071961
257 #define CTX_MAGIC_SECURE 0x16917011
258
259 static const char * digest_algo_to_string( int algo );
260 static gpg_err_code_t check_digest_algo (int algo);
261 static gpg_err_code_t md_open (gcry_md_hd_t *h, int algo, int secure, int hmac);
262 static gpg_err_code_t md_enable (gcry_md_hd_t hd, int algo);
263 static gpg_err_code_t md_copy (gcry_md_hd_t a, gcry_md_hd_t *b);
264 static void md_close (gcry_md_hd_t a);
265 static void md_write (gcry_md_hd_t a, byte *inbuf, size_t inlen);
266 static void md_final(gcry_md_hd_t a);
267 static byte *md_read( gcry_md_hd_t a, int algo );
268 static int md_get_algo( gcry_md_hd_t a );
269 static int md_digest_length( int algo );
270 static const byte *md_asn_oid( int algo, size_t *asnlen, size_t *mdlen );
271 static void md_start_debug( gcry_md_hd_t a, const char *suffix );
272 static void md_stop_debug( gcry_md_hd_t a );
273
274 /****************
275  * Map a string to the digest algo
276  */
277 int
278 gcry_md_map_name (const char *string)
279 {
280   GcryModule *digest;
281   int id = 0;
282
283   if (!string)
284     return 0;
285
286   /* If the string starts with a digit (optionally prefixed with
287      either "OID." or "oid."), we first look into our table of ASN.1
288      object identifiers to figure out the algorithm */
289   if (digitp (string)
290       || !strncmp (string, "oid.", 4) 
291       || !strncmp (string, "OID.", 4) )
292     {
293       int i;
294       const char *s =  digitp(string)? string : (string+4);
295
296       for (i=0; oid_table[i].oidstring; i++)
297         {
298           if (!strcmp (s, oid_table[i].oidstring))
299             return oid_table[i].algo;
300         }
301     }
302
303
304   REGISTER_DEFAULT_DIGESTS;
305
306   ath_mutex_lock (&digests_registered_lock);
307   digest = gcry_digest_lookup_name (string);
308   if (digest)
309     {
310       id = ((GcryDigestSpec *) digest->spec)->id;
311       _gcry_module_release (digest);
312     }
313   ath_mutex_unlock (&digests_registered_lock);
314
315   return id;
316 }
317
318
319 /****************
320  * Map a digest algo to a string
321  */
322 static const char *
323 digest_algo_to_string (int id)
324 {
325   const char *name = NULL;
326   GcryModule *digest;
327
328   REGISTER_DEFAULT_DIGESTS;
329
330   ath_mutex_lock (&digests_registered_lock);
331   digest = gcry_digest_lookup_id (id);
332   if (digest)
333     {
334       name = ((GcryDigestSpec *) digest->spec)->name;
335       _gcry_module_release (digest);
336     }
337   ath_mutex_unlock (&digests_registered_lock);
338
339   return name;
340 }
341
342 /****************
343  * This function simply returns the name of the algorithm or some constant
344  * string when there is no algo.  It will never return NULL.
345  * Use  the macro gcry_md_test_algo() to check whether the algorithm
346  * is valid.
347  */
348 const char *
349 gcry_md_algo_name (int id)
350 {
351   const char *s = digest_algo_to_string (id);
352   return s ? s : "?";
353 }
354
355
356 static gpg_err_code_t
357 check_digest_algo (int id)
358 {
359   gpg_err_code_t rc = 0;
360   GcryModule *digest;
361
362   REGISTER_DEFAULT_DIGESTS;
363
364   ath_mutex_lock (&digests_registered_lock);
365   digest = gcry_digest_lookup_id (id);
366   if (digest)
367     _gcry_module_release (digest);
368   else
369     rc = GPG_ERR_DIGEST_ALGO;
370   ath_mutex_unlock (&digests_registered_lock);
371
372   return rc;
373 }
374
375
376
377 /****************
378  * Open a message digest handle for use with algorithm ALGO.
379  * More algorithms may be added by md_enable(). The initial algorithm
380  * may be 0.
381  */
382 static gpg_err_code_t
383 md_open (gcry_md_hd_t *h, int algo, int secure, int hmac)
384 {
385   gpg_err_code_t err = GPG_ERR_NO_ERROR;
386   int bufsize = secure ? 512 : 1024;
387   struct gcry_md_context *ctx;
388   gcry_md_hd_t hd;
389   size_t n;
390
391   /* Allocate a memory area to hold the caller visible buffer with it's
392    * control information and the data required by this module. Set the
393    * context pointer at the beginning to this area.
394    * We have to use this strange scheme because we want to hide the
395    * internal data but have a variable sized buffer.
396    *
397    *    +---+------+---........------+-------------+
398    *    !ctx! bctl !  buffer         ! private     !
399    *    +---+------+---........------+-------------+
400    *      !                           ^
401    *      !---------------------------!
402    *
403    * We have to make sture that private is well aligned.
404    */
405   n = sizeof (struct gcry_md_handle) + bufsize;
406   n = ((n + sizeof (PROPERLY_ALIGNED_TYPE) - 1)
407        / sizeof (PROPERLY_ALIGNED_TYPE)) * sizeof (PROPERLY_ALIGNED_TYPE);
408
409   /* allocate and set the Context pointer to the private data */
410   if (secure)
411     hd = gcry_malloc_secure (n + sizeof (struct gcry_md_context));
412   else
413     hd = gcry_malloc (n + sizeof (struct gcry_md_context));
414
415   if (! hd)
416     err = gpg_err_code_from_errno (errno);
417
418   if (! err)
419     {
420       hd->ctx = ctx = (struct gcry_md_context *) ((char *) hd + n);
421       /* setup the globally visible data (bctl in the diagram)*/
422       hd->bufsize = n - sizeof (struct gcry_md_handle) + 1;
423       hd->bufpos = 0;
424
425       /* initialize the private data */
426       memset (hd->ctx, 0, sizeof *hd->ctx);
427       ctx->magic = secure ? CTX_MAGIC_SECURE : CTX_MAGIC_NORMAL;
428       ctx->secure = secure;
429
430       if (hmac)
431         {
432           ctx->macpads = gcry_malloc_secure (128);
433           if (! ctx->macpads)
434             {
435               md_close (hd);
436               err = gpg_err_code_from_errno (errno);
437             }
438         }
439     }
440
441   if (! err)
442     {
443       /* FIXME: should we really do that? */
444       _gcry_fast_random_poll ();
445
446       if (algo)
447         {
448           err = md_enable (hd, algo);
449           if (err)
450             md_close (hd);
451         }
452     }
453
454   if (! err)
455     *h = hd;
456
457   return err;
458 }
459
460 /* Create a message digest object for algorithm ALGO.  FLAGS may be
461    given as an bitwise OR of the gcry_md_flags values.  ALGO may be
462    given as 0 if the algorithms to be used are later set using
463    gcry_md_enable. H is guaranteed to be a valid handle or NULL on
464    error.  */
465 gpg_error_t
466 gcry_md_open (gcry_md_hd_t *h, int algo, unsigned int flags)
467 {
468   gpg_err_code_t err = GPG_ERR_NO_ERROR;
469   gcry_md_hd_t hd;
470
471   if ((flags & ~(GCRY_MD_FLAG_SECURE | GCRY_MD_FLAG_HMAC)))
472     err = GPG_ERR_INV_ARG;
473   else
474     {
475       err = md_open (&hd, algo, (flags & GCRY_MD_FLAG_SECURE),
476                      (flags & GCRY_MD_FLAG_HMAC));
477     }
478
479   *h = err? NULL : hd;
480   return gpg_error (err);
481 }
482
483
484
485 static gpg_err_code_t
486 md_enable (gcry_md_hd_t hd, int id)
487 {
488   struct gcry_md_context *h = hd->ctx;
489   GcryDigestSpec *digest = NULL;
490   GcryDigestEntry *entry;
491   GcryModule *module;
492   gpg_err_code_t err = 0;
493
494   for (entry = h->list; entry; entry = entry->next)
495     if (entry->digest->id == id)
496       return err; /* already enabled */
497
498   REGISTER_DEFAULT_DIGESTS;
499
500   ath_mutex_lock (&digests_registered_lock);
501   module = gcry_digest_lookup_id (id);
502   ath_mutex_unlock (&digests_registered_lock);
503   if (! module)
504     {
505       log_debug ("md_enable: algorithm %d not available\n", id);
506       err = GPG_ERR_DIGEST_ALGO;
507     }
508   else
509     digest = (GcryDigestSpec *) module->spec;
510
511   if (! err)
512     {
513       size_t size = sizeof (*entry)
514         + digest->contextsize
515         - sizeof (entry->context);
516
517       /* and allocate a new list entry */
518       if (h->secure)
519         entry = gcry_malloc_secure (size);
520       else
521         entry = gcry_malloc (size);
522
523       if (! entry)
524         err = gpg_err_code_from_errno (errno);
525       else
526         {
527           entry->digest = digest;
528           entry->module = module;
529           entry->next = h->list;
530           h->list = entry;
531
532           /* and init this instance */
533           (*entry->digest->init) (&entry->context.c);
534         }
535     }
536
537   if (err)
538     {
539       if (module)
540         {
541            ath_mutex_lock (&digests_registered_lock);
542            _gcry_module_release (module);
543            ath_mutex_unlock (&digests_registered_lock);
544         }
545     }
546
547   return err;
548 }
549
550
551 gpg_error_t
552 gcry_md_enable (gcry_md_hd_t hd, int id)
553 {
554   gpg_err_code_t err = md_enable (hd, id);
555   return gpg_error (err);
556 }
557
558 static gpg_err_code_t
559 md_copy (gcry_md_hd_t ahd, gcry_md_hd_t *b_hd)
560 {
561   gpg_err_code_t err = GPG_ERR_NO_ERROR;
562   struct gcry_md_context *a = ahd->ctx;
563   struct gcry_md_context *b;
564   GcryDigestEntry *ar, *br;
565   gcry_md_hd_t bhd;
566   size_t n;
567   
568   if (ahd->bufpos)
569     md_write (ahd, NULL, 0);
570
571   n = (char *) ahd->ctx - (char *) ahd;
572   if (a->secure)
573     bhd = gcry_malloc_secure (n + sizeof (struct gcry_md_context));
574   else
575     bhd = gcry_malloc (n + sizeof (struct gcry_md_context));
576
577   if (! bhd)
578     err = gpg_err_code_from_errno (errno);
579
580   if (! err)
581     {
582       bhd->ctx = b = (struct gcry_md_context *) ((char *) bhd + n);
583       /* no need to copy the buffer due to the write above */
584       assert (ahd->bufsize == (n - sizeof (struct gcry_md_handle) + 1));
585       bhd->bufsize = ahd->bufsize;
586       bhd->bufpos = 0;
587       assert (! ahd->bufpos);
588       memcpy (b, a, sizeof *a);
589       b->list = NULL;
590       b->debug = NULL;
591       if (a->macpads)
592         {
593           b->macpads = gcry_malloc_secure (128);
594           if (! b->macpads)
595             {
596               md_close (bhd);
597               err = gpg_err_code_from_errno (errno);
598             }
599           else
600             memcpy (b->macpads, a->macpads, 128);
601         }
602     }
603
604   /* and now copy the complete list of algorithms */
605   /* I know that the copied list is reversed, but that doesn't matter */
606
607   if (! err)
608     for (ar = a->list; ar; ar = ar->next)
609       {
610         if (a->secure)
611           br = gcry_xmalloc_secure (sizeof *br
612                                     + ar->digest->contextsize
613                                     - sizeof(ar->context));
614         else
615           br = gcry_xmalloc (sizeof *br
616                              + ar->digest->contextsize
617                              - sizeof (ar->context));
618         memcpy (br, ar,
619                 sizeof (*br) + ar->digest->contextsize - sizeof (ar->context));
620         br->next = b->list;
621         b->list = br;
622
623         /* Add a reference to the module.  */
624         ath_mutex_lock (&digests_registered_lock);
625         _gcry_module_use (br->module);
626         ath_mutex_unlock (&digests_registered_lock);
627        }
628
629   if (a->debug)
630     md_start_debug (bhd, "unknown");
631
632   if (! err)
633     *b_hd = bhd;
634
635   return err;
636 }
637
638 gpg_error_t
639 gcry_md_copy (gcry_md_hd_t *handle, gcry_md_hd_t hd)
640 {
641   gpg_err_code_t err = md_copy (hd, handle);
642   if (err)
643     *handle = NULL;
644   return gpg_error (err);
645 }
646
647 /****************
648  * Reset all contexts and discard any buffered stuff.  This may be used
649  * instead of a md_close(); md_open().
650  */
651 void
652 gcry_md_reset (gcry_md_hd_t a)
653 {
654   GcryDigestEntry *r;
655   
656   a->bufpos = a->ctx->finalized = 0;
657
658   for (r = a->ctx->list; r; r = r->next)
659     {
660       memset (r->context.c, 0, r->digest->contextsize);
661       (*r->digest->init) (&r->context.c);
662     }
663   if (a->ctx->macpads)
664     md_write (a, a->ctx->macpads, 64); /* inner pad */
665 }
666
667 static void
668 md_close (gcry_md_hd_t a)
669 {
670   GcryDigestEntry *r, *r2;
671
672   if (! a)
673     return;
674   if (a->ctx->debug)
675     md_stop_debug (a);
676   for (r = a->ctx->list; r; r = r2)
677     {
678       r2 = r->next;
679       ath_mutex_lock (&digests_registered_lock);
680       _gcry_module_release (r->module);
681       ath_mutex_unlock (&digests_registered_lock);
682       gcry_free (r);
683     }
684   gcry_free(a->ctx->macpads);
685   gcry_free(a);
686 }
687
688 void
689 gcry_md_close (gcry_md_hd_t hd)
690 {
691   md_close (hd);
692 }
693
694 static void
695 md_write (gcry_md_hd_t a, byte *inbuf, size_t inlen)
696 {
697   GcryDigestEntry *r;
698   
699   if (a->ctx->debug)
700     {
701       if (a->bufpos && fwrite (a->buf, a->bufpos, 1, a->ctx->debug) != 1)
702         BUG();
703       if (inlen && fwrite (inbuf, inlen, 1, a->ctx->debug) != 1)
704         BUG();
705     }
706
707   for (r = a->ctx->list; r; r = r->next)
708     {
709       if (a->bufpos)
710         (*r->digest->write) (&r->context.c, a->buf, a->bufpos);
711       (*r->digest->write) (&r->context.c, inbuf, inlen);
712     }
713   a->bufpos = 0;
714 }
715
716 void
717 gcry_md_write (gcry_md_hd_t hd, const void *inbuf, size_t inlen)
718 {
719   md_write (hd, (unsigned char *) inbuf, inlen);
720 }
721
722 static void
723 md_final (gcry_md_hd_t a)
724 {
725   GcryDigestEntry *r;
726
727   if (a->ctx->finalized)
728     return;
729
730   if (a->bufpos)
731     md_write (a, NULL, 0);
732
733   for (r = a->ctx->list; r; r = r->next)
734     (*r->digest->final) (&r->context.c);
735
736   a->ctx->finalized = 1;
737
738   if (a->ctx->macpads)
739     {
740       /* finish the hmac */
741       int algo = md_get_algo (a);
742       byte *p = md_read (a, algo);
743       size_t dlen = md_digest_length (algo);
744       gcry_md_hd_t om;
745       gpg_err_code_t err = md_open (&om, algo, a->ctx->secure, 0);
746
747       if (err)
748         _gcry_fatal_error (err, NULL);
749       md_write (om, a->ctx->macpads+64, 64);
750       md_write (om, p, dlen);
751       md_final (om);
752       /* replace our digest with the mac (they have the same size) */
753       memcpy (p, md_read (om, algo), dlen);
754       md_close (om);
755     }
756 }
757
758 static gpg_err_code_t
759 prepare_macpads( gcry_md_hd_t hd, const byte *key, size_t keylen)
760 {
761   int i;
762   int algo = md_get_algo( hd );
763   byte *helpkey = NULL;
764   byte *ipad, *opad;
765
766   if( !algo )
767     return GPG_ERR_DIGEST_ALGO; /* i.e. no algo enabled */
768
769   if( keylen > 64 ) {
770     helpkey = gcry_malloc_secure( md_digest_length( algo ) );
771     if( !helpkey )
772       return gpg_err_code_from_errno (errno);
773     gcry_md_hash_buffer( algo, helpkey, key, keylen );
774     key = helpkey;
775     keylen = md_digest_length( algo );
776     assert( keylen <= 64 );
777   }
778
779   memset( hd->ctx->macpads, 0, 128 );
780   ipad = hd->ctx->macpads;
781   opad = hd->ctx->macpads+64;
782   memcpy( ipad, key, keylen );
783   memcpy( opad, key, keylen );
784   for(i=0; i < 64; i++ ) {
785     ipad[i] ^= 0x36;
786     opad[i] ^= 0x5c;
787   }
788   gcry_free( helpkey );
789
790   return GPG_ERR_NO_ERROR;
791 }
792
793 gpg_error_t
794 gcry_md_ctl (gcry_md_hd_t hd, int cmd, byte *buffer, size_t buflen)
795 {
796   gpg_err_code_t rc = 0;
797   
798   switch (cmd)
799     {
800     case GCRYCTL_FINALIZE:
801       md_final (hd);
802       break;
803     case GCRYCTL_SET_KEY:
804       rc = gpg_err_code (gcry_md_setkey (hd, buffer, buflen));
805       break;
806     case GCRYCTL_START_DUMP:
807       md_start_debug (hd, buffer);
808       break;
809     case GCRYCTL_STOP_DUMP:
810       md_stop_debug( hd );
811       break;
812     default:
813       rc = GPG_ERR_INV_OP;
814     }
815   return gpg_error (rc);
816 }
817
818 gpg_error_t
819 gcry_md_setkey (gcry_md_hd_t hd, const void *key, size_t keylen)
820 {
821   gpg_err_code_t rc = GPG_ERR_NO_ERROR;
822
823   if (! hd->ctx->macpads)
824     rc = GPG_ERR_CONFLICT;
825   else
826     {
827       rc = prepare_macpads (hd, key, keylen);
828       if (! rc)
829         gcry_md_reset (hd);
830     }
831
832   return gpg_error (rc);
833 }
834
835
836 /****************
837  * if ALGO is null get the digest for the used algo (which should be only one)
838  */
839 static byte *
840 md_read( gcry_md_hd_t a, int algo )
841 {
842   GcryDigestEntry *r = a->ctx->list;
843
844   if (! algo)
845     {
846       /* return the first algorithm */
847       if (r && r->next)
848         log_debug("more than algorithm in md_read(0)\n");
849       return (*r->digest->read)( &r->context.c );
850     }
851   else
852     {
853       for (r = a->ctx->list; r; r = r->next)
854         if (r->digest->id == algo)
855           return (*r->digest->read) (&r->context.c);
856     }
857   BUG();
858   return NULL;
859 }
860
861 /****************
862  * Read out the complete digest, this function implictly finalizes
863  * the hash.
864  */
865 byte *
866 gcry_md_read (gcry_md_hd_t hd, int algo)
867 {
868   gcry_md_ctl (hd, GCRYCTL_FINALIZE, NULL, 0);
869   return md_read (hd, algo);
870 }
871
872 /****************
873  * This function combines md_final and md_read but keeps the context
874  * intact.  This function can be used to calculate intermediate
875  * digests.  The digest is copied into buffer and the digestlength is
876  * returned.  If buffer is NULL only the needed size for buffer is returned.
877  * buflen gives the max size of buffer. If the buffer is too shourt to
878  * hold the complete digest, the buffer is filled with as many bytes are
879  * possible and this value is returned.
880  */
881 #if 0
882 static int
883 md_digest( gcry_md_hd_t a, int algo, byte *buffer, int buflen )
884 {
885   struct md_digest_list_s *r = NULL;
886   char *context;
887   char *digest;
888
889   if( a->bufpos )
890     md_write( a, NULL, 0 );
891
892   if( !algo ) {  /* return digest for the first algorithm */
893     if( (r=a->ctx->list) && r->next )
894       log_debug("more than algorithm in md_digest(0)\n");
895   }
896   else {
897     for(r=a->ctx->list; r; r = r->next )
898       if( r->algo == algo )
899         break;
900   }
901   if( !r )
902     BUG();
903
904   if( !buffer )
905     return r->mdlen;
906
907   /* I don't want to change the interface, so I simply work on a copy
908    * of the context (extra overhead - should be fixed)*/
909   context = a->ctx->secure ? gcry_xmalloc_secure( r->contextsize )
910     : gcry_xmalloc( r->contextsize );
911   memcpy( context, r->context.c, r->contextsize );
912   (*r->digest->final)( context );
913   digest = (*r->digest->read)( context );
914
915   if( buflen > r->mdlen )
916     buflen = r->mdlen;
917   memcpy( buffer, digest, buflen );
918
919   gcry_free(context);
920   return buflen;
921 }
922 #endif
923
924 /****************
925  * Read out an intermediate digest.
926  */
927 gpg_err_code_t
928 gcry_md_get (gcry_md_hd_t hd, int algo, byte *buffer, int buflen)
929 {
930   /*md_digest ... */
931   return GPG_ERR_INTERNAL;
932 }
933
934
935 /****************
936  * Shortcut function to hash a buffer with a given algo. The only supported
937  * algorithm is RIPE-MD. The supplied digest buffer must be large enough
938  * to store the resulting hash.  No error is returned, the function will
939  * abort on an invalid algo.  DISABLED_ALGOS are ignored here.
940  */
941 void
942 gcry_md_hash_buffer (int algo, void *digest, const void *buffer, size_t length)
943 {
944   if (algo == GCRY_MD_RMD160)
945     _gcry_rmd160_hash_buffer (digest, buffer, length);
946   else
947     {
948       /* for the others we do not have a fast function, so we use the
949          normal functions to do it */
950       gcry_md_hd_t h;
951       gpg_err_code_t err = md_open (&h, algo, 0, 0);
952       if(! err)
953         /* FIXME?  */
954         BUG(); /* algo not available */
955       md_write (h, (byte *) buffer, length);
956       md_final (h);
957       memcpy (digest, md_read (h, algo), md_digest_length (algo));
958       md_close (h);
959     }
960 }
961
962 static int
963 md_get_algo (gcry_md_hd_t a)
964 {
965   GcryDigestEntry *r = a->ctx->list;
966
967   if (r && r->next)
968     log_error("WARNING: more than algorithm in md_get_algo()\n");
969   return r ? r->digest->id : 0;
970 }
971
972 int
973 gcry_md_get_algo (gcry_md_hd_t hd)
974 {
975   return md_get_algo (hd);
976 }
977
978
979 /****************
980  * Return the length of the digest
981  */
982 static int
983 md_digest_length (int id)
984 {
985   GcryModule *digest;
986   int mdlen = 0;
987
988   REGISTER_DEFAULT_DIGESTS;
989
990   ath_mutex_lock (&digests_registered_lock);
991   digest = gcry_digest_lookup_id (id);
992   if (digest)
993     {
994       mdlen = ((GcryDigestSpec *) digest->spec)->mdlen;
995       _gcry_module_release (digest);
996     }
997   ath_mutex_unlock (&digests_registered_lock);
998
999   return mdlen;
1000 }
1001
1002 /****************
1003  * Return the length of the digest in bytes.
1004  * This function will return 0 in case of errors.
1005  */
1006 unsigned int
1007 gcry_md_get_algo_dlen (int id)
1008 {
1009   return md_digest_length (id);
1010 }
1011
1012
1013 /* Hmmm: add a mode to enumerate the OIDs
1014  *      to make g10/sig-check.c more portable */
1015 static const byte *
1016 md_asn_oid (int id, size_t *asnlen, size_t *mdlen)
1017 {
1018   const byte *asnoid = NULL;
1019   GcryModule *digest;
1020
1021   REGISTER_DEFAULT_DIGESTS;
1022
1023   ath_mutex_lock (&digests_registered_lock);
1024   digest = gcry_digest_lookup_id (id);
1025   if (digest)
1026     {
1027       if (asnlen)
1028         *asnlen = ((GcryDigestSpec *) digest->spec)->asnlen;
1029       if (mdlen)
1030         *mdlen = ((GcryDigestSpec *) digest->spec)->mdlen;
1031       asnoid = ((GcryDigestSpec *) digest->spec)->asnoid;
1032       _gcry_module_release (digest);
1033     }
1034   else
1035     log_bug ("no asn for md algo %d\n", id);
1036   ath_mutex_unlock (&digests_registered_lock);
1037
1038   return asnoid;
1039 }
1040
1041
1042
1043 /****************
1044  * Return information about the given cipher algorithm
1045  * WHAT select the kind of information returned:
1046  *  GCRYCTL_TEST_ALGO:
1047  *      Returns 0 when the specified algorithm is available for use.
1048  *      buffer and nbytes must be zero.
1049  *  GCRYCTL_GET_ASNOID:
1050  *      Return the ASNOID of the algorithm in buffer. if buffer is NULL, only
1051  *      the required length is returned.
1052  *
1053  * Note:  Because this function is in most cases used to return an
1054  * integer value, we can make it easier for the caller to just look at
1055  * the return value.  The caller will in all cases consult the value
1056  * and thereby detecting whether a error occured or not (i.e. while checking
1057  * the block size)
1058  */
1059 gpg_error_t
1060 gcry_md_algo_info (int algo, int what, void *buffer, size_t *nbytes)
1061 {
1062   gpg_err_code_t err = GPG_ERR_NO_ERROR;
1063
1064   switch (what)
1065     {
1066     case GCRYCTL_TEST_ALGO:
1067       if (buffer || nbytes)
1068         err = GPG_ERR_INV_ARG;
1069       else
1070         err = check_digest_algo (algo);
1071       break;
1072
1073     case GCRYCTL_GET_ASNOID:
1074       {
1075         size_t asnlen;
1076         const char *asn = md_asn_oid (algo, &asnlen, NULL);
1077         if (buffer && (*nbytes >= asnlen))
1078           {
1079             memcpy (buffer, asn, asnlen);
1080             *nbytes = asnlen;
1081           }
1082         else if ((! buffer) && nbytes)
1083           *nbytes = asnlen;
1084         else
1085           {
1086             if (buffer)
1087               err = GPG_ERR_TOO_SHORT;
1088             else
1089               err = GPG_ERR_INV_ARG;
1090           }
1091         break;
1092       }
1093
1094   default:
1095     err = GPG_ERR_INV_OP;
1096   }
1097
1098   return gpg_error (err);
1099 }
1100
1101
1102 static void
1103 md_start_debug( gcry_md_hd_t md, const char *suffix )
1104 {
1105   static int idx=0;
1106   char buf[25];
1107
1108   if( md->ctx->debug ) {
1109     log_debug("Oops: md debug already started\n");
1110     return;
1111   }
1112   idx++;
1113   sprintf(buf, "dbgmd-%05d.%.10s", idx, suffix );
1114   md->ctx->debug = fopen(buf, "w");
1115   if( !md->ctx->debug )
1116     log_debug("md debug: can't open %s\n", buf );
1117 }
1118
1119 static void
1120 md_stop_debug( gcry_md_hd_t md )
1121 {
1122   if( md->ctx->debug ) {
1123     if( md->bufpos )
1124       md_write( md, NULL, 0 );
1125     fclose(md->ctx->debug);
1126     md->ctx->debug = NULL;
1127   }
1128 #ifdef HAVE_U64_TYPEDEF
1129   {  /* a kludge to pull in the __muldi3 for Solaris */
1130     volatile u32 a = (u32)(ulong)md;
1131     volatile u64 b = 42;
1132     volatile u64 c;
1133     c = a * b;
1134   }
1135 #endif
1136 }
1137
1138
1139
1140 /****************
1141  * Return information about the digest handle.
1142  *  GCRYCTL_IS_SECURE:
1143  *      Returns 1 when the handle works on secured memory
1144  *      otherwise 0 is returned.  There is no error return.
1145  *  GCRYCTL_IS_ALGO_ENABLED:
1146  *     Returns 1 if the algo is enanled for that handle.
1147  *     The algo must be passed as the address of an int.
1148  */
1149 gpg_error_t
1150 gcry_md_info (gcry_md_hd_t h, int cmd, void *buffer, size_t *nbytes)
1151 {
1152   gpg_err_code_t err = GPG_ERR_NO_ERROR;
1153
1154   switch (cmd)
1155     {
1156     case GCRYCTL_IS_SECURE:
1157       *nbytes = h->ctx->secure;
1158       break;
1159
1160     case GCRYCTL_IS_ALGO_ENABLED:
1161       {
1162         GcryDigestEntry *r;
1163         int algo;
1164
1165         if ((! buffer) || (nbytes && (*nbytes != sizeof (int))))
1166           err = GPG_ERR_INV_ARG;
1167         else
1168           {
1169             algo = *(int*)buffer;
1170             
1171             *nbytes = 0;
1172             for(r=h->ctx->list; r; r = r->next ) {
1173               if (r->digest->id == algo)
1174                 {
1175                   *nbytes = 1;
1176                   break;
1177                 }
1178             }
1179           }
1180         break;
1181       }
1182
1183   default:
1184     err = GPG_ERR_INV_OP;
1185   }
1186
1187   return gpg_error (err);
1188 }
1189
1190 gpg_err_code_t
1191 _gcry_md_init (void)
1192 {
1193   gpg_err_code_t err = GPG_ERR_NO_ERROR;
1194
1195   REGISTER_DEFAULT_DIGESTS;
1196
1197   return err;
1198 }
1199
1200
1201 int
1202 gcry_md_is_secure (gcry_md_hd_t a) 
1203 {
1204   size_t value;
1205
1206   if (gcry_md_info (a, GCRYCTL_IS_SECURE, NULL, &value))
1207     value = 1; /* It seems to be better to assume secure memory on
1208                   error. */
1209   return value;
1210 }
1211
1212
1213 int
1214 gcry_md_is_enabled (gcry_md_hd_t a, int algo) 
1215 {
1216   size_t value;
1217
1218   if (gcry_md_info (a, GCRYCTL_IS_ALGO_ENABLED, &algo, &value))
1219     value = 0;
1220   return value;
1221 }