aboutsummaryrefslogtreecommitdiff
path: root/src/util/crypto_hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/crypto_hash.c')
-rw-r--r--src/util/crypto_hash.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/util/crypto_hash.c b/src/util/crypto_hash.c
index e14e7c898..3244a4371 100644
--- a/src/util/crypto_hash.c
+++ b/src/util/crypto_hash.c
@@ -561,19 +561,27 @@ GNUNET_CRYPTO_hmac_derive_key_v (struct GNUNET_CRYPTO_AuthKey *key,
561void 561void
562GNUNET_CRYPTO_hmac (const struct GNUNET_CRYPTO_AuthKey *key, 562GNUNET_CRYPTO_hmac (const struct GNUNET_CRYPTO_AuthKey *key,
563 const void *plaintext, size_t plaintext_len, 563 const void *plaintext, size_t plaintext_len,
564 struct GNUNET_HashCode * hmac) 564 struct GNUNET_HashCode *hmac)
565{ 565{
566 gcry_md_hd_t md; 566 static int once;
567 static gcry_md_hd_t md;
567 const unsigned char *mc; 568 const unsigned char *mc;
568 569
569 GNUNET_assert (GPG_ERR_NO_ERROR == 570 if (! once)
570 gcry_md_open (&md, GCRY_MD_SHA512, GCRY_MD_FLAG_HMAC)); 571 {
572 once = 1;
573 GNUNET_assert (GPG_ERR_NO_ERROR ==
574 gcry_md_open (&md, GCRY_MD_SHA512, GCRY_MD_FLAG_HMAC));
575 }
576 else
577 {
578 gcry_md_reset (md);
579 }
571 gcry_md_setkey (md, key->key, sizeof (key->key)); 580 gcry_md_setkey (md, key->key, sizeof (key->key));
572 gcry_md_write (md, plaintext, plaintext_len); 581 gcry_md_write (md, plaintext, plaintext_len);
573 mc = gcry_md_read (md, GCRY_MD_SHA512); 582 mc = gcry_md_read (md, GCRY_MD_SHA512);
574 if (mc != NULL) 583 GNUNET_assert (NULL != mc);
575 memcpy (hmac->bits, mc, sizeof (hmac->bits)); 584 memcpy (hmac->bits, mc, sizeof (hmac->bits));
576 gcry_md_close (md);
577} 585}
578 586
579 587