Add tests for mbedtls_ctr_increment_counter

Signed-off-by: Dave Rodgman <dave.rodgman@arm.com>
This commit is contained in:
Dave Rodgman 2024-01-13 17:31:13 +00:00
parent b49cf1019d
commit ae730348e9
2 changed files with 118 additions and 0 deletions

View File

@ -1105,3 +1105,48 @@ ctr_drbg_threads:"B10A961F2EA39927B4C48AEDDD299026":1:5
CTR_DRBG self test
ctr_drbg_selftest:
Increment counter rollover
ctr_increment_rollover
Increment counter 00
ctr_increment:"00"
Increment counter ff00
ctr_increment:"ff00"
Increment counter ff0000
ctr_increment:"ff0000"
Increment counter ff000000
ctr_increment:"ff000000"
Increment counter ff00000000
ctr_increment:"ff00000000"
Increment counter ff0000000000
ctr_increment:"ff0000000000"
Increment counter ff000000000000
ctr_increment:"ff000000000000"
Increment counter 01
ctr_increment:"01"
Increment counter ff01
ctr_increment:"ff01"
Increment counter ff0001
ctr_increment:"ff0001"
Increment counter ff000001
ctr_increment:"ff000001"
Increment counter ff00000001
ctr_increment:"ff00000001"
Increment counter ff0000000001
ctr_increment:"ff0000000001"
Increment counter ff000000000001
ctr_increment:"ff000000000001"

View File

@ -2,6 +2,7 @@
#include "mbedtls/entropy.h"
#include "mbedtls/ctr_drbg.h"
#include "string.h"
#include "ctr.h"
#if defined(MBEDTLS_THREADING_PTHREAD)
#include "mbedtls/threading.h"
@ -443,3 +444,75 @@ void ctr_drbg_selftest()
AES_PSA_DONE();
}
/* END_CASE */
/* BEGIN_CASE */
void ctr_increment_rollover()
{
uint8_t c[16];
uint8_t r[16];
// test all increments from 2^n - 1 to 2^n (i.e. where we roll over into the next bit)
for (int n = 0; n <= 128; n++) {
memset(c, 0, 16);
memset(r, 0, 16);
// set least significant (highest address) n bits to 1, i.e. generate (2^n - 1)
for (int i = 0; i < n; i++) {
int bit = i % 8;
int byte = (i / 8);
c[15 - byte] |= 1 << bit;
}
// increment to get 2^n
mbedtls_ctr_increment_counter(c);
// now generate a reference result equal to 2^n - i.e. set only bit (n + 1)
// if n == 127, this will not set any bits (i.e. wraps to 0).
int bit = n % 8;
int byte = n / 8;
if (byte < 16) {
r[15 - byte] = 1 << bit;
}
TEST_MEMORY_COMPARE(c, 16, r, 16);
}
uint64_t lsb = 10, msb = 20;
MBEDTLS_PUT_UINT64_BE(msb, c, 0);
MBEDTLS_PUT_UINT64_BE(lsb, c, 8);
memcpy(r, c, 16);
mbedtls_ctr_increment_counter(c);
for (int i = 15; i >= 0; i--) {
r[i] += 1;
if (r[i] != 0) {
break;
}
}
TEST_MEMORY_COMPARE(c, 16, r, 16);
}
/* END_CASE */
/* BEGIN_CASE */
void ctr_increment(data_t *x)
{
uint8_t c[16];
uint8_t r[16];
// initialise c and r from test argument
memset(c, 0, 16);
memcpy(c, x->x, x->len);
memcpy(r, c, 16);
// increment c
mbedtls_ctr_increment_counter(c);
// increment reference
for (int i = 15; i >= 0; i--) {
r[i] += 1;
if (r[i] != 0) {
break;
}
}
// test that mbedtls_ctr_increment_counter behaviour matches reference
TEST_MEMORY_COMPARE(c, 16, r, 16);
}
/* END_CASE */