@@ -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