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