Poly1305-AEAD: updated implementation to match draft-irtf-cfrg-chacha20-poly1305-03
[libgcrypt.git] / tests / hmac.c
index a3cbe5d..f4dc945 100644 (file)
@@ -26,7 +26,7 @@
 #include <string.h>
 #include <stdarg.h>
 
-#include "../src/gcrypt.h"
+#include "../src/gcrypt-int.h"
 
 static int verbose;
 static int error_count;
@@ -57,12 +57,12 @@ die (const char *format, ...)
 
 static void
 check_one_mac (int algo,
-               void *key, size_t keylen,
-               void *data, size_t datalen,
-               char *expect)
+               const void *key, size_t keylen,
+               const void *data, size_t datalen,
+               const char *expect)
 {
   gcry_md_hd_t hd;
-  char *p;
+  unsigned char *p;
   int mdlen;
   int i;
   gcry_error_t err = 0;
@@ -70,21 +70,21 @@ check_one_mac (int algo,
   err = gcry_md_open (&hd, algo, GCRY_MD_FLAG_HMAC);
   if (err)
     {
-      fail ("algo %d, grcy_md_open failed: %s\n", algo, gpg_strerror (err));
+      fail ("algo %d, gcry_md_open failed: %s\n", algo, gpg_strerror (err));
       return;
     }
 
   mdlen = gcry_md_get_algo_dlen (algo);
   if (mdlen < 1 || mdlen > 500)
     {
-      fail ("algo %d, grcy_md_get_algo_dlen failed: %d\n", algo, mdlen);
+      fail ("algo %d, gcry_md_get_algo_dlen failed: %d\n", algo, mdlen);
       return;
     }
 
   err = gcry_md_setkey (hd, key, keylen);
   if (err)
     {
-      fail ("algo %d, grcy_md_setkey failed: %s\n", algo, gpg_strerror (err));
+      fail ("algo %d, gcry_md_setkey failed: %s\n", algo, gpg_strerror (err));
       return;
     }
 
@@ -111,25 +111,100 @@ check_one_mac (int algo,
 static void
 check_hmac (void)
 {
-  unsigned char key[64];
+  unsigned char key[128];
   int i, j;
 
-  /* FIPS 198a, A.1 */
+  if (verbose)
+    fprintf (stderr, "checking FIPS-198a, A.1\n");
   for (i=0; i < 64; i++)
     key[i] = i;
   check_one_mac (GCRY_MD_SHA1, key, 64, "Sample #1", 9,
                  "\x4f\x4c\xa3\xd5\xd6\x8b\xa7\xcc\x0a\x12"
                  "\x08\xc9\xc6\x1e\x9c\x5d\xa0\x40\x3c\x0a");
 
-  /* FIPS 198a, A.2 */
+  if (verbose)
+    fprintf (stderr, "checking FIPS-198a, A.2\n");
   for (i=0, j=0x30; i < 20; i++)
     key[i] = j++;
   check_one_mac (GCRY_MD_SHA1, key, 20, "Sample #2", 9,
                  "\x09\x22\xd3\x40\x5f\xaa\x3d\x19\x4f\x82"
                  "\xa4\x58\x30\x73\x7d\x5c\xc6\xc7\x5d\x24");
 
+  if (verbose)
+    fprintf (stderr, "checking FIPS-198a, A.3\n");
+  for (i=0, j=0x50; i < 100; i++)
+    key[i] = j++;
+  check_one_mac (GCRY_MD_SHA1, key, 100, "Sample #3", 9,
+                 "\xbc\xf4\x1e\xab\x8b\xb2\xd8\x02\xf3\xd0"
+                 "\x5c\xaf\x7c\xb0\x92\xec\xf8\xd1\xa3\xaa");
+
+  if (verbose)
+    fprintf (stderr, "checking FIPS-198a, A.4\n");
+  for (i=0, j=0x70; i < 49; i++)
+    key[i] = j++;
+  check_one_mac (GCRY_MD_SHA1, key, 49, "Sample #4", 9,
+                 "\x9e\xa8\x86\xef\xe2\x68\xdb\xec\xce\x42"
+                 "\x0c\x75\x24\xdf\x32\xe0\x75\x1a\x2a\x26");
+
+}
+
+
+static void
+check_hmac_multi (void)
+{
+  gpg_error_t err;
+  unsigned char key[128];
+  const char msg[] = "Sample #1";
+  const char mac[] = ("\x4f\x4c\xa3\xd5\xd6\x8b\xa7\xcc\x0a\x12"
+                      "\x08\xc9\xc6\x1e\x9c\x5d\xa0\x40\x3c\x0a");
+  gcry_buffer_t iov[4];
+  char digest[64];
+  int i;
+  int algo;
+  int maclen;
+
+  if (verbose)
+    fprintf (stderr, "checking HMAC using multiple buffers\n");
+  for (i=0; i < 64; i++)
+    key[i] = i;
+
+  memset (iov, 0, sizeof iov);
+  iov[0].data = key;
+  iov[0].len = 64;
+  iov[1].data = (void*)msg;
+  iov[1].off = 0;
+  iov[1].len = 3;
+  iov[2].data = (void*)msg;
+  iov[2].off = 3;
+  iov[2].len = 1;
+  iov[3].data = (void*)msg;
+  iov[3].off = 4;
+  iov[3].len = 5;
+
+  algo = GCRY_MD_SHA1;
+  maclen = gcry_md_get_algo_dlen (algo);
+  err = gcry_md_hash_buffers (algo, GCRY_MD_FLAG_HMAC, digest, iov, 4);
+  if (err)
+    {
+      fail ("gcry_md_hash_buffers failed: %s\n", algo, gpg_strerror (err));
+      return;
+    }
+
+  if (memcmp (digest, mac, maclen))
+    {
+      printf ("computed: ");
+      for (i = 0; i < maclen; i++)
+       printf ("%02x ", digest[i] & 0xFF);
+      printf ("\nexpected: ");
+      for (i = 0; i < maclen; i++)
+       printf ("%02x ", mac[i] & 0xFF);
+      printf ("\n");
+
+      fail ("gcry_md_hash_buffers, algo %d, MAC does not match\n", algo);
+    }
 }
 
+
 int
 main (int argc, char **argv)
 {
@@ -148,6 +223,7 @@ main (int argc, char **argv)
   if (debug)
     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u, 0);
   check_hmac ();
+  check_hmac_multi ();
 
   return error_count ? 1 : 0;
 }