Skip to content

Commit 4d8c836

Browse files
authored
Merge pull request #346 from gilles-peskine-arm/mpi_copy_shrink
Improve robustness and testing of mbedtls_mpi_copy
2 parents f317dc4 + a9da093 commit 4d8c836

File tree

3 files changed

+161
-34
lines changed

3 files changed

+161
-34
lines changed

library/bignum.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,10 @@ int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs )
158158
if( nblimbs > MBEDTLS_MPI_MAX_LIMBS )
159159
return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
160160

161-
/* Actually resize up in this case */
161+
/* Actually resize up if there are currently fewer than nblimbs limbs. */
162162
if( X->n <= nblimbs )
163163
return( mbedtls_mpi_grow( X, nblimbs ) );
164+
/* After this point, then X->n > nblimbs and in particular X->n > 0. */
164165

165166
for( i = X->n - 1; i > 0; i-- )
166167
if( X->p[i] != 0 )
@@ -199,7 +200,7 @@ int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y )
199200
if( X == Y )
200201
return( 0 );
201202

202-
if( Y->p == NULL )
203+
if( Y->n == 0 )
203204
{
204205
mbedtls_mpi_free( X );
205206
return( 0 );

tests/suites/test_suite_mpi.data

Lines changed: 82 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -292,37 +292,106 @@ mbedtls_mpi_cmp_abs:10:"2":10:"-3":-1
292292
Base test mbedtls_mpi_cmp_abs (Mix values) #3
293293
mbedtls_mpi_cmp_abs:10:"-2":10:"1":1
294294

295-
Base test mbedtls_mpi_copy #1
296-
mbedtls_mpi_copy:0:1500
295+
Copy zero (1 limb) to positive (1 limb)
296+
mbedtls_mpi_copy_sint:0:1500
297297

298-
Base test mpi_copy_self #1
298+
Copy zero (1 limb) to negative (1 limb)
299+
mbedtls_mpi_copy_sint:0:-1500
300+
301+
Copy positive (1 limb) to zero (1 limb)
302+
mbedtls_mpi_copy_sint:1500:0
303+
304+
Copy negative (1 limb) to zero (1 limb)
305+
mbedtls_mpi_copy_sint:-1500:0
306+
307+
Copy positive (1 limb) to negative (1 limb)
308+
mbedtls_mpi_copy_sint:1500:-42
309+
310+
Copy negative (1 limb) to positive (1 limb)
311+
mbedtls_mpi_copy_sint:-42:1500
312+
313+
Copy zero (null) to zero (null)
314+
mbedtls_mpi_copy_binary:"":""
315+
316+
Copy zero (null) to positive (1 limb)
317+
mbedtls_mpi_copy_binary:"":"1234"
318+
319+
Copy positive (1 limb) to zero (null)
320+
mbedtls_mpi_copy_binary:"1234":""
321+
322+
Copy positive to larger
323+
mbedtls_mpi_copy_binary:"bead":"ca5cadedb01dfaceacc01ade"
324+
325+
Copy positive to smaller
326+
mbedtls_mpi_copy_binary:"ca5cadedb01dfaceacc01ade":"bead"
327+
328+
Copy self: positive (1 limb)
299329
mpi_copy_self:14
300330

301-
Base test mbedtls_mpi_swap #1
302-
mbedtls_mpi_swap:0:1500
331+
Copy self: zero (1 limb)
332+
mpi_copy_self:0
333+
334+
Swap zero (1 limb) with positive (1 limb)
335+
mbedtls_mpi_swap_sint:0:1500
336+
337+
Swap zero (1 limb) with negative (1 limb)
338+
mbedtls_mpi_swap_sint:0:-1500
339+
340+
Swap positive (1 limb) with zero (1 limb)
341+
mbedtls_mpi_swap_sint:1500:0
342+
343+
Swap negative (1 limb) with zero (1 limb)
344+
mbedtls_mpi_swap_sint:-1500:0
345+
346+
Swap positive (1 limb) with negative (1 limb)
347+
mbedtls_mpi_swap_sint:1500:-42
348+
349+
Swap negative (1 limb) with positive (1 limb)
350+
mbedtls_mpi_swap_sint:-42:1500
351+
352+
Swap zero (null) with zero (null)
353+
mbedtls_mpi_swap_binary:"":""
354+
355+
Swap zero (null) with positive (1 limb)
356+
mbedtls_mpi_swap_binary:"":"1234"
357+
358+
Swap positive (1 limb) with zero (null)
359+
mbedtls_mpi_swap_binary:"1234":""
360+
361+
Swap positive with larger
362+
mbedtls_mpi_swap_binary:"bead":"ca5cadedb01dfaceacc01ade"
363+
364+
Swap positive with smaller
365+
mbedtls_mpi_swap_binary:"ca5cadedb01dfaceacc01ade":"bead"
366+
367+
Swap self: 1 limb
368+
mpi_swap_self:"face"
369+
370+
Swap self: null
371+
mpi_swap_self:""
303372

304-
Test mbedtls_mpi_shrink #1
373+
Shrink 2 limbs in a buffer of size 2 to 4
305374
mbedtls_mpi_shrink:2:2:4:4
306375

307-
Test mbedtls_mpi_shrink #2
376+
Shrink 2 limbs in a buffer of size 4 to 4
308377
mbedtls_mpi_shrink:4:2:4:4
309378

310-
Test mbedtls_mpi_shrink #3
379+
Shrink 2 limbs in a buffer of size 8 to 4
311380
mbedtls_mpi_shrink:8:2:4:4
312381

313-
Test mbedtls_mpi_shrink #4
382+
Shrink 4 limbs in a buffer of size 8 to 4
314383
mbedtls_mpi_shrink:8:4:4:4
315384

316-
Test mbedtls_mpi_shrink #5
385+
Shrink 6 limbs in a buffer of size 8 to 4 yielding 6
317386
mbedtls_mpi_shrink:8:6:4:6
318387

319-
Test mbedtls_mpi_shrink #6
388+
Shrink 2 limbs in a buffer of size 4 to 0 yielding 2
320389
mbedtls_mpi_shrink:4:2:0:2
321390

322-
Test mbedtls_mpi_shrink #7
391+
Shrink 1 limbs in a buffer of size 4 to 0 yielding 1
323392
mbedtls_mpi_shrink:4:1:0:1
324393

325-
Test mbedtls_mpi_shrink #8
394+
Shrink 0 limbs in a buffer of size 4 to 0 yielding 1
326395
mbedtls_mpi_shrink:4:0:0:1
327396

328397
Test mbedtls_mpi_safe_cond_assign #1

tests/suites/test_suite_mpi.function

Lines changed: 76 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -629,22 +629,40 @@ exit:
629629
/* END_CASE */
630630

631631
/* BEGIN_CASE */
632-
void mbedtls_mpi_copy( int input_X, int input_A )
632+
void mbedtls_mpi_copy_sint( int input_X, int input_Y )
633633
{
634-
mbedtls_mpi X, Y, A;
635-
mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
634+
mbedtls_mpi X, Y;
635+
mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
636636

637637
TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
638-
TEST_ASSERT( mbedtls_mpi_lset( &Y, input_A ) == 0 );
639-
TEST_ASSERT( mbedtls_mpi_lset( &A, input_A ) == 0 );
640-
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
641-
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
638+
TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
639+
642640
TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
643-
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) == 0 );
644-
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) != 0 );
641+
TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
642+
TEST_ASSERT( mbedtls_mpi_cmp_int( &Y, input_X ) == 0 );
645643

646644
exit:
647-
mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
645+
mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
646+
}
647+
/* END_CASE */
648+
649+
/* BEGIN_CASE */
650+
void mbedtls_mpi_copy_binary( data_t *input_X, data_t *input_Y )
651+
{
652+
mbedtls_mpi X, Y, X0;
653+
mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &X0 );
654+
655+
TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
656+
TEST_ASSERT( mbedtls_mpi_read_binary( &Y, input_Y->x, input_Y->len ) == 0 );
657+
TEST_ASSERT( mbedtls_mpi_read_binary( &X0, input_X->x, input_X->len ) == 0 );
658+
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
659+
660+
TEST_ASSERT( mbedtls_mpi_copy( &Y, &X ) == 0 );
661+
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
662+
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 );
663+
664+
exit:
665+
mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &X0 );
648666
}
649667
/* END_CASE */
650668

@@ -736,22 +754,61 @@ exit:
736754
/* END_CASE */
737755

738756
/* BEGIN_CASE */
739-
void mbedtls_mpi_swap( int input_X, int input_Y )
757+
void mbedtls_mpi_swap_sint( int input_X, int input_Y )
740758
{
741-
mbedtls_mpi X, Y, A;
742-
mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &A );
759+
mbedtls_mpi X, Y;
760+
mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
743761

744762
TEST_ASSERT( mbedtls_mpi_lset( &X, input_X ) == 0 );
745763
TEST_ASSERT( mbedtls_mpi_lset( &Y, input_Y ) == 0 );
746-
TEST_ASSERT( mbedtls_mpi_lset( &A, input_X ) == 0 );
747-
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
748-
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &A ) == 0 );
764+
TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_X ) == 0 );
765+
TEST_ASSERT( mbedtls_mpi_cmp_int( &Y, input_Y ) == 0 );
766+
749767
mbedtls_mpi_swap( &X, &Y );
750-
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y ) != 0 );
751-
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &A ) == 0 );
768+
TEST_ASSERT( mbedtls_mpi_cmp_int( &X, input_Y ) == 0 );
769+
TEST_ASSERT( mbedtls_mpi_cmp_int( &Y, input_X ) == 0 );
752770

753771
exit:
754-
mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &A );
772+
mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
773+
}
774+
/* END_CASE */
775+
776+
/* BEGIN_CASE */
777+
void mbedtls_mpi_swap_binary( data_t *input_X, data_t *input_Y )
778+
{
779+
mbedtls_mpi X, Y, X0, Y0;
780+
mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );
781+
mbedtls_mpi_init( &X0 ); mbedtls_mpi_init( &Y0 );
782+
783+
TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
784+
TEST_ASSERT( mbedtls_mpi_read_binary( &Y, input_Y->x, input_Y->len ) == 0 );
785+
TEST_ASSERT( mbedtls_mpi_read_binary( &X0, input_X->x, input_X->len ) == 0 );
786+
TEST_ASSERT( mbedtls_mpi_read_binary( &Y0, input_Y->x, input_Y->len ) == 0 );
787+
788+
mbedtls_mpi_swap( &X, &Y );
789+
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &Y0 ) == 0 );
790+
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &Y, &X0 ) == 0 );
791+
792+
exit:
793+
mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );
794+
mbedtls_mpi_free( &X0 ); mbedtls_mpi_free( &Y0 );
795+
}
796+
/* END_CASE */
797+
798+
/* BEGIN_CASE */
799+
void mpi_swap_self( data_t *input_X )
800+
{
801+
mbedtls_mpi X, X0;
802+
mbedtls_mpi_init( &X ); mbedtls_mpi_init( &X0 );
803+
804+
TEST_ASSERT( mbedtls_mpi_read_binary( &X, input_X->x, input_X->len ) == 0 );
805+
TEST_ASSERT( mbedtls_mpi_read_binary( &X0, input_X->x, input_X->len ) == 0 );
806+
807+
mbedtls_mpi_swap( &X, &X );
808+
TEST_ASSERT( mbedtls_mpi_cmp_mpi( &X, &X0 ) == 0 );
809+
810+
exit:
811+
mbedtls_mpi_free( &X ); mbedtls_mpi_free( &X0 );
755812
}
756813
/* END_CASE */
757814

0 commit comments

Comments
 (0)