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 */ |
Janos Follath | 566c91d | 2022-11-26 12:05:50 +0000 | [diff] [blame^] | 117 | void mpi_mod_io_neg( char * input_N, char * input_R, data_t * buf, int ret ) |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 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; |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 121 | size_t n_limbs, r_limbs; |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 122 | |
| 123 | mbedtls_mpi_mod_modulus m; |
| 124 | mbedtls_mpi_mod_residue r; |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 125 | mbedtls_mpi_mod_residue rn = { NULL, 0 }; |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 126 | mbedtls_mpi_mod_ext_rep endian = MBEDTLS_MPI_MOD_EXT_REP_LE; |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 127 | |
Janos Follath | 799eaee | 2022-11-25 15:57:04 +0000 | [diff] [blame] | 128 | mbedtls_mpi_mod_modulus_init( &m ); |
Janos Follath | 799eaee | 2022-11-25 15:57:04 +0000 | [diff] [blame] | 129 | |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 130 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, input_N ) ); |
| 131 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &R, &r_limbs, input_R ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 132 | |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 133 | /* modulo->p == NULL || residue->p == NULL ( m has not been set-up ) */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 134 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
Janos Follath | 566c91d | 2022-11-26 12:05:50 +0000 | [diff] [blame^] | 135 | mbedtls_mpi_mod_read( &r, &m, buf->x, buf->len, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 136 | |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 137 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
Janos Follath | 566c91d | 2022-11-26 12:05:50 +0000 | [diff] [blame^] | 138 | mbedtls_mpi_mod_write( &r, &m, buf->x, buf->len, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 139 | |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 140 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
| 141 | MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| 142 | TEST_EQUAL( 0, mbedtls_mpi_mod_residue_setup( &r, &m, R , n_limbs ) ); |
| 143 | |
| 144 | /* modulo->p == NULL || residue->p == NULL ( m has been set-up ) */ |
| 145 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
Janos Follath | 566c91d | 2022-11-26 12:05:50 +0000 | [diff] [blame^] | 146 | mbedtls_mpi_mod_read( &rn, &m, buf->x, buf->len, endian ) ); |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 147 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
Janos Follath | 566c91d | 2022-11-26 12:05:50 +0000 | [diff] [blame^] | 148 | mbedtls_mpi_mod_write( &rn, &m, buf->x, buf->len, endian ) ); |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 149 | |
| 150 | /* Fail for r_limbs > m->limbs */ |
| 151 | r.limbs = m.limbs + 1; |
| 152 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
Janos Follath | 566c91d | 2022-11-26 12:05:50 +0000 | [diff] [blame^] | 153 | mbedtls_mpi_mod_read( &r, &m, buf->x, buf->len, endian ) ); |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 154 | TEST_EQUAL( MBEDTLS_ERR_MPI_BAD_INPUT_DATA, |
Janos Follath | 566c91d | 2022-11-26 12:05:50 +0000 | [diff] [blame^] | 155 | mbedtls_mpi_mod_write( &r, &m, buf->x, buf->len, endian ) ); |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 156 | r.limbs = r_limbs; |
| 157 | |
| 158 | /* Test the read */ |
Janos Follath | 566c91d | 2022-11-26 12:05:50 +0000 | [diff] [blame^] | 159 | TEST_EQUAL( ret, mbedtls_mpi_mod_read( &r, &m, buf->x, buf->len, endian ) ); |
Minos Galanakis | 96070a5 | 2022-11-25 19:32:10 +0000 | [diff] [blame] | 160 | |
| 161 | /* Test write overflow only when the representation is large and read is successful */ |
| 162 | if (r.limbs > 1 && ret == 0) |
| 163 | TEST_EQUAL( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL, |
Janos Follath | 566c91d | 2022-11-26 12:05:50 +0000 | [diff] [blame^] | 164 | mbedtls_mpi_mod_write( &r, &m, buf->x, 1, endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 165 | exit: |
| 166 | mbedtls_mpi_mod_modulus_free( &m ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 167 | mbedtls_free( N ); |
| 168 | mbedtls_free( R ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 169 | } |
| 170 | /* END_CASE */ |
| 171 | |
| 172 | /* BEGIN_CASE */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 173 | 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] | 174 | { |
| 175 | mbedtls_mpi_uint *N = NULL; |
| 176 | mbedtls_mpi_uint *R = NULL; |
| 177 | unsigned char *r_buff = NULL; |
| 178 | mbedtls_mpi_mod_modulus m; |
| 179 | mbedtls_mpi_mod_residue r; |
| 180 | size_t n_limbs, n_bytes, a_bytes; |
| 181 | |
Janos Follath | 799eaee | 2022-11-25 15:57:04 +0000 | [diff] [blame] | 182 | mbedtls_mpi_mod_modulus_init( &m ); |
| 183 | |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 184 | /* Read inputs */ |
| 185 | TEST_EQUAL( 0, mbedtls_test_read_mpi_core( &N, &n_limbs, input_N ) ); |
| 186 | n_bytes = n_limbs * sizeof( mbedtls_mpi_uint ); |
| 187 | a_bytes = input_A->len * sizeof( char ); |
| 188 | |
| 189 | /* Allocate the memory for intermediate data structures */ |
| 190 | ASSERT_ALLOC( R, n_bytes ); |
| 191 | ASSERT_ALLOC( r_buff, a_bytes ); |
| 192 | |
| 193 | /* Test that input's size is not greater to modulo's */ |
| 194 | TEST_LE_U(a_bytes, n_bytes ); |
| 195 | |
| 196 | /* Init Structures */ |
Janos Follath | 91295d2 | 2022-11-24 18:20:26 +0000 | [diff] [blame] | 197 | TEST_EQUAL( 0, mbedtls_mpi_mod_modulus_setup( &m, N, n_limbs, |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 198 | MBEDTLS_MPI_MOD_REP_MONTGOMERY ) ); |
| 199 | |
| 200 | /* Enforcing p_limbs >= m->limbs */ |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 201 | 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] | 202 | |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 203 | TEST_EQUAL( 0, mbedtls_mpi_mod_read( &r, &m, input_A->x, input_A->len, |
| 204 | endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 205 | |
Janos Follath | 3e3fc91 | 2022-11-24 18:02:46 +0000 | [diff] [blame] | 206 | TEST_EQUAL( 0, mbedtls_mpi_mod_write( &r, &m, r_buff, a_bytes, |
| 207 | endian ) ); |
Minos Galanakis | 8f24270 | 2022-11-10 16:56:02 +0000 | [diff] [blame] | 208 | |
| 209 | ASSERT_COMPARE( r_buff, a_bytes, input_A->x, a_bytes ); |
| 210 | exit: |
| 211 | mbedtls_mpi_mod_modulus_free( &m ); |
| 212 | mbedtls_free( N ); |
| 213 | mbedtls_free( R ); |
| 214 | mbedtls_free( r_buff ); |
| 215 | } |
| 216 | /* END_CASE */ |
Janos Follath | 5933f69 | 2022-11-02 14:35:17 +0000 | [diff] [blame] | 217 | /* END MERGE SLOT 7 */ |
| 218 | |
| 219 | /* BEGIN MERGE SLOT 8 */ |
| 220 | |
| 221 | /* END MERGE SLOT 8 */ |
| 222 | |
| 223 | /* BEGIN MERGE SLOT 9 */ |
| 224 | |
| 225 | /* END MERGE SLOT 9 */ |
| 226 | |
| 227 | /* BEGIN MERGE SLOT 10 */ |
| 228 | |
| 229 | /* END MERGE SLOT 10 */ |