vb2_sha_tests.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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. /* FIPS 180-2 Tests for message digest functions. */
  6. #include <stdio.h>
  7. #include "2sysincludes.h"
  8. #include "2rsa.h"
  9. #include "2sha.h"
  10. #include "2return_codes.h"
  11. #include "sha_test_vectors.h"
  12. #include "test_common.h"
  13. void sha1_tests(void)
  14. {
  15. uint8_t digest[VB2_SHA1_DIGEST_SIZE];
  16. uint8_t *test_inputs[3];
  17. int i;
  18. test_inputs[0] = (uint8_t *) oneblock_msg;
  19. test_inputs[1] = (uint8_t *) multiblock_msg1;
  20. test_inputs[2] = (uint8_t *) long_msg;
  21. for (i = 0; i < 3; i++) {
  22. TEST_SUCC(vb2_digest_buffer(test_inputs[i],
  23. strlen((char *)test_inputs[i]),
  24. VB2_HASH_SHA1,
  25. digest, sizeof(digest)),
  26. "vb2_digest_buffer() SHA1");
  27. TEST_EQ(memcmp(digest, sha1_results[i], sizeof(digest)),
  28. 0, "SHA1 digest");
  29. }
  30. TEST_EQ(vb2_digest_buffer(test_inputs[0],
  31. strlen((char *)test_inputs[0]),
  32. VB2_HASH_SHA1, digest, sizeof(digest) - 1),
  33. VB2_ERROR_SHA_FINALIZE_DIGEST_SIZE,
  34. "vb2_digest_buffer() too small");
  35. TEST_EQ(vb2_hash_block_size(VB2_HASH_SHA1), VB2_SHA1_BLOCK_SIZE,
  36. "vb2_hash_block_size(VB2_HASH_SHA1)");
  37. }
  38. void sha256_tests(void)
  39. {
  40. uint8_t digest[VB2_SHA256_DIGEST_SIZE];
  41. uint8_t *test_inputs[3];
  42. struct vb2_sha256_context ctx;
  43. const uint8_t expect_multiple[VB2_SHA256_DIGEST_SIZE] = {
  44. 0x07, 0x08, 0xb4, 0xca, 0x46, 0x4c, 0x40, 0x39,
  45. 0x07, 0x06, 0x88, 0x80, 0x30, 0x55, 0x5d, 0x86,
  46. 0x0e, 0x4a, 0x0d, 0x2b, 0xc6, 0xc4, 0x87, 0x39,
  47. 0x2c, 0x16, 0x55, 0xb0, 0x82, 0x13, 0x16, 0x29 };
  48. const uint8_t extend_from[VB2_SHA256_DIGEST_SIZE] = { 0x00, };
  49. const uint8_t extend_by[VB2_SHA256_BLOCK_SIZE] = { 0x00, };
  50. const uint8_t expected_extend[VB2_SHA256_DIGEST_SIZE] = {
  51. 0x7c, 0xa5, 0x16, 0x14, 0x42, 0x5c, 0x3b, 0xa8, 0xce, 0x54,
  52. 0xdd, 0x2f, 0xc2, 0x02, 0x0a, 0xe7, 0xb6, 0xe5, 0x74, 0xd1,
  53. 0x98, 0x13, 0x6d, 0x0f, 0xae, 0x7e, 0x26, 0xcc, 0xbf, 0x0b,
  54. 0xe7, 0xa6 };
  55. int i;
  56. test_inputs[0] = (uint8_t *) oneblock_msg;
  57. test_inputs[1] = (uint8_t *) multiblock_msg1;
  58. test_inputs[2] = (uint8_t *) long_msg;
  59. for (i = 0; i < 3; i++) {
  60. TEST_SUCC(vb2_digest_buffer(test_inputs[i],
  61. strlen((char *)test_inputs[i]),
  62. VB2_HASH_SHA256,
  63. digest, sizeof(digest)),
  64. "vb2_digest_buffer() SHA256");
  65. TEST_EQ(memcmp(digest, sha256_results[i], sizeof(digest)),
  66. 0, "SHA-256 digest");
  67. }
  68. TEST_EQ(vb2_digest_buffer(test_inputs[0],
  69. strlen((char *)test_inputs[0]),
  70. VB2_HASH_SHA256, digest, sizeof(digest) - 1),
  71. VB2_ERROR_SHA_FINALIZE_DIGEST_SIZE,
  72. "vb2_digest_buffer() too small");
  73. /* Test multiple small extends */
  74. vb2_sha256_init(&ctx);
  75. vb2_sha256_update(&ctx, (uint8_t *)"test1", 5);
  76. vb2_sha256_update(&ctx, (uint8_t *)"test2", 5);
  77. vb2_sha256_update(&ctx, (uint8_t *)"test3", 5);
  78. vb2_sha256_finalize(&ctx, digest);
  79. TEST_EQ(memcmp(digest, expect_multiple, sizeof(digest)), 0,
  80. "SHA-256 multiple extends");
  81. TEST_EQ(vb2_hash_block_size(VB2_HASH_SHA256), VB2_SHA256_BLOCK_SIZE,
  82. "vb2_hash_block_size(VB2_HASH_SHA256)");
  83. /* Test SHA256 hash extend */
  84. vb2_sha256_extend(extend_from, extend_by, digest);
  85. TEST_SUCC(memcmp(digest, expected_extend, sizeof(digest)), NULL);
  86. }
  87. void sha512_tests(void)
  88. {
  89. uint8_t digest[VB2_SHA512_DIGEST_SIZE];
  90. uint8_t *test_inputs[3];
  91. int i;
  92. test_inputs[0] = (uint8_t *) oneblock_msg;
  93. test_inputs[1] = (uint8_t *) multiblock_msg2;
  94. test_inputs[2] = (uint8_t *) long_msg;
  95. for (i = 0; i < 3; i++) {
  96. TEST_SUCC(vb2_digest_buffer(test_inputs[i],
  97. strlen((char *)test_inputs[i]),
  98. VB2_HASH_SHA512,
  99. digest, sizeof(digest)),
  100. "vb2_digest_buffer() SHA512");
  101. TEST_EQ(memcmp(digest, sha512_results[i], sizeof(digest)),
  102. 0, "SHA-512 digest");
  103. }
  104. TEST_EQ(vb2_digest_buffer(test_inputs[0],
  105. strlen((char *)test_inputs[0]),
  106. VB2_HASH_SHA512, digest, sizeof(digest) - 1),
  107. VB2_ERROR_SHA_FINALIZE_DIGEST_SIZE,
  108. "vb2_digest_buffer() too small");
  109. TEST_EQ(vb2_hash_block_size(VB2_HASH_SHA512), VB2_SHA512_BLOCK_SIZE,
  110. "vb2_hash_block_size(VB2_HASH_SHA512)");
  111. }
  112. void misc_tests(void)
  113. {
  114. uint8_t digest[VB2_SHA512_DIGEST_SIZE];
  115. struct vb2_digest_context dc;
  116. /* Crypto algorithm to hash algorithm mapping */
  117. TEST_EQ(vb2_crypto_to_hash(VB2_ALG_RSA1024_SHA1), VB2_HASH_SHA1,
  118. "Crypto map to SHA1");
  119. TEST_EQ(vb2_crypto_to_hash(VB2_ALG_RSA2048_SHA256), VB2_HASH_SHA256,
  120. "Crypto map to SHA256");
  121. TEST_EQ(vb2_crypto_to_hash(VB2_ALG_RSA4096_SHA256), VB2_HASH_SHA256,
  122. "Crypto map to SHA256 2");
  123. TEST_EQ(vb2_crypto_to_hash(VB2_ALG_RSA8192_SHA512), VB2_HASH_SHA512,
  124. "Crypto map to SHA512");
  125. TEST_EQ(vb2_crypto_to_hash(VB2_ALG_COUNT), VB2_HASH_INVALID,
  126. "Crypto map to invalid");
  127. TEST_EQ(vb2_digest_size(VB2_HASH_INVALID), 0,
  128. "digest size invalid alg");
  129. TEST_EQ(vb2_hash_block_size(VB2_HASH_INVALID), 0,
  130. "vb2_hash_block_size(VB2_HASH_INVALID)");
  131. TEST_EQ(vb2_digest_buffer((uint8_t *)oneblock_msg, strlen(oneblock_msg),
  132. VB2_HASH_INVALID, digest, sizeof(digest)),
  133. VB2_ERROR_SHA_INIT_ALGORITHM,
  134. "vb2_digest_buffer() invalid alg");
  135. /* Test bad algorithm inside extend and finalize */
  136. vb2_digest_init(&dc, VB2_HASH_SHA256);
  137. dc.hash_alg = VB2_HASH_INVALID;
  138. TEST_EQ(vb2_digest_extend(&dc, digest, sizeof(digest)),
  139. VB2_ERROR_SHA_EXTEND_ALGORITHM,
  140. "vb2_digest_extend() invalid alg");
  141. TEST_EQ(vb2_digest_finalize(&dc, digest, sizeof(digest)),
  142. VB2_ERROR_SHA_FINALIZE_ALGORITHM,
  143. "vb2_digest_finalize() invalid alg");
  144. }
  145. static void hash_algorithm_name_tests(void)
  146. {
  147. enum vb2_hash_algorithm alg;
  148. char test_name[256];
  149. for (alg = 1; alg < VB2_HASH_ALG_COUNT; alg++) {
  150. sprintf(test_name, "%s: %s (alg=%d)",
  151. __func__, vb2_get_hash_algorithm_name(alg), alg);
  152. TEST_STR_NEQ(vb2_get_hash_algorithm_name(alg),
  153. VB2_INVALID_ALG_NAME, test_name);
  154. }
  155. }
  156. int main(int argc, char *argv[])
  157. {
  158. /* Initialize long_msg with 'a' x 1,000,000 */
  159. long_msg = (char *) malloc(1000001);
  160. memset(long_msg, 'a', 1000000);
  161. long_msg[1000000]=0;
  162. sha1_tests();
  163. sha256_tests();
  164. sha512_tests();
  165. misc_tests();
  166. hash_algorithm_name_tests();
  167. free(long_msg);
  168. return gTestSuccess ? 0 : 255;
  169. }