57 #include <gtest/gtest.h>
67 #include "../ec/internal.h"
68 #include "../../test/file_test.h"
69 #include "../../test/test_util.h"
75 return bssl::UniquePtr<BIGNUM>(bn);
82 static const char kP[] =
"ffffffffffffffffffffffffffffffff7fffffff";
83 static const char kA[] =
"ffffffffffffffffffffffffffffffff7ffffffc";
84 static const char kB[] =
"1c97befc54bd7a8b65acf89f81d4d4adc565fa45";
85 static const char kX[] =
"4a96b5688ef573284664698968c38bb913cbfc82";
86 static const char kY[] =
"23a628553168947d59dcc912042351377ac5fb32";
87 static const char kN[] =
"0100000000000000000001f4c8f927aed3ca752257";
92 if (!
p || !
a || !
b || !
x || !
y || !
n) {
96 bssl::UniquePtr<EC_GROUP>
group(
119 int expected_result) {
125 bssl::UniquePtr<uint8_t> delete_der(der);
127 ECDSA_verify(0, digest, digest_len, der, der_len, eckey));
137 FAIL() <<
"Unknown API type.";
158 size_t buf_len = 2 * bn_len;
159 std::vector<uint8_t> raw_buf(buf_len);
165 size_t offset = raw_buf[10] % buf_len;
166 uint8_t dirt = raw_buf[11] ? raw_buf[11] : 1;
180 TEST(ECDSATest, BuiltinCurves) {
182 uint8_t digest[20], wrong_digest[20];
186 static const struct {
197 for (
const auto &curve : kCurves) {
200 bssl::UniquePtr<EC_GROUP>
group;
216 bssl::UniquePtr<EC_KEY> wrong_eckey(
EC_KEY_new());
227 std::vector<uint8_t> signature(sig_len);
229 ECDSA_sign(0, digest, 20, signature.data(), &sig_len, eckey.get()));
230 signature.resize(sig_len);
235 std::vector<uint8_t> signature2(sig_len);
237 ECDSA_sign(0, digest, 20, signature2.data(), &sig_len, eckey.get()));
238 signature2.resize(sig_len);
252 signature.size(), eckey.get()));
257 signature.size() - 1, eckey.get()));
261 bssl::UniquePtr<ECDSA_SIG> ecdsa_sig(
291 return (
bits / 8) + (7 + (
bits % 8)) / 8;
295 static const size_t kBits[] = {224, 256, 384, 521, 10000};
296 for (
size_t bits : kBits) {
303 std::vector<uint8_t>
bytes(order_len, 0xff);
318 if (!t->GetAttribute(&curve_name,
key)) {
322 if (curve_name ==
"P-224") {
325 if (curve_name ==
"P-256") {
326 return bssl::UniquePtr<EC_GROUP>(
329 if (curve_name ==
"P-384") {
332 if (curve_name ==
"P-521") {
335 if (curve_name ==
"secp160r1") {
347 if (!
ctx || !
p || !
a || !
b || !
x || !
y ||
353 bssl::UniquePtr<EC_GROUP>
ret(
370 std::vector<uint8_t>
bytes;
378 TEST(ECDSATest, VerifyTestVectors) {
379 FileTestGTest(
"crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt",
381 for (
bool custom_group : {
false,
true}) {
389 bssl::UniquePtr<BIGNUM>
x =
GetBIGNUM(t,
"X");
391 bssl::UniquePtr<BIGNUM>
y =
GetBIGNUM(t,
"Y");
393 bssl::UniquePtr<BIGNUM>
r =
GetBIGNUM(t,
"R");
395 bssl::UniquePtr<BIGNUM> s =
GetBIGNUM(t,
"S");
397 std::vector<uint8_t> digest;
408 group.get(), pub_key.get(),
x.get(),
y.get(),
nullptr));
414 t->HasAttribute(
"Invalid") ? 0 : 1,
420 TEST(ECDSATest, SignTestVectors) {
421 FileTestGTest(
"crypto/fipsmodule/ecdsa/ecdsa_sign_tests.txt",
423 for (
bool custom_group : {
false,
true}) {
431 bssl::UniquePtr<BIGNUM> priv_key =
GetBIGNUM(t,
"Private");
433 bssl::UniquePtr<BIGNUM>
x =
GetBIGNUM(t,
"X");
435 bssl::UniquePtr<BIGNUM>
y =
GetBIGNUM(t,
"Y");
437 std::vector<uint8_t>
k;
439 bssl::UniquePtr<BIGNUM>
r =
GetBIGNUM(t,
"R");
441 bssl::UniquePtr<BIGNUM> s =
GetBIGNUM(t,
"S");
443 std::vector<uint8_t> digest;
453 group.get(), pub_key.get(),
x.get(),
y.get(),
nullptr));
457 bssl::UniquePtr<ECDSA_SIG> sig(
459 digest.data(), digest.size(),
key.get(),
k.data(),
k.size()));