aes selftest: determine selftest loop limit in runtime

Signed-off-by: Yanray Wang <yanray.wang@arm.com>
This commit is contained in:
Yanray Wang 2023-05-11 12:04:23 +08:00
parent 62c9991a5b
commit 59c2dfa48c

View file

@ -1820,318 +1820,315 @@ int mbedtls_aes_self_test(int verbose)
/* /*
* ECB mode * ECB mode
*/ */
for (i = 0; i < 6; i++) { {
u = i >> 1; static const int num_tests =
keybits = 128 + u * 64; sizeof(aes_test_ecb_dec) / sizeof(*aes_test_ecb_dec);
mode = i & 1;
if (verbose != 0) { for (i = 0; i < num_tests << 1; i++) {
mbedtls_printf(" AES-ECB-%3u (%s): ", keybits, u = i >> 1;
(mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); keybits = 128 + u * 64;
} mode = i & 1;
#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH) if (verbose != 0) {
if (keybits > 128) { mbedtls_printf(" AES-ECB-%3u (%s): ", keybits,
mbedtls_printf("skipped\n"); (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
continue; }
}
#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
memset(buf, 0, 16); memset(buf, 0, 16);
if (mode == MBEDTLS_AES_DECRYPT) { if (mode == MBEDTLS_AES_DECRYPT) {
ret = mbedtls_aes_setkey_dec(&ctx, key, keybits); ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
aes_tests = aes_test_ecb_dec[u]; aes_tests = aes_test_ecb_dec[u];
} else { } else {
ret = mbedtls_aes_setkey_enc(&ctx, key, keybits); ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
aes_tests = aes_test_ecb_enc[u]; aes_tests = aes_test_ecb_enc[u];
} }
/* /*
* AES-192 is an optional feature that may be unavailable when * AES-192 is an optional feature that may be unavailable when
* there is an alternative underlying implementation i.e. when * there is an alternative underlying implementation i.e. when
* MBEDTLS_AES_ALT is defined. * MBEDTLS_AES_ALT is defined.
*/ */
if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) { if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
mbedtls_printf("skipped\n"); mbedtls_printf("skipped\n");
continue; continue;
} else if (ret != 0) { } else if (ret != 0) {
goto exit;
}
for (j = 0; j < 10000; j++) {
ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
if (ret != 0) {
goto exit; goto exit;
} }
for (j = 0; j < 10000; j++) {
ret = mbedtls_aes_crypt_ecb(&ctx, mode, buf, buf);
if (ret != 0) {
goto exit;
}
}
if (memcmp(buf, aes_tests, 16) != 0) {
ret = 1;
goto exit;
}
if (verbose != 0) {
mbedtls_printf("passed\n");
}
} }
if (memcmp(buf, aes_tests, 16) != 0) {
ret = 1;
goto exit;
}
if (verbose != 0) { if (verbose != 0) {
mbedtls_printf("passed\n"); mbedtls_printf("\n");
} }
} }
if (verbose != 0) {
mbedtls_printf("\n");
}
#if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_CIPHER_MODE_CBC)
/* /*
* CBC mode * CBC mode
*/ */
for (i = 0; i < 6; i++) { {
u = i >> 1; static const int num_tests =
keybits = 128 + u * 64; sizeof(aes_test_cbc_dec) / sizeof(*aes_test_cbc_dec);
mode = i & 1;
if (verbose != 0) { for (i = 0; i < num_tests << 1; i++) {
mbedtls_printf(" AES-CBC-%3u (%s): ", keybits, u = i >> 1;
(mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); keybits = 128 + u * 64;
} mode = i & 1;
#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH) if (verbose != 0) {
if (keybits > 128) { mbedtls_printf(" AES-CBC-%3u (%s): ", keybits,
mbedtls_printf("skipped\n"); (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
continue;
}
#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
memset(iv, 0, 16);
memset(prv, 0, 16);
memset(buf, 0, 16);
if (mode == MBEDTLS_AES_DECRYPT) {
ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
aes_tests = aes_test_cbc_dec[u];
} else {
ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
aes_tests = aes_test_cbc_enc[u];
}
/*
* AES-192 is an optional feature that may be unavailable when
* there is an alternative underlying implementation i.e. when
* MBEDTLS_AES_ALT is defined.
*/
if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
mbedtls_printf("skipped\n");
continue;
} else if (ret != 0) {
goto exit;
}
for (j = 0; j < 10000; j++) {
if (mode == MBEDTLS_AES_ENCRYPT) {
unsigned char tmp[16];
memcpy(tmp, prv, 16);
memcpy(prv, buf, 16);
memcpy(buf, tmp, 16);
} }
ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf); memset(iv, 0, 16);
if (ret != 0) { memset(prv, 0, 16);
memset(buf, 0, 16);
if (mode == MBEDTLS_AES_DECRYPT) {
ret = mbedtls_aes_setkey_dec(&ctx, key, keybits);
aes_tests = aes_test_cbc_dec[u];
} else {
ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
aes_tests = aes_test_cbc_enc[u];
}
/*
* AES-192 is an optional feature that may be unavailable when
* there is an alternative underlying implementation i.e. when
* MBEDTLS_AES_ALT is defined.
*/
if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
mbedtls_printf("skipped\n");
continue;
} else if (ret != 0) {
goto exit; goto exit;
} }
} for (j = 0; j < 10000; j++) {
if (mode == MBEDTLS_AES_ENCRYPT) {
unsigned char tmp[16];
if (memcmp(buf, aes_tests, 16) != 0) { memcpy(tmp, prv, 16);
ret = 1; memcpy(prv, buf, 16);
goto exit; memcpy(buf, tmp, 16);
}
ret = mbedtls_aes_crypt_cbc(&ctx, mode, 16, iv, buf, buf);
if (ret != 0) {
goto exit;
}
}
if (memcmp(buf, aes_tests, 16) != 0) {
ret = 1;
goto exit;
}
if (verbose != 0) {
mbedtls_printf("passed\n");
}
} }
if (verbose != 0) { if (verbose != 0) {
mbedtls_printf("passed\n"); mbedtls_printf("\n");
} }
} }
if (verbose != 0) {
mbedtls_printf("\n");
}
#endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CFB) #if defined(MBEDTLS_CIPHER_MODE_CFB)
/* /*
* CFB128 mode * CFB128 mode
*/ */
for (i = 0; i < 6; i++) { {
u = i >> 1; static const int num_tests =
keybits = 128 + u * 64; sizeof(aes_test_cfb128_key) / sizeof(*aes_test_cfb128_key);
mode = i & 1;
if (verbose != 0) { for (i = 0; i < num_tests << 1; i++) {
mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits, u = i >> 1;
(mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); keybits = 128 + u * 64;
} mode = i & 1;
#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH) if (verbose != 0) {
if (keybits > 128) { mbedtls_printf(" AES-CFB128-%3u (%s): ", keybits,
mbedtls_printf("skipped\n"); (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
continue; }
}
#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
memcpy(iv, aes_test_cfb128_iv, 16); memcpy(iv, aes_test_cfb128_iv, 16);
memcpy(key, aes_test_cfb128_key[u], keybits / 8); memcpy(key, aes_test_cfb128_key[u], keybits / 8);
offset = 0; offset = 0;
ret = mbedtls_aes_setkey_enc(&ctx, key, keybits); ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
/* /*
* AES-192 is an optional feature that may be unavailable when * AES-192 is an optional feature that may be unavailable when
* there is an alternative underlying implementation i.e. when * there is an alternative underlying implementation i.e. when
* MBEDTLS_AES_ALT is defined. * MBEDTLS_AES_ALT is defined.
*/ */
if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) { if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
mbedtls_printf("skipped\n"); mbedtls_printf("skipped\n");
continue; continue;
} else if (ret != 0) { } else if (ret != 0) {
goto exit; goto exit;
} }
if (mode == MBEDTLS_AES_DECRYPT) { if (mode == MBEDTLS_AES_DECRYPT) {
memcpy(buf, aes_test_cfb128_ct[u], 64); memcpy(buf, aes_test_cfb128_ct[u], 64);
aes_tests = aes_test_cfb128_pt; aes_tests = aes_test_cfb128_pt;
} else { } else {
memcpy(buf, aes_test_cfb128_pt, 64); memcpy(buf, aes_test_cfb128_pt, 64);
aes_tests = aes_test_cfb128_ct[u]; aes_tests = aes_test_cfb128_ct[u];
} }
ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf); ret = mbedtls_aes_crypt_cfb128(&ctx, mode, 64, &offset, iv, buf, buf);
if (ret != 0) { if (ret != 0) {
goto exit; goto exit;
} }
if (memcmp(buf, aes_tests, 64) != 0) { if (memcmp(buf, aes_tests, 64) != 0) {
ret = 1; ret = 1;
goto exit; goto exit;
}
if (verbose != 0) {
mbedtls_printf("passed\n");
}
} }
if (verbose != 0) { if (verbose != 0) {
mbedtls_printf("passed\n"); mbedtls_printf("\n");
} }
} }
if (verbose != 0) {
mbedtls_printf("\n");
}
#endif /* MBEDTLS_CIPHER_MODE_CFB */ #endif /* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_OFB) #if defined(MBEDTLS_CIPHER_MODE_OFB)
/* /*
* OFB mode * OFB mode
*/ */
for (i = 0; i < 6; i++) { {
u = i >> 1; static const int num_tests =
keybits = 128 + u * 64; sizeof(aes_test_ofb_key) / sizeof(*aes_test_ofb_key);
mode = i & 1;
if (verbose != 0) { for (i = 0; i < num_tests << 1; i++) {
mbedtls_printf(" AES-OFB-%3u (%s): ", keybits, u = i >> 1;
(mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); keybits = 128 + u * 64;
} mode = i & 1;
#if defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH) if (verbose != 0) {
if (keybits > 128) { mbedtls_printf(" AES-OFB-%3u (%s): ", keybits,
mbedtls_printf("skipped\n"); (mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
continue; }
}
#endif /* MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH */
memcpy(iv, aes_test_ofb_iv, 16); memcpy(iv, aes_test_ofb_iv, 16);
memcpy(key, aes_test_ofb_key[u], keybits / 8); memcpy(key, aes_test_ofb_key[u], keybits / 8);
offset = 0; offset = 0;
ret = mbedtls_aes_setkey_enc(&ctx, key, keybits); ret = mbedtls_aes_setkey_enc(&ctx, key, keybits);
/* /*
* AES-192 is an optional feature that may be unavailable when * AES-192 is an optional feature that may be unavailable when
* there is an alternative underlying implementation i.e. when * there is an alternative underlying implementation i.e. when
* MBEDTLS_AES_ALT is defined. * MBEDTLS_AES_ALT is defined.
*/ */
if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) { if (ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192) {
mbedtls_printf("skipped\n"); mbedtls_printf("skipped\n");
continue; continue;
} else if (ret != 0) { } else if (ret != 0) {
goto exit; goto exit;
} }
if (mode == MBEDTLS_AES_DECRYPT) { if (mode == MBEDTLS_AES_DECRYPT) {
memcpy(buf, aes_test_ofb_ct[u], 64); memcpy(buf, aes_test_ofb_ct[u], 64);
aes_tests = aes_test_ofb_pt; aes_tests = aes_test_ofb_pt;
} else { } else {
memcpy(buf, aes_test_ofb_pt, 64); memcpy(buf, aes_test_ofb_pt, 64);
aes_tests = aes_test_ofb_ct[u]; aes_tests = aes_test_ofb_ct[u];
} }
ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf); ret = mbedtls_aes_crypt_ofb(&ctx, 64, &offset, iv, buf, buf);
if (ret != 0) { if (ret != 0) {
goto exit; goto exit;
} }
if (memcmp(buf, aes_tests, 64) != 0) { if (memcmp(buf, aes_tests, 64) != 0) {
ret = 1; ret = 1;
goto exit; goto exit;
}
if (verbose != 0) {
mbedtls_printf("passed\n");
}
} }
if (verbose != 0) { if (verbose != 0) {
mbedtls_printf("passed\n"); mbedtls_printf("\n");
} }
} }
if (verbose != 0) {
mbedtls_printf("\n");
}
#endif /* MBEDTLS_CIPHER_MODE_OFB */ #endif /* MBEDTLS_CIPHER_MODE_OFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR) #if defined(MBEDTLS_CIPHER_MODE_CTR)
/* /*
* CTR mode * CTR mode
*/ */
for (i = 0; i < 6; i++) { {
u = i >> 1; static const int num_tests =
mode = i & 1; sizeof(aes_test_ctr_key) / sizeof(*aes_test_ctr_key);
if (verbose != 0) { for (i = 0; i < num_tests << 1; i++) {
mbedtls_printf(" AES-CTR-128 (%s): ", u = i >> 1;
(mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc"); mode = i & 1;
}
memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16); if (verbose != 0) {
memcpy(key, aes_test_ctr_key[u], 16); mbedtls_printf(" AES-CTR-128 (%s): ",
(mode == MBEDTLS_AES_DECRYPT) ? "dec" : "enc");
}
offset = 0; memcpy(nonce_counter, aes_test_ctr_nonce_counter[u], 16);
if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) { memcpy(key, aes_test_ctr_key[u], 16);
goto exit;
}
len = aes_test_ctr_len[u]; offset = 0;
if ((ret = mbedtls_aes_setkey_enc(&ctx, key, 128)) != 0) {
goto exit;
}
if (mode == MBEDTLS_AES_DECRYPT) { len = aes_test_ctr_len[u];
memcpy(buf, aes_test_ctr_ct[u], len);
aes_tests = aes_test_ctr_pt[u];
} else {
memcpy(buf, aes_test_ctr_pt[u], len);
aes_tests = aes_test_ctr_ct[u];
}
ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter, if (mode == MBEDTLS_AES_DECRYPT) {
stream_block, buf, buf); memcpy(buf, aes_test_ctr_ct[u], len);
if (ret != 0) { aes_tests = aes_test_ctr_pt[u];
goto exit; } else {
} memcpy(buf, aes_test_ctr_pt[u], len);
aes_tests = aes_test_ctr_ct[u];
}
if (memcmp(buf, aes_tests, len) != 0) { ret = mbedtls_aes_crypt_ctr(&ctx, len, &offset, nonce_counter,
ret = 1; stream_block, buf, buf);
goto exit; if (ret != 0) {
} goto exit;
}
if (verbose != 0) { if (memcmp(buf, aes_tests, len) != 0) {
mbedtls_printf("passed\n"); ret = 1;
goto exit;
}
if (verbose != 0) {
mbedtls_printf("passed\n");
}
} }
} }
@ -2141,14 +2138,14 @@ int mbedtls_aes_self_test(int verbose)
#endif /* MBEDTLS_CIPHER_MODE_CTR */ #endif /* MBEDTLS_CIPHER_MODE_CTR */
#if defined(MBEDTLS_CIPHER_MODE_XTS) #if defined(MBEDTLS_CIPHER_MODE_XTS)
/*
* XTS mode
*/
{ {
static const int num_tests = static const int num_tests =
sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key); sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key);
mbedtls_aes_xts_context ctx_xts; mbedtls_aes_xts_context ctx_xts;
/*
* XTS mode
*/
mbedtls_aes_xts_init(&ctx_xts); mbedtls_aes_xts_init(&ctx_xts);
for (i = 0; i < num_tests << 1; i++) { for (i = 0; i < num_tests << 1; i++) {