summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Jacobs <kjacobs@mozilla.com>2020-09-08 14:41:46 +0000
committerKevin Jacobs <kjacobs@mozilla.com>2020-09-08 14:41:46 +0000
commitac7687cb4d4321247ff9032d25df145581b5be06 (patch)
tree2c6f6704d82c9d3a9553dd9a6071409c6c76c2be
parent64d967b3b5e3874bc3636332847a5def728e1e0c (diff)
downloadnss-hg-ac7687cb4d4321247ff9032d25df145581b5be06.tar.gz
Bug 1605922 - Account for negative sign in mp_radix_size r=bbeurdouche
Differential Revision: https://phabricator.services.mozilla.com/D86443
-rw-r--r--gtests/freebl_gtest/mpi_unittest.cc33
-rw-r--r--lib/freebl/mpi/mpi.c2
2 files changed, 34 insertions, 1 deletions
diff --git a/gtests/freebl_gtest/mpi_unittest.cc b/gtests/freebl_gtest/mpi_unittest.cc
index 37dc1f978..0503006f9 100644
--- a/gtests/freebl_gtest/mpi_unittest.cc
+++ b/gtests/freebl_gtest/mpi_unittest.cc
@@ -192,6 +192,39 @@ TEST_F(MPITest, MpiFixlenOctetsZero) {
TestToFixedOctets(zero, sizeof(mp_digit) + 1);
}
+TEST_F(MPITest, MpiRadixSizeNeg) {
+ char* str;
+ mp_int a;
+ mp_err rv;
+ const char* negative_edge =
+ "-5400000000000000003000000002200020090919017007777777777870000090"
+ "00000000007500443416610000000000000000000000000000000000000000000"
+ "00000000000000000000000000000000000000000000000000000000075049054"
+ "18610000800555594485440016000031555550000000000000000220030200909"
+ "19017007777777700000000000000000000000000000000000000000000000000"
+ "00000000000500000000000000000000000000004668129841661000071000000"
+ "00000000000000000000000000000000000000000000000007504434166100000"
+ "00000000000000000000000000000000000000000000000000000000000000000"
+ "00000000075049054186100008005555944854400184572169555500000000000"
+ "0000022003020090919017007777777700000000000000000000";
+
+ rv = mp_init(&a);
+ ASSERT_EQ(MP_OKAY, rv);
+ rv = mp_read_variable_radix(&a, negative_edge, 10);
+ ASSERT_EQ(MP_OKAY, rv);
+
+ const int radixSize = mp_radix_size(&a, 10);
+ ASSERT_LE(0, radixSize);
+
+ str = (char*)malloc(radixSize);
+ ASSERT_NE(nullptr, str);
+ rv = mp_toradix(&a, str, 10);
+ ASSERT_EQ(MP_OKAY, rv);
+ ASSERT_EQ(0, strcmp(negative_edge, str));
+ free(str);
+ mp_clear(&a);
+}
+
TEST_F(MPITest, MpiFixlenOctetsVarlen) {
std::vector<uint8_t> packed;
for (size_t i = 0; i < sizeof(mp_digit) * 2; ++i) {
diff --git a/lib/freebl/mpi/mpi.c b/lib/freebl/mpi/mpi.c
index 1b7b171e7..1d306696f 100644
--- a/lib/freebl/mpi/mpi.c
+++ b/lib/freebl/mpi/mpi.c
@@ -2693,7 +2693,7 @@ mp_radix_size(mp_int *mp, int radix)
bits = USED(mp) * DIGIT_BIT - 1;
- return s_mp_outlen(bits, radix);
+ return SIGN(mp) + s_mp_outlen(bits, radix);
} /* end mp_radix_size() */