Skip to content

Commit 99bf36b

Browse files
committed
wolfcrypt/src/port/arm/armv8-32-curve25519.S and wolfcrypt/src/port/arm/armv8-32-curve25519_c.c: fix MPI overflow in L_curve25519_inv_8, similar to fix in #10536 (efabd1844a).
1 parent 1f0f29c commit 99bf36b

2 files changed

Lines changed: 78 additions & 8 deletions

File tree

wolfcrypt/src/port/arm/armv8-32-curve25519.S

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3677,6 +3677,33 @@ L_curve25519_inv_8:
36773677
ldr r1, [sp, #160]
36783678
ldr r0, [sp, #160]
36793679
bl fe_mul_op
3680+
# Ensure result is less than modulus
3681+
ldr r0, [sp, #160]
3682+
ldm r0, {r4, r5, r6, r7, r8, r9, r10, r11}
3683+
adds r2, r4, #19
3684+
adcs r2, r5, #0
3685+
adcs r2, r6, #0
3686+
adcs r2, r7, #0
3687+
adcs r2, r8, #0
3688+
adcs r2, r9, #0
3689+
adcs r2, r10, #0
3690+
adc r2, r11, #0
3691+
asr r2, r2, #31
3692+
and r2, r2, #19
3693+
adds r4, r4, r2
3694+
adcs r5, r5, #0
3695+
adcs r6, r6, #0
3696+
adcs r7, r7, #0
3697+
adcs r8, r8, #0
3698+
adcs r9, r9, #0
3699+
adcs r10, r10, #0
3700+
adc r11, r11, #0
3701+
#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
3702+
bic r11, r11, #0x80000000
3703+
#else
3704+
bfc r11, #31, #1
3705+
#endif
3706+
stm r0, {r4, r5, r6, r7, r8, r9, r10, r11}
36803707
mov r0, #0
36813708
add sp, sp, #0xbc
36823709
pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
@@ -3959,21 +3986,29 @@ L_curve25519_inv_8:
39593986
# Ensure result is less than modulus
39603987
ldr r0, [sp, #176]
39613988
ldm r0, {r4, r5, r6, r7, r8, r9, r10, r11}
3962-
mov r2, #19
3963-
and r2, r2, r11, asr #31
3989+
adds r2, r4, #19
3990+
adcs r2, r5, #0
3991+
adcs r2, r6, #0
3992+
adcs r2, r7, #0
3993+
adcs r2, r8, #0
3994+
adcs r2, r9, #0
3995+
adcs r2, r10, #0
3996+
adc r2, r11, #0
3997+
asr r2, r2, #31
3998+
and r2, r2, #19
39643999
adds r4, r4, r2
39654000
adcs r5, r5, #0
39664001
adcs r6, r6, #0
39674002
adcs r7, r7, #0
39684003
adcs r8, r8, #0
39694004
adcs r9, r9, #0
4005+
adcs r10, r10, #0
4006+
adc r11, r11, #0
39704007
#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
39714008
bic r11, r11, #0x80000000
39724009
#else
39734010
bfc r11, #31, #1
39744011
#endif
3975-
adcs r10, r10, #0
3976-
adc r11, r11, #0
39774012
stm r0, {r4, r5, r6, r7, r8, r9, r10, r11}
39784013
mov r0, #0
39794014
add sp, sp, #0xc0

wolfcrypt/src/port/arm/armv8-32-curve25519_c.c

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4082,6 +4082,33 @@ WC_OMIT_FRAME_POINTER int curve25519(byte* r, const byte* n, const byte* a)
40824082
"ldr r1, [sp, #160]\n\t"
40834083
"ldr r0, [sp, #160]\n\t"
40844084
"bl fe_mul_op\n\t"
4085+
/* Ensure result is less than modulus */
4086+
"ldr %[r], [sp, #160]\n\t"
4087+
"ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
4088+
"adds %[a], r4, #19\n\t"
4089+
"adcs %[a], r5, #0\n\t"
4090+
"adcs %[a], r6, #0\n\t"
4091+
"adcs %[a], r7, #0\n\t"
4092+
"adcs %[a], r8, #0\n\t"
4093+
"adcs %[a], r9, #0\n\t"
4094+
"adcs %[a], r10, #0\n\t"
4095+
"adc %[a], r11, #0\n\t"
4096+
"asr %[a], %[a], #31\n\t"
4097+
"and %[a], %[a], #19\n\t"
4098+
"adds r4, r4, %[a]\n\t"
4099+
"adcs r5, r5, #0\n\t"
4100+
"adcs r6, r6, #0\n\t"
4101+
"adcs r7, r7, #0\n\t"
4102+
"adcs r8, r8, #0\n\t"
4103+
"adcs r9, r9, #0\n\t"
4104+
"adcs r10, r10, #0\n\t"
4105+
"adc r11, r11, #0\n\t"
4106+
#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
4107+
"bic r11, r11, #0x80000000\n\t"
4108+
#else
4109+
"bfc r11, #31, #1\n\t"
4110+
#endif
4111+
"stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
40854112
"mov r0, #0\n\t"
40864113
"add sp, sp, #0xbc\n\t"
40874114
#ifndef WOLFSSL_NO_VAR_ASSIGN_REG
@@ -4392,21 +4419,29 @@ WC_OMIT_FRAME_POINTER int curve25519(byte* r, const byte* n, const byte* a)
43924419
/* Ensure result is less than modulus */
43934420
"ldr %[r], [sp, #176]\n\t"
43944421
"ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
4395-
"mov %[a], #19\n\t"
4396-
"and %[a], %[a], r11, asr #31\n\t"
4422+
"adds %[a], r4, #19\n\t"
4423+
"adcs %[a], r5, #0\n\t"
4424+
"adcs %[a], r6, #0\n\t"
4425+
"adcs %[a], r7, #0\n\t"
4426+
"adcs %[a], r8, #0\n\t"
4427+
"adcs %[a], r9, #0\n\t"
4428+
"adcs %[a], r10, #0\n\t"
4429+
"adc %[a], r11, #0\n\t"
4430+
"asr %[a], %[a], #31\n\t"
4431+
"and %[a], %[a], #19\n\t"
43974432
"adds r4, r4, %[a]\n\t"
43984433
"adcs r5, r5, #0\n\t"
43994434
"adcs r6, r6, #0\n\t"
44004435
"adcs r7, r7, #0\n\t"
44014436
"adcs r8, r8, #0\n\t"
44024437
"adcs r9, r9, #0\n\t"
4438+
"adcs r10, r10, #0\n\t"
4439+
"adc r11, r11, #0\n\t"
44034440
#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7)
44044441
"bic r11, r11, #0x80000000\n\t"
44054442
#else
44064443
"bfc r11, #31, #1\n\t"
44074444
#endif
4408-
"adcs r10, r10, #0\n\t"
4409-
"adc r11, r11, #0\n\t"
44104445
"stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t"
44114446
"mov r0, #0\n\t"
44124447
"add sp, sp, #0xc0\n\t"

0 commit comments

Comments
 (0)