diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index 558eaa232..88dce14fa 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -2607,6 +2607,12 @@ static int _sp_cmp(sp_int* a, sp_int* b) #endif ret = _sp_cmp_abs(a, b); #ifdef WOLFSSL_SP_INT_NEGATIVE + if (a->sign == MP_NEG) { + /* MP_GT = 1, MP_LT = -1, MP_EQ = 0 + * Swapping MP_GT and MP_LT results. + */ + ret = -ret; + } } else if (a->sign > b->sign) { ret = MP_LT; diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 96e8ce567..515c33a35 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -34974,6 +34974,31 @@ static int mp_test_cmp(mp_int* a, mp_int* b) if (ret != MP_EQ) return -13010; +#if (!defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_SP_MATH_ALL)) || \ + defined(WOLFSSL_SP_INT_NEGATIVE) + mp_read_radix(a, "-1", MP_RADIX_HEX); + mp_read_radix(a, "1", MP_RADIX_HEX); + ret = mp_cmp(a, b); + if (ret != MP_LT) + return -13011; + ret = mp_cmp(b, a); + if (ret != MP_GT) + return -13012; + + mp_read_radix(b, "-2", MP_RADIX_HEX); + ret = mp_cmp(a, b); + if (ret != MP_GT) + return -13013; + ret = mp_cmp(b, a); + if (ret != MP_LT) + return -13014; + + mp_read_radix(a, "-2", MP_RADIX_HEX); + ret = mp_cmp(a, b); + if (ret != MP_EQ) + return -13015; +#endif + return 0; }