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