AES-CTR test vectors and fixes to CTR code.

This commit is contained in:
Adam Ierymenko 2020-02-21 17:22:26 -08:00
parent 87890565f3
commit 4af3467757
No known key found for this signature in database
GPG key ID: C8877CF2D7A5D7F3
2 changed files with 31 additions and 7 deletions

View file

@ -514,6 +514,7 @@ void AES::CTR::crypt(const void *const input,unsigned int len) noexcept
out += totalLen;
_len = (totalLen + len);
#if 0
// This is the largest chunk size that will fit in SSE registers with four
// registers left over for round key data and temporaries.
while (len >= 192) {
@ -672,8 +673,9 @@ void AES::CTR::crypt(const void *const input,unsigned int len) noexcept
len -= 192;
out += 192;
}
#endif
while (_len >= 64) {
while (len >= 64) {
__m128i d0,d1,d2,d3;
if (likely(c1 < 0xfffffffffffffffcULL)) {
d0 = _mm_set_epi64x((long long)Utils::hton(c1),(long long)c0);
@ -699,10 +701,10 @@ void AES::CTR::crypt(const void *const input,unsigned int len) noexcept
d1 = _mm_xor_si128(d1,k0);
d2 = _mm_xor_si128(d2,k0);
d3 = _mm_xor_si128(d3,k0);
d0 = _mm_xor_si128(d0,k1);
d1 = _mm_xor_si128(d1,k1);
d2 = _mm_xor_si128(d2,k1);
d3 = _mm_xor_si128(d3,k1);
d0 = _mm_aesenc_si128(d0,k1);
d1 = _mm_aesenc_si128(d1,k1);
d2 = _mm_aesenc_si128(d2,k1);
d3 = _mm_aesenc_si128(d3,k1);
for (int r=2;r<14;r+=2) {
k0 = _aes._k.ni.k[r];
k1 = _aes._k.ni.k[r+1];

View file

@ -77,6 +77,11 @@ static const uint8_t AES_TEST_VECTOR_0_KEY[32] = { 0x60,0x3d,0xeb,0x10,0x15,0xca
static const uint8_t AES_TEST_VECTOR_0_IN[16] = { 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a };
static const uint8_t AES_TEST_VECTOR_0_OUT[16] = { 0xf3,0xee,0xd1,0xbd,0xb5,0xd2,0xa0,0x3c,0x06,0x4b,0x5a,0x7e,0x3d,0xb1,0x81,0xf8 };
static const uint8_t AES_CTR_TEST_VECTOR_0_KEY[32] = { 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe,0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81,0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7,0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4 };
static const uint8_t AES_CTR_TEST_VECTOR_0_IV[16] = { 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff };
static const uint8_t AES_CTR_TEST_VECTOR_0_IN[64] = { 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96,0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a,0xae,0x2d,0x8a,0x57,0x1e,0x03,0xac,0x9c,0x9e,0xb7,0x6f,0xac,0x45,0xaf,0x8e,0x51,0x30,0xc8,0x1c,0x46,0xa3,0x5c,0xe4,0x11,0xe5,0xfb,0xc1,0x19,0x1a,0x0a,0x52,0xef,0xf6,0x9f,0x24,0x45,0xdf,0x4f,0x9b,0x17,0xad,0x2b,0x41,0x7b,0xe6,0x6c,0x37,0x10 };
static const uint8_t AES_CTR_TEST_VECTOR_0_OUT[64] = { 0x60,0x1e,0xc3,0x13,0x77,0x57,0x89,0xa5,0xb7,0xa7,0xf5,0x04,0xbb,0xf3,0xd2,0x28,0xf4,0x43,0xe3,0xca,0x4d,0x62,0xb5,0x9a,0xca,0x84,0xe9,0x90,0xca,0xca,0xf5,0xc5,0x2b,0x09,0x30,0xda,0xa2,0x3d,0xe9,0x4c,0xe8,0x70,0x17,0xba,0x2d,0x84,0x98,0x8d,0xdf,0xc9,0xc5,0x8d,0xb6,0x7a,0xad,0xa6,0x13,0xc2,0xdd,0x08,0x45,0x79,0x41,0xa6 };
static const uint8_t AES_GMAC_VECTOR_0_KEY[32] = { 0xbb, 0x10, 0x10, 0x06, 0x4f, 0xb8, 0x35, 0x23, 0xea, 0x9d, 0xf3, 0x2b, 0xad, 0x9f, 0x1f, 0x2a, 0x4f, 0xce, 0xfc, 0x0f, 0x21, 0x07, 0xc0, 0xaa, 0xba, 0xd9, 0xb7, 0x56, 0xd8, 0x09, 0x21, 0x9d };
static const uint8_t AES_GMAC_VECTOR_0_IV[12] = { 0x2f, 0x9a, 0xd0, 0x12, 0xad, 0xfc, 0x12, 0x73, 0x43, 0xfb, 0xe0, 0x56 };
static const uint8_t AES_GMAC_VECTOR_0_IN[16] = { 0xdb, 0x98, 0xd9, 0x0d, 0x1b, 0x69, 0x5c, 0xdb, 0x74, 0x7a, 0x34, 0x3f, 0xbb, 0xc9, 0xf1, 0x41 };
@ -514,17 +519,34 @@ extern "C" const char *ZTT_crypto()
AES aes(AES_TEST_VECTOR_0_KEY);
aes.encrypt(AES_TEST_VECTOR_0_IN,out);
if (memcmp(AES_TEST_VECTOR_0_OUT,out,16) != 0) {
ZT_T_PRINTF("FAILED (test vector 0) ZT_EOL_S");
ZT_T_PRINTF("FAILED (test vector 0)" ZT_EOL_S);
return "AES test vector 0 failed";
}
aes.decrypt(out,out);
if (memcmp(AES_TEST_VECTOR_0_IN,out,16) != 0) {
ZT_T_PRINTF("FAILED (test vector 0 decrypt) ZT_EOL_S");
ZT_T_PRINTF("FAILED (test vector 0 decrypt)" ZT_EOL_S);
return "AES test vector 0 decrypt failed";
}
ZT_T_PRINTF("OK" ZT_EOL_S);
}
{
uint8_t out[64];
ZT_T_PRINTF("[crypto] Testing AES-CTR (hardware acceleration: %s)... ",AES::accelerated() ? "enabled" : "disabled");
{
AES aes(AES_CTR_TEST_VECTOR_0_KEY);
AES::CTR ctr(aes);
ctr.init(AES_CTR_TEST_VECTOR_0_IV,out);
ctr.crypt(AES_CTR_TEST_VECTOR_0_IN,64);
ctr.finish();
if (memcmp(out,AES_CTR_TEST_VECTOR_0_OUT,64) != 0) {
ZT_T_PRINTF("FAILED (test vector 0)" ZT_EOL_S);
return "AES-CTR test vector 0 failed";
}
}
ZT_T_PRINTF("OK" ZT_EOL_S);
}
{
uint8_t tag[16];
ZT_T_PRINTF("[crypto] Testing AES-GMAC (hardware acceleration: %s)... ",AES::accelerated() ? "enabled" : "disabled");