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 */ |
| 15 | void mpi_mod_setup( int ext_rep, int int_rep, int iret ) |
| 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 ); |
| 25 | ret = mbedtls_mpi_mod_modulus_setup( &m, mp, MLIMBS, ext_rep, int_rep ); |
| 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 | a17ad48 | 2022-11-16 16:29:15 +0000 | [diff] [blame^] | 84 | void mpi_residue_setup( ) |
| 85 | { |
| 86 | #define RS_ONE 0 |
| 87 | #define RS_MAX_MIN1 1 |
| 88 | #define RS_MAX 2 |
| 89 | const char * s_data[ 3 ] = { "01", "fe", "ff" }; |
| 90 | |
| 91 | mbedtls_mpi_uint *N = NULL; |
| 92 | mbedtls_mpi_uint *R = NULL; |
| 93 | mbedtls_mpi_uint *R_MAX = NULL; |
| 94 | size_t n_limbs, r_limbs, r_max_limbs; |
| 95 | mbedtls_mpi_mod_modulus m; |
| 96 | mbedtls_mpi_mod_residue r; |
| 97 | |
| 98 | /* Allocate the memory for intermediate data structures */ |
| 99 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, s_data[ RS_MAX_MIN1 ] ) ); |
| 100 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R, &r_limbs, s_data[ RS_ONE ] ) ); |
| 101 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R_MAX, &r_max_limbs, s_data[ RS_MAX ] ) ); |
| 102 | |
| 103 | mbedtls_mpi_mod_modulus_init( &m ); |
| 104 | |
| 105 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
| 106 | MBEDTLS_MPI_MOD_EXT_REP_LE, MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| 107 | |
| 108 | TEST_EQUAL( 0, mbedtls_mpi_mod_residue_setup( &r, &m, R , r_limbs ) ); |
| 109 | |
| 110 | /* Test for r-> limbs > m-> limbs */ |
| 111 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_residue_setup( &r, &m, R , r_limbs + 1 ) ); |
| 112 | |
| 113 | /* Test for r-> p > m-> p */ |
| 114 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_residue_setup( &r, &m, R_MAX , r_max_limbs ) ); |
| 115 | |
| 116 | /* Test for r-> p == m-> p */ |
| 117 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_residue_setup( &r, &m, N , r_max_limbs ) ); |
| 118 | |
| 119 | exit: |
| 120 | mbedtls_mpi_mod_modulus_free( &m ); |
| 121 | mbedtls_free( N ); |
| 122 | mbedtls_free( R ); |
| 123 | mbedtls_free( R_MAX ); |
| 124 | |
| 125 | #undef RS_ONE |
| 126 | #undef RS_MAX_MIN1 |
| 127 | #undef RS_MAX |
| 128 | } |
| 129 | /* END_CASE */ |
| 130 | /* BEGIN_CASE */ |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 131 | void mpi_mod_io_neg( ) |
| 132 | { |
| 133 | #define IO_ZERO 0 |
| 134 | #define IO_ONE 1 |
| 135 | #define IO_MIN1 2 |
| 136 | #define IO_MAX 3 |
| 137 | #define IO_2LIMBS_MIN1 4 |
| 138 | #define IO_2LIMBS 5 |
Janos Follath | 5933f69 | 2022-11-02 14:35:17 +0000 | [diff] [blame] | 139 | |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 140 | mbedtls_mpi_uint *N = NULL; |
| 141 | mbedtls_mpi_uint *R = NULL; |
| 142 | mbedtls_mpi_uint *N2 = NULL; |
| 143 | mbedtls_mpi_uint *R2 = NULL; |
| 144 | unsigned char *r_buff = NULL; |
| 145 | |
| 146 | size_t n_limbs, r_limbs, n2_limbs, r2_limbs; |
| 147 | |
| 148 | mbedtls_mpi_mod_modulus m; |
| 149 | mbedtls_mpi_mod_residue r; |
| 150 | mbedtls_mpi_mod_modulus m2; |
| 151 | mbedtls_mpi_mod_residue rn = { NULL, 0 }; |
| 152 | |
| 153 | const char * s_data[ 6 ] = { "00", "01", "fe", "ff", |
| 154 | "7ffffffffffffffff0" ,"7ffffffffffffffff1" }; |
| 155 | const size_t buff_bytes = 1024; |
| 156 | |
| 157 | /* Allocate the memory for intermediate data structures */ |
| 158 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, s_data[ IO_MIN1 ] ) ); |
| 159 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R, &r_limbs, s_data[ IO_ONE ] ) ); |
| 160 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N2, &n2_limbs, s_data[ IO_2LIMBS ] ) ); |
| 161 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R2, &r2_limbs, s_data[ IO_2LIMBS_MIN1 ] ) ); |
| 162 | |
| 163 | mbedtls_mpi_mod_modulus_init( &m ); |
| 164 | mbedtls_mpi_mod_modulus_init( &m2 ); |
| 165 | |
| 166 | /* Allocate more than required space on buffer so we can test for input_r > mpi */ |
| 167 | ASSERT_ALLOC( r_buff, buff_bytes ); |
| 168 | memset( r_buff, 0x1, 1 ); |
| 169 | |
| 170 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
| 171 | MBEDTLS_MPI_MOD_EXT_REP_LE, MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| 172 | |
| 173 | TEST_EQUAL( 0, mbedtls_mpi_mod_residue_setup( &r, &m, R , n_limbs ) ); |
| 174 | |
| 175 | /* Pass for input_r < modulo */ |
| 176 | TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, r_buff, 1 ) ); |
| 177 | |
| 178 | /* input_r == modulo -1 */ |
| 179 | memset( r_buff, 0xfd, buff_bytes ); |
| 180 | TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, r_buff, 1 ) ); |
| 181 | |
| 182 | /* modulo->p == NULL || residue->p == NULL ( m2 has not been set-up ) */ |
| 183 | TEST_EQUAL(MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_read( &r, &m2, r_buff, 1 ) ); |
| 184 | TEST_EQUAL(MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_read( &rn, &m, r_buff, 1 ) ); |
| 185 | TEST_EQUAL(MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_write( &r, &m2, r_buff, 1 ) ); |
| 186 | TEST_EQUAL(MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_write( &rn, &m, r_buff, 1 ) ); |
| 187 | |
| 188 | /* Fail for r_limbs < m->limbs */ |
| 189 | r.limbs = m.limbs - 1; |
| 190 | TEST_EQUAL(MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_read( &r, &m, r_buff, 1 ) ); |
| 191 | TEST_EQUAL(MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_write( &rn, &m, r_buff, 1 ) ); |
| 192 | r.limbs = r_limbs; |
| 193 | |
| 194 | /* Fail if input_r >= modulo m */ |
| 195 | /* input_r = modulo */ |
| 196 | memset( r_buff, 0xfe, buff_bytes ); |
| 197 | TEST_EQUAL(MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_read( &r, &m, r_buff, 1 ) ); |
| 198 | |
| 199 | /* input_r > modulo */ |
| 200 | memset( r_buff, 0xff, buff_bytes ); |
| 201 | TEST_EQUAL(MBEDTLS_ERR_MPI_BAD_INPUT_DATA, mbedtls_mpi_mod_read( &r, &m, r_buff, 1 ) ); |
| 202 | |
| 203 | /* Data too large to fit */ |
| 204 | TEST_EQUAL(MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL, mbedtls_mpi_mod_read( &r, &m, r_buff, buff_bytes ) ); |
| 205 | |
| 206 | /* Read the two limbs input data into a larger modulus and residue */ |
| 207 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m2, N2, n2_limbs, |
| 208 | MBEDTLS_MPI_MOD_EXT_REP_LE, MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| 209 | rn.p = R2; |
| 210 | rn.limbs = r2_limbs; |
| 211 | TEST_EQUAL(MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL, mbedtls_mpi_mod_write( &rn, &m2, r_buff, 1 ) ); |
| 212 | |
| 213 | exit: |
| 214 | mbedtls_mpi_mod_modulus_free( &m ); |
| 215 | mbedtls_mpi_mod_modulus_free( &m2 ); |
| 216 | mbedtls_free( N ); |
| 217 | mbedtls_free( R ); |
| 218 | mbedtls_free( N2 ); |
| 219 | mbedtls_free( R2 ); |
| 220 | mbedtls_free( r_buff ); |
| 221 | |
| 222 | #undef IO_ZERO |
| 223 | #undef IO_ONE |
| 224 | #undef IO_MIN1 |
| 225 | #undef IO_MAX |
| 226 | #undef IO_2LIMBS_MIN1 |
| 227 | #undef IO_2LIMBS |
| 228 | } |
| 229 | /* END_CASE */ |
| 230 | |
| 231 | /* BEGIN_CASE */ |
| 232 | void mpi_mod_io( char * input_N, data_t * input_A, int iendian ) |
| 233 | { |
| 234 | mbedtls_mpi_uint *N = NULL; |
| 235 | mbedtls_mpi_uint *R = NULL; |
| 236 | unsigned char *r_buff = NULL; |
| 237 | mbedtls_mpi_mod_modulus m; |
| 238 | mbedtls_mpi_mod_residue r; |
| 239 | size_t n_limbs, n_bytes, a_bytes; |
| 240 | |
| 241 | /* Read inputs */ |
| 242 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, input_N ) ); |
| 243 | n_bytes = n_limbs * sizeof( mbedtls_mpi_uint ); |
| 244 | a_bytes = input_A->len * sizeof( char ); |
| 245 | |
| 246 | /* Allocate the memory for intermediate data structures */ |
| 247 | ASSERT_ALLOC( R, n_bytes ); |
| 248 | ASSERT_ALLOC( r_buff, a_bytes ); |
| 249 | |
| 250 | /* Test that input's size is not greater to modulo's */ |
| 251 | TEST_LE_U(a_bytes, n_bytes ); |
| 252 | |
| 253 | /* Init Structures */ |
| 254 | mbedtls_mpi_mod_modulus_init( &m ); |
| 255 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, iendian, |
| 256 | MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| 257 | |
| 258 | /* Enforcing p_limbs >= m->limbs */ |
| 259 | TEST_EQUAL( 0, mbedtls_mpi_mod_residue_setup( &r, &m, R , n_limbs ) ); |
| 260 | |
| 261 | TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, input_A->x, input_A->len ) ); |
| 262 | |
| 263 | TEST_EQUAL( 0,mbedtls_mpi_mod_write( &r, &m, r_buff, a_bytes ) ); |
| 264 | |
| 265 | ASSERT_COMPARE( r_buff, a_bytes, input_A->x, a_bytes ); |
| 266 | exit: |
| 267 | mbedtls_mpi_mod_modulus_free( &m ); |
| 268 | mbedtls_free( N ); |
| 269 | mbedtls_free( R ); |
| 270 | mbedtls_free( r_buff ); |
| 271 | } |
| 272 | /* END_CASE */ |
Janos Follath | 5933f69 | 2022-11-02 14:35:17 +0000 | [diff] [blame] | 273 | /* END MERGE SLOT 7 */ |
| 274 | |
| 275 | /* BEGIN MERGE SLOT 8 */ |
| 276 | |
| 277 | /* END MERGE SLOT 8 */ |
| 278 | |
| 279 | /* BEGIN MERGE SLOT 9 */ |
| 280 | |
| 281 | /* END MERGE SLOT 9 */ |
| 282 | |
| 283 | /* BEGIN MERGE SLOT 10 */ |
| 284 | |
| 285 | /* END MERGE SLOT 10 */ |