1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci#include "mbedtls/bignum.h" 3a8e1175bSopenharmony_ci#include "mbedtls/entropy.h" 4a8e1175bSopenharmony_ci#include "constant_time_internal.h" 5a8e1175bSopenharmony_ci#include "bignum_core.h" 6a8e1175bSopenharmony_ci#include "test/constant_flow.h" 7a8e1175bSopenharmony_ci 8a8e1175bSopenharmony_ci#if MBEDTLS_MPI_MAX_BITS > 792 9a8e1175bSopenharmony_ci#define MPI_MAX_BITS_LARGER_THAN_792 10a8e1175bSopenharmony_ci#endif 11a8e1175bSopenharmony_ci 12a8e1175bSopenharmony_ci/* Check the validity of the sign bit in an MPI object. Reject representations 13a8e1175bSopenharmony_ci * that are not supported by the rest of the library and indicate a bug when 14a8e1175bSopenharmony_ci * constructing the value. */ 15a8e1175bSopenharmony_cistatic int sign_is_valid(const mbedtls_mpi *X) 16a8e1175bSopenharmony_ci{ 17a8e1175bSopenharmony_ci /* Only +1 and -1 are valid sign bits, not e.g. 0 */ 18a8e1175bSopenharmony_ci if (X->s != 1 && X->s != -1) { 19a8e1175bSopenharmony_ci return 0; 20a8e1175bSopenharmony_ci } 21a8e1175bSopenharmony_ci 22a8e1175bSopenharmony_ci /* The value 0 must be represented with the sign +1. A "negative zero" 23a8e1175bSopenharmony_ci * with s=-1 is an invalid representation. Forbid that. As an exception, 24a8e1175bSopenharmony_ci * we sometimes test the robustness of library functions when given 25a8e1175bSopenharmony_ci * a negative zero input. If a test case has a negative zero as input, 26a8e1175bSopenharmony_ci * we don't mind if the function has a negative zero output. */ 27a8e1175bSopenharmony_ci if (!mbedtls_test_get_case_uses_negative_0() && 28a8e1175bSopenharmony_ci mbedtls_mpi_bitlen(X) == 0 && X->s != 1) { 29a8e1175bSopenharmony_ci return 0; 30a8e1175bSopenharmony_ci } 31a8e1175bSopenharmony_ci 32a8e1175bSopenharmony_ci return 1; 33a8e1175bSopenharmony_ci} 34a8e1175bSopenharmony_ci 35a8e1175bSopenharmony_citypedef struct mbedtls_test_mpi_random { 36a8e1175bSopenharmony_ci data_t *data; 37a8e1175bSopenharmony_ci size_t pos; 38a8e1175bSopenharmony_ci size_t chunk_len; 39a8e1175bSopenharmony_ci} mbedtls_test_mpi_random; 40a8e1175bSopenharmony_ci 41a8e1175bSopenharmony_ci/* 42a8e1175bSopenharmony_ci * This function is called by the Miller-Rabin primality test each time it 43a8e1175bSopenharmony_ci * chooses a random witness. The witnesses (or non-witnesses as provided by the 44a8e1175bSopenharmony_ci * test) are stored in the data member of the state structure. Each number is in 45a8e1175bSopenharmony_ci * the format that mbedtls_mpi_read_string understands and is chunk_len long. 46a8e1175bSopenharmony_ci */ 47a8e1175bSopenharmony_ciint mbedtls_test_mpi_miller_rabin_determinizer(void *state, 48a8e1175bSopenharmony_ci unsigned char *buf, 49a8e1175bSopenharmony_ci size_t len) 50a8e1175bSopenharmony_ci{ 51a8e1175bSopenharmony_ci mbedtls_test_mpi_random *random = (mbedtls_test_mpi_random *) state; 52a8e1175bSopenharmony_ci 53a8e1175bSopenharmony_ci if (random == NULL || random->data->x == NULL || buf == NULL) { 54a8e1175bSopenharmony_ci return -1; 55a8e1175bSopenharmony_ci } 56a8e1175bSopenharmony_ci 57a8e1175bSopenharmony_ci if (random->pos + random->chunk_len > random->data->len 58a8e1175bSopenharmony_ci || random->chunk_len > len) { 59a8e1175bSopenharmony_ci return -1; 60a8e1175bSopenharmony_ci } 61a8e1175bSopenharmony_ci 62a8e1175bSopenharmony_ci memset(buf, 0, len); 63a8e1175bSopenharmony_ci 64a8e1175bSopenharmony_ci /* The witness is written to the end of the buffer, since the buffer is 65a8e1175bSopenharmony_ci * used as big endian, unsigned binary data in mbedtls_mpi_read_binary. 66a8e1175bSopenharmony_ci * Writing the witness to the start of the buffer would result in the 67a8e1175bSopenharmony_ci * buffer being 'witness 000...000', which would be treated as 68a8e1175bSopenharmony_ci * witness * 2^n for some n. */ 69a8e1175bSopenharmony_ci memcpy(buf + len - random->chunk_len, &random->data->x[random->pos], 70a8e1175bSopenharmony_ci random->chunk_len); 71a8e1175bSopenharmony_ci 72a8e1175bSopenharmony_ci random->pos += random->chunk_len; 73a8e1175bSopenharmony_ci 74a8e1175bSopenharmony_ci return 0; 75a8e1175bSopenharmony_ci} 76a8e1175bSopenharmony_ci 77a8e1175bSopenharmony_ci/* Random generator that is told how many bytes to return. */ 78a8e1175bSopenharmony_cistatic int f_rng_bytes_left(void *state, unsigned char *buf, size_t len) 79a8e1175bSopenharmony_ci{ 80a8e1175bSopenharmony_ci size_t *bytes_left = state; 81a8e1175bSopenharmony_ci size_t i; 82a8e1175bSopenharmony_ci for (i = 0; i < len; i++) { 83a8e1175bSopenharmony_ci if (*bytes_left == 0) { 84a8e1175bSopenharmony_ci return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; 85a8e1175bSopenharmony_ci } 86a8e1175bSopenharmony_ci buf[i] = *bytes_left & 0xff; 87a8e1175bSopenharmony_ci --(*bytes_left); 88a8e1175bSopenharmony_ci } 89a8e1175bSopenharmony_ci return 0; 90a8e1175bSopenharmony_ci} 91a8e1175bSopenharmony_ci 92a8e1175bSopenharmony_ci/* END_HEADER */ 93a8e1175bSopenharmony_ci 94a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES 95a8e1175bSopenharmony_ci * depends_on:MBEDTLS_BIGNUM_C 96a8e1175bSopenharmony_ci * END_DEPENDENCIES 97a8e1175bSopenharmony_ci */ 98a8e1175bSopenharmony_ci 99a8e1175bSopenharmony_ci/* BEGIN_CASE */ 100a8e1175bSopenharmony_civoid mpi_null() 101a8e1175bSopenharmony_ci{ 102a8e1175bSopenharmony_ci mbedtls_mpi X, Y, Z; 103a8e1175bSopenharmony_ci 104a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 105a8e1175bSopenharmony_ci mbedtls_mpi_init(&Y); 106a8e1175bSopenharmony_ci mbedtls_mpi_init(&Z); 107a8e1175bSopenharmony_ci 108a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_get_bit(&X, 42) == 0); 109a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_lsb(&X) == 0); 110a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_bitlen(&X) == 0); 111a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_size(&X) == 0); 112a8e1175bSopenharmony_ci 113a8e1175bSopenharmony_ciexit: 114a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 115a8e1175bSopenharmony_ci} 116a8e1175bSopenharmony_ci/* END_CASE */ 117a8e1175bSopenharmony_ci 118a8e1175bSopenharmony_ci/* BEGIN_CASE */ 119a8e1175bSopenharmony_civoid mpi_read_write_string(int radix_X, char *input_X, int radix_A, 120a8e1175bSopenharmony_ci char *input_A, int output_size, int result_read, 121a8e1175bSopenharmony_ci int result_write) 122a8e1175bSopenharmony_ci{ 123a8e1175bSopenharmony_ci mbedtls_mpi X; 124a8e1175bSopenharmony_ci char str[1000]; 125a8e1175bSopenharmony_ci size_t len; 126a8e1175bSopenharmony_ci 127a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 128a8e1175bSopenharmony_ci 129a8e1175bSopenharmony_ci memset(str, '!', sizeof(str)); 130a8e1175bSopenharmony_ci 131a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_read_string(&X, radix_X, input_X) == result_read); 132a8e1175bSopenharmony_ci if (result_read == 0) { 133a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 134a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_write_string(&X, radix_A, str, output_size, &len) == result_write); 135a8e1175bSopenharmony_ci if (result_write == 0) { 136a8e1175bSopenharmony_ci TEST_ASSERT(strcmp(str, input_A) == 0); 137a8e1175bSopenharmony_ci TEST_ASSERT(str[len] == '!'); 138a8e1175bSopenharmony_ci } 139a8e1175bSopenharmony_ci } 140a8e1175bSopenharmony_ci 141a8e1175bSopenharmony_ciexit: 142a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 143a8e1175bSopenharmony_ci} 144a8e1175bSopenharmony_ci/* END_CASE */ 145a8e1175bSopenharmony_ci 146a8e1175bSopenharmony_ci/* BEGIN_CASE */ 147a8e1175bSopenharmony_civoid mpi_zero_length_buffer_is_null() 148a8e1175bSopenharmony_ci{ 149a8e1175bSopenharmony_ci mbedtls_mpi X; 150a8e1175bSopenharmony_ci size_t olen; 151a8e1175bSopenharmony_ci 152a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 153a8e1175bSopenharmony_ci 154a8e1175bSopenharmony_ci /* Simply test that the following functions do not crash when a NULL buffer 155a8e1175bSopenharmony_ci * pointer and 0 length is passed. We don't care much about the return value. */ 156a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_read_binary(&X, NULL, 0), 0); 157a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_read_binary_le(&X, NULL, 0), 0); 158a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_write_string(&X, 16, NULL, 0, &olen), MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL); 159a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_write_binary(&X, NULL, 0), 0); 160a8e1175bSopenharmony_ci 161a8e1175bSopenharmony_ciexit: 162a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 163a8e1175bSopenharmony_ci} 164a8e1175bSopenharmony_ci/* END_CASE */ 165a8e1175bSopenharmony_ci 166a8e1175bSopenharmony_ci/* BEGIN_CASE */ 167a8e1175bSopenharmony_civoid mpi_read_binary(data_t *buf, char *input_A) 168a8e1175bSopenharmony_ci{ 169a8e1175bSopenharmony_ci mbedtls_mpi X; 170a8e1175bSopenharmony_ci char str[1000]; 171a8e1175bSopenharmony_ci size_t len; 172a8e1175bSopenharmony_ci 173a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 174a8e1175bSopenharmony_ci 175a8e1175bSopenharmony_ci 176a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_read_binary(&X, buf->x, buf->len) == 0); 177a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 178a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_write_string(&X, 16, str, sizeof(str), &len) == 0); 179a8e1175bSopenharmony_ci TEST_ASSERT(strcmp((char *) str, input_A) == 0); 180a8e1175bSopenharmony_ci 181a8e1175bSopenharmony_ciexit: 182a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 183a8e1175bSopenharmony_ci} 184a8e1175bSopenharmony_ci/* END_CASE */ 185a8e1175bSopenharmony_ci 186a8e1175bSopenharmony_ci/* BEGIN_CASE */ 187a8e1175bSopenharmony_civoid mpi_read_binary_le(data_t *buf, char *input_A) 188a8e1175bSopenharmony_ci{ 189a8e1175bSopenharmony_ci mbedtls_mpi X; 190a8e1175bSopenharmony_ci char str[1000]; 191a8e1175bSopenharmony_ci size_t len; 192a8e1175bSopenharmony_ci 193a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 194a8e1175bSopenharmony_ci 195a8e1175bSopenharmony_ci 196a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_read_binary_le(&X, buf->x, buf->len) == 0); 197a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 198a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_write_string(&X, 16, str, sizeof(str), &len) == 0); 199a8e1175bSopenharmony_ci TEST_ASSERT(strcmp((char *) str, input_A) == 0); 200a8e1175bSopenharmony_ci 201a8e1175bSopenharmony_ciexit: 202a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 203a8e1175bSopenharmony_ci} 204a8e1175bSopenharmony_ci/* END_CASE */ 205a8e1175bSopenharmony_ci 206a8e1175bSopenharmony_ci/* BEGIN_CASE */ 207a8e1175bSopenharmony_civoid mpi_write_binary(char *input_X, data_t *input_A, 208a8e1175bSopenharmony_ci int output_size, int result) 209a8e1175bSopenharmony_ci{ 210a8e1175bSopenharmony_ci mbedtls_mpi X; 211a8e1175bSopenharmony_ci unsigned char buf[1000]; 212a8e1175bSopenharmony_ci size_t buflen; 213a8e1175bSopenharmony_ci 214a8e1175bSopenharmony_ci memset(buf, 0x00, 1000); 215a8e1175bSopenharmony_ci 216a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 217a8e1175bSopenharmony_ci 218a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 219a8e1175bSopenharmony_ci 220a8e1175bSopenharmony_ci buflen = mbedtls_mpi_size(&X); 221a8e1175bSopenharmony_ci if (buflen > (size_t) output_size) { 222a8e1175bSopenharmony_ci buflen = (size_t) output_size; 223a8e1175bSopenharmony_ci } 224a8e1175bSopenharmony_ci 225a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_write_binary(&X, buf, buflen) == result); 226a8e1175bSopenharmony_ci if (result == 0) { 227a8e1175bSopenharmony_ci 228a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(buf, input_A->x, 229a8e1175bSopenharmony_ci buflen, input_A->len) == 0); 230a8e1175bSopenharmony_ci } 231a8e1175bSopenharmony_ci 232a8e1175bSopenharmony_ciexit: 233a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 234a8e1175bSopenharmony_ci} 235a8e1175bSopenharmony_ci/* END_CASE */ 236a8e1175bSopenharmony_ci 237a8e1175bSopenharmony_ci/* BEGIN_CASE */ 238a8e1175bSopenharmony_civoid mpi_write_binary_le(char *input_X, data_t *input_A, 239a8e1175bSopenharmony_ci int output_size, int result) 240a8e1175bSopenharmony_ci{ 241a8e1175bSopenharmony_ci mbedtls_mpi X; 242a8e1175bSopenharmony_ci unsigned char buf[1000]; 243a8e1175bSopenharmony_ci size_t buflen; 244a8e1175bSopenharmony_ci 245a8e1175bSopenharmony_ci memset(buf, 0x00, 1000); 246a8e1175bSopenharmony_ci 247a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 248a8e1175bSopenharmony_ci 249a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 250a8e1175bSopenharmony_ci 251a8e1175bSopenharmony_ci buflen = mbedtls_mpi_size(&X); 252a8e1175bSopenharmony_ci if (buflen > (size_t) output_size) { 253a8e1175bSopenharmony_ci buflen = (size_t) output_size; 254a8e1175bSopenharmony_ci } 255a8e1175bSopenharmony_ci 256a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_write_binary_le(&X, buf, buflen) == result); 257a8e1175bSopenharmony_ci if (result == 0) { 258a8e1175bSopenharmony_ci 259a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(buf, input_A->x, 260a8e1175bSopenharmony_ci buflen, input_A->len) == 0); 261a8e1175bSopenharmony_ci } 262a8e1175bSopenharmony_ci 263a8e1175bSopenharmony_ciexit: 264a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 265a8e1175bSopenharmony_ci} 266a8e1175bSopenharmony_ci/* END_CASE */ 267a8e1175bSopenharmony_ci 268a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */ 269a8e1175bSopenharmony_civoid mpi_read_file(char *input_file, data_t *input_A, int result) 270a8e1175bSopenharmony_ci{ 271a8e1175bSopenharmony_ci mbedtls_mpi X; 272a8e1175bSopenharmony_ci unsigned char buf[1000]; 273a8e1175bSopenharmony_ci size_t buflen; 274a8e1175bSopenharmony_ci FILE *file; 275a8e1175bSopenharmony_ci int ret; 276a8e1175bSopenharmony_ci 277a8e1175bSopenharmony_ci memset(buf, 0x00, 1000); 278a8e1175bSopenharmony_ci 279a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 280a8e1175bSopenharmony_ci 281a8e1175bSopenharmony_ci file = fopen(input_file, "r"); 282a8e1175bSopenharmony_ci TEST_ASSERT(file != NULL); 283a8e1175bSopenharmony_ci ret = mbedtls_mpi_read_file(&X, 16, file); 284a8e1175bSopenharmony_ci fclose(file); 285a8e1175bSopenharmony_ci TEST_ASSERT(ret == result); 286a8e1175bSopenharmony_ci 287a8e1175bSopenharmony_ci if (result == 0) { 288a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 289a8e1175bSopenharmony_ci buflen = mbedtls_mpi_size(&X); 290a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_write_binary(&X, buf, buflen) == 0); 291a8e1175bSopenharmony_ci 292a8e1175bSopenharmony_ci 293a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_hexcmp(buf, input_A->x, 294a8e1175bSopenharmony_ci buflen, input_A->len) == 0); 295a8e1175bSopenharmony_ci } 296a8e1175bSopenharmony_ci 297a8e1175bSopenharmony_ciexit: 298a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 299a8e1175bSopenharmony_ci} 300a8e1175bSopenharmony_ci/* END_CASE */ 301a8e1175bSopenharmony_ci 302a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */ 303a8e1175bSopenharmony_civoid mpi_write_file(char *input_X, char *output_file) 304a8e1175bSopenharmony_ci{ 305a8e1175bSopenharmony_ci mbedtls_mpi X, Y; 306a8e1175bSopenharmony_ci FILE *file_out, *file_in; 307a8e1175bSopenharmony_ci int ret; 308a8e1175bSopenharmony_ci 309a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); 310a8e1175bSopenharmony_ci 311a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 312a8e1175bSopenharmony_ci 313a8e1175bSopenharmony_ci file_out = fopen(output_file, "w"); 314a8e1175bSopenharmony_ci TEST_ASSERT(file_out != NULL); 315a8e1175bSopenharmony_ci ret = mbedtls_mpi_write_file(NULL, &X, 16, file_out); 316a8e1175bSopenharmony_ci fclose(file_out); 317a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 318a8e1175bSopenharmony_ci 319a8e1175bSopenharmony_ci file_in = fopen(output_file, "r"); 320a8e1175bSopenharmony_ci TEST_ASSERT(file_in != NULL); 321a8e1175bSopenharmony_ci ret = mbedtls_mpi_read_file(&Y, 16, file_in); 322a8e1175bSopenharmony_ci fclose(file_in); 323a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 324a8e1175bSopenharmony_ci 325a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &Y) == 0); 326a8e1175bSopenharmony_ci 327a8e1175bSopenharmony_ciexit: 328a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); 329a8e1175bSopenharmony_ci} 330a8e1175bSopenharmony_ci/* END_CASE */ 331a8e1175bSopenharmony_ci 332a8e1175bSopenharmony_ci/* BEGIN_CASE */ 333a8e1175bSopenharmony_civoid mpi_get_bit(char *input_X, int pos, int val) 334a8e1175bSopenharmony_ci{ 335a8e1175bSopenharmony_ci mbedtls_mpi X; 336a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 337a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 338a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_get_bit(&X, pos) == val); 339a8e1175bSopenharmony_ci 340a8e1175bSopenharmony_ciexit: 341a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 342a8e1175bSopenharmony_ci} 343a8e1175bSopenharmony_ci/* END_CASE */ 344a8e1175bSopenharmony_ci 345a8e1175bSopenharmony_ci/* BEGIN_CASE */ 346a8e1175bSopenharmony_civoid mpi_set_bit(char *input_X, int pos, int val, 347a8e1175bSopenharmony_ci char *output_Y, int result) 348a8e1175bSopenharmony_ci{ 349a8e1175bSopenharmony_ci mbedtls_mpi X, Y; 350a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); 351a8e1175bSopenharmony_ci 352a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 353a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, output_Y) == 0); 354a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_set_bit(&X, pos, val) == result); 355a8e1175bSopenharmony_ci 356a8e1175bSopenharmony_ci if (result == 0) { 357a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 358a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &Y) == 0); 359a8e1175bSopenharmony_ci } 360a8e1175bSopenharmony_ci 361a8e1175bSopenharmony_ciexit: 362a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); 363a8e1175bSopenharmony_ci} 364a8e1175bSopenharmony_ci/* END_CASE */ 365a8e1175bSopenharmony_ci 366a8e1175bSopenharmony_ci/* BEGIN_CASE */ 367a8e1175bSopenharmony_civoid mpi_lsb(char *input_X, int nr_bits) 368a8e1175bSopenharmony_ci{ 369a8e1175bSopenharmony_ci mbedtls_mpi X; 370a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 371a8e1175bSopenharmony_ci 372a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 373a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_lsb(&X) == (size_t) nr_bits); 374a8e1175bSopenharmony_ci 375a8e1175bSopenharmony_ciexit: 376a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 377a8e1175bSopenharmony_ci} 378a8e1175bSopenharmony_ci/* END_CASE */ 379a8e1175bSopenharmony_ci 380a8e1175bSopenharmony_ci/* BEGIN_CASE */ 381a8e1175bSopenharmony_civoid mpi_bitlen(char *input_X, int nr_bits) 382a8e1175bSopenharmony_ci{ 383a8e1175bSopenharmony_ci mbedtls_mpi X; 384a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 385a8e1175bSopenharmony_ci 386a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 387a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_bitlen(&X) == (size_t) nr_bits); 388a8e1175bSopenharmony_ci 389a8e1175bSopenharmony_ciexit: 390a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 391a8e1175bSopenharmony_ci} 392a8e1175bSopenharmony_ci/* END_CASE */ 393a8e1175bSopenharmony_ci 394a8e1175bSopenharmony_ci/* BEGIN_CASE */ 395a8e1175bSopenharmony_civoid mpi_gcd(char *input_X, char *input_Y, 396a8e1175bSopenharmony_ci char *input_A) 397a8e1175bSopenharmony_ci{ 398a8e1175bSopenharmony_ci mbedtls_mpi A, X, Y, Z; 399a8e1175bSopenharmony_ci mbedtls_mpi_init(&A); mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z); 400a8e1175bSopenharmony_ci 401a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 402a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 403a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 404a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_gcd(&Z, &X, &Y) == 0); 405a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 406a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) == 0); 407a8e1175bSopenharmony_ci 408a8e1175bSopenharmony_ciexit: 409a8e1175bSopenharmony_ci mbedtls_mpi_free(&A); mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z); 410a8e1175bSopenharmony_ci} 411a8e1175bSopenharmony_ci/* END_CASE */ 412a8e1175bSopenharmony_ci 413a8e1175bSopenharmony_ci/* BEGIN_CASE */ 414a8e1175bSopenharmony_civoid mpi_cmp_int(int input_X, int input_A, int result_CMP) 415a8e1175bSopenharmony_ci{ 416a8e1175bSopenharmony_ci mbedtls_mpi X; 417a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 418a8e1175bSopenharmony_ci 419a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_lset(&X, input_X) == 0); 420a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_int(&X, input_A) == result_CMP); 421a8e1175bSopenharmony_ci 422a8e1175bSopenharmony_ciexit: 423a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 424a8e1175bSopenharmony_ci} 425a8e1175bSopenharmony_ci/* END_CASE */ 426a8e1175bSopenharmony_ci 427a8e1175bSopenharmony_ci/* BEGIN_CASE */ 428a8e1175bSopenharmony_civoid mpi_cmp_mpi(char *input_X, char *input_Y, 429a8e1175bSopenharmony_ci int input_A) 430a8e1175bSopenharmony_ci{ 431a8e1175bSopenharmony_ci mbedtls_mpi X, Y; 432a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); 433a8e1175bSopenharmony_ci 434a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 435a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 436a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &Y) == input_A); 437a8e1175bSopenharmony_ci 438a8e1175bSopenharmony_ciexit: 439a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); 440a8e1175bSopenharmony_ci} 441a8e1175bSopenharmony_ci/* END_CASE */ 442a8e1175bSopenharmony_ci 443a8e1175bSopenharmony_ci/* BEGIN_CASE */ 444a8e1175bSopenharmony_civoid mpi_lt_mpi_ct(int size_X, char *input_X, 445a8e1175bSopenharmony_ci int size_Y, char *input_Y, 446a8e1175bSopenharmony_ci int input_ret, int input_err) 447a8e1175bSopenharmony_ci{ 448a8e1175bSopenharmony_ci unsigned ret = -1; 449a8e1175bSopenharmony_ci unsigned input_uret = input_ret; 450a8e1175bSopenharmony_ci mbedtls_mpi X, Y; 451a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); 452a8e1175bSopenharmony_ci 453a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 454a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 455a8e1175bSopenharmony_ci 456a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_grow(&X, size_X) == 0); 457a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_grow(&Y, size_Y) == 0); 458a8e1175bSopenharmony_ci 459a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_lt_mpi_ct(&X, &Y, &ret) == input_err); 460a8e1175bSopenharmony_ci if (input_err == 0) { 461a8e1175bSopenharmony_ci TEST_EQUAL(ret, input_uret); 462a8e1175bSopenharmony_ci } 463a8e1175bSopenharmony_ci 464a8e1175bSopenharmony_ciexit: 465a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); 466a8e1175bSopenharmony_ci} 467a8e1175bSopenharmony_ci/* END_CASE */ 468a8e1175bSopenharmony_ci 469a8e1175bSopenharmony_ci/* BEGIN_CASE */ 470a8e1175bSopenharmony_civoid mpi_cmp_abs(char *input_X, char *input_Y, 471a8e1175bSopenharmony_ci int input_A) 472a8e1175bSopenharmony_ci{ 473a8e1175bSopenharmony_ci mbedtls_mpi X, Y; 474a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); 475a8e1175bSopenharmony_ci 476a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 477a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 478a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_abs(&X, &Y) == input_A); 479a8e1175bSopenharmony_ci 480a8e1175bSopenharmony_ciexit: 481a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); 482a8e1175bSopenharmony_ci} 483a8e1175bSopenharmony_ci/* END_CASE */ 484a8e1175bSopenharmony_ci 485a8e1175bSopenharmony_ci/* BEGIN_CASE */ 486a8e1175bSopenharmony_civoid mpi_copy(char *src_hex, char *dst_hex) 487a8e1175bSopenharmony_ci{ 488a8e1175bSopenharmony_ci mbedtls_mpi src, dst, ref; 489a8e1175bSopenharmony_ci mbedtls_mpi_init(&src); 490a8e1175bSopenharmony_ci mbedtls_mpi_init(&dst); 491a8e1175bSopenharmony_ci mbedtls_mpi_init(&ref); 492a8e1175bSopenharmony_ci 493a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&src, src_hex) == 0); 494a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&ref, dst_hex) == 0); 495a8e1175bSopenharmony_ci 496a8e1175bSopenharmony_ci /* mbedtls_mpi_copy() */ 497a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&dst, dst_hex) == 0); 498a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_copy(&dst, &src) == 0); 499a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&dst)); 500a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&dst, &src) == 0); 501a8e1175bSopenharmony_ci 502a8e1175bSopenharmony_ci /* mbedtls_mpi_safe_cond_assign(), assignment done */ 503a8e1175bSopenharmony_ci mbedtls_mpi_free(&dst); 504a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&dst, dst_hex) == 0); 505a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_safe_cond_assign(&dst, &src, 1) == 0); 506a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&dst)); 507a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&dst, &src) == 0); 508a8e1175bSopenharmony_ci 509a8e1175bSopenharmony_ci /* mbedtls_mpi_safe_cond_assign(), assignment not done */ 510a8e1175bSopenharmony_ci mbedtls_mpi_free(&dst); 511a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&dst, dst_hex) == 0); 512a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_safe_cond_assign(&dst, &src, 0) == 0); 513a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&dst)); 514a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&dst, &ref) == 0); 515a8e1175bSopenharmony_ci 516a8e1175bSopenharmony_ciexit: 517a8e1175bSopenharmony_ci mbedtls_mpi_free(&src); 518a8e1175bSopenharmony_ci mbedtls_mpi_free(&dst); 519a8e1175bSopenharmony_ci mbedtls_mpi_free(&ref); 520a8e1175bSopenharmony_ci} 521a8e1175bSopenharmony_ci/* END_CASE */ 522a8e1175bSopenharmony_ci 523a8e1175bSopenharmony_ci/* BEGIN_CASE */ 524a8e1175bSopenharmony_civoid mpi_copy_self(char *input_X) 525a8e1175bSopenharmony_ci{ 526a8e1175bSopenharmony_ci mbedtls_mpi X, A; 527a8e1175bSopenharmony_ci mbedtls_mpi_init(&A); 528a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 529a8e1175bSopenharmony_ci 530a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 531a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_copy(&X, &X) == 0); 532a8e1175bSopenharmony_ci 533a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_X) == 0); 534a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 535a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &A) == 0); 536a8e1175bSopenharmony_ci 537a8e1175bSopenharmony_ciexit: 538a8e1175bSopenharmony_ci mbedtls_mpi_free(&A); 539a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 540a8e1175bSopenharmony_ci} 541a8e1175bSopenharmony_ci/* END_CASE */ 542a8e1175bSopenharmony_ci 543a8e1175bSopenharmony_ci/* BEGIN_CASE */ 544a8e1175bSopenharmony_civoid mpi_swap(char *X_hex, char *Y_hex) 545a8e1175bSopenharmony_ci{ 546a8e1175bSopenharmony_ci mbedtls_mpi X, Y, X0, Y0; 547a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); 548a8e1175bSopenharmony_ci mbedtls_mpi_init(&X0); mbedtls_mpi_init(&Y0); 549a8e1175bSopenharmony_ci 550a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X0, X_hex) == 0); 551a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y0, Y_hex) == 0); 552a8e1175bSopenharmony_ci 553a8e1175bSopenharmony_ci /* mbedtls_mpi_swap() */ 554a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, X_hex) == 0); 555a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, Y_hex) == 0); 556a8e1175bSopenharmony_ci mbedtls_mpi_swap(&X, &Y); 557a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 558a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Y)); 559a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &Y0) == 0); 560a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Y, &X0) == 0); 561a8e1175bSopenharmony_ci 562a8e1175bSopenharmony_ci /* mbedtls_mpi_safe_cond_swap(), swap done */ 563a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 564a8e1175bSopenharmony_ci mbedtls_mpi_free(&Y); 565a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, X_hex) == 0); 566a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, Y_hex) == 0); 567a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_safe_cond_swap(&X, &Y, 1) == 0); 568a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 569a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Y)); 570a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &Y0) == 0); 571a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Y, &X0) == 0); 572a8e1175bSopenharmony_ci 573a8e1175bSopenharmony_ci /* mbedtls_mpi_safe_cond_swap(), swap not done */ 574a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 575a8e1175bSopenharmony_ci mbedtls_mpi_free(&Y); 576a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, X_hex) == 0); 577a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, Y_hex) == 0); 578a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_safe_cond_swap(&X, &Y, 0) == 0); 579a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 580a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Y)); 581a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &X0) == 0); 582a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Y, &Y0) == 0); 583a8e1175bSopenharmony_ci 584a8e1175bSopenharmony_ciexit: 585a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); 586a8e1175bSopenharmony_ci mbedtls_mpi_free(&X0); mbedtls_mpi_free(&Y0); 587a8e1175bSopenharmony_ci} 588a8e1175bSopenharmony_ci/* END_CASE */ 589a8e1175bSopenharmony_ci 590a8e1175bSopenharmony_ci/* BEGIN_CASE */ 591a8e1175bSopenharmony_civoid mpi_swap_self(char *X_hex) 592a8e1175bSopenharmony_ci{ 593a8e1175bSopenharmony_ci mbedtls_mpi X, X0; 594a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&X0); 595a8e1175bSopenharmony_ci 596a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, X_hex) == 0); 597a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X0, X_hex) == 0); 598a8e1175bSopenharmony_ci 599a8e1175bSopenharmony_ci mbedtls_mpi_swap(&X, &X); 600a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 601a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &X0) == 0); 602a8e1175bSopenharmony_ci 603a8e1175bSopenharmony_ciexit: 604a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&X0); 605a8e1175bSopenharmony_ci} 606a8e1175bSopenharmony_ci/* END_CASE */ 607a8e1175bSopenharmony_ci 608a8e1175bSopenharmony_ci/* BEGIN_CASE */ 609a8e1175bSopenharmony_civoid mpi_shrink(int before, int used, int min, int after) 610a8e1175bSopenharmony_ci{ 611a8e1175bSopenharmony_ci mbedtls_mpi X; 612a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 613a8e1175bSopenharmony_ci 614a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_grow(&X, before) == 0); 615a8e1175bSopenharmony_ci if (used > 0) { 616a8e1175bSopenharmony_ci size_t used_bit_count = used * 8 * sizeof(mbedtls_mpi_uint); 617a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_set_bit(&X, used_bit_count - 1, 1) == 0); 618a8e1175bSopenharmony_ci } 619a8e1175bSopenharmony_ci TEST_EQUAL(X.n, (size_t) before); 620a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_shrink(&X, min) == 0); 621a8e1175bSopenharmony_ci TEST_EQUAL(X.n, (size_t) after); 622a8e1175bSopenharmony_ci 623a8e1175bSopenharmony_ciexit: 624a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 625a8e1175bSopenharmony_ci} 626a8e1175bSopenharmony_ci/* END_CASE */ 627a8e1175bSopenharmony_ci 628a8e1175bSopenharmony_ci/* BEGIN_CASE */ 629a8e1175bSopenharmony_civoid mpi_add_mpi(char *input_X, char *input_Y, 630a8e1175bSopenharmony_ci char *input_A) 631a8e1175bSopenharmony_ci{ 632a8e1175bSopenharmony_ci mbedtls_mpi X, Y, Z, A; 633a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&A); 634a8e1175bSopenharmony_ci 635a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 636a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 637a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 638a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_add_mpi(&Z, &X, &Y) == 0); 639a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 640a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) == 0); 641a8e1175bSopenharmony_ci 642a8e1175bSopenharmony_ci /* result == first operand */ 643a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_add_mpi(&X, &X, &Y) == 0); 644a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 645a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &A) == 0); 646a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 647a8e1175bSopenharmony_ci 648a8e1175bSopenharmony_ci /* result == second operand */ 649a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_add_mpi(&Y, &X, &Y) == 0); 650a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Y)); 651a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Y, &A) == 0); 652a8e1175bSopenharmony_ci 653a8e1175bSopenharmony_ciexit: 654a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&A); 655a8e1175bSopenharmony_ci} 656a8e1175bSopenharmony_ci/* END_CASE */ 657a8e1175bSopenharmony_ci 658a8e1175bSopenharmony_ci/* BEGIN_CASE */ 659a8e1175bSopenharmony_civoid mpi_add_mpi_inplace(char *input_X, char *input_A) 660a8e1175bSopenharmony_ci{ 661a8e1175bSopenharmony_ci mbedtls_mpi X, A; 662a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&A); 663a8e1175bSopenharmony_ci 664a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 665a8e1175bSopenharmony_ci 666a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 667a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_sub_abs(&X, &X, &X) == 0); 668a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_int(&X, 0) == 0); 669a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 670a8e1175bSopenharmony_ci 671a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 672a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_add_abs(&X, &X, &X) == 0); 673a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 674a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &A) == 0); 675a8e1175bSopenharmony_ci 676a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 677a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_add_mpi(&X, &X, &X) == 0); 678a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 679a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &A) == 0); 680a8e1175bSopenharmony_ci 681a8e1175bSopenharmony_ciexit: 682a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&A); 683a8e1175bSopenharmony_ci} 684a8e1175bSopenharmony_ci/* END_CASE */ 685a8e1175bSopenharmony_ci 686a8e1175bSopenharmony_ci 687a8e1175bSopenharmony_ci/* BEGIN_CASE */ 688a8e1175bSopenharmony_civoid mpi_add_abs(char *input_X, char *input_Y, 689a8e1175bSopenharmony_ci char *input_A) 690a8e1175bSopenharmony_ci{ 691a8e1175bSopenharmony_ci mbedtls_mpi X, Y, Z, A; 692a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&A); 693a8e1175bSopenharmony_ci 694a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 695a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 696a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 697a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_add_abs(&Z, &X, &Y) == 0); 698a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 699a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) == 0); 700a8e1175bSopenharmony_ci 701a8e1175bSopenharmony_ci /* result == first operand */ 702a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_add_abs(&X, &X, &Y) == 0); 703a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 704a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &A) == 0); 705a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 706a8e1175bSopenharmony_ci 707a8e1175bSopenharmony_ci /* result == second operand */ 708a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_add_abs(&Y, &X, &Y) == 0); 709a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Y)); 710a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Y, &A) == 0); 711a8e1175bSopenharmony_ci 712a8e1175bSopenharmony_ciexit: 713a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&A); 714a8e1175bSopenharmony_ci} 715a8e1175bSopenharmony_ci/* END_CASE */ 716a8e1175bSopenharmony_ci 717a8e1175bSopenharmony_ci/* BEGIN_CASE */ 718a8e1175bSopenharmony_civoid mpi_add_int(char *input_X, int input_Y, 719a8e1175bSopenharmony_ci char *input_A) 720a8e1175bSopenharmony_ci{ 721a8e1175bSopenharmony_ci mbedtls_mpi X, Z, A; 722a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&A); 723a8e1175bSopenharmony_ci 724a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 725a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 726a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_add_int(&Z, &X, input_Y) == 0); 727a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 728a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) == 0); 729a8e1175bSopenharmony_ci 730a8e1175bSopenharmony_ciexit: 731a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&A); 732a8e1175bSopenharmony_ci} 733a8e1175bSopenharmony_ci/* END_CASE */ 734a8e1175bSopenharmony_ci 735a8e1175bSopenharmony_ci/* BEGIN_CASE */ 736a8e1175bSopenharmony_civoid mpi_sub_mpi(char *input_X, char *input_Y, 737a8e1175bSopenharmony_ci char *input_A) 738a8e1175bSopenharmony_ci{ 739a8e1175bSopenharmony_ci mbedtls_mpi X, Y, Z, A; 740a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&A); 741a8e1175bSopenharmony_ci 742a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 743a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 744a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 745a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_sub_mpi(&Z, &X, &Y) == 0); 746a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 747a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) == 0); 748a8e1175bSopenharmony_ci 749a8e1175bSopenharmony_ci /* result == first operand */ 750a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_sub_mpi(&X, &X, &Y) == 0); 751a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 752a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &A) == 0); 753a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 754a8e1175bSopenharmony_ci 755a8e1175bSopenharmony_ci /* result == second operand */ 756a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_sub_mpi(&Y, &X, &Y) == 0); 757a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Y)); 758a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Y, &A) == 0); 759a8e1175bSopenharmony_ci 760a8e1175bSopenharmony_ciexit: 761a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&A); 762a8e1175bSopenharmony_ci} 763a8e1175bSopenharmony_ci/* END_CASE */ 764a8e1175bSopenharmony_ci 765a8e1175bSopenharmony_ci/* BEGIN_CASE */ 766a8e1175bSopenharmony_civoid mpi_sub_abs(char *input_X, char *input_Y, 767a8e1175bSopenharmony_ci char *input_A, int sub_result) 768a8e1175bSopenharmony_ci{ 769a8e1175bSopenharmony_ci mbedtls_mpi X, Y, Z, A; 770a8e1175bSopenharmony_ci int res; 771a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&A); 772a8e1175bSopenharmony_ci 773a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 774a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 775a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 776a8e1175bSopenharmony_ci 777a8e1175bSopenharmony_ci res = mbedtls_mpi_sub_abs(&Z, &X, &Y); 778a8e1175bSopenharmony_ci TEST_ASSERT(res == sub_result); 779a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 780a8e1175bSopenharmony_ci if (res == 0) { 781a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) == 0); 782a8e1175bSopenharmony_ci } 783a8e1175bSopenharmony_ci 784a8e1175bSopenharmony_ci /* result == first operand */ 785a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_sub_abs(&X, &X, &Y) == sub_result); 786a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 787a8e1175bSopenharmony_ci if (sub_result == 0) { 788a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &A) == 0); 789a8e1175bSopenharmony_ci } 790a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 791a8e1175bSopenharmony_ci 792a8e1175bSopenharmony_ci /* result == second operand */ 793a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_sub_abs(&Y, &X, &Y) == sub_result); 794a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Y)); 795a8e1175bSopenharmony_ci if (sub_result == 0) { 796a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Y, &A) == 0); 797a8e1175bSopenharmony_ci } 798a8e1175bSopenharmony_ci 799a8e1175bSopenharmony_ciexit: 800a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&A); 801a8e1175bSopenharmony_ci} 802a8e1175bSopenharmony_ci/* END_CASE */ 803a8e1175bSopenharmony_ci 804a8e1175bSopenharmony_ci/* BEGIN_CASE */ 805a8e1175bSopenharmony_civoid mpi_sub_int(char *input_X, int input_Y, 806a8e1175bSopenharmony_ci char *input_A) 807a8e1175bSopenharmony_ci{ 808a8e1175bSopenharmony_ci mbedtls_mpi X, Z, A; 809a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&A); 810a8e1175bSopenharmony_ci 811a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 812a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 813a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_sub_int(&Z, &X, input_Y) == 0); 814a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 815a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) == 0); 816a8e1175bSopenharmony_ci 817a8e1175bSopenharmony_ciexit: 818a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&A); 819a8e1175bSopenharmony_ci} 820a8e1175bSopenharmony_ci/* END_CASE */ 821a8e1175bSopenharmony_ci 822a8e1175bSopenharmony_ci/* BEGIN_CASE */ 823a8e1175bSopenharmony_civoid mpi_mul_mpi(char *input_X, char *input_Y, 824a8e1175bSopenharmony_ci char *input_A) 825a8e1175bSopenharmony_ci{ 826a8e1175bSopenharmony_ci mbedtls_mpi X, Y, Z, A; 827a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&A); 828a8e1175bSopenharmony_ci 829a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 830a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 831a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 832a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_mul_mpi(&Z, &X, &Y) == 0); 833a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 834a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) == 0); 835a8e1175bSopenharmony_ci 836a8e1175bSopenharmony_ciexit: 837a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&A); 838a8e1175bSopenharmony_ci} 839a8e1175bSopenharmony_ci/* END_CASE */ 840a8e1175bSopenharmony_ci 841a8e1175bSopenharmony_ci/* BEGIN_CASE */ 842a8e1175bSopenharmony_civoid mpi_mul_int(char *input_X, int input_Y, 843a8e1175bSopenharmony_ci char *input_A, char *result_comparison) 844a8e1175bSopenharmony_ci{ 845a8e1175bSopenharmony_ci mbedtls_mpi X, Z, A; 846a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&A); 847a8e1175bSopenharmony_ci 848a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 849a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 850a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_mul_int(&Z, &X, input_Y) == 0); 851a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 852a8e1175bSopenharmony_ci if (strcmp(result_comparison, "==") == 0) { 853a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) == 0); 854a8e1175bSopenharmony_ci } else if (strcmp(result_comparison, "!=") == 0) { 855a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) != 0); 856a8e1175bSopenharmony_ci } else { 857a8e1175bSopenharmony_ci TEST_FAIL("unknown operator"); 858a8e1175bSopenharmony_ci } 859a8e1175bSopenharmony_ci 860a8e1175bSopenharmony_ciexit: 861a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&A); 862a8e1175bSopenharmony_ci} 863a8e1175bSopenharmony_ci/* END_CASE */ 864a8e1175bSopenharmony_ci 865a8e1175bSopenharmony_ci/* BEGIN_CASE */ 866a8e1175bSopenharmony_civoid mpi_div_mpi(char *input_X, char *input_Y, 867a8e1175bSopenharmony_ci char *input_A, char *input_B, 868a8e1175bSopenharmony_ci int div_result) 869a8e1175bSopenharmony_ci{ 870a8e1175bSopenharmony_ci mbedtls_mpi X, Y, Q, R, A, B; 871a8e1175bSopenharmony_ci int res; 872a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Q); mbedtls_mpi_init(&R); 873a8e1175bSopenharmony_ci mbedtls_mpi_init(&A); mbedtls_mpi_init(&B); 874a8e1175bSopenharmony_ci 875a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 876a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 877a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 878a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&B, input_B) == 0); 879a8e1175bSopenharmony_ci res = mbedtls_mpi_div_mpi(&Q, &R, &X, &Y); 880a8e1175bSopenharmony_ci TEST_ASSERT(res == div_result); 881a8e1175bSopenharmony_ci if (res == 0) { 882a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Q)); 883a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&R)); 884a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Q, &A) == 0); 885a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R, &B) == 0); 886a8e1175bSopenharmony_ci } 887a8e1175bSopenharmony_ci 888a8e1175bSopenharmony_ciexit: 889a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Q); mbedtls_mpi_free(&R); 890a8e1175bSopenharmony_ci mbedtls_mpi_free(&A); mbedtls_mpi_free(&B); 891a8e1175bSopenharmony_ci} 892a8e1175bSopenharmony_ci/* END_CASE */ 893a8e1175bSopenharmony_ci 894a8e1175bSopenharmony_ci/* BEGIN_CASE */ 895a8e1175bSopenharmony_civoid mpi_div_int(char *input_X, int input_Y, 896a8e1175bSopenharmony_ci char *input_A, char *input_B, 897a8e1175bSopenharmony_ci int div_result) 898a8e1175bSopenharmony_ci{ 899a8e1175bSopenharmony_ci mbedtls_mpi X, Q, R, A, B; 900a8e1175bSopenharmony_ci int res; 901a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Q); mbedtls_mpi_init(&R); mbedtls_mpi_init(&A); 902a8e1175bSopenharmony_ci mbedtls_mpi_init(&B); 903a8e1175bSopenharmony_ci 904a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 905a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 906a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&B, input_B) == 0); 907a8e1175bSopenharmony_ci res = mbedtls_mpi_div_int(&Q, &R, &X, input_Y); 908a8e1175bSopenharmony_ci TEST_ASSERT(res == div_result); 909a8e1175bSopenharmony_ci if (res == 0) { 910a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Q)); 911a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&R)); 912a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Q, &A) == 0); 913a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R, &B) == 0); 914a8e1175bSopenharmony_ci } 915a8e1175bSopenharmony_ci 916a8e1175bSopenharmony_ciexit: 917a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Q); mbedtls_mpi_free(&R); mbedtls_mpi_free(&A); 918a8e1175bSopenharmony_ci mbedtls_mpi_free(&B); 919a8e1175bSopenharmony_ci} 920a8e1175bSopenharmony_ci/* END_CASE */ 921a8e1175bSopenharmony_ci 922a8e1175bSopenharmony_ci/* BEGIN_CASE */ 923a8e1175bSopenharmony_civoid mpi_mod_mpi(char *input_X, char *input_Y, 924a8e1175bSopenharmony_ci char *input_A, int div_result) 925a8e1175bSopenharmony_ci{ 926a8e1175bSopenharmony_ci mbedtls_mpi X, Y, A; 927a8e1175bSopenharmony_ci int res; 928a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&A); 929a8e1175bSopenharmony_ci 930a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 931a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 932a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 933a8e1175bSopenharmony_ci res = mbedtls_mpi_mod_mpi(&X, &X, &Y); 934a8e1175bSopenharmony_ci TEST_ASSERT(res == div_result); 935a8e1175bSopenharmony_ci if (res == 0) { 936a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 937a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &A) == 0); 938a8e1175bSopenharmony_ci } 939a8e1175bSopenharmony_ci 940a8e1175bSopenharmony_ciexit: 941a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&A); 942a8e1175bSopenharmony_ci} 943a8e1175bSopenharmony_ci/* END_CASE */ 944a8e1175bSopenharmony_ci 945a8e1175bSopenharmony_ci/* BEGIN_CASE */ 946a8e1175bSopenharmony_civoid mpi_mod_int(char *input_X, mbedtls_mpi_sint y, 947a8e1175bSopenharmony_ci mbedtls_mpi_sint a, int mod_result) 948a8e1175bSopenharmony_ci{ 949a8e1175bSopenharmony_ci mbedtls_mpi X; 950a8e1175bSopenharmony_ci int res; 951a8e1175bSopenharmony_ci mbedtls_mpi_uint r; 952a8e1175bSopenharmony_ci 953a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 954a8e1175bSopenharmony_ci 955a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_read_mpi(&X, input_X), 0); 956a8e1175bSopenharmony_ci 957a8e1175bSopenharmony_ci res = mbedtls_mpi_mod_int(&r, &X, y); 958a8e1175bSopenharmony_ci TEST_EQUAL(res, mod_result); 959a8e1175bSopenharmony_ci if (res == 0) { 960a8e1175bSopenharmony_ci TEST_EQUAL(r, a); 961a8e1175bSopenharmony_ci } 962a8e1175bSopenharmony_ci 963a8e1175bSopenharmony_ciexit: 964a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 965a8e1175bSopenharmony_ci} 966a8e1175bSopenharmony_ci/* END_CASE */ 967a8e1175bSopenharmony_ci 968a8e1175bSopenharmony_ci/* BEGIN_CASE */ 969a8e1175bSopenharmony_civoid mpi_exp_mod_min_RR(char *input_A, char *input_E, 970a8e1175bSopenharmony_ci char *input_N, char *input_X, 971a8e1175bSopenharmony_ci int exp_result) 972a8e1175bSopenharmony_ci{ 973a8e1175bSopenharmony_ci mbedtls_mpi A, E, N, RR, Z, X; 974a8e1175bSopenharmony_ci int res; 975a8e1175bSopenharmony_ci mbedtls_mpi_init(&A); mbedtls_mpi_init(&E); mbedtls_mpi_init(&N); 976a8e1175bSopenharmony_ci mbedtls_mpi_init(&RR); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&X); 977a8e1175bSopenharmony_ci 978a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_read_mpi(&A, input_A), 0); 979a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_read_mpi(&E, input_E), 0); 980a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_read_mpi(&N, input_N), 0); 981a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_test_read_mpi(&X, input_X), 0); 982a8e1175bSopenharmony_ci 983a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_core_get_mont_r2_unsafe(&RR, &N), 0); 984a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_shrink(&RR, 0), 0); 985a8e1175bSopenharmony_ci /* The objective of this test is to check that exp_mod defends 986a8e1175bSopenharmony_ci * against a smaller RR. */ 987a8e1175bSopenharmony_ci TEST_LE_U(RR.n, N.n - 1); 988a8e1175bSopenharmony_ci 989a8e1175bSopenharmony_ci res = mbedtls_mpi_exp_mod(&Z, &A, &E, &N, &RR); 990a8e1175bSopenharmony_ci /* We know that exp_mod internally needs RR to be as large as N. 991a8e1175bSopenharmony_ci * Validate that it is the case now, otherwise there was probably 992a8e1175bSopenharmony_ci * a buffer overread. */ 993a8e1175bSopenharmony_ci TEST_EQUAL(RR.n, N.n); 994a8e1175bSopenharmony_ci 995a8e1175bSopenharmony_ci TEST_EQUAL(res, exp_result); 996a8e1175bSopenharmony_ci if (res == 0) { 997a8e1175bSopenharmony_ci TEST_EQUAL(sign_is_valid(&Z), 1); 998a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_mpi(&Z, &X), 0); 999a8e1175bSopenharmony_ci } 1000a8e1175bSopenharmony_ci 1001a8e1175bSopenharmony_ciexit: 1002a8e1175bSopenharmony_ci mbedtls_mpi_free(&A); mbedtls_mpi_free(&E); mbedtls_mpi_free(&N); 1003a8e1175bSopenharmony_ci mbedtls_mpi_free(&RR); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&X); 1004a8e1175bSopenharmony_ci} 1005a8e1175bSopenharmony_ci/* END_CASE */ 1006a8e1175bSopenharmony_ci 1007a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1008a8e1175bSopenharmony_civoid mpi_exp_mod(char *input_A, char *input_E, 1009a8e1175bSopenharmony_ci char *input_N, char *input_X, 1010a8e1175bSopenharmony_ci int exp_result) 1011a8e1175bSopenharmony_ci{ 1012a8e1175bSopenharmony_ci mbedtls_mpi A, E, N, RR, Z, X; 1013a8e1175bSopenharmony_ci int res; 1014a8e1175bSopenharmony_ci mbedtls_mpi_init(&A); mbedtls_mpi_init(&E); mbedtls_mpi_init(&N); 1015a8e1175bSopenharmony_ci mbedtls_mpi_init(&RR); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&X); 1016a8e1175bSopenharmony_ci 1017a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 1018a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0); 1019a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0); 1020a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 1021a8e1175bSopenharmony_ci 1022a8e1175bSopenharmony_ci res = mbedtls_mpi_exp_mod(&Z, &A, &E, &N, NULL); 1023a8e1175bSopenharmony_ci TEST_ASSERT(res == exp_result); 1024a8e1175bSopenharmony_ci if (res == 0) { 1025a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 1026a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &X) == 0); 1027a8e1175bSopenharmony_ci } 1028a8e1175bSopenharmony_ci 1029a8e1175bSopenharmony_ci /* Now test again with the speed-up parameter supplied as an output. */ 1030a8e1175bSopenharmony_ci res = mbedtls_mpi_exp_mod(&Z, &A, &E, &N, &RR); 1031a8e1175bSopenharmony_ci TEST_ASSERT(res == exp_result); 1032a8e1175bSopenharmony_ci if (res == 0) { 1033a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 1034a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &X) == 0); 1035a8e1175bSopenharmony_ci } 1036a8e1175bSopenharmony_ci 1037a8e1175bSopenharmony_ci /* Now test again with the speed-up parameter supplied in calculated form. */ 1038a8e1175bSopenharmony_ci res = mbedtls_mpi_exp_mod(&Z, &A, &E, &N, &RR); 1039a8e1175bSopenharmony_ci TEST_ASSERT(res == exp_result); 1040a8e1175bSopenharmony_ci if (res == 0) { 1041a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 1042a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &X) == 0); 1043a8e1175bSopenharmony_ci } 1044a8e1175bSopenharmony_ci 1045a8e1175bSopenharmony_ciexit: 1046a8e1175bSopenharmony_ci mbedtls_mpi_free(&A); mbedtls_mpi_free(&E); mbedtls_mpi_free(&N); 1047a8e1175bSopenharmony_ci mbedtls_mpi_free(&RR); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&X); 1048a8e1175bSopenharmony_ci} 1049a8e1175bSopenharmony_ci/* END_CASE */ 1050a8e1175bSopenharmony_ci 1051a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1052a8e1175bSopenharmony_civoid mpi_exp_mod_size(int A_bytes, int E_bytes, int N_bytes, 1053a8e1175bSopenharmony_ci char *input_RR, int exp_result) 1054a8e1175bSopenharmony_ci{ 1055a8e1175bSopenharmony_ci mbedtls_mpi A, E, N, RR, Z; 1056a8e1175bSopenharmony_ci mbedtls_mpi_init(&A); mbedtls_mpi_init(&E); mbedtls_mpi_init(&N); 1057a8e1175bSopenharmony_ci mbedtls_mpi_init(&RR); mbedtls_mpi_init(&Z); 1058a8e1175bSopenharmony_ci 1059a8e1175bSopenharmony_ci /* Set A to 2^(A_bytes - 1) + 1 */ 1060a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_lset(&A, 1) == 0); 1061a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_shift_l(&A, (A_bytes * 8) - 1) == 0); 1062a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_set_bit(&A, 0, 1) == 0); 1063a8e1175bSopenharmony_ci 1064a8e1175bSopenharmony_ci /* Set E to 2^(E_bytes - 1) + 1 */ 1065a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_lset(&E, 1) == 0); 1066a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_shift_l(&E, (E_bytes * 8) - 1) == 0); 1067a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_set_bit(&E, 0, 1) == 0); 1068a8e1175bSopenharmony_ci 1069a8e1175bSopenharmony_ci /* Set N to 2^(N_bytes - 1) + 1 */ 1070a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_lset(&N, 1) == 0); 1071a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_shift_l(&N, (N_bytes * 8) - 1) == 0); 1072a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_set_bit(&N, 0, 1) == 0); 1073a8e1175bSopenharmony_ci 1074a8e1175bSopenharmony_ci if (strlen(input_RR)) { 1075a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&RR, input_RR) == 0); 1076a8e1175bSopenharmony_ci } 1077a8e1175bSopenharmony_ci 1078a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_exp_mod(&Z, &A, &E, &N, &RR) == exp_result); 1079a8e1175bSopenharmony_ci 1080a8e1175bSopenharmony_ciexit: 1081a8e1175bSopenharmony_ci mbedtls_mpi_free(&A); mbedtls_mpi_free(&E); mbedtls_mpi_free(&N); 1082a8e1175bSopenharmony_ci mbedtls_mpi_free(&RR); mbedtls_mpi_free(&Z); 1083a8e1175bSopenharmony_ci} 1084a8e1175bSopenharmony_ci/* END_CASE */ 1085a8e1175bSopenharmony_ci 1086a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1087a8e1175bSopenharmony_civoid mpi_inv_mod(char *input_X, char *input_Y, 1088a8e1175bSopenharmony_ci char *input_A, int div_result) 1089a8e1175bSopenharmony_ci{ 1090a8e1175bSopenharmony_ci mbedtls_mpi X, Y, Z, A; 1091a8e1175bSopenharmony_ci int res; 1092a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z); mbedtls_mpi_init(&A); 1093a8e1175bSopenharmony_ci 1094a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 1095a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&Y, input_Y) == 0); 1096a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 1097a8e1175bSopenharmony_ci res = mbedtls_mpi_inv_mod(&Z, &X, &Y); 1098a8e1175bSopenharmony_ci TEST_ASSERT(res == div_result); 1099a8e1175bSopenharmony_ci if (res == 0) { 1100a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&Z)); 1101a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&Z, &A) == 0); 1102a8e1175bSopenharmony_ci } 1103a8e1175bSopenharmony_ci 1104a8e1175bSopenharmony_ciexit: 1105a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z); mbedtls_mpi_free(&A); 1106a8e1175bSopenharmony_ci} 1107a8e1175bSopenharmony_ci/* END_CASE */ 1108a8e1175bSopenharmony_ci 1109a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */ 1110a8e1175bSopenharmony_civoid mpi_is_prime(char *input_X, int div_result) 1111a8e1175bSopenharmony_ci{ 1112a8e1175bSopenharmony_ci mbedtls_mpi X; 1113a8e1175bSopenharmony_ci int res; 1114a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 1115a8e1175bSopenharmony_ci 1116a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 1117a8e1175bSopenharmony_ci res = mbedtls_mpi_is_prime_ext(&X, 40, mbedtls_test_rnd_std_rand, NULL); 1118a8e1175bSopenharmony_ci TEST_ASSERT(res == div_result); 1119a8e1175bSopenharmony_ci 1120a8e1175bSopenharmony_ciexit: 1121a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 1122a8e1175bSopenharmony_ci} 1123a8e1175bSopenharmony_ci/* END_CASE */ 1124a8e1175bSopenharmony_ci 1125a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */ 1126a8e1175bSopenharmony_civoid mpi_is_prime_det(data_t *input_X, data_t *witnesses, 1127a8e1175bSopenharmony_ci int chunk_len, int rounds) 1128a8e1175bSopenharmony_ci{ 1129a8e1175bSopenharmony_ci mbedtls_mpi X; 1130a8e1175bSopenharmony_ci int res; 1131a8e1175bSopenharmony_ci mbedtls_test_mpi_random rand; 1132a8e1175bSopenharmony_ci 1133a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 1134a8e1175bSopenharmony_ci rand.data = witnesses; 1135a8e1175bSopenharmony_ci rand.pos = 0; 1136a8e1175bSopenharmony_ci rand.chunk_len = chunk_len; 1137a8e1175bSopenharmony_ci 1138a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_read_binary(&X, input_X->x, input_X->len) == 0); 1139a8e1175bSopenharmony_ci res = mbedtls_mpi_is_prime_ext(&X, rounds - 1, 1140a8e1175bSopenharmony_ci mbedtls_test_mpi_miller_rabin_determinizer, 1141a8e1175bSopenharmony_ci &rand); 1142a8e1175bSopenharmony_ci TEST_ASSERT(res == 0); 1143a8e1175bSopenharmony_ci 1144a8e1175bSopenharmony_ci rand.data = witnesses; 1145a8e1175bSopenharmony_ci rand.pos = 0; 1146a8e1175bSopenharmony_ci rand.chunk_len = chunk_len; 1147a8e1175bSopenharmony_ci 1148a8e1175bSopenharmony_ci res = mbedtls_mpi_is_prime_ext(&X, rounds, 1149a8e1175bSopenharmony_ci mbedtls_test_mpi_miller_rabin_determinizer, 1150a8e1175bSopenharmony_ci &rand); 1151a8e1175bSopenharmony_ci TEST_ASSERT(res == MBEDTLS_ERR_MPI_NOT_ACCEPTABLE); 1152a8e1175bSopenharmony_ci 1153a8e1175bSopenharmony_ciexit: 1154a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 1155a8e1175bSopenharmony_ci} 1156a8e1175bSopenharmony_ci/* END_CASE */ 1157a8e1175bSopenharmony_ci 1158a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_GENPRIME */ 1159a8e1175bSopenharmony_civoid mpi_gen_prime(int bits, int flags, int ref_ret) 1160a8e1175bSopenharmony_ci{ 1161a8e1175bSopenharmony_ci mbedtls_mpi X; 1162a8e1175bSopenharmony_ci int my_ret; 1163a8e1175bSopenharmony_ci 1164a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 1165a8e1175bSopenharmony_ci 1166a8e1175bSopenharmony_ci my_ret = mbedtls_mpi_gen_prime(&X, bits, flags, 1167a8e1175bSopenharmony_ci mbedtls_test_rnd_std_rand, NULL); 1168a8e1175bSopenharmony_ci TEST_ASSERT(my_ret == ref_ret); 1169a8e1175bSopenharmony_ci 1170a8e1175bSopenharmony_ci if (ref_ret == 0) { 1171a8e1175bSopenharmony_ci size_t actual_bits = mbedtls_mpi_bitlen(&X); 1172a8e1175bSopenharmony_ci 1173a8e1175bSopenharmony_ci TEST_ASSERT(actual_bits >= (size_t) bits); 1174a8e1175bSopenharmony_ci TEST_ASSERT(actual_bits <= (size_t) bits + 1); 1175a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 1176a8e1175bSopenharmony_ci 1177a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_is_prime_ext(&X, 40, 1178a8e1175bSopenharmony_ci mbedtls_test_rnd_std_rand, 1179a8e1175bSopenharmony_ci NULL) == 0); 1180a8e1175bSopenharmony_ci if (flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH) { 1181a8e1175bSopenharmony_ci /* X = ( X - 1 ) / 2 */ 1182a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_shift_r(&X, 1) == 0); 1183a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_is_prime_ext(&X, 40, 1184a8e1175bSopenharmony_ci mbedtls_test_rnd_std_rand, 1185a8e1175bSopenharmony_ci NULL) == 0); 1186a8e1175bSopenharmony_ci } 1187a8e1175bSopenharmony_ci } 1188a8e1175bSopenharmony_ci 1189a8e1175bSopenharmony_ciexit: 1190a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 1191a8e1175bSopenharmony_ci} 1192a8e1175bSopenharmony_ci/* END_CASE */ 1193a8e1175bSopenharmony_ci 1194a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1195a8e1175bSopenharmony_civoid mpi_shift_l(char *input_X, int shift_X, 1196a8e1175bSopenharmony_ci char *input_A) 1197a8e1175bSopenharmony_ci{ 1198a8e1175bSopenharmony_ci mbedtls_mpi X, A; 1199a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&A); 1200a8e1175bSopenharmony_ci 1201a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 1202a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 1203a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_shift_l(&X, shift_X) == 0); 1204a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 1205a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &A) == 0); 1206a8e1175bSopenharmony_ci 1207a8e1175bSopenharmony_ciexit: 1208a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&A); 1209a8e1175bSopenharmony_ci} 1210a8e1175bSopenharmony_ci/* END_CASE */ 1211a8e1175bSopenharmony_ci 1212a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1213a8e1175bSopenharmony_civoid mpi_shift_r(char *input_X, int shift_X, 1214a8e1175bSopenharmony_ci char *input_A) 1215a8e1175bSopenharmony_ci{ 1216a8e1175bSopenharmony_ci mbedtls_mpi X, A; 1217a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); mbedtls_mpi_init(&A); 1218a8e1175bSopenharmony_ci 1219a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&X, input_X) == 0); 1220a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_test_read_mpi(&A, input_A) == 0); 1221a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_shift_r(&X, shift_X) == 0); 1222a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 1223a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_cmp_mpi(&X, &A) == 0); 1224a8e1175bSopenharmony_ci 1225a8e1175bSopenharmony_ciexit: 1226a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); mbedtls_mpi_free(&A); 1227a8e1175bSopenharmony_ci} 1228a8e1175bSopenharmony_ci/* END_CASE */ 1229a8e1175bSopenharmony_ci 1230a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1231a8e1175bSopenharmony_civoid mpi_fill_random(int wanted_bytes, int rng_bytes, 1232a8e1175bSopenharmony_ci int before, int expected_ret) 1233a8e1175bSopenharmony_ci{ 1234a8e1175bSopenharmony_ci mbedtls_mpi X; 1235a8e1175bSopenharmony_ci int ret; 1236a8e1175bSopenharmony_ci size_t bytes_left = rng_bytes; 1237a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 1238a8e1175bSopenharmony_ci 1239a8e1175bSopenharmony_ci if (before != 0) { 1240a8e1175bSopenharmony_ci /* Set X to sign(before) * 2^(|before|-1) */ 1241a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_lset(&X, before > 0 ? 1 : -1) == 0); 1242a8e1175bSopenharmony_ci if (before < 0) { 1243a8e1175bSopenharmony_ci before = -before; 1244a8e1175bSopenharmony_ci } 1245a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_shift_l(&X, before - 1) == 0); 1246a8e1175bSopenharmony_ci } 1247a8e1175bSopenharmony_ci 1248a8e1175bSopenharmony_ci ret = mbedtls_mpi_fill_random(&X, wanted_bytes, 1249a8e1175bSopenharmony_ci f_rng_bytes_left, &bytes_left); 1250a8e1175bSopenharmony_ci TEST_ASSERT(ret == expected_ret); 1251a8e1175bSopenharmony_ci 1252a8e1175bSopenharmony_ci if (expected_ret == 0) { 1253a8e1175bSopenharmony_ci /* mbedtls_mpi_fill_random is documented to use bytes from the RNG 1254a8e1175bSopenharmony_ci * as a big-endian representation of the number. We know when 1255a8e1175bSopenharmony_ci * our RNG function returns null bytes, so we know how many 1256a8e1175bSopenharmony_ci * leading zero bytes the number has. */ 1257a8e1175bSopenharmony_ci size_t leading_zeros = 0; 1258a8e1175bSopenharmony_ci if (wanted_bytes > 0 && rng_bytes % 256 == 0) { 1259a8e1175bSopenharmony_ci leading_zeros = 1; 1260a8e1175bSopenharmony_ci } 1261a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_size(&X) + leading_zeros == 1262a8e1175bSopenharmony_ci (size_t) wanted_bytes); 1263a8e1175bSopenharmony_ci TEST_ASSERT((int) bytes_left == rng_bytes - wanted_bytes); 1264a8e1175bSopenharmony_ci TEST_ASSERT(sign_is_valid(&X)); 1265a8e1175bSopenharmony_ci } 1266a8e1175bSopenharmony_ci 1267a8e1175bSopenharmony_ciexit: 1268a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 1269a8e1175bSopenharmony_ci} 1270a8e1175bSopenharmony_ci/* END_CASE */ 1271a8e1175bSopenharmony_ci 1272a8e1175bSopenharmony_ci/* BEGIN_CASE */ 1273a8e1175bSopenharmony_civoid most_negative_mpi_sint() 1274a8e1175bSopenharmony_ci{ 1275a8e1175bSopenharmony_ci /* Ad hoc tests for n = -p = -2^(biL-1) as a mbedtls_mpi_sint. We 1276a8e1175bSopenharmony_ci * guarantee that mbedtls_mpi_sint is a two's complement type, so this 1277a8e1175bSopenharmony_ci * is a valid value. However, negating it (`-n`) has undefined behavior 1278a8e1175bSopenharmony_ci * (although in practice `-n` evaluates to the value n). 1279a8e1175bSopenharmony_ci * 1280a8e1175bSopenharmony_ci * This function has ad hoc tests for this value. It's separated from other 1281a8e1175bSopenharmony_ci * functions because the test framework makes it hard to pass this value 1282a8e1175bSopenharmony_ci * into test cases. 1283a8e1175bSopenharmony_ci * 1284a8e1175bSopenharmony_ci * In the comments here: 1285a8e1175bSopenharmony_ci * - biL = number of bits in limbs 1286a8e1175bSopenharmony_ci * - p = 2^(biL-1) (smallest positive value not in mbedtls_mpi_sint range) 1287a8e1175bSopenharmony_ci * - n = -2^(biL-1) (largest negative value in mbedtls_mpi_sint range) 1288a8e1175bSopenharmony_ci */ 1289a8e1175bSopenharmony_ci 1290a8e1175bSopenharmony_ci mbedtls_mpi A, R, X; 1291a8e1175bSopenharmony_ci mbedtls_mpi_init(&A); 1292a8e1175bSopenharmony_ci mbedtls_mpi_init(&R); 1293a8e1175bSopenharmony_ci mbedtls_mpi_init(&X); 1294a8e1175bSopenharmony_ci 1295a8e1175bSopenharmony_ci mbedtls_mpi_uint most_positive_plus_1 = (mbedtls_mpi_uint) 1 << (biL - 1); 1296a8e1175bSopenharmony_ci const mbedtls_mpi_sint most_positive = most_positive_plus_1 - 1; 1297a8e1175bSopenharmony_ci const mbedtls_mpi_sint most_negative = -most_positive - 1; 1298a8e1175bSopenharmony_ci TEST_EQUAL((mbedtls_mpi_uint) most_negative, 1299a8e1175bSopenharmony_ci (mbedtls_mpi_uint) 1 << (biL - 1)); 1300a8e1175bSopenharmony_ci TEST_EQUAL((mbedtls_mpi_uint) most_negative << 1, 0); 1301a8e1175bSopenharmony_ci 1302a8e1175bSopenharmony_ci /* Test mbedtls_mpi_lset() */ 1303a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_lset(&A, most_negative), 0); 1304a8e1175bSopenharmony_ci TEST_EQUAL(A.s, -1); 1305a8e1175bSopenharmony_ci TEST_EQUAL(A.n, 1); 1306a8e1175bSopenharmony_ci TEST_EQUAL(A.p[0], most_positive_plus_1); 1307a8e1175bSopenharmony_ci 1308a8e1175bSopenharmony_ci /* Test mbedtls_mpi_cmp_int(): -p == -p */ 1309a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&A, most_negative), 0); 1310a8e1175bSopenharmony_ci 1311a8e1175bSopenharmony_ci /* Test mbedtls_mpi_cmp_int(): -(p+1) < -p */ 1312a8e1175bSopenharmony_ci A.p[0] = most_positive_plus_1 + 1; 1313a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&A, most_negative), -1); 1314a8e1175bSopenharmony_ci 1315a8e1175bSopenharmony_ci /* Test mbedtls_mpi_cmp_int(): -(p-1) > -p */ 1316a8e1175bSopenharmony_ci A.p[0] = most_positive_plus_1 - 1; 1317a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&A, most_negative), 1); 1318a8e1175bSopenharmony_ci 1319a8e1175bSopenharmony_ci /* Test mbedtls_mpi_add_int(): (p-1) + (-p) */ 1320a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_lset(&A, most_positive), 0); 1321a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_add_int(&X, &A, most_negative), 0); 1322a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&X, -1), 0); 1323a8e1175bSopenharmony_ci 1324a8e1175bSopenharmony_ci /* Test mbedtls_mpi_add_int(): (0) + (-p) */ 1325a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_lset(&A, 0), 0); 1326a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_add_int(&X, &A, most_negative), 0); 1327a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&X, most_negative), 0); 1328a8e1175bSopenharmony_ci 1329a8e1175bSopenharmony_ci /* Test mbedtls_mpi_add_int(): (-p) + (-p) */ 1330a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_lset(&A, most_negative), 0); 1331a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_add_int(&X, &A, most_negative), 0); 1332a8e1175bSopenharmony_ci TEST_EQUAL(X.s, -1); 1333a8e1175bSopenharmony_ci TEST_EQUAL(X.n, 2); 1334a8e1175bSopenharmony_ci TEST_EQUAL(X.p[0], 0); 1335a8e1175bSopenharmony_ci TEST_EQUAL(X.p[1], 1); 1336a8e1175bSopenharmony_ci 1337a8e1175bSopenharmony_ci /* Test mbedtls_mpi_sub_int(): (p) - (-p) */ 1338a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 1339a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_lset(&A, most_positive), 0); 1340a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_sub_int(&X, &A, most_negative), 0); 1341a8e1175bSopenharmony_ci TEST_EQUAL(X.s, 1); 1342a8e1175bSopenharmony_ci TEST_EQUAL(X.n, 1); 1343a8e1175bSopenharmony_ci TEST_EQUAL(X.p[0], ~(mbedtls_mpi_uint) 0); 1344a8e1175bSopenharmony_ci 1345a8e1175bSopenharmony_ci /* Test mbedtls_mpi_sub_int(): (0) - (-p) */ 1346a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_lset(&A, 0), 0); 1347a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_sub_int(&X, &A, most_negative), 0); 1348a8e1175bSopenharmony_ci TEST_EQUAL(X.s, 1); 1349a8e1175bSopenharmony_ci TEST_EQUAL(X.n, 1); 1350a8e1175bSopenharmony_ci TEST_EQUAL(X.p[0], most_positive_plus_1); 1351a8e1175bSopenharmony_ci 1352a8e1175bSopenharmony_ci /* Test mbedtls_mpi_sub_int(): (-p) - (-p) */ 1353a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_lset(&A, most_negative), 0); 1354a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_sub_int(&X, &A, most_negative), 0); 1355a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&X, 0), 0); 1356a8e1175bSopenharmony_ci 1357a8e1175bSopenharmony_ci /* Test mbedtls_mpi_div_int(): (-p+1) / (-p) */ 1358a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_lset(&A, -most_positive), 0); 1359a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_div_int(&X, &R, &A, most_negative), 0); 1360a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&X, 0), 0); 1361a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&R, -most_positive), 0); 1362a8e1175bSopenharmony_ci 1363a8e1175bSopenharmony_ci /* Test mbedtls_mpi_div_int(): (-p) / (-p) */ 1364a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_lset(&A, most_negative), 0); 1365a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_div_int(&X, &R, &A, most_negative), 0); 1366a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&X, 1), 0); 1367a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&R, 0), 0); 1368a8e1175bSopenharmony_ci 1369a8e1175bSopenharmony_ci /* Test mbedtls_mpi_div_int(): (-2*p) / (-p) */ 1370a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_shift_l(&A, 1), 0); 1371a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_div_int(&X, &R, &A, most_negative), 0); 1372a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&X, 2), 0); 1373a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&R, 0), 0); 1374a8e1175bSopenharmony_ci 1375a8e1175bSopenharmony_ci /* Test mbedtls_mpi_div_int(): (-2*p+1) / (-p) */ 1376a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_add_int(&A, &A, 1), 0); 1377a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_div_int(&X, &R, &A, most_negative), 0); 1378a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&X, 1), 0); 1379a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&R, -most_positive), 0); 1380a8e1175bSopenharmony_ci 1381a8e1175bSopenharmony_ci /* Test mbedtls_mpi_div_int(): (p-1) / (-p) */ 1382a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_lset(&A, most_positive), 0); 1383a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_div_int(&X, &R, &A, most_negative), 0); 1384a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&X, 0), 0); 1385a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&R, most_positive), 0); 1386a8e1175bSopenharmony_ci 1387a8e1175bSopenharmony_ci /* Test mbedtls_mpi_div_int(): (p) / (-p) */ 1388a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_add_int(&A, &A, 1), 0); 1389a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_div_int(&X, &R, &A, most_negative), 0); 1390a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&X, -1), 0); 1391a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&R, 0), 0); 1392a8e1175bSopenharmony_ci 1393a8e1175bSopenharmony_ci /* Test mbedtls_mpi_div_int(): (2*p) / (-p) */ 1394a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_shift_l(&A, 1), 0); 1395a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_div_int(&X, &R, &A, most_negative), 0); 1396a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&X, -2), 0); 1397a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_cmp_int(&R, 0), 0); 1398a8e1175bSopenharmony_ci 1399a8e1175bSopenharmony_ci /* Test mbedtls_mpi_mod_int(): never valid */ 1400a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_mod_int(X.p, &A, most_negative), 1401a8e1175bSopenharmony_ci MBEDTLS_ERR_MPI_NEGATIVE_VALUE); 1402a8e1175bSopenharmony_ci 1403a8e1175bSopenharmony_ci /* Test mbedtls_mpi_random(): never valid */ 1404a8e1175bSopenharmony_ci TEST_EQUAL(mbedtls_mpi_random(&X, most_negative, &A, 1405a8e1175bSopenharmony_ci mbedtls_test_rnd_std_rand, NULL), 1406a8e1175bSopenharmony_ci MBEDTLS_ERR_MPI_BAD_INPUT_DATA); 1407a8e1175bSopenharmony_ci 1408a8e1175bSopenharmony_ciexit: 1409a8e1175bSopenharmony_ci mbedtls_mpi_free(&A); 1410a8e1175bSopenharmony_ci mbedtls_mpi_free(&R); 1411a8e1175bSopenharmony_ci mbedtls_mpi_free(&X); 1412a8e1175bSopenharmony_ci} 1413a8e1175bSopenharmony_ci/* END_CASE */ 1414a8e1175bSopenharmony_ci 1415a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */ 1416a8e1175bSopenharmony_civoid mpi_selftest() 1417a8e1175bSopenharmony_ci{ 1418a8e1175bSopenharmony_ci TEST_ASSERT(mbedtls_mpi_self_test(1) == 0); 1419a8e1175bSopenharmony_ci} 1420a8e1175bSopenharmony_ci/* END_CASE */ 1421