1/* 2 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10#include <stdio.h> 11#include <string.h> 12#include <stdlib.h> 13 14#include "internal/nelem.h" 15 16# include <openssl/hmac.h> 17# include <openssl/sha.h> 18# ifndef OPENSSL_NO_MD5 19# include <openssl/md5.h> 20# endif 21 22# ifdef CHARSET_EBCDIC 23# include <openssl/ebcdic.h> 24# endif 25 26#include "testutil.h" 27 28# ifndef OPENSSL_NO_MD5 29static struct test_st { 30 const char key[16]; 31 int key_len; 32 const char data[64]; 33 int data_len; 34 const char *digest; 35} test[8] = { 36 { 37 "", 0, "More text test vectors to stuff up EBCDIC machines :-)", 54, 38 "e9139d1e6ee064ef8cf514fc7dc83e86", 39 }, 40 { 41 { 42 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 43 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 44 }, 16, "Hi There", 8, 45 "9294727a3638bb1c13f48ef8158bfc9d", 46 }, 47 { 48 "Jefe", 4, "what do ya want for nothing?", 28, 49 "750c783e6ab0b503eaa86e310a5db738", 50 }, 51 { 52 { 53 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 54 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 55 }, 16, { 56 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 57 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 58 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 59 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 60 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd 61 }, 50, "56be34521d144c88dbb8c733f0e8b3f6", 62 }, 63 { 64 "", 0, "My test data", 12, 65 "61afdecb95429ef494d61fdee15990cabf0826fc" 66 }, 67 { 68 "", 0, "My test data", 12, 69 "2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776" 70 }, 71 { 72 "123456", 6, "My test data", 12, 73 "bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd" 74 }, 75 { 76 "12345", 5, "My test data again", 18, 77 "a12396ceddd2a85f4c656bc1e0aa50c78cffde3e" 78 } 79}; 80# endif 81 82static char *pt(unsigned char *md, unsigned int len); 83 84#define UC(a) ((const unsigned char *)(a)) 85 86 87# ifndef OPENSSL_NO_MD5 88static int test_hmac_md5(int idx) 89{ 90 char *p; 91# ifdef CHARSET_EBCDIC 92 ebcdic2ascii(test[0].data, test[0].data, test[0].data_len); 93 ebcdic2ascii(test[1].data, test[1].data, test[1].data_len); 94 ebcdic2ascii(test[2].key, test[2].key, test[2].key_len); 95 ebcdic2ascii(test[2].data, test[2].data, test[2].data_len); 96# endif 97 98 p = pt(HMAC(EVP_md5(), 99 test[idx].key, test[idx].key_len, 100 UC(test[idx].data), test[idx].data_len, NULL, NULL), 101 MD5_DIGEST_LENGTH); 102 103 if (!TEST_str_eq(p, test[idx].digest)) 104 return 0; 105 106 return 1; 107} 108# endif 109 110static int test_hmac_bad(void) 111{ 112 HMAC_CTX *ctx = NULL; 113 int ret = 0; 114 115 ctx = HMAC_CTX_new(); 116 if (!TEST_ptr(ctx) 117 || !TEST_ptr_null(HMAC_CTX_get_md(ctx)) 118 || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL)) 119 || !TEST_false(HMAC_Update(ctx, UC(test[4].data), test[4].data_len)) 120 || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, EVP_sha1(), NULL)) 121 || !TEST_false(HMAC_Update(ctx, UC(test[4].data), test[4].data_len))) 122 goto err; 123 124 ret = 1; 125err: 126 HMAC_CTX_free(ctx); 127 return ret; 128} 129 130static int test_hmac_run(void) 131{ 132 char *p; 133 HMAC_CTX *ctx = NULL; 134 unsigned char buf[EVP_MAX_MD_SIZE]; 135 unsigned int len; 136 int ret = 0; 137 138 ctx = HMAC_CTX_new(); 139 HMAC_CTX_reset(ctx); 140 141 if (!TEST_ptr(ctx) 142 || !TEST_ptr_null(HMAC_CTX_get_md(ctx)) 143 || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL)) 144 || !TEST_false(HMAC_Update(ctx, UC(test[4].data), test[4].data_len)) 145 || !TEST_false(HMAC_Init_ex(ctx, test[4].key, -1, EVP_sha1(), NULL))) 146 goto err; 147 148 if (!TEST_true(HMAC_Init_ex(ctx, test[4].key, test[4].key_len, EVP_sha1(), NULL)) 149 || !TEST_true(HMAC_Update(ctx, UC(test[4].data), test[4].data_len)) 150 || !TEST_true(HMAC_Final(ctx, buf, &len))) 151 goto err; 152 153 p = pt(buf, len); 154 if (!TEST_str_eq(p, test[4].digest)) 155 goto err; 156 157 if (!TEST_false(HMAC_Init_ex(ctx, NULL, 0, EVP_sha256(), NULL))) 158 goto err; 159 160 if (!TEST_true(HMAC_Init_ex(ctx, test[5].key, test[5].key_len, EVP_sha256(), NULL)) 161 || !TEST_ptr_eq(HMAC_CTX_get_md(ctx), EVP_sha256()) 162 || !TEST_true(HMAC_Update(ctx, UC(test[5].data), test[5].data_len)) 163 || !TEST_true(HMAC_Final(ctx, buf, &len))) 164 goto err; 165 166 p = pt(buf, len); 167 if (!TEST_str_eq(p, test[5].digest)) 168 goto err; 169 170 if (!TEST_true(HMAC_Init_ex(ctx, test[6].key, test[6].key_len, NULL, NULL)) 171 || !TEST_true(HMAC_Update(ctx, UC(test[6].data), test[6].data_len)) 172 || !TEST_true(HMAC_Final(ctx, buf, &len))) 173 goto err; 174 p = pt(buf, len); 175 if (!TEST_str_eq(p, test[6].digest)) 176 goto err; 177 178 /* Test reusing a key */ 179 if (!TEST_true(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL)) 180 || !TEST_true(HMAC_Update(ctx, UC(test[6].data), test[6].data_len)) 181 || !TEST_true(HMAC_Final(ctx, buf, &len))) 182 goto err; 183 p = pt(buf, len); 184 if (!TEST_str_eq(p, test[6].digest)) 185 goto err; 186 187 /* 188 * Test reusing a key where the digest is provided again but is the same as 189 * last time 190 */ 191 if (!TEST_true(HMAC_Init_ex(ctx, NULL, 0, EVP_sha256(), NULL)) 192 || !TEST_true(HMAC_Update(ctx, UC(test[6].data), test[6].data_len)) 193 || !TEST_true(HMAC_Final(ctx, buf, &len))) 194 goto err; 195 p = pt(buf, len); 196 if (!TEST_str_eq(p, test[6].digest)) 197 goto err; 198 199 ret = 1; 200err: 201 HMAC_CTX_free(ctx); 202 return ret; 203} 204 205 206static int test_hmac_single_shot(void) 207{ 208 char *p; 209 210 /* Test single-shot with an empty key. */ 211 p = pt(HMAC(EVP_sha1(), NULL, 0, UC(test[4].data), test[4].data_len, 212 NULL, NULL), SHA_DIGEST_LENGTH); 213 if (!TEST_str_eq(p, test[4].digest)) 214 return 0; 215 216 return 1; 217} 218 219 220static int test_hmac_copy(void) 221{ 222 char *p; 223 HMAC_CTX *ctx = NULL, *ctx2 = NULL; 224 unsigned char buf[EVP_MAX_MD_SIZE]; 225 unsigned int len; 226 int ret = 0; 227 228 ctx = HMAC_CTX_new(); 229 ctx2 = HMAC_CTX_new(); 230 if (!TEST_ptr(ctx) || !TEST_ptr(ctx2)) 231 goto err; 232 233 if (!TEST_true(HMAC_Init_ex(ctx, test[7].key, test[7].key_len, EVP_sha1(), NULL)) 234 || !TEST_true(HMAC_Update(ctx, UC(test[7].data), test[7].data_len)) 235 || !TEST_true(HMAC_CTX_copy(ctx2, ctx)) 236 || !TEST_true(HMAC_Final(ctx2, buf, &len))) 237 goto err; 238 239 p = pt(buf, len); 240 if (!TEST_str_eq(p, test[7].digest)) 241 goto err; 242 243 ret = 1; 244err: 245 HMAC_CTX_free(ctx2); 246 HMAC_CTX_free(ctx); 247 return ret; 248} 249 250# ifndef OPENSSL_NO_MD5 251static char *pt(unsigned char *md, unsigned int len) 252{ 253 unsigned int i; 254 static char buf[80]; 255 256 for (i = 0; i < len; i++) 257 sprintf(&(buf[i * 2]), "%02x", md[i]); 258 return buf; 259} 260# endif 261 262int setup_tests(void) 263{ 264 ADD_ALL_TESTS(test_hmac_md5, 4); 265 ADD_TEST(test_hmac_single_shot); 266 ADD_TEST(test_hmac_bad); 267 ADD_TEST(test_hmac_run); 268 ADD_TEST(test_hmac_copy); 269 return 1; 270} 271 272