diff --git a/fizz/backend/openssl/crypto/signature/test/PeerCertVerify.cpp b/fizz/backend/openssl/crypto/signature/test/PeerCertVerify.cpp new file mode 100644 index 0000000000..ae02b7b7e1 --- /dev/null +++ b/fizz/backend/openssl/crypto/signature/test/PeerCertVerify.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include + +#include +#include +#include + +using namespace testing; + +namespace fizz { +namespace openssl { +namespace test { + +class VerifyTest : public Test, + public WithParamInterface {}; + +TEST_P(VerifyTest, PeerCertVerify) { + fizz::test::testCertVerify(GetParam(), openssl::CertUtils::makePeerCert); +} + +INSTANTIATE_TEST_SUITE_P( + SignatureTestVectors, + VerifyTest, + ValuesIn(fizz::test::kSignatureTestVectors)); + +} // namespace test +} // namespace openssl +} // namespace fizz diff --git a/fizz/crypto/test/Signature.cpp b/fizz/crypto/test/Signature.cpp new file mode 100644 index 0000000000..8e4e5be012 --- /dev/null +++ b/fizz/crypto/test/Signature.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include + +#include +#include +#include + +using namespace testing; + +namespace fizz { +namespace test { + +std::unique_ptr makeCertBuf(std::string certDer) { + return folly::IOBuf::copyBuffer(certDer.data(), certDer.size()); +} + +void testCertVerify( + SignatureTestData testCase, + std::unique_ptr (*makePeerCert)(Buf)) { + std::string certDer = folly::unhexlify(testCase.certDer); + std::string msg = folly::unhexlify(testCase.msg); + std::string sig = folly::unhexlify(testCase.sig); + + std::unique_ptr certBuf = makeCertBuf(certDer); + + if (!testCase.validCert) { + EXPECT_THROW(makePeerCert(makeCertBuf(certDer)), std::runtime_error); + return; + } + + // make sure move works + auto tempPeerCert = makePeerCert(makeCertBuf(certDer)); + + auto peerCert = std::move(tempPeerCert); + + // test getDER() + auto retDer = peerCert->getDER(); + ASSERT_TRUE(retDer.has_value()); + + ASSERT_EQ(memcmp(certDer.c_str(), retDer.value().c_str(), certDer.size()), 0); + + if (!testCase.validSig) { + EXPECT_THROW( + peerCert->verify( + testCase.sigScheme, + fizz::CertificateVerifyContext::Server, + folly::ByteRange( + reinterpret_cast(msg.c_str()), + msg.size()), + folly::ByteRange( + reinterpret_cast(sig.c_str()), + sig.size())), + std::runtime_error); + } else { + EXPECT_NO_THROW(peerCert->verify( + testCase.sigScheme, + fizz::CertificateVerifyContext::Server, + folly::ByteRange( + reinterpret_cast(msg.c_str()), msg.size()), + folly::ByteRange( + reinterpret_cast(sig.c_str()), sig.size()))); + } +} +} // namespace test +} // namespace fizz diff --git a/fizz/crypto/test/Signature.h b/fizz/crypto/test/Signature.h new file mode 100644 index 0000000000..bc377c49cd --- /dev/null +++ b/fizz/crypto/test/Signature.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include + +#include +#include + +namespace fizz { +namespace test { + +void testCertVerify( + SignatureTestData testCase, + std::unique_ptr (*makePeerCert)(Buf)); +} // namespace test +} // namespace fizz diff --git a/fizz/crypto/test/SignatureTestData.h b/fizz/crypto/test/SignatureTestData.h index 5fc6df6042..f4a3b94831 100644 --- a/fizz/crypto/test/SignatureTestData.h +++ b/fizz/crypto/test/SignatureTestData.h @@ -5,6 +5,8 @@ * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. */ +#pragma once + #include namespace fizz::test {