Don't store an HMAC key for longer than we need
[openssl.git] / test / hmactest.c
index 2431be5cb69ca4e4cfedb5ccceda6ea68693a8f5..a4a9c849b9145d675c766d4f2fb4ee0288bf9d8c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
  *
 /*
  * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
  *
- * Licensed under the OpenSSL license (the "License").  You may not use
+ * Licensed under the Apache License 2.0 (the "License").  You may not use
  * this file except in compliance with the License.  You can obtain a copy
  * in the file LICENSE in the source distribution or at
  * https://www.openssl.org/source/license.html
  * this file except in compliance with the License.  You can obtain a copy
  * in the file LICENSE in the source distribution or at
  * https://www.openssl.org/source/license.html
@@ -11,7 +11,7 @@
 #include <string.h>
 #include <stdlib.h>
 
 #include <string.h>
 #include <stdlib.h>
 
-#include "../e_os.h"
+#include "internal/nelem.h"
 
 # include <openssl/hmac.h>
 # include <openssl/sha.h>
 
 # include <openssl/hmac.h>
 # include <openssl/sha.h>
 
 # ifndef OPENSSL_NO_MD5
 static struct test_st {
 
 # ifndef OPENSSL_NO_MD5
 static struct test_st {
-    unsigned char key[16];
+    const char key[16];
     int key_len;
     int key_len;
-    unsigned char data[64];
+    const unsigned char data[64];
     int data_len;
     int data_len;
-    unsigned char *digest;
+    const char *digest;
 } test[8] = {
     {
         "", 0, "More text test vectors to stuff up EBCDIC machines :-)", 54,
 } test[8] = {
     {
         "", 0, "More text test vectors to stuff up EBCDIC machines :-)", 54,
-        (unsigned char *)"e9139d1e6ee064ef8cf514fc7dc83e86",
+        "e9139d1e6ee064ef8cf514fc7dc83e86",
     },
     {
     },
     {
-        {
-            0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-            0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-        }, 16, "Hi There", 8,
-        (unsigned char *)"9294727a3638bb1c13f48ef8158bfc9d",
+        "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
+        16, "Hi There", 8,
+        "9294727a3638bb1c13f48ef8158bfc9d",
     },
     {
         "Jefe", 4, "what do ya want for nothing?", 28,
     },
     {
         "Jefe", 4, "what do ya want for nothing?", 28,
-        (unsigned char *)"750c783e6ab0b503eaa86e310a5db738",
+        "750c783e6ab0b503eaa86e310a5db738",
     },
     {
     },
     {
-        {
-            0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-            0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-        }, 16, {
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
+        16, {
             0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
             0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
             0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
             0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
             0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd
             0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
             0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
             0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
             0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
             0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd
-        }, 50, (unsigned char *)"56be34521d144c88dbb8c733f0e8b3f6",
+        }, 50, "56be34521d144c88dbb8c733f0e8b3f6",
     },
     {
         "", 0, "My test data", 12,
     },
     {
         "", 0, "My test data", 12,
-        (unsigned char *)"61afdecb95429ef494d61fdee15990cabf0826fc"
+        "61afdecb95429ef494d61fdee15990cabf0826fc"
     },
     {
         "", 0, "My test data", 12,
     },
     {
         "", 0, "My test data", 12,
-        (unsigned char *)"2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776"
+        "2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776"
     },
     {
         "123456", 6, "My test data", 12,
     },
     {
         "123456", 6, "My test data", 12,
-        (unsigned char *)"bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd"
+        "bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd"
     },
     {
         "12345", 5, "My test data again", 18,
     },
     {
         "12345", 5, "My test data again", 18,
-        (unsigned char *)"a12396ceddd2a85f4c656bc1e0aa50c78cffde3e"
+        "a12396ceddd2a85f4c656bc1e0aa50c78cffde3e"
     }
 };
 # endif
     }
 };
 # endif
@@ -98,14 +94,14 @@ static int test_hmac_md5(int idx)
                 test[idx].data, test[idx].data_len, NULL, NULL),
                 MD5_DIGEST_LENGTH);
 
                 test[idx].data, test[idx].data_len, NULL, NULL),
                 MD5_DIGEST_LENGTH);
 
-    if (!TEST_str_eq(p, (char *)test[idx].digest))
+    if (!TEST_str_eq(p, test[idx].digest))
       return 0;
 
     return 1;
 }
 # endif
 
       return 0;
 
     return 1;
 }
 # endif
 
-static int test_hmac_bad()
+static int test_hmac_bad(void)
 {
     HMAC_CTX *ctx = NULL;
     int ret = 0;
 {
     HMAC_CTX *ctx = NULL;
     int ret = 0;
@@ -125,7 +121,7 @@ err:
     return ret;
 }
 
     return ret;
 }
 
-static int test_hmac_run()
+static int test_hmac_run(void)
 {
     char *p;
     HMAC_CTX *ctx = NULL;
 {
     char *p;
     HMAC_CTX *ctx = NULL;
@@ -149,7 +145,7 @@ static int test_hmac_run()
         goto err;
 
     p = pt(buf, len);
         goto err;
 
     p = pt(buf, len);
-    if (!TEST_str_eq(p, (char *)test[4].digest))
+    if (!TEST_str_eq(p, test[4].digest))
         goto err;
 
     if (!TEST_false(HMAC_Init_ex(ctx, NULL, 0, EVP_sha256(), NULL)))
         goto err;
 
     if (!TEST_false(HMAC_Init_ex(ctx, NULL, 0, EVP_sha256(), NULL)))
@@ -162,7 +158,7 @@ static int test_hmac_run()
         goto err;
 
     p = pt(buf, len);
         goto err;
 
     p = pt(buf, len);
-    if (!TEST_str_eq(p, (char *)test[5].digest))
+    if (!TEST_str_eq(p, test[5].digest))
         goto err;
 
     if (!TEST_true(HMAC_Init_ex(ctx, test[6].key, test[6].key_len, NULL, NULL))
         goto err;
 
     if (!TEST_true(HMAC_Init_ex(ctx, test[6].key, test[6].key_len, NULL, NULL))
@@ -170,7 +166,28 @@ static int test_hmac_run()
         || !TEST_true(HMAC_Final(ctx, buf, &len)))
         goto err;
     p = pt(buf, len);
         || !TEST_true(HMAC_Final(ctx, buf, &len)))
         goto err;
     p = pt(buf, len);
-    if (!TEST_str_eq(p, (char *)test[6].digest))
+    if (!TEST_str_eq(p, test[6].digest))
+        goto err;
+
+    /* Test reusing a key */
+    if (!TEST_true(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL))
+        || !TEST_true(HMAC_Update(ctx, test[6].data, test[6].data_len))
+        || !TEST_true(HMAC_Final(ctx, buf, &len)))
+        goto err;
+    p = pt(buf, len);
+    if (!TEST_str_eq(p, test[6].digest))
+        goto err;
+
+    /*
+     * Test reusing a key where the digest is provided again but is the same as
+     * last time
+     */
+    if (!TEST_true(HMAC_Init_ex(ctx, NULL, 0, EVP_sha256(), NULL))
+        || !TEST_true(HMAC_Update(ctx, test[6].data, test[6].data_len))
+        || !TEST_true(HMAC_Final(ctx, buf, &len)))
+        goto err;
+    p = pt(buf, len);
+    if (!TEST_str_eq(p, test[6].digest))
         goto err;
 
     ret = 1;
         goto err;
 
     ret = 1;
@@ -180,21 +197,21 @@ err:
 }
 
 
 }
 
 
-static int test_hmac_single_shot()
+static int test_hmac_single_shot(void)
 {
     char *p;
 
     /* Test single-shot with an empty key. */
     p = pt(HMAC(EVP_sha1(), NULL, 0, test[4].data, test[4].data_len,
                 NULL, NULL), SHA_DIGEST_LENGTH);
 {
     char *p;
 
     /* Test single-shot with an empty key. */
     p = pt(HMAC(EVP_sha1(), NULL, 0, test[4].data, test[4].data_len,
                 NULL, NULL), SHA_DIGEST_LENGTH);
-    if (!TEST_str_eq(p, (char *)test[4].digest))
+    if (!TEST_str_eq(p, test[4].digest))
         return 0;
 
     return 1;
 }
 
 
         return 0;
 
     return 1;
 }
 
 
-static int test_hmac_copy()
+static int test_hmac_copy(void)
 {
     char *p;
     HMAC_CTX *ctx = NULL, *ctx2 = NULL;
 {
     char *p;
     HMAC_CTX *ctx = NULL, *ctx2 = NULL;
@@ -214,7 +231,7 @@ static int test_hmac_copy()
         goto err;
 
     p = pt(buf, len);
         goto err;
 
     p = pt(buf, len);
-    if (!TEST_str_eq(p, (char *)test[7].digest))
+    if (!TEST_str_eq(p, test[7].digest))
         goto err;
 
     ret = 1;
         goto err;
 
     ret = 1;