Convert p256-x86_64_test to GTest.
BUG=129
Change-Id: Ieda2c2cc08f83ae24a2dfdb243dc17b4c15ed5b2
Reviewed-on: https://boringssl-review.googlesource.com/16993
Commit-Queue: Adam Langley <agl@google.com>
Reviewed-by: Adam Langley <agl@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt
index f4430eb..cc5c692 100644
--- a/crypto/CMakeLists.txt
+++ b/crypto/CMakeLists.txt
@@ -241,6 +241,7 @@
fipsmodule/aes/aes_test.cc
fipsmodule/bn/bn_test.cc
fipsmodule/ec/ec_test.cc
+ fipsmodule/ec/p256-x86_64_test.cc
fipsmodule/ecdsa/ecdsa_test.cc
fipsmodule/modes/gcm_test.cc
fipsmodule/rand/ctrdrbg_test.cc
diff --git a/crypto/fipsmodule/CMakeLists.txt b/crypto/fipsmodule/CMakeLists.txt
index 2b90622..a1bc6dc 100644
--- a/crypto/fipsmodule/CMakeLists.txt
+++ b/crypto/fipsmodule/CMakeLists.txt
@@ -203,14 +203,4 @@
)
target_link_libraries(example_mul crypto)
-
-add_executable(
- p256-x86_64_test
-
- ec/p256-x86_64_test.cc
-
- $<TARGET_OBJECTS:test_support>
-)
-
-target_link_libraries(p256-x86_64_test crypto)
-add_dependencies(all_tests example_mul p256-x86_64_test)
+add_dependencies(all_tests example_mul)
diff --git a/crypto/fipsmodule/ec/p256-x86_64_test.cc b/crypto/fipsmodule/ec/p256-x86_64_test.cc
index eb670aa..4600c76 100644
--- a/crypto/fipsmodule/ec/p256-x86_64_test.cc
+++ b/crypto/fipsmodule/ec/p256-x86_64_test.cc
@@ -21,11 +21,14 @@
#include <stdio.h>
#include <string.h>
+#include <gtest/gtest.h>
+
#include <openssl/bn.h>
#include <openssl/mem.h>
#include "../bn/internal.h"
#include "../../test/file_test.h"
+#include "../../test/test_util.h"
#include "p256-x86_64.h"
@@ -34,7 +37,7 @@
#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && \
!defined(OPENSSL_SMALL) && !defined(BORINGSSL_SHARED_LIBRARY)
-static bool TestSelectW5() {
+TEST(P256_X86_64Test, SelectW5) {
// Fill a table with some garbage input.
P256_POINT table[16];
for (size_t i = 0; i < 16; i++) {
@@ -54,16 +57,12 @@
expected = table[i-1];
}
- if (OPENSSL_memcmp(&val, &expected, sizeof(P256_POINT)) != 0) {
- fprintf(stderr, "ecp_nistz256_select_w5(%d) gave the wrong value.\n", i);
- return false;
- }
+ EXPECT_EQ(Bytes(reinterpret_cast<const char *>(&expected), sizeof(expected)),
+ Bytes(reinterpret_cast<const char *>(&val), sizeof(val)));
}
-
- return true;
}
-static bool TestSelectW7() {
+TEST(P256_X86_64Test, SelectW7) {
// Fill a table with some garbage input.
P256_POINT_AFFINE table[64];
for (size_t i = 0; i < 64; i++) {
@@ -82,13 +81,9 @@
expected = table[i-1];
}
- if (OPENSSL_memcmp(&val, &expected, sizeof(P256_POINT_AFFINE)) != 0) {
- fprintf(stderr, "ecp_nistz256_select_w7(%d) gave the wrong value.\n", i);
- return false;
- }
+ EXPECT_EQ(Bytes(reinterpret_cast<const char *>(&expected), sizeof(expected)),
+ Bytes(reinterpret_cast<const char *>(&val), sizeof(val)));
}
-
- return true;
}
static bool GetFieldElement(FileTest *t, BN_ULONG out[P256_LIMBS],
@@ -99,7 +94,7 @@
}
if (bytes.size() != BN_BYTES * P256_LIMBS) {
- t->PrintLine("Invalid length: %s", name);
+ ADD_FAILURE() << "Invalid length: " << name;
return false;
}
@@ -124,19 +119,23 @@
return ret;
}
-static bool ExpectFieldElementsEqual(FileTest *t, const char *message,
- const BN_ULONG expected[P256_LIMBS],
- const BN_ULONG actual[P256_LIMBS]) {
+static testing::AssertionResult ExpectFieldElementsEqual(
+ const char *expected_expr, const char *actual_expr,
+ const BN_ULONG expected[P256_LIMBS], const BN_ULONG actual[P256_LIMBS]) {
if (OPENSSL_memcmp(expected, actual, sizeof(BN_ULONG) * P256_LIMBS) == 0) {
- return true;
+ return testing::AssertionSuccess();
}
- t->PrintLine("%s", message);
- t->PrintLine("Expected: %s", FieldElementToString(expected).c_str());
- t->PrintLine("Actual: %s", FieldElementToString(actual).c_str());
- return false;
+ return testing::AssertionFailure()
+ << "Expected: " << FieldElementToString(expected) << " ("
+ << expected_expr << ")\n"
+ << "Actual: " << FieldElementToString(actual) << " (" << actual_expr
+ << ")";
}
+#define EXPECT_FIELD_ELEMENTS_EQUAL(a, b) \
+ EXPECT_PRED_FORMAT2(ExpectFieldElementsEqual, a, b)
+
static bool PointToAffine(P256_POINT_AFFINE *out, const P256_POINT *in) {
static const uint8_t kP[] = {
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
@@ -194,315 +193,194 @@
return true;
}
-static bool ExpectPointsEqual(FileTest *t, const char *message,
- const P256_POINT_AFFINE *expected,
- const P256_POINT *point) {
+static testing::AssertionResult ExpectPointsEqual(
+ const char *expected_expr, const char *actual_expr,
+ const P256_POINT_AFFINE *expected, const P256_POINT *actual) {
// There are multiple representations of the same |P256_POINT|, so convert to
// |P256_POINT_AFFINE| and compare.
P256_POINT_AFFINE affine;
- if (!PointToAffine(&affine, point)) {
- t->PrintLine("%s", message);
- t->PrintLine("Could not convert to affine: (%s, %s, %s)",
- FieldElementToString(point->X).c_str(),
- FieldElementToString(point->Y).c_str(),
- FieldElementToString(point->Z).c_str());
- return false;
+ if (!PointToAffine(&affine, actual)) {
+ return testing::AssertionFailure()
+ << "Could not convert " << actual_expr << " to affine: ("
+ << FieldElementToString(actual->X) << ", "
+ << FieldElementToString(actual->Y) << ", "
+ << FieldElementToString(actual->Z) << ")";
}
if (OPENSSL_memcmp(expected, &affine, sizeof(P256_POINT_AFFINE)) != 0) {
- t->PrintLine("%s", message);
- t->PrintLine("Expected: (%s, %s)",
- FieldElementToString(expected->X).c_str(),
- FieldElementToString(expected->Y).c_str());
- t->PrintLine("Actual: (%s, %s)", FieldElementToString(affine.X).c_str(),
- FieldElementToString(affine.Y).c_str());
- return false;
+ return testing::AssertionFailure()
+ << "Expected: (" << FieldElementToString(expected->X) << ", "
+ << FieldElementToString(expected->Y) << ") (" << expected_expr
+ << "; affine)\n"
+ << "Actual: (" << FieldElementToString(affine.X) << ", "
+ << FieldElementToString(affine.Y) << ") (" << actual_expr << ")";
}
- return true;
+ return testing::AssertionSuccess();
}
-static bool TestNegate(FileTest *t) {
+#define EXPECT_POINTS_EQUAL(a, b) EXPECT_PRED_FORMAT2(ExpectPointsEqual, a, b)
+
+static void TestNegate(FileTest *t) {
BN_ULONG a[P256_LIMBS], b[P256_LIMBS];
- if (!GetFieldElement(t, a, "A") ||
- !GetFieldElement(t, b, "B")) {
- return false;
- }
+ ASSERT_TRUE(GetFieldElement(t, a, "A"));
+ ASSERT_TRUE(GetFieldElement(t, b, "B"));
// Test that -A = B.
BN_ULONG ret[P256_LIMBS];
ecp_nistz256_neg(ret, a);
- if (!ExpectFieldElementsEqual(t, "ecp_nistz256_neg(A) was incorrect.", b,
- ret)) {
- return false;
- }
+ EXPECT_FIELD_ELEMENTS_EQUAL(b, ret);
OPENSSL_memcpy(ret, a, sizeof(ret));
- ecp_nistz256_neg(ret, ret);
- if (!ExpectFieldElementsEqual(
- t, "In-place ecp_nistz256_neg(A) was incorrect.", b, ret)) {
- return false;
- }
+ ecp_nistz256_neg(ret, ret /* a */);
+ EXPECT_FIELD_ELEMENTS_EQUAL(b, ret);
// Test that -B = A.
ecp_nistz256_neg(ret, b);
- if (!ExpectFieldElementsEqual(t, "ecp_nistz256_neg(B) was incorrect.", a,
- ret)) {
- return false;
- }
+ EXPECT_FIELD_ELEMENTS_EQUAL(a, ret);
OPENSSL_memcpy(ret, b, sizeof(ret));
- ecp_nistz256_neg(ret, ret);
- if (!ExpectFieldElementsEqual(
- t, "In-place ecp_nistz256_neg(B) was incorrect.", a, ret)) {
- return false;
- }
-
- return true;
+ ecp_nistz256_neg(ret, ret /* b */);
+ EXPECT_FIELD_ELEMENTS_EQUAL(a, ret);
}
-static bool TestMulMont(FileTest *t) {
+static void TestMulMont(FileTest *t) {
BN_ULONG a[P256_LIMBS], b[P256_LIMBS], result[P256_LIMBS];
- if (!GetFieldElement(t, a, "A") ||
- !GetFieldElement(t, b, "B") ||
- !GetFieldElement(t, result, "Result")) {
- return false;
- }
+ ASSERT_TRUE(GetFieldElement(t, a, "A"));
+ ASSERT_TRUE(GetFieldElement(t, b, "B"));
+ ASSERT_TRUE(GetFieldElement(t, result, "Result"));
BN_ULONG ret[P256_LIMBS];
ecp_nistz256_mul_mont(ret, a, b);
- if (!ExpectFieldElementsEqual(t, "ecp_nistz256_mul_mont(A, B) was incorrect.",
- result, ret)) {
- return false;
- }
+ EXPECT_FIELD_ELEMENTS_EQUAL(result, ret);
ecp_nistz256_mul_mont(ret, b, a);
- if (!ExpectFieldElementsEqual(t, "ecp_nistz256_mul_mont(B, A) was incorrect.",
- result, ret)) {
- return false;
- }
+ EXPECT_FIELD_ELEMENTS_EQUAL(result, ret);
OPENSSL_memcpy(ret, a, sizeof(ret));
- ecp_nistz256_mul_mont(ret, ret, b);
- if (!ExpectFieldElementsEqual(
- t, "ecp_nistz256_mul_mont(ret = A, B) was incorrect.", result, ret)) {
- return false;
- }
+ ecp_nistz256_mul_mont(ret, ret /* a */, b);
+ EXPECT_FIELD_ELEMENTS_EQUAL(result, ret);
OPENSSL_memcpy(ret, a, sizeof(ret));
ecp_nistz256_mul_mont(ret, b, ret);
- if (!ExpectFieldElementsEqual(
- t, "ecp_nistz256_mul_mont(B, ret = A) was incorrect.", result, ret)) {
- return false;
- }
+ EXPECT_FIELD_ELEMENTS_EQUAL(result, ret);
OPENSSL_memcpy(ret, b, sizeof(ret));
- ecp_nistz256_mul_mont(ret, a, ret);
- if (!ExpectFieldElementsEqual(
- t, "ecp_nistz256_mul_mont(A, ret = B) was incorrect.", result, ret)) {
- return false;
- }
+ ecp_nistz256_mul_mont(ret, a, ret /* b */);
+ EXPECT_FIELD_ELEMENTS_EQUAL(result, ret);
OPENSSL_memcpy(ret, b, sizeof(ret));
- ecp_nistz256_mul_mont(ret, ret, a);
- if (!ExpectFieldElementsEqual(
- t, "ecp_nistz256_mul_mont(ret = B, A) was incorrect.", result, ret)) {
- return false;
- }
+ ecp_nistz256_mul_mont(ret, ret /* b */, a);
+ EXPECT_FIELD_ELEMENTS_EQUAL(result, ret);
if (OPENSSL_memcmp(a, b, sizeof(a)) == 0) {
ecp_nistz256_sqr_mont(ret, a);
- if (!ExpectFieldElementsEqual(t, "ecp_nistz256_sqr_mont(A) was incorrect.",
- result, ret)) {
- return false;
- }
+ EXPECT_FIELD_ELEMENTS_EQUAL(result, ret);
OPENSSL_memcpy(ret, a, sizeof(ret));
- ecp_nistz256_sqr_mont(ret, ret);
- if (!ExpectFieldElementsEqual(
- t, "ecp_nistz256_sqr_mont(ret = A) was incorrect.", result, ret)) {
- return false;
- }
+ ecp_nistz256_sqr_mont(ret, ret /* a */);
+ EXPECT_FIELD_ELEMENTS_EQUAL(result, ret);
}
-
- return true;
}
-static bool TestFromMont(FileTest *t) {
+static void TestFromMont(FileTest *t) {
BN_ULONG a[P256_LIMBS], result[P256_LIMBS];
- if (!GetFieldElement(t, a, "A") ||
- !GetFieldElement(t, result, "Result")) {
- return false;
- }
+ ASSERT_TRUE(GetFieldElement(t, a, "A"));
+ ASSERT_TRUE(GetFieldElement(t, result, "Result"));
BN_ULONG ret[P256_LIMBS];
ecp_nistz256_from_mont(ret, a);
- if (!ExpectFieldElementsEqual(t, "ecp_nistz256_from_mont(A) was incorrect.",
- result, ret)) {
- return false;
- }
+ EXPECT_FIELD_ELEMENTS_EQUAL(result, ret);
OPENSSL_memcpy(ret, a, sizeof(ret));
- ecp_nistz256_from_mont(ret, ret);
- if (!ExpectFieldElementsEqual(
- t, "ecp_nistz256_from_mont(ret = A) was incorrect.", result, ret)) {
- return false;
- }
-
- return true;
+ ecp_nistz256_from_mont(ret, ret /* a */);
+ EXPECT_FIELD_ELEMENTS_EQUAL(result, ret);
}
-static bool TestPointAdd(FileTest *t) {
+static void TestPointAdd(FileTest *t) {
P256_POINT a, b;
P256_POINT_AFFINE result;
- if (!GetFieldElement(t, a.X, "A.X") ||
- !GetFieldElement(t, a.Y, "A.Y") ||
- !GetFieldElement(t, a.Z, "A.Z") ||
- !GetFieldElement(t, b.X, "B.X") ||
- !GetFieldElement(t, b.Y, "B.Y") ||
- !GetFieldElement(t, b.Z, "B.Z") ||
- !GetFieldElement(t, result.X, "Result.X") ||
- !GetFieldElement(t, result.Y, "Result.Y")) {
- return false;
- }
+ ASSERT_TRUE(GetFieldElement(t, a.X, "A.X"));
+ ASSERT_TRUE(GetFieldElement(t, a.Y, "A.Y"));
+ ASSERT_TRUE(GetFieldElement(t, a.Z, "A.Z"));
+ ASSERT_TRUE(GetFieldElement(t, b.X, "B.X"));
+ ASSERT_TRUE(GetFieldElement(t, b.Y, "B.Y"));
+ ASSERT_TRUE(GetFieldElement(t, b.Z, "B.Z"));
+ ASSERT_TRUE(GetFieldElement(t, result.X, "Result.X"));
+ ASSERT_TRUE(GetFieldElement(t, result.Y, "Result.Y"));
P256_POINT ret;
ecp_nistz256_point_add(&ret, &a, &b);
- if (!ExpectPointsEqual(t, "ecp_nistz256_point_add(A, B) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ EXPECT_POINTS_EQUAL(&result, &ret);
ecp_nistz256_point_add(&ret, &b, &a);
- if (!ExpectPointsEqual(t, "ecp_nistz256_point_add(B, A) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ EXPECT_POINTS_EQUAL(&result, &ret);
OPENSSL_memcpy(&ret, &a, sizeof(ret));
- ecp_nistz256_point_add(&ret, &ret, &b);
- if (!ExpectPointsEqual(t, "ecp_nistz256_point_add(ret = A, B) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ ecp_nistz256_point_add(&ret, &ret /* a */, &b);
+ EXPECT_POINTS_EQUAL(&result, &ret);
OPENSSL_memcpy(&ret, &a, sizeof(ret));
- ecp_nistz256_point_add(&ret, &b, &ret);
- if (!ExpectPointsEqual(t, "ecp_nistz256_point_add(B, ret = A) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ ecp_nistz256_point_add(&ret, &b, &ret /* a */);
+ EXPECT_POINTS_EQUAL(&result, &ret);
OPENSSL_memcpy(&ret, &b, sizeof(ret));
- ecp_nistz256_point_add(&ret, &a, &ret);
- if (!ExpectPointsEqual(t, "ecp_nistz256_point_add(ret = A, B) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ ecp_nistz256_point_add(&ret, &a, &ret /* b */);
+ EXPECT_POINTS_EQUAL(&result, &ret);
OPENSSL_memcpy(&ret, &b, sizeof(ret));
- ecp_nistz256_point_add(&ret, &ret, &a);
- if (!ExpectPointsEqual(t, "ecp_nistz256_point_add(ret = B, A) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ ecp_nistz256_point_add(&ret, &ret /* b */, &a);
+ EXPECT_POINTS_EQUAL(&result, &ret);
P256_POINT_AFFINE a_affine, b_affine, infinity;
OPENSSL_memset(&infinity, 0, sizeof(infinity));
- if (!PointToAffine(&a_affine, &a) ||
- !PointToAffine(&b_affine, &b)) {
- return false;
- }
+ ASSERT_TRUE(PointToAffine(&a_affine, &a));
+ ASSERT_TRUE(PointToAffine(&b_affine, &b));
// ecp_nistz256_point_add_affine does not work when a == b unless doubling the
// point at infinity.
if (OPENSSL_memcmp(&a_affine, &b_affine, sizeof(a_affine)) != 0 ||
OPENSSL_memcmp(&a_affine, &infinity, sizeof(a_affine)) == 0) {
ecp_nistz256_point_add_affine(&ret, &a, &b_affine);
- if (!ExpectPointsEqual(t,
- "ecp_nistz256_point_add_affine(A, B) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ EXPECT_POINTS_EQUAL(&result, &ret);
OPENSSL_memcpy(&ret, &a, sizeof(ret));
- ecp_nistz256_point_add_affine(&ret, &ret, &b_affine);
- if (!ExpectPointsEqual(
- t, "ecp_nistz256_point_add_affine(ret = A, B) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ ecp_nistz256_point_add_affine(&ret, &ret /* a */, &b_affine);
+ EXPECT_POINTS_EQUAL(&result, &ret);
ecp_nistz256_point_add_affine(&ret, &b, &a_affine);
- if (!ExpectPointsEqual(t,
- "ecp_nistz256_point_add_affine(B, A) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ EXPECT_POINTS_EQUAL(&result, &ret);
OPENSSL_memcpy(&ret, &b, sizeof(ret));
- ecp_nistz256_point_add_affine(&ret, &ret, &a_affine);
- if (!ExpectPointsEqual(
- t, "ecp_nistz256_point_add_affine(ret = B, A) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ ecp_nistz256_point_add_affine(&ret, &ret /* b */, &a_affine);
+ EXPECT_POINTS_EQUAL(&result, &ret);
}
if (OPENSSL_memcmp(&a, &b, sizeof(a)) == 0) {
ecp_nistz256_point_double(&ret, &a);
- if (!ExpectPointsEqual(t, "ecp_nistz256_point_double(A) was incorrect.",
- &result, &ret)) {
- return false;
- }
+ EXPECT_POINTS_EQUAL(&result, &ret);
ret = a;
- ecp_nistz256_point_double(&ret, &ret);
- if (!ExpectPointsEqual(
- t, "In-place ecp_nistz256_point_double(A) was incorrect.", &result,
- &ret)) {
- return false;
- }
+ ecp_nistz256_point_double(&ret, &ret /* a */);
+ EXPECT_POINTS_EQUAL(&result, &ret);
}
-
- return true;
}
-int main(int argc, char **argv) {
- if (argc != 2) {
- fprintf(stderr, "%s TEST_FILE\n", argv[0]);
- return 1;
- }
-
- if (!TestSelectW5() ||
- !TestSelectW7()) {
- return 1;
- }
-
- return FileTestMain([](FileTest *t, void *) -> bool {
+TEST(P256_X86_64Test, TestVectors) {
+ return FileTestGTest("crypto/fipsmodule/ec/p256-x86_64_tests.txt",
+ [](FileTest *t) {
if (t->GetParameter() == "Negate") {
- return TestNegate(t);
+ TestNegate(t);
+ } else if (t->GetParameter() == "MulMont") {
+ TestMulMont(t);
+ } else if (t->GetParameter() == "FromMont") {
+ TestFromMont(t);
+ } else if (t->GetParameter() == "PointAdd") {
+ TestPointAdd(t);
+ } else {
+ FAIL() << "Unknown test type:" << t->GetParameter();
}
- if (t->GetParameter() == "MulMont") {
- return TestMulMont(t);
- }
- if (t->GetParameter() == "FromMont") {
- return TestFromMont(t);
- }
- if (t->GetParameter() == "PointAdd") {
- return TestPointAdd(t);
- }
-
- t->PrintLine("Unknown test type: %s", t->GetParameter().c_str());
- return false;
- }, nullptr, argv[1]);
-}
-
-#else
-
-int main() {
- printf("PASS\n");
- return 0;
+ });
}
#endif
diff --git a/sources.cmake b/sources.cmake
index 3947c93..11fc61a 100644
--- a/sources.cmake
+++ b/sources.cmake
@@ -41,6 +41,7 @@
crypto/evp/evp_tests.txt
crypto/fipsmodule/aes/aes_tests.txt
crypto/fipsmodule/bn/bn_tests.txt
+ crypto/fipsmodule/ec/p256-x86_64_tests.txt
crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt
crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt
crypto/fipsmodule/modes/gcm_tests.txt
diff --git a/util/all_tests.json b/util/all_tests.json
index 49d89c8..b92a057 100644
--- a/util/all_tests.json
+++ b/util/all_tests.json
@@ -1,7 +1,6 @@
[
["crypto/crypto_test"],
["crypto/fipsmodule/example_mul"],
- ["crypto/fipsmodule/p256-x86_64_test", "crypto/fipsmodule/ec/p256-x86_64_tests.txt"],
["crypto/x509v3/tab_test"],
["crypto/x509v3/v3name_test"],
["decrepit/decrepit_test"],
diff --git a/util/embed_test_data.go b/util/embed_test_data.go
index cb7cc2e..ffc446b 100644
--- a/util/embed_test_data.go
+++ b/util/embed_test_data.go
@@ -46,7 +46,7 @@
case '"':
buf.WriteString(`\"`)
default:
- if unicode.IsPrint(rune(b)) {
+ if rune(b) > 127 || unicode.IsPrint(rune(b)) {
buf.WriteByte(b)
} else {
fmt.Fprintf(&buf, "\\x%02x", b)