crypto: add testing for unaligned buffers with XTS cipher mode
Validate that the XTS cipher mode will correctly operate with plain text, cipher text and IV buffers that are not 64-bit aligned. Reviewed-by: Alberto Garcia <berto@igalia.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
a61f682fde
commit
1e0fa32c6c
@ -416,6 +416,88 @@ static void test_xts_split(const void *opaque)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void test_xts_unaligned(const void *opaque)
|
||||||
|
{
|
||||||
|
#define BAD_ALIGN 3
|
||||||
|
const QCryptoXTSTestData *data = opaque;
|
||||||
|
uint8_t in[512 + BAD_ALIGN], out[512 + BAD_ALIGN];
|
||||||
|
uint8_t Torg[16], T[16 + BAD_ALIGN];
|
||||||
|
uint64_t seq;
|
||||||
|
struct TestAES aesdata;
|
||||||
|
struct TestAES aestweak;
|
||||||
|
|
||||||
|
AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
|
||||||
|
AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
|
||||||
|
AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
|
||||||
|
AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);
|
||||||
|
|
||||||
|
seq = data->seqnum;
|
||||||
|
STORE64L(seq, Torg);
|
||||||
|
memset(Torg + 8, 0, 8);
|
||||||
|
|
||||||
|
/* IV not aligned */
|
||||||
|
memcpy(T + BAD_ALIGN, Torg, 16);
|
||||||
|
memcpy(in, data->PTX, data->PTLEN);
|
||||||
|
xts_encrypt(&aesdata, &aestweak,
|
||||||
|
test_xts_aes_encrypt,
|
||||||
|
test_xts_aes_decrypt,
|
||||||
|
T + BAD_ALIGN, data->PTLEN, out, in);
|
||||||
|
|
||||||
|
g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);
|
||||||
|
|
||||||
|
/* plain text not aligned */
|
||||||
|
memcpy(T, Torg, 16);
|
||||||
|
memcpy(in + BAD_ALIGN, data->PTX, data->PTLEN);
|
||||||
|
xts_encrypt(&aesdata, &aestweak,
|
||||||
|
test_xts_aes_encrypt,
|
||||||
|
test_xts_aes_decrypt,
|
||||||
|
T, data->PTLEN, out, in + BAD_ALIGN);
|
||||||
|
|
||||||
|
g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);
|
||||||
|
|
||||||
|
/* cipher text not aligned */
|
||||||
|
memcpy(T, Torg, 16);
|
||||||
|
memcpy(in, data->PTX, data->PTLEN);
|
||||||
|
xts_encrypt(&aesdata, &aestweak,
|
||||||
|
test_xts_aes_encrypt,
|
||||||
|
test_xts_aes_decrypt,
|
||||||
|
T, data->PTLEN, out + BAD_ALIGN, in);
|
||||||
|
|
||||||
|
g_assert(memcmp(out + BAD_ALIGN, data->CTX, data->PTLEN) == 0);
|
||||||
|
|
||||||
|
|
||||||
|
/* IV not aligned */
|
||||||
|
memcpy(T + BAD_ALIGN, Torg, 16);
|
||||||
|
memcpy(in, data->CTX, data->PTLEN);
|
||||||
|
xts_decrypt(&aesdata, &aestweak,
|
||||||
|
test_xts_aes_encrypt,
|
||||||
|
test_xts_aes_decrypt,
|
||||||
|
T + BAD_ALIGN, data->PTLEN, out, in);
|
||||||
|
|
||||||
|
g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
|
||||||
|
|
||||||
|
/* cipher text not aligned */
|
||||||
|
memcpy(T, Torg, 16);
|
||||||
|
memcpy(in + BAD_ALIGN, data->CTX, data->PTLEN);
|
||||||
|
xts_decrypt(&aesdata, &aestweak,
|
||||||
|
test_xts_aes_encrypt,
|
||||||
|
test_xts_aes_decrypt,
|
||||||
|
T, data->PTLEN, out, in + BAD_ALIGN);
|
||||||
|
|
||||||
|
g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
|
||||||
|
|
||||||
|
/* plain text not aligned */
|
||||||
|
memcpy(T, Torg, 16);
|
||||||
|
memcpy(in, data->CTX, data->PTLEN);
|
||||||
|
xts_decrypt(&aesdata, &aestweak,
|
||||||
|
test_xts_aes_encrypt,
|
||||||
|
test_xts_aes_decrypt,
|
||||||
|
T, data->PTLEN, out + BAD_ALIGN, in);
|
||||||
|
|
||||||
|
g_assert(memcmp(out + BAD_ALIGN, data->PTX, data->PTLEN) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
@ -437,6 +519,10 @@ int main(int argc, char **argv)
|
|||||||
g_test_add_data_func(path, &test_data[i], test_xts_split);
|
g_test_add_data_func(path, &test_data[i], test_xts_split);
|
||||||
g_free(path);
|
g_free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
path = g_strdup_printf("%s/unaligned", test_data[i].path);
|
||||||
|
g_test_add_data_func(path, &test_data[i], test_xts_unaligned);
|
||||||
|
g_free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user