5 #include "sw/device/lib/crypto/drivers/entropy.h"
6 #include "sw/device/lib/crypto/impl/integrity.h"
7 #include "sw/device/lib/crypto/impl/keyblob.h"
11 #include "sw/device/lib/testing/test_framework/check.h"
15 #define MODULE_ID MAKE_MODULE_ID('t', 's', 't')
74 static const uint32_t kTestMask[] = {
75 0x8cb847c3, 0xc6d34f36, 0x72edbf7b, 0x9bc0317f, 0x8f003c7f, 0x1d7ba049,
76 0xfd463b63, 0xbb720c44, 0x784c215e, 0xeb101d65, 0x35beb911, 0xab481345,
77 0xa7ebc3e3, 0x04b2a1b9, 0x764a9630, 0x78b8f9c5, 0x3f2a1d8e, 0x8cb847c3,
78 0xc6d34f36, 0x72edbf7b, 0x9bc0317f, 0x8f003c7f, 0x1d7ba049, 0xfd463b63,
79 0xbb720c44, 0x784c215e, 0xeb101d65, 0x35beb911, 0xab481345, 0xa7ebc3e3,
80 0x04b2a1b9, 0x764a9630, 0x78b8f9c5, 0x3f2a1d8e,
90 if (
test->ikm_bytelen >
sizeof(kTestMask)) {
92 return OUT_OF_RANGE();
97 .version = kOtcryptoLibVersion1,
98 .key_mode =
test->hmac_key_mode,
99 .key_length =
test->ikm_bytelen,
102 .security_level = kOtcryptoKeySecurityLevelLow,
104 uint32_t ikm_keyblob[keyblob_num_words(ikm_config)];
105 TRY(keyblob_from_key_and_mask(
test->ikm, kTestMask, ikm_config, ikm_keyblob));
107 .config = ikm_config,
108 .keyblob = ikm_keyblob,
109 .keyblob_length =
sizeof(ikm_keyblob),
111 ikm.checksum = integrity_blinded_checksum(&ikm);
115 .version = kOtcryptoLibVersion1,
116 .key_mode =
test->hmac_key_mode,
117 .key_length =
test->prk_wordlen *
sizeof(uint32_t),
120 .security_level = kOtcryptoKeySecurityLevelLow,
122 uint32_t prk_keyblob[keyblob_num_words(prk_config)];
124 .config = prk_config,
125 .keyblob = prk_keyblob,
126 .keyblob_length =
sizeof(prk_keyblob),
132 .version = kOtcryptoLibVersion1,
133 .key_mode = kOtcryptoKeyModeAesCtr,
134 .key_length =
test->okm_bytelen,
137 .security_level = kOtcryptoKeySecurityLevelLow,
139 uint32_t okm_keyblob[keyblob_num_words(okm_config)];
141 .config = okm_config,
142 .keyblob = okm_keyblob,
143 .keyblob_length =
sizeof(okm_keyblob),
149 .len =
test->salt_bytelen,
155 .len =
test->info_bytelen,
162 if (
test->prk != NULL) {
163 uint32_t *prk_share0;
164 uint32_t *prk_share1;
165 TRY(keyblob_to_shares(&prk, &prk_share0, &prk_share1));
166 uint32_t unmasked_prk[
test->prk_wordlen];
167 for (
size_t i = 0; i <
ARRAYSIZE(unmasked_prk); i++) {
168 unmasked_prk[i] = prk_share0[i] ^ prk_share1[i];
170 TRY_CHECK_ARRAYS_EQ(unmasked_prk,
test->prk,
test->prk_wordlen);
177 uint32_t *okm_share0;
178 uint32_t *okm_share1;
179 TRY(keyblob_to_shares(&okm, &okm_share0, &okm_share1));
180 uint32_t unmasked_okm[keyblob_share_num_words(okm_config)];
181 for (
size_t i = 0; i <
ARRAYSIZE(unmasked_okm); i++) {
182 unmasked_okm[i] = okm_share0[i] ^ okm_share1[i];
184 TRY_CHECK_ARRAYS_EQ((
unsigned char *)unmasked_okm, (
unsigned char *)
test->okm,
207 uint32_t ikm_data[] = {
208 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x00000b0b,
210 uint8_t salt_data[] = {
211 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
212 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
214 uint8_t info_data[] = {
215 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
217 uint32_t prk_data[] = {
218 0x36097707, 0xdf322e2c, 0x0d3fdc0d, 0x63ba7bc4,
219 0x3bc7b690, 0x319c0fb5, 0x4a84ec22, 0xe5b3c2d7,
221 uint32_t okm_data[] = {
222 0x255fb23c, 0x7ad5acfa, 0x644f4390, 0x2a2f36d0, 0x900a2d2d, 0x4c5a1acf,
223 0x562db05d, 0xbfc5c4ec, 0x08720034, 0x1887b8d5, 0x00006558,
226 .hmac_key_mode = kOtcryptoKeyModeHmacSha256,
230 .salt_bytelen =
sizeof(salt_data),
232 .info_bytelen =
sizeof(info_data),
238 return run_test(&
test);
274 uint32_t ikm_data[] = {
275 0x03020100, 0x07060504, 0x0b0a0908, 0x0f0e0d0c, 0x13121110,
276 0x17161514, 0x1b1a1918, 0x1f1e1d1c, 0x23222120, 0x27262524,
277 0x2b2a2928, 0x2f2e2d2c, 0x33323130, 0x37363534, 0x3b3a3938,
278 0x3f3e3d3c, 0x43424140, 0x47464544, 0x4b4a4948, 0x4f4e4d4c,
280 uint8_t salt_data[] = {
281 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
282 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
283 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
284 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
285 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
286 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
287 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
289 uint8_t info_data[] = {
290 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
291 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
292 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
293 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
294 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
295 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
296 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
298 uint32_t prk_data[] = {
299 0x8cb8a606, 0x1a365358, 0x9c4c1006, 0x5cb435eb,
300 0x140076ef, 0x01714690, 0x403f194a, 0x44c25fc1,
302 uint32_t okm_data[] = {
303 0x8d391eb1, 0xa12703c8, 0x8cf7e7c8, 0x34496a59, 0xda2e014f, 0xd8fa4e2d,
304 0x4ccc50a0, 0x7ca9af19, 0x995a0459, 0x7282c7ca, 0xc641cb71, 0x090e595e,
305 0x607532da, 0xb8092f0c, 0xa9937736, 0x71dba3ac, 0x81c530cc, 0x873eec79,
306 0xd5014cc1, 0x4f43f3c1, 0x0000871d,
310 .hmac_key_mode = kOtcryptoKeyModeHmacSha256,
314 .salt_bytelen =
sizeof(salt_data),
316 .info_bytelen =
sizeof(info_data),
322 return run_test(&
test);
344 uint32_t ikm_data[] = {
345 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x0b0b0b0b, 0x00000b0b,
347 uint32_t prk_data[] = {
348 0xa324ef19, 0x167b712c, 0x1da9337f, 0xdf8b646f,
349 0x76675996, 0x7763dbaf, 0x1c4c43ac, 0x04cb3c29,
351 uint32_t okm_data[] = {
352 0x75e7a48d, 0x8fc163a5, 0x2a805f71, 0x315a3c06, 0x5c1fa1b8, 0x9e87e15e,
353 0x5f4e45c3, 0x2d8d733c, 0x9513209d, 0x1ab6a4fa, 0x0000c896,
356 .hmac_key_mode = kOtcryptoKeyModeHmacSha256,
368 return run_test(&
test);
371 OTTF_DEFINE_TEST_CONFIG();
375 CHECK_STATUS_OK(entropy_complex_init());
381 return status_ok(test_result);