Werner Lewis | 0c6ea12 | 2022-09-30 13:02:16 +0100 | [diff] [blame] | 1 | /* BEGIN_HEADER */ |
| 2 | #include "mbedtls/bignum.h" |
| 3 | #include "mbedtls/entropy.h" |
| 4 | #include "bignum_mod.h" |
| 5 | #include "constant_time_internal.h" |
| 6 | #include "test/constant_flow.h" |
Werner Lewis | 0c6ea12 | 2022-09-30 13:02:16 +0100 | [diff] [blame] | 7 | /* END_HEADER */ |
| 8 | |
| 9 | /* BEGIN_DEPENDENCIES |
| 10 | * depends_on:MBEDTLS_BIGNUM_C |
| 11 | * END_DEPENDENCIES |
| 12 | */ |
| 13 | |
| 14 | /* BEGIN_CASE */ |
Janos Follath | 91295d2 | 2022-11-24 18:20:26 +0000 | [diff] [blame] | 15 | void mpi_mod_setup( int int_rep, int iret ) |
Werner Lewis | 0c6ea12 | 2022-09-30 13:02:16 +0100 | [diff] [blame] | 16 | { |
| 17 | #define MLIMBS 8 |
| 18 | mbedtls_mpi_uint mp[MLIMBS]; |
| 19 | mbedtls_mpi_mod_modulus m; |
| 20 | int ret; |
| 21 | |
Minos Galanakis | 4d4c98b | 2022-10-27 15:58:02 +0100 | [diff] [blame] | 22 | memset( mp, 0xFF, sizeof(mp) ); |
Werner Lewis | 0c6ea12 | 2022-09-30 13:02:16 +0100 | [diff] [blame] | 23 | |
| 24 | mbedtls_mpi_mod_modulus_init( &m ); |
Janos Follath | 91295d2 | 2022-11-24 18:20:26 +0000 | [diff] [blame] | 25 | ret = mbedtls_mpi_mod_modulus_setup( &m, mp, MLIMBS, int_rep ); |
Werner Lewis | 0c6ea12 | 2022-09-30 13:02:16 +0100 | [diff] [blame] | 26 | TEST_EQUAL( ret, iret ); |
| 27 | |
Minos Galanakis | dd365a5 | 2022-10-19 01:48:32 +0100 | [diff] [blame] | 28 | /* Only test if the constants have been set-up */ |
| 29 | if ( ret == 0 && int_rep == MBEDTLS_MPI_MOD_REP_MONTGOMERY ) |
| 30 | { |
| 31 | /* Test that the consts have been calculated */ |
| 32 | TEST_ASSERT( m.rep.mont.rr != NULL ); |
| 33 | TEST_ASSERT( m.rep.mont.mm != 0 ); |
| 34 | |
Minos Galanakis | dd365a5 | 2022-10-19 01:48:32 +0100 | [diff] [blame] | 35 | } |
| 36 | |
Werner Lewis | 0c6ea12 | 2022-09-30 13:02:16 +0100 | [diff] [blame] | 37 | /* Address sanitiser should catch if we try to free mp */ |
| 38 | mbedtls_mpi_mod_modulus_free( &m ); |
| 39 | |
| 40 | /* Make sure that the modulus doesn't have reference to mp anymore */ |
| 41 | TEST_ASSERT( m.p != mp ); |
| 42 | |
Minos Galanakis | dd365a5 | 2022-10-19 01:48:32 +0100 | [diff] [blame] | 43 | /* Only test if the constants have been set-up */ |
| 44 | if ( ret == 0 && int_rep == MBEDTLS_MPI_MOD_REP_MONTGOMERY ) |
| 45 | { |
Minos Galanakis | dd365a5 | 2022-10-19 01:48:32 +0100 | [diff] [blame] | 46 | /* Verify the data and pointers allocated have been properly wiped */ |
| 47 | TEST_ASSERT( m.rep.mont.rr == NULL ); |
| 48 | TEST_ASSERT( m.rep.mont.mm == 0 ); |
Minos Galanakis | dd365a5 | 2022-10-19 01:48:32 +0100 | [diff] [blame] | 49 | } |
Werner Lewis | 0c6ea12 | 2022-09-30 13:02:16 +0100 | [diff] [blame] | 50 | exit: |
| 51 | /* It should be safe to call an mbedtls free several times */ |
| 52 | mbedtls_mpi_mod_modulus_free( &m ); |
| 53 | |
| 54 | #undef MLIMBS |
| 55 | } |
| 56 | /* END_CASE */ |
Janos Follath | 5933f69 | 2022-11-02 14:35:17 +0000 | [diff] [blame] | 57 | |
| 58 | /* BEGIN MERGE SLOT 1 */ |
| 59 | |
| 60 | /* END MERGE SLOT 1 */ |
| 61 | |
| 62 | /* BEGIN MERGE SLOT 2 */ |
| 63 | |
| 64 | /* END MERGE SLOT 2 */ |
| 65 | |
| 66 | /* BEGIN MERGE SLOT 3 */ |
| 67 | |
| 68 | /* END MERGE SLOT 3 */ |
| 69 | |
| 70 | /* BEGIN MERGE SLOT 4 */ |
| 71 | |
| 72 | /* END MERGE SLOT 4 */ |
| 73 | |
| 74 | /* BEGIN MERGE SLOT 5 */ |
| 75 | |
| 76 | /* END MERGE SLOT 5 */ |
| 77 | |
| 78 | /* BEGIN MERGE SLOT 6 */ |
| 79 | |
| 80 | /* END MERGE SLOT 6 */ |
| 81 | |
| 82 | /* BEGIN MERGE SLOT 7 */ |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 83 | /* BEGIN_CASE */ |
Janos Follath | 91f3abd | 2022-11-26 11:47:14 +0000 | [diff] [blame^] | 84 | void mpi_residue_setup( char * input_N, char * input_R, int ret ) |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 85 | { |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 86 | mbedtls_mpi_uint *N = NULL; |
| 87 | mbedtls_mpi_uint *R = NULL; |
Minos Galanakis | aed832a | 2022-11-24 09:09:47 +0000 | [diff] [blame] | 88 | size_t n_limbs, r_limbs; |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 89 | mbedtls_mpi_mod_modulus m; |
| 90 | mbedtls_mpi_mod_residue r; |
| 91 | |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 92 | mbedtls_mpi_mod_modulus_init( &m ); |
| 93 | |
Minos Galanakis | aed832a | 2022-11-24 09:09:47 +0000 | [diff] [blame] | 94 | /* Allocate the memory for intermediate data structures */ |
Janos Follath | 91f3abd | 2022-11-26 11:47:14 +0000 | [diff] [blame^] | 95 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, input_N ) ); |
| 96 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R, &r_limbs, input_R ) ); |
Minos Galanakis | aed832a | 2022-11-24 09:09:47 +0000 | [diff] [blame] | 97 | |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 98 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
Janos Follath | 91295d2 | 2022-11-24 18:20:26 +0000 | [diff] [blame] | 99 | MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 100 | |
Minos Galanakis | aed832a | 2022-11-24 09:09:47 +0000 | [diff] [blame] | 101 | TEST_EQUAL( ret, mbedtls_mpi_mod_residue_setup( &r, &m, R , r_limbs ) ); |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 102 | |
Janos Follath | 91f3abd | 2022-11-26 11:47:14 +0000 | [diff] [blame^] | 103 | if ( ret == 0 ) |
| 104 | { |
| 105 | TEST_EQUAL( r.limbs, r_limbs ); |
| 106 | TEST_ASSERT( r.p == R ); |
| 107 | } |
| 108 | |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 109 | exit: |
| 110 | mbedtls_mpi_mod_modulus_free( &m ); |
| 111 | mbedtls_free( N ); |
| 112 | mbedtls_free( R ); |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 113 | } |
| 114 | /* END_CASE */ |
Minos Galanakis | aed832a | 2022-11-24 09:09:47 +0000 | [diff] [blame] | 115 | |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 116 | /* BEGIN_CASE */ |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 117 | void mpi_mod_io_neg( ) |
| 118 | { |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 119 | mbedtls_mpi_uint *N = NULL; |
| 120 | mbedtls_mpi_uint *R = NULL; |
| 121 | mbedtls_mpi_uint *N2 = NULL; |
| 122 | mbedtls_mpi_uint *R2 = NULL; |
| 123 | unsigned char *r_buff = NULL; |
| 124 | |
| 125 | size_t n_limbs, r_limbs, n2_limbs, r2_limbs; |
| 126 | |
| 127 | mbedtls_mpi_mod_modulus m; |
| 128 | mbedtls_mpi_mod_residue r; |
| 129 | mbedtls_mpi_mod_modulus m2; |
| 130 | mbedtls_mpi_mod_residue rn = { NULL, 0 }; |
| 131 | |
Minos Galanakis | 8b37545 | 2022-11-24 11:04:11 +0000 | [diff] [blame] | 132 | const char *hex_residue_single = "01"; |
| 133 | const char *hex_modulus_single = "fe"; |
| 134 | const char *hex_residue_multi = "7ffffffffffffffffffffffffffffff0"; |
| 135 | const char *hex_modulus_multi = "7ffffffffffffffffffffffffffffff1"; |
| 136 | |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 137 | const size_t buff_bytes = 1024; |
| 138 | |
Janos Follath | 799eaee | 2022-11-25 15:57:04 +0000 | [diff] [blame] | 139 | mbedtls_mpi_mod_modulus_init( &m ); |
| 140 | mbedtls_mpi_mod_modulus_init( &m2 ); |
| 141 | |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 142 | /* Allocate the memory for intermediate data structures */ |
Minos Galanakis | 8b37545 | 2022-11-24 11:04:11 +0000 | [diff] [blame] | 143 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, hex_modulus_single ) ); |
| 144 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R, &r_limbs, hex_residue_single ) ); |
| 145 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N2, &n2_limbs, hex_modulus_multi ) ); |
| 146 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R2, &r2_limbs, hex_residue_multi ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 147 | |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 148 | /* Allocate more than required space on buffer so we can test for input_r > mpi */ |
| 149 | ASSERT_ALLOC( r_buff, buff_bytes ); |
| 150 | memset( r_buff, 0x1, 1 ); |
| 151 | |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 152 | mbedtls_mpi_mod_ext_rep endian = MBEDTLS_MPI_MOD_EXT_REP_LE; |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 153 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
Janos Follath | 91295d2 | 2022-11-24 18:20:26 +0000 | [diff] [blame] | 154 | MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 155 | |
| 156 | TEST_EQUAL( 0, mbedtls_mpi_mod_residue_setup( &r, &m, R , n_limbs ) ); |
| 157 | |
| 158 | /* Pass for input_r < modulo */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 159 | TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 160 | |
Minos Galanakis | 8b37545 | 2022-11-24 11:04:11 +0000 | [diff] [blame] | 161 | /* Pass for input_r == modulo -1 */ |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 162 | memset( r_buff, 0xfd, buff_bytes ); |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 163 | TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 164 | |
| 165 | /* modulo->p == NULL || residue->p == NULL ( m2 has not been set-up ) */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 166 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 167 | mbedtls_mpi_mod_read( &r, &m2, r_buff, 1, endian ) ); |
| 168 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 169 | mbedtls_mpi_mod_read( &rn, &m, r_buff, 1, endian ) ); |
| 170 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 171 | mbedtls_mpi_mod_write( &r, &m2, r_buff, 1, endian ) ); |
| 172 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 173 | mbedtls_mpi_mod_write( &rn, &m, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 174 | |
| 175 | /* Fail for r_limbs < m->limbs */ |
| 176 | r.limbs = m.limbs - 1; |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 177 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 178 | mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
| 179 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 180 | mbedtls_mpi_mod_write( &rn, &m, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 181 | r.limbs = r_limbs; |
| 182 | |
| 183 | /* Fail if input_r >= modulo m */ |
| 184 | /* input_r = modulo */ |
| 185 | memset( r_buff, 0xfe, buff_bytes ); |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 186 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 187 | mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 188 | |
| 189 | /* input_r > modulo */ |
| 190 | memset( r_buff, 0xff, buff_bytes ); |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 191 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 192 | mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 193 | |
| 194 | /* Data too large to fit */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 195 | TEST_EQUAL( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL, |
| 196 | mbedtls_mpi_mod_read( &r, &m, r_buff, buff_bytes, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 197 | |
| 198 | /* Read the two limbs input data into a larger modulus and residue */ |
| 199 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m2, N2, n2_limbs, |
Janos Follath | 91295d2 | 2022-11-24 18:20:26 +0000 | [diff] [blame] | 200 | MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 201 | rn.p = R2; |
| 202 | rn.limbs = r2_limbs; |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 203 | TEST_EQUAL( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL, |
| 204 | mbedtls_mpi_mod_write( &rn, &m2, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 205 | |
| 206 | exit: |
| 207 | mbedtls_mpi_mod_modulus_free( &m ); |
| 208 | mbedtls_mpi_mod_modulus_free( &m2 ); |
| 209 | mbedtls_free( N ); |
| 210 | mbedtls_free( R ); |
| 211 | mbedtls_free( N2 ); |
| 212 | mbedtls_free( R2 ); |
| 213 | mbedtls_free( r_buff ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 214 | } |
| 215 | /* END_CASE */ |
| 216 | |
| 217 | /* BEGIN_CASE */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 218 | void mpi_mod_io( char * input_N, data_t * input_A, int endian ) |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 219 | { |
| 220 | mbedtls_mpi_uint *N = NULL; |
| 221 | mbedtls_mpi_uint *R = NULL; |
| 222 | unsigned char *r_buff = NULL; |
| 223 | mbedtls_mpi_mod_modulus m; |
| 224 | mbedtls_mpi_mod_residue r; |
| 225 | size_t n_limbs, n_bytes, a_bytes; |
| 226 | |
Janos Follath | 799eaee | 2022-11-25 15:57:04 +0000 | [diff] [blame] | 227 | mbedtls_mpi_mod_modulus_init( &m ); |
| 228 | |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 229 | /* Read inputs */ |
| 230 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, input_N ) ); |
| 231 | n_bytes = n_limbs * sizeof( mbedtls_mpi_uint ); |
| 232 | a_bytes = input_A->len * sizeof( char ); |
| 233 | |
| 234 | /* Allocate the memory for intermediate data structures */ |
| 235 | ASSERT_ALLOC( R, n_bytes ); |
| 236 | ASSERT_ALLOC( r_buff, a_bytes ); |
| 237 | |
| 238 | /* Test that input's size is not greater to modulo's */ |
| 239 | TEST_LE_U(a_bytes, n_bytes ); |
| 240 | |
| 241 | /* Init Structures */ |
Janos Follath | 91295d2 | 2022-11-24 18:20:26 +0000 | [diff] [blame] | 242 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 243 | MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| 244 | |
| 245 | /* Enforcing p_limbs >= m->limbs */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 246 | TEST_EQUAL( 0, mbedtls_mpi_mod_residue_setup( &r, &m, R, n_limbs ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 247 | |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 248 | TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, input_A->x, input_A->len, |
| 249 | endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 250 | |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 251 | TEST_EQUAL( 0, mbedtls_mpi_mod_write( &r, &m, r_buff, a_bytes, |
| 252 | endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 253 | |
| 254 | ASSERT_COMPARE( r_buff, a_bytes, input_A->x, a_bytes ); |
| 255 | exit: |
| 256 | mbedtls_mpi_mod_modulus_free( &m ); |
| 257 | mbedtls_free( N ); |
| 258 | mbedtls_free( R ); |
| 259 | mbedtls_free( r_buff ); |
| 260 | } |
| 261 | /* END_CASE */ |
Janos Follath | 5933f69 | 2022-11-02 14:35:17 +0000 | [diff] [blame] | 262 | /* END MERGE SLOT 7 */ |
| 263 | |
| 264 | /* BEGIN MERGE SLOT 8 */ |
| 265 | |
| 266 | /* END MERGE SLOT 8 */ |
| 267 | |
| 268 | /* BEGIN MERGE SLOT 9 */ |
| 269 | |
| 270 | /* END MERGE SLOT 9 */ |
| 271 | |
| 272 | /* BEGIN MERGE SLOT 10 */ |
| 273 | |
| 274 | /* END MERGE SLOT 10 */ |