1 /* 2 * Copyright 1995-2017 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 29 static struct test_st { 30 const char key[16]; 31 int key_len; 32 const unsigned 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 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 42 16, "Hi There", 8, 43 "9294727a3638bb1c13f48ef8158bfc9d", 44 }, 45 { 46 "Jefe", 4, "what do ya want for nothing?", 28, 47 "750c783e6ab0b503eaa86e310a5db738", 48 }, 49 { 50 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 51 16, { 52 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 53 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 54 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 55 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 56 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd 57 }, 50, "56be34521d144c88dbb8c733f0e8b3f6", 58 }, 59 { 60 "", 0, "My test data", 12, 61 "61afdecb95429ef494d61fdee15990cabf0826fc" 62 }, 63 { 64 "", 0, "My test data", 12, 65 "2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776" 66 }, 67 { 68 "123456", 6, "My test data", 12, 69 "bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd" 70 }, 71 { 72 "12345", 5, "My test data again", 18, 73 "a12396ceddd2a85f4c656bc1e0aa50c78cffde3e" 74 } 75 }; 76 # endif 77 78 static char *pt(unsigned char *md, unsigned int len); 79 80 81 # ifndef OPENSSL_NO_MD5 82 static int test_hmac_md5(int idx) 83 { 84 char *p; 85 # ifdef CHARSET_EBCDIC 86 ebcdic2ascii(test[0].data, test[0].data, test[0].data_len); 87 ebcdic2ascii(test[1].data, test[1].data, test[1].data_len); 88 ebcdic2ascii(test[2].key, test[2].key, test[2].key_len); 89 ebcdic2ascii(test[2].data, test[2].data, test[2].data_len); 90 # endif 91 92 p = pt(HMAC(EVP_md5(), 93 test[idx].key, test[idx].key_len, 94 test[idx].data, test[idx].data_len, NULL, NULL), 95 MD5_DIGEST_LENGTH); 96 97 if (!TEST_str_eq(p, test[idx].digest)) 98 return 0; 99 100 return 1; 101 } 102 # endif 103 104 static int test_hmac_bad(void) 105 { 106 HMAC_CTX *ctx = NULL; 107 int ret = 0; 108 109 ctx = HMAC_CTX_new(); 110 if (!TEST_ptr(ctx) 111 || !TEST_ptr_null(HMAC_CTX_get_md(ctx)) 112 || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL)) 113 || !TEST_false(HMAC_Update(ctx, test[4].data, test[4].data_len)) 114 || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, EVP_sha1(), NULL)) 115 || !TEST_false(HMAC_Update(ctx, test[4].data, test[4].data_len))) 116 goto err; 117 118 ret = 1; 119 err: 120 HMAC_CTX_free(ctx); 121 return ret; 122 } 123 124 static int test_hmac_run(void) 125 { 126 char *p; 127 HMAC_CTX *ctx = NULL; 128 unsigned char buf[EVP_MAX_MD_SIZE]; 129 unsigned int len; 130 int ret = 0; 131 132 ctx = HMAC_CTX_new(); 133 HMAC_CTX_reset(ctx); 134 135 if (!TEST_ptr(ctx) 136 || !TEST_ptr_null(HMAC_CTX_get_md(ctx)) 137 || !TEST_false(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL)) 138 || !TEST_false(HMAC_Update(ctx, test[4].data, test[4].data_len)) 139 || !TEST_false(HMAC_Init_ex(ctx, test[4].key, -1, EVP_sha1(), NULL))) 140 goto err; 141 142 if (!TEST_true(HMAC_Init_ex(ctx, test[4].key, test[4].key_len, EVP_sha1(), NULL)) 143 || !TEST_true(HMAC_Update(ctx, test[4].data, test[4].data_len)) 144 || !TEST_true(HMAC_Final(ctx, buf, &len))) 145 goto err; 146 147 p = pt(buf, len); 148 if (!TEST_str_eq(p, test[4].digest)) 149 goto err; 150 151 if (!TEST_false(HMAC_Init_ex(ctx, NULL, 0, EVP_sha256(), NULL))) 152 goto err; 153 154 if (!TEST_true(HMAC_Init_ex(ctx, test[5].key, test[5].key_len, EVP_sha256(), NULL)) 155 || !TEST_ptr_eq(HMAC_CTX_get_md(ctx), EVP_sha256()) 156 || !TEST_true(HMAC_Update(ctx, test[5].data, test[5].data_len)) 157 || !TEST_true(HMAC_Final(ctx, buf, &len))) 158 goto err; 159 160 p = pt(buf, len); 161 if (!TEST_str_eq(p, test[5].digest)) 162 goto err; 163 164 if (!TEST_true(HMAC_Init_ex(ctx, test[6].key, test[6].key_len, NULL, NULL)) 165 || !TEST_true(HMAC_Update(ctx, test[6].data, test[6].data_len)) 166 || !TEST_true(HMAC_Final(ctx, buf, &len))) 167 goto err; 168 p = pt(buf, len); 169 if (!TEST_str_eq(p, test[6].digest)) 170 goto err; 171 172 ret = 1; 173 err: 174 HMAC_CTX_free(ctx); 175 return ret; 176 } 177 178 179 static int test_hmac_single_shot(void) 180 { 181 char *p; 182 183 /* Test single-shot with an empty key. */ 184 p = pt(HMAC(EVP_sha1(), NULL, 0, test[4].data, test[4].data_len, 185 NULL, NULL), SHA_DIGEST_LENGTH); 186 if (!TEST_str_eq(p, test[4].digest)) 187 return 0; 188 189 return 1; 190 } 191 192 193 static int test_hmac_copy(void) 194 { 195 char *p; 196 HMAC_CTX *ctx = NULL, *ctx2 = NULL; 197 unsigned char buf[EVP_MAX_MD_SIZE]; 198 unsigned int len; 199 int ret = 0; 200 201 ctx = HMAC_CTX_new(); 202 ctx2 = HMAC_CTX_new(); 203 if (!TEST_ptr(ctx) || !TEST_ptr(ctx2)) 204 goto err; 205 206 if (!TEST_true(HMAC_Init_ex(ctx, test[7].key, test[7].key_len, EVP_sha1(), NULL)) 207 || !TEST_true(HMAC_Update(ctx, test[7].data, test[7].data_len)) 208 || !TEST_true(HMAC_CTX_copy(ctx2, ctx)) 209 || !TEST_true(HMAC_Final(ctx2, buf, &len))) 210 goto err; 211 212 p = pt(buf, len); 213 if (!TEST_str_eq(p, test[7].digest)) 214 goto err; 215 216 ret = 1; 217 err: 218 HMAC_CTX_free(ctx2); 219 HMAC_CTX_free(ctx); 220 return ret; 221 } 222 223 # ifndef OPENSSL_NO_MD5 224 static char *pt(unsigned char *md, unsigned int len) 225 { 226 unsigned int i; 227 static char buf[80]; 228 229 for (i = 0; i < len; i++) 230 sprintf(&(buf[i * 2]), "%02x", md[i]); 231 return buf; 232 } 233 # endif 234 235 int setup_tests(void) 236 { 237 ADD_ALL_TESTS(test_hmac_md5, 4); 238 ADD_TEST(test_hmac_single_shot); 239 ADD_TEST(test_hmac_bad); 240 ADD_TEST(test_hmac_run); 241 ADD_TEST(test_hmac_copy); 242 return 1; 243 } 244 245