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 */ |
Minos Galanakis | aed832a | 2022-11-24 09:09:47 +0000 | [diff] [blame] | 84 | void mpi_residue_setup( char * input_X, char * input_Y, 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 */ |
| 95 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, input_X ) ); |
| 96 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R, &r_limbs, input_Y ) ); |
| 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 | |
| 103 | exit: |
| 104 | mbedtls_mpi_mod_modulus_free( &m ); |
| 105 | mbedtls_free( N ); |
| 106 | mbedtls_free( R ); |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 107 | } |
| 108 | /* END_CASE */ |
Minos Galanakis | aed832a | 2022-11-24 09:09:47 +0000 | [diff] [blame] | 109 | |
Minos Galanakis | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame] | 110 | /* BEGIN_CASE */ |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 111 | void mpi_mod_io_neg( ) |
| 112 | { |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 113 | mbedtls_mpi_uint *N = NULL; |
| 114 | mbedtls_mpi_uint *R = NULL; |
| 115 | mbedtls_mpi_uint *N2 = NULL; |
| 116 | mbedtls_mpi_uint *R2 = NULL; |
| 117 | unsigned char *r_buff = NULL; |
| 118 | |
| 119 | size_t n_limbs, r_limbs, n2_limbs, r2_limbs; |
| 120 | |
| 121 | mbedtls_mpi_mod_modulus m; |
| 122 | mbedtls_mpi_mod_residue r; |
| 123 | mbedtls_mpi_mod_modulus m2; |
| 124 | mbedtls_mpi_mod_residue rn = { NULL, 0 }; |
| 125 | |
Minos Galanakis | 8b37545 | 2022-11-24 11:04:11 +0000 | [diff] [blame] | 126 | const char *hex_residue_single = "01"; |
| 127 | const char *hex_modulus_single = "fe"; |
| 128 | const char *hex_residue_multi = "7ffffffffffffffffffffffffffffff0"; |
| 129 | const char *hex_modulus_multi = "7ffffffffffffffffffffffffffffff1"; |
| 130 | |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 131 | const size_t buff_bytes = 1024; |
| 132 | |
| 133 | /* Allocate the memory for intermediate data structures */ |
Minos Galanakis | 8b37545 | 2022-11-24 11:04:11 +0000 | [diff] [blame] | 134 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, hex_modulus_single ) ); |
| 135 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R, &r_limbs, hex_residue_single ) ); |
| 136 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N2, &n2_limbs, hex_modulus_multi ) ); |
| 137 | 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] | 138 | |
| 139 | mbedtls_mpi_mod_modulus_init( &m ); |
| 140 | mbedtls_mpi_mod_modulus_init( &m2 ); |
| 141 | |
| 142 | /* Allocate more than required space on buffer so we can test for input_r > mpi */ |
| 143 | ASSERT_ALLOC( r_buff, buff_bytes ); |
| 144 | memset( r_buff, 0x1, 1 ); |
| 145 | |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 146 | mbedtls_mpi_mod_ext_rep endian = MBEDTLS_MPI_MOD_EXT_REP_LE; |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 147 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
Janos Follath | 91295d2 | 2022-11-24 18:20:26 +0000 | [diff] [blame] | 148 | MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 149 | |
| 150 | TEST_EQUAL( 0, mbedtls_mpi_mod_residue_setup( &r, &m, R , n_limbs ) ); |
| 151 | |
| 152 | /* Pass for input_r < modulo */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 153 | 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] | 154 | |
Minos Galanakis | 8b37545 | 2022-11-24 11:04:11 +0000 | [diff] [blame] | 155 | /* Pass for input_r == modulo -1 */ |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 156 | memset( r_buff, 0xfd, buff_bytes ); |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 157 | 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] | 158 | |
| 159 | /* modulo->p == NULL || residue->p == NULL ( m2 has not been set-up ) */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 160 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 161 | mbedtls_mpi_mod_read( &r, &m2, r_buff, 1, endian ) ); |
| 162 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 163 | mbedtls_mpi_mod_read( &rn, &m, r_buff, 1, endian ) ); |
| 164 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 165 | mbedtls_mpi_mod_write( &r, &m2, r_buff, 1, endian ) ); |
| 166 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 167 | mbedtls_mpi_mod_write( &rn, &m, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 168 | |
| 169 | /* Fail for r_limbs < m->limbs */ |
| 170 | r.limbs = m.limbs - 1; |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 171 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 172 | mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
| 173 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 174 | mbedtls_mpi_mod_write( &rn, &m, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 175 | r.limbs = r_limbs; |
| 176 | |
| 177 | /* Fail if input_r >= modulo m */ |
| 178 | /* input_r = modulo */ |
| 179 | memset( r_buff, 0xfe, buff_bytes ); |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 180 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 181 | mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 182 | |
| 183 | /* input_r > modulo */ |
| 184 | memset( r_buff, 0xff, buff_bytes ); |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 185 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
| 186 | mbedtls_mpi_mod_read( &r, &m, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 187 | |
| 188 | /* Data too large to fit */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 189 | TEST_EQUAL( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL, |
| 190 | mbedtls_mpi_mod_read( &r, &m, r_buff, buff_bytes, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 191 | |
| 192 | /* Read the two limbs input data into a larger modulus and residue */ |
| 193 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m2, N2, n2_limbs, |
Janos Follath | 91295d2 | 2022-11-24 18:20:26 +0000 | [diff] [blame] | 194 | MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 195 | rn.p = R2; |
| 196 | rn.limbs = r2_limbs; |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 197 | TEST_EQUAL( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL, |
| 198 | mbedtls_mpi_mod_write( &rn, &m2, r_buff, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 199 | |
| 200 | exit: |
| 201 | mbedtls_mpi_mod_modulus_free( &m ); |
| 202 | mbedtls_mpi_mod_modulus_free( &m2 ); |
| 203 | mbedtls_free( N ); |
| 204 | mbedtls_free( R ); |
| 205 | mbedtls_free( N2 ); |
| 206 | mbedtls_free( R2 ); |
| 207 | mbedtls_free( r_buff ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 208 | } |
| 209 | /* END_CASE */ |
| 210 | |
| 211 | /* BEGIN_CASE */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 212 | 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] | 213 | { |
| 214 | mbedtls_mpi_uint *N = NULL; |
| 215 | mbedtls_mpi_uint *R = NULL; |
| 216 | unsigned char *r_buff = NULL; |
| 217 | mbedtls_mpi_mod_modulus m; |
| 218 | mbedtls_mpi_mod_residue r; |
| 219 | size_t n_limbs, n_bytes, a_bytes; |
| 220 | |
| 221 | /* Read inputs */ |
| 222 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, input_N ) ); |
| 223 | n_bytes = n_limbs * sizeof( mbedtls_mpi_uint ); |
| 224 | a_bytes = input_A->len * sizeof( char ); |
| 225 | |
| 226 | /* Allocate the memory for intermediate data structures */ |
| 227 | ASSERT_ALLOC( R, n_bytes ); |
| 228 | ASSERT_ALLOC( r_buff, a_bytes ); |
| 229 | |
| 230 | /* Test that input's size is not greater to modulo's */ |
| 231 | TEST_LE_U(a_bytes, n_bytes ); |
| 232 | |
| 233 | /* Init Structures */ |
| 234 | mbedtls_mpi_mod_modulus_init( &m ); |
Janos Follath | 91295d2 | 2022-11-24 18:20:26 +0000 | [diff] [blame] | 235 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 236 | MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| 237 | |
| 238 | /* Enforcing p_limbs >= m->limbs */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 239 | 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] | 240 | |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 241 | TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, input_A->x, input_A->len, |
| 242 | endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 243 | |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 244 | TEST_EQUAL( 0, mbedtls_mpi_mod_write( &r, &m, r_buff, a_bytes, |
| 245 | endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 246 | |
| 247 | ASSERT_COMPARE( r_buff, a_bytes, input_A->x, a_bytes ); |
| 248 | exit: |
| 249 | mbedtls_mpi_mod_modulus_free( &m ); |
| 250 | mbedtls_free( N ); |
| 251 | mbedtls_free( R ); |
| 252 | mbedtls_free( r_buff ); |
| 253 | } |
| 254 | /* END_CASE */ |
Janos Follath | 5933f69 | 2022-11-02 14:35:17 +0000 | [diff] [blame] | 255 | /* END MERGE SLOT 7 */ |
| 256 | |
| 257 | /* BEGIN MERGE SLOT 8 */ |
| 258 | |
| 259 | /* END MERGE SLOT 8 */ |
| 260 | |
| 261 | /* BEGIN MERGE SLOT 9 */ |
| 262 | |
| 263 | /* END MERGE SLOT 9 */ |
| 264 | |
| 265 | /* BEGIN MERGE SLOT 10 */ |
| 266 | |
| 267 | /* END MERGE SLOT 10 */ |