Index: net/der/parse_values_unittest.cc |
diff --git a/net/der/parse_values_unittest.cc b/net/der/parse_values_unittest.cc |
index ff0aafc107977389954653d15186ad816d92ebeb..3eaa4009fb86d4daf81a0aa9b7588fdffe563050 100644 |
--- a/net/der/parse_values_unittest.cc |
+++ b/net/der/parse_values_unittest.cc |
@@ -184,19 +184,26 @@ struct Uint64TestData { |
const Uint64TestData kUint64TestData[] = { |
{true, {0x00}, 1, 0}, |
+ // This number fails because it is not a minimal representation. |
+ {false, {0x00, 0x00}, 2}, |
{true, {0x01}, 1, 1}, |
- {false, {0xFF}, 1, 0}, |
+ {false, {0xFF}, 1}, |
{true, {0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 8, INT64_MAX}, |
- {false, {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 8, 0}, |
- {false, {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 9, 0}, |
- {false, {0x00, 0x01}, 2, 1}, |
- {false, {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}, 9, 0}, |
- {false, {0}, 0, 0}, |
+ {true, |
+ {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, |
+ 9, |
+ UINT64_MAX}, |
+ // This number fails because it is negative. |
+ {false, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 8}, |
+ {false, {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 8}, |
+ {false, {0x00, 0x01}, 2}, |
+ {false, {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}, 9}, |
+ {false, {0}, 0}, |
}; |
TEST(ParseValuesTest, ParseUint64) { |
for (size_t i = 0; i < arraysize(kUint64TestData); i++) { |
- Uint64TestData test_case = kUint64TestData[i]; |
+ const Uint64TestData& test_case = kUint64TestData[i]; |
SCOPED_TRACE(i); |
uint64_t result; |
@@ -207,6 +214,58 @@ TEST(ParseValuesTest, ParseUint64) { |
} |
} |
+struct ParseIntegerTestData { |
+ bool should_pass; |
+ const uint8_t input[2]; |
+ size_t length; |
+ bool negative; |
+ // The difference between length and numeric_length. If it is 0 then |
+ // numeric_length is expected to match length. |
+ int length_difference; |
+}; |
+ |
+const ParseIntegerTestData kParseIntegerTestData[] = { |
+ // Empty input (invalid DER). |
+ {false, {0x00}, 0}, |
+ |
+ // The correct encoding for zero. |
+ {true, {0x00}, 1, false}, |
+ |
+ // Invalid representation of zero (not minimal) |
+ {false, {0x00, 0x00}, 2}, |
+ |
+ // Valid single byte negative numbers. |
+ {true, {0x80}, 1, true}, |
+ {true, {0xFF}, 1, true}, |
+ |
+ // Non-minimal negative number. |
+ {false, {0xFF, 0x80}, 2}, |
+ |
+ // Positive number with a legitimate leading zero. |
+ {true, {0x00, 0x80}, 2, false, -1}, |
+ |
+ // A legitimate negative number that starts with FF (MSB of second byte is |
+ // 0 so OK). |
+ {true, {0xFF, 0x7F}, 2, true}, |
+}; |
+ |
+TEST(ParseValuesTest, IsValidInteger) { |
+ for (size_t i = 0; i < arraysize(kParseIntegerTestData); i++) { |
+ const ParseIntegerTestData& test_case = kParseIntegerTestData[i]; |
+ SCOPED_TRACE(i); |
+ |
+ bool negative; |
+ size_t numeric_length; |
+ EXPECT_EQ(test_case.should_pass, |
+ IsValidInteger(Input(test_case.input, test_case.length), |
+ &negative, &numeric_length)); |
+ if (test_case.should_pass) { |
+ EXPECT_EQ(test_case.negative, negative); |
+ EXPECT_EQ(test_case.length + test_case.length_difference, numeric_length); |
+ } |
+ } |
+} |
+ |
// Tests parsing an empty BIT STRING. |
TEST(ParseValuesTest, ParseBitStringEmptyNoUnusedBits) { |
const uint8_t kData[] = {0x00}; |