1e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler * Use of this source code is governed by a BSD-style license that can be
3e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler * found in the LICENSE file.
4e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler */
5e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
6e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler/* FIPS 180-2 Tests for message digest functions. */
7e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
8b9be53640efdee92b1b42e60adda274563236301Randall Spangler#include "2sysincludes.h"
9e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler#include "2rsa.h"
10e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler#include "2sha.h"
11b9be53640efdee92b1b42e60adda274563236301Randall Spangler#include "2return_codes.h"
12e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
13e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler#include "sha_test_vectors.h"
14b9be53640efdee92b1b42e60adda274563236301Randall Spangler#include "test_common.h"
15e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
16e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spanglerstatic int vb2_digest(const uint8_t *buf,
174eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler		      uint32_t size,
184eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler		      enum vb2_hash_algorithm hash_alg,
194eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler		      uint8_t *digest,
204eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler		      uint32_t digest_size)
21e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler{
22e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	struct vb2_digest_context dc;
23e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	int rv;
24e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
254eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler	rv = vb2_digest_init(&dc, hash_alg);
26e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	if (rv)
27e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler		return rv;
28e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
29e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	rv = vb2_digest_extend(&dc, buf, size);
30e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	if (rv)
31e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler		return rv;
32e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
33e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	return vb2_digest_finalize(&dc, digest, digest_size);
34e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler}
35e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
36e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spanglervoid sha1_tests(void)
37e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler{
38e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	uint8_t digest[VB2_SHA1_DIGEST_SIZE];
39e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	uint8_t *test_inputs[3];
40e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	int i;
41e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
42e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	test_inputs[0] = (uint8_t *) oneblock_msg;
43e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	test_inputs[1] = (uint8_t *) multiblock_msg1;
44e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	test_inputs[2] = (uint8_t *) long_msg;
45e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
46e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	for (i = 0; i < 3; i++) {
47b9be53640efdee92b1b42e60adda274563236301Randall Spangler		TEST_SUCC(vb2_digest(test_inputs[i],
48b9be53640efdee92b1b42e60adda274563236301Randall Spangler				     strlen((char *)test_inputs[i]),
494eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler				     VB2_HASH_SHA1, digest, sizeof(digest)),
50b9be53640efdee92b1b42e60adda274563236301Randall Spangler			  "vb2_digest() SHA1");
51e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler		TEST_EQ(memcmp(digest, sha1_results[i], sizeof(digest)),
52e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler			0, "SHA1 digest");
53e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	}
54e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
55b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_digest(test_inputs[0], strlen((char *)test_inputs[0]),
564eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler			   VB2_HASH_SHA1, digest, sizeof(digest) - 1),
57b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SHA_FINALIZE_DIGEST_SIZE, "vb2_digest() too small");
58e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler}
59e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
60e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spanglervoid sha256_tests(void)
61e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler{
62e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	uint8_t digest[VB2_SHA256_DIGEST_SIZE];
63e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	uint8_t *test_inputs[3];
64e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	int i;
65e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
66e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	test_inputs[0] = (uint8_t *) oneblock_msg;
67e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	test_inputs[1] = (uint8_t *) multiblock_msg1;
68e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	test_inputs[2] = (uint8_t *) long_msg;
69e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
70e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	for (i = 0; i < 3; i++) {
71b9be53640efdee92b1b42e60adda274563236301Randall Spangler		TEST_SUCC(vb2_digest(test_inputs[i],
72b9be53640efdee92b1b42e60adda274563236301Randall Spangler				     strlen((char *)test_inputs[i]),
734eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler				     VB2_HASH_SHA256, digest, sizeof(digest)),
74b9be53640efdee92b1b42e60adda274563236301Randall Spangler			  "vb2_digest() SHA256");
75e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler		TEST_EQ(memcmp(digest, sha256_results[i], sizeof(digest)),
76e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler			0, "SHA-256 digest");
77e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	}
78e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
79b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_digest(test_inputs[0], strlen((char *)test_inputs[0]),
804eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler			   VB2_HASH_SHA256, digest, sizeof(digest) - 1),
81b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SHA_FINALIZE_DIGEST_SIZE, "vb2_digest() too small");
82e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler}
83e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
84e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spanglervoid sha512_tests(void)
85e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler{
86e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	uint8_t digest[VB2_SHA512_DIGEST_SIZE];
87e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	uint8_t *test_inputs[3];
88e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	int i;
89e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
90e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	test_inputs[0] = (uint8_t *) oneblock_msg;
91e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	test_inputs[1] = (uint8_t *) multiblock_msg2;
92e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	test_inputs[2] = (uint8_t *) long_msg;
93e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
94e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	for (i = 0; i < 3; i++) {
95b9be53640efdee92b1b42e60adda274563236301Randall Spangler		TEST_SUCC(vb2_digest(test_inputs[i],
96b9be53640efdee92b1b42e60adda274563236301Randall Spangler				     strlen((char *)test_inputs[i]),
974eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler				     VB2_HASH_SHA512, digest,
98b9be53640efdee92b1b42e60adda274563236301Randall Spangler				     sizeof(digest)),
99b9be53640efdee92b1b42e60adda274563236301Randall Spangler			  "vb2_digest() SHA512");
100e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler		TEST_EQ(memcmp(digest, sha512_results[i], sizeof(digest)),
101e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler			0, "SHA-512 digest");
102e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	}
103e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
104b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_digest(test_inputs[0], strlen((char *)test_inputs[0]),
1054eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler			   VB2_HASH_SHA512, digest, sizeof(digest) - 1),
106b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SHA_FINALIZE_DIGEST_SIZE, "vb2_digest() too small");
107e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler}
108e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
109e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spanglervoid misc_tests(void)
110e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler{
111e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	uint8_t digest[VB2_SHA512_DIGEST_SIZE];
112e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	struct vb2_digest_context dc;
113e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
1144eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler	/* Crypto algorithm to hash algorithm mapping */
1154eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler	TEST_EQ(vb2_crypto_to_hash(VB2_ALG_RSA1024_SHA1), VB2_HASH_SHA1,
1164eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler		"Crypto map to SHA1");
1174eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler	TEST_EQ(vb2_crypto_to_hash(VB2_ALG_RSA2048_SHA256), VB2_HASH_SHA256,
1184eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler		"Crypto map to SHA256");
1194eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler	TEST_EQ(vb2_crypto_to_hash(VB2_ALG_RSA4096_SHA256), VB2_HASH_SHA256,
1204eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler		"Crypto map to SHA256 2");
1214eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler	TEST_EQ(vb2_crypto_to_hash(VB2_ALG_RSA8192_SHA512), VB2_HASH_SHA512,
1224eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler		"Crypto map to SHA512");
1234eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler	TEST_EQ(vb2_crypto_to_hash(VB2_ALG_COUNT), VB2_HASH_INVALID,
1244eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler		"Crypto map to invalid");
1254eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler
1264eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler	TEST_EQ(vb2_digest_size(VB2_HASH_INVALID), 0,
1274eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler		"digest size invalid alg");
128e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
129b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_digest((uint8_t *)oneblock_msg, strlen(oneblock_msg),
1304eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler			   VB2_HASH_INVALID, digest, sizeof(digest)),
131b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SHA_INIT_ALGORITHM,
132b9be53640efdee92b1b42e60adda274563236301Randall Spangler		"vb2_digest() invalid alg");
133e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
134e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	/* Test bad algorithm inside extend and finalize */
1354eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler	vb2_digest_init(&dc, VB2_HASH_SHA256);
1364eef812d68f64cc501d795131d95f8a2f27223b1Randall Spangler	dc.hash_alg = VB2_HASH_INVALID;
137b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_digest_extend(&dc, digest, sizeof(digest)),
138b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SHA_EXTEND_ALGORITHM,
139b9be53640efdee92b1b42e60adda274563236301Randall Spangler		"vb2_digest_extend() invalid alg");
140b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_digest_finalize(&dc, digest, sizeof(digest)),
141b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SHA_FINALIZE_ALGORITHM,
142b9be53640efdee92b1b42e60adda274563236301Randall Spangler		"vb2_digest_finalize() invalid alg");
143e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler}
144e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
145e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spanglerint main(int argc, char *argv[])
146e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler{
147e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	/* Initialize long_msg with 'a' x 1,000,000 */
148e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	long_msg = (char *) malloc(1000001);
149e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	memset(long_msg, 'a', 1000000);
150e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	long_msg[1000000]=0;
151e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
152e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	sha1_tests();
153e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	sha256_tests();
154e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	sha512_tests();
155e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	misc_tests();
156e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
157e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	free(long_msg);
158e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler
159e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler	return gTestSuccess ? 0 : 255;
160e166d04e797b605dd2f6784bc863a262c418c0c4Randall Spangler}
161