]> git.ipfire.org Git - thirdparty/openssl.git/blame - test/hmactest.c
Update copyright year
[thirdparty/openssl.git] / test / hmactest.c
CommitLineData
440e5d80 1/*
33388b44 2 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
58964a49 3 *
909f1a2e 4 * Licensed under the Apache License 2.0 (the "License"). You may not use
440e5d80
RS
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
58964a49
RE
8 */
9
dbde4726
P
10/*
11 * HMAC low level APIs are deprecated for public use, but still ok for internal
12 * use.
13 */
14#include "internal/deprecated.h"
15
58964a49
RE
16#include <stdio.h>
17#include <string.h>
18#include <stdlib.h>
f5d7a031 19
176db6dc 20#include "internal/nelem.h"
55f78baf 21
0f113f3e 22# include <openssl/hmac.h>
b1413d9b 23# include <openssl/sha.h>
0f113f3e
MC
24# ifndef OPENSSL_NO_MD5
25# include <openssl/md5.h>
26# endif
58964a49 27
0f113f3e
MC
28# ifdef CHARSET_EBCDIC
29# include <openssl/ebcdic.h>
30# endif
a53955d8 31
623d1056
RS
32#include "testutil.h"
33
0f113f3e
MC
34# ifndef OPENSSL_NO_MD5
35static struct test_st {
f53537b1 36 const char key[16];
0f113f3e 37 int key_len;
f53537b1 38 const unsigned char data[64];
0f113f3e 39 int data_len;
f53537b1 40 const char *digest;
2cfbdd71 41} test[8] = {
0f113f3e
MC
42 {
43 "", 0, "More text test vectors to stuff up EBCDIC machines :-)", 54,
f53537b1 44 "e9139d1e6ee064ef8cf514fc7dc83e86",
0f113f3e
MC
45 },
46 {
1057c2c3 47 "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
73ff6d68 48 16, "Hi There", 8,
f53537b1 49 "9294727a3638bb1c13f48ef8158bfc9d",
0f113f3e
MC
50 },
51 {
52 "Jefe", 4, "what do ya want for nothing?", 28,
f53537b1 53 "750c783e6ab0b503eaa86e310a5db738",
0f113f3e
MC
54 },
55 {
1057c2c3 56 "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
73ff6d68 57 16, {
0f113f3e
MC
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, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
61 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
62 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd
f53537b1 63 }, 50, "56be34521d144c88dbb8c733f0e8b3f6",
0f113f3e 64 },
2cfbdd71
MC
65 {
66 "", 0, "My test data", 12,
f53537b1 67 "61afdecb95429ef494d61fdee15990cabf0826fc"
2cfbdd71
MC
68 },
69 {
70 "", 0, "My test data", 12,
f53537b1 71 "2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776"
2cfbdd71
MC
72 },
73 {
74 "123456", 6, "My test data", 12,
f53537b1 75 "bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd"
2cfbdd71
MC
76 },
77 {
8a3c000c 78 "12345", 5, "My test data again", 18,
f53537b1 79 "a12396ceddd2a85f4c656bc1e0aa50c78cffde3e"
2cfbdd71 80 }
0f113f3e
MC
81};
82# endif
58964a49 83
2cfbdd71
MC
84static char *pt(unsigned char *md, unsigned int len);
85
623d1056 86
0f113f3e 87# ifndef OPENSSL_NO_MD5
623d1056
RS
88static int test_hmac_md5(int idx)
89{
0f113f3e 90 char *p;
0f113f3e
MC
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
a53955d8 97
623d1056
RS
98 p = pt(HMAC(EVP_md5(),
99 test[idx].key, test[idx].key_len,
100 test[idx].data, test[idx].data_len, NULL, NULL),
101 MD5_DIGEST_LENGTH);
102
f53537b1 103 if (!TEST_str_eq(p, test[idx].digest))
623d1056
RS
104 return 0;
105
106 return 1;
107}
108# endif
109
31a80694 110static int test_hmac_bad(void)
623d1056
RS
111{
112 HMAC_CTX *ctx = NULL;
113 int ret = 0;
2cfbdd71 114
bf7c6817 115 ctx = HMAC_CTX_new();
623d1056
RS
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, 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, 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
31a80694 130static int test_hmac_run(void)
623d1056
RS
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;
b1413d9b 137
623d1056 138 ctx = HMAC_CTX_new();
a87a0a6e 139 HMAC_CTX_reset(ctx);
623d1056
RS
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, 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, test[4].data, test[4].data_len))
150 || !TEST_true(HMAC_Final(ctx, buf, &len)))
151 goto err;
152
2cfbdd71 153 p = pt(buf, len);
f53537b1 154 if (!TEST_str_eq(p, test[4].digest))
623d1056
RS
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, test[5].data, test[5].data_len))
163 || !TEST_true(HMAC_Final(ctx, buf, &len)))
164 goto err;
165
2cfbdd71 166 p = pt(buf, len);
f53537b1 167 if (!TEST_str_eq(p, test[5].digest))
623d1056
RS
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, test[6].data, test[6].data_len))
172 || !TEST_true(HMAC_Final(ctx, buf, &len)))
173 goto err;
2cfbdd71 174 p = pt(buf, len);
f53537b1 175 if (!TEST_str_eq(p, test[6].digest))
623d1056
RS
176 goto err;
177
b1558c0b
MC
178 /* Test reusing a key */
179 if (!TEST_true(HMAC_Init_ex(ctx, NULL, 0, NULL, NULL))
180 || !TEST_true(HMAC_Update(ctx, 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, 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
623d1056
RS
199 ret = 1;
200err:
201 HMAC_CTX_free(ctx);
202 return ret;
203}
204
205
31a80694 206static int test_hmac_single_shot(void)
623d1056
RS
207{
208 char *p;
209
210 /* Test single-shot with an empty key. */
211 p = pt(HMAC(EVP_sha1(), NULL, 0, test[4].data, test[4].data_len,
212 NULL, NULL), SHA_DIGEST_LENGTH);
f53537b1 213 if (!TEST_str_eq(p, test[4].digest))
623d1056
RS
214 return 0;
215
216 return 1;
217}
218
219
31a80694 220static int test_hmac_copy(void)
623d1056
RS
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();
bf7c6817 229 ctx2 = HMAC_CTX_new();
623d1056
RS
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, 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
2cfbdd71 239 p = pt(buf, len);
f53537b1 240 if (!TEST_str_eq(p, test[7].digest))
623d1056
RS
241 goto err;
242
243 ret = 1;
244err:
bf7c6817
RL
245 HMAC_CTX_free(ctx2);
246 HMAC_CTX_free(ctx);
623d1056 247 return ret;
0f113f3e 248}
58964a49 249
0f113f3e 250# ifndef OPENSSL_NO_MD5
2cfbdd71 251static char *pt(unsigned char *md, unsigned int len)
0f113f3e 252{
2cfbdd71 253 unsigned int i;
0f113f3e 254 static char buf[80];
58964a49 255
2cfbdd71 256 for (i = 0; i < len; i++)
0f113f3e 257 sprintf(&(buf[i * 2]), "%02x", md[i]);
c2500f65 258 return buf;
0f113f3e
MC
259}
260# endif
623d1056 261
ad887416 262int setup_tests(void)
623d1056
RS
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);
ad887416 269 return 1;
623d1056
RS
270}
271