Minimal implementation of Widevine MediaCAS ECMG.
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=226515998
This commit is contained in:
@@ -355,23 +355,23 @@ const bool kTestDevCodeSigningCertFlagValue = true;
|
||||
|
||||
TEST(X509CertTest, LoadCert) {
|
||||
X509Cert test_cert;
|
||||
EXPECT_EQ(util::OkStatus(),
|
||||
EXPECT_EQ(OkStatus(),
|
||||
test_cert.LoadDer(absl::HexStringToBytes(kTestRootCaDerCert)));
|
||||
EXPECT_EQ(util::OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
EXPECT_EQ(OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
// TODO(user): Add more specific status checks to failure tests.
|
||||
EXPECT_NE(util::OkStatus(), test_cert.LoadDer("bad cert"));
|
||||
EXPECT_NE(util::OkStatus(), test_cert.LoadPem("bad cert"));
|
||||
EXPECT_NE(util::OkStatus(), test_cert.LoadDer(""));
|
||||
EXPECT_NE(util::OkStatus(), test_cert.LoadPem(""));
|
||||
EXPECT_NE(OkStatus(), test_cert.LoadDer("bad cert"));
|
||||
EXPECT_NE(OkStatus(), test_cert.LoadPem("bad cert"));
|
||||
EXPECT_NE(OkStatus(), test_cert.LoadDer(""));
|
||||
EXPECT_NE(OkStatus(), test_cert.LoadPem(""));
|
||||
}
|
||||
|
||||
TEST(X509CertTest, VerifySignature) {
|
||||
X509Cert test_cert;
|
||||
ASSERT_EQ(util::OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
ASSERT_EQ(OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
std::string message(absl::HexStringToBytes(kTestMessage));
|
||||
std::string signature;
|
||||
ASSERT_EQ(util::OkStatus(), GenerateRsaSignatureSha256Pkcs1(
|
||||
kTestCertPrivateKey, message, &signature));
|
||||
ASSERT_EQ(OkStatus(), GenerateRsaSignatureSha256Pkcs1(kTestCertPrivateKey,
|
||||
message, &signature));
|
||||
std::unique_ptr<RsaPublicKey> pub_key(test_cert.GetRsaPublicKey());
|
||||
ASSERT_TRUE(pub_key);
|
||||
EXPECT_TRUE(pub_key->VerifySignatureSha256Pkcs7(message, signature));
|
||||
@@ -384,7 +384,7 @@ TEST(X509CertTest, VerifySignature) {
|
||||
|
||||
TEST(X509CertTest, GetSubjectNameField) {
|
||||
X509Cert test_cert;
|
||||
ASSERT_EQ(util::OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
ASSERT_EQ(OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
EXPECT_EQ(kTestPemCertSubjectField_C, test_cert.GetSubjectNameField("C"));
|
||||
EXPECT_EQ(kTestPemCertSubjectField_CN, test_cert.GetSubjectNameField("CN"));
|
||||
EXPECT_EQ("", test_cert.GetSubjectNameField("invalid_field"));
|
||||
@@ -392,13 +392,13 @@ TEST(X509CertTest, GetSubjectNameField) {
|
||||
|
||||
TEST(X509CertTest, GetSerialNumber) {
|
||||
X509Cert test_cert;
|
||||
ASSERT_EQ(util::OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
ASSERT_EQ(OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
EXPECT_EQ(kTestPemCertSerialNumber, test_cert.GetSerialNumber());
|
||||
}
|
||||
|
||||
TEST(X509CertTest, GetNotBeforeSeconds) {
|
||||
X509Cert test_cert;
|
||||
ASSERT_EQ(util::OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
ASSERT_EQ(OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
int64_t not_before_seconds = 0;
|
||||
ASSERT_TRUE(test_cert.GetNotBeforeSeconds(¬_before_seconds));
|
||||
EXPECT_EQ(kTestPemCertNotBeforeSeconds, not_before_seconds);
|
||||
@@ -406,7 +406,7 @@ TEST(X509CertTest, GetNotBeforeSeconds) {
|
||||
|
||||
TEST(X509CertTest, GetNotAfterSeconds) {
|
||||
X509Cert test_cert;
|
||||
ASSERT_EQ(util::OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
ASSERT_EQ(OkStatus(), test_cert.LoadPem(kTestPemCert));
|
||||
int64_t not_after_seconds = 0;
|
||||
ASSERT_TRUE(test_cert.GetNotAfterSeconds(¬_after_seconds));
|
||||
EXPECT_EQ(kTestPemCertNotAfterSeconds, not_after_seconds);
|
||||
@@ -414,7 +414,7 @@ TEST(X509CertTest, GetNotAfterSeconds) {
|
||||
|
||||
TEST(X509CertTest, CertChain) {
|
||||
X509CertChain test_chain;
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
ASSERT_EQ(2, test_chain.GetNumCerts());
|
||||
EXPECT_FALSE(test_chain.GetCert(0) == NULL);
|
||||
EXPECT_FALSE(test_chain.GetCert(1) == NULL);
|
||||
@@ -423,7 +423,7 @@ TEST(X509CertTest, CertChain) {
|
||||
|
||||
TEST(X509CertTest, IsCaCertificate) {
|
||||
X509CertChain test_chain;
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
ASSERT_EQ(2, test_chain.GetNumCerts());
|
||||
EXPECT_FALSE(test_chain.GetCert(0)->IsCaCertificate());
|
||||
EXPECT_TRUE(test_chain.GetCert(1)->IsCaCertificate());
|
||||
@@ -431,84 +431,84 @@ TEST(X509CertTest, IsCaCertificate) {
|
||||
|
||||
TEST(X509CertTest, ChainVerificationPem) {
|
||||
std::unique_ptr<X509Cert> ca_cert(new X509Cert);
|
||||
ASSERT_EQ(util::OkStatus(),
|
||||
ASSERT_EQ(OkStatus(),
|
||||
ca_cert->LoadDer(absl::HexStringToBytes(kTestRootCaDerCert)));
|
||||
X509CA ca(ca_cert.release());
|
||||
X509CertChain test_chain;
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
EXPECT_EQ(util::OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestPemCert));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
EXPECT_EQ(OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestPemCert));
|
||||
ASSERT_EQ(1, test_chain.GetNumCerts());
|
||||
EXPECT_NE(util::OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
EXPECT_EQ(util::OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
EXPECT_NE(OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
EXPECT_EQ(OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
}
|
||||
|
||||
TEST(X509CertTest, ChainVerificationPkcs7) {
|
||||
std::unique_ptr<X509Cert> ca_cert(new X509Cert);
|
||||
ASSERT_EQ(util::OkStatus(),
|
||||
ASSERT_EQ(OkStatus(),
|
||||
ca_cert->LoadDer(absl::HexStringToBytes(kTestRootCaDerCert)));
|
||||
X509CA ca(ca_cert.release());
|
||||
X509CertChain test_chain;
|
||||
ASSERT_EQ(util::OkStatus(),
|
||||
ASSERT_EQ(OkStatus(),
|
||||
test_chain.LoadPkcs7(absl::HexStringToBytes(kTestPk7CertChain)));
|
||||
EXPECT_EQ(util::OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestPemCert));
|
||||
EXPECT_EQ(OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestPemCert));
|
||||
ASSERT_EQ(1, test_chain.GetNumCerts());
|
||||
EXPECT_NE(util::OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
EXPECT_EQ(util::OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
EXPECT_NE(OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
EXPECT_EQ(OkStatus(), ca.VerifyCertChain(test_chain));
|
||||
}
|
||||
|
||||
TEST(X509CertTest, VerifyCertWithChainIca) {
|
||||
std::unique_ptr<X509Cert> ca_cert(new X509Cert);
|
||||
ASSERT_EQ(util::OkStatus(), ca_cert->LoadPem(kTestRootCaPemCert));
|
||||
ASSERT_EQ(OkStatus(), ca_cert->LoadPem(kTestRootCaPemCert));
|
||||
X509CA ca(ca_cert.release());
|
||||
|
||||
// Verify the ICA with the root succeeds.
|
||||
X509CertChain test_chain;
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestRootCaPemCert));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestRootCaPemCert));
|
||||
ASSERT_EQ(1, test_chain.GetNumCerts());
|
||||
X509Cert ica_cert;
|
||||
ASSERT_EQ(util::OkStatus(), ica_cert.LoadPem(kTestPemIca));
|
||||
EXPECT_EQ(util::OkStatus(), ca.VerifyCertWithChain(ica_cert, test_chain));
|
||||
ASSERT_EQ(OkStatus(), ica_cert.LoadPem(kTestPemIca));
|
||||
EXPECT_EQ(OkStatus(), ca.VerifyCertWithChain(ica_cert, test_chain));
|
||||
}
|
||||
|
||||
TEST(X509CertTest, VerifyCertWithChainLeaf) {
|
||||
std::unique_ptr<X509Cert> ca_cert(new X509Cert);
|
||||
ASSERT_EQ(util::OkStatus(), ca_cert->LoadPem(kTestRootCaPemCert));
|
||||
ASSERT_EQ(OkStatus(), ca_cert->LoadPem(kTestRootCaPemCert));
|
||||
X509CA ca(ca_cert.release());
|
||||
|
||||
// Verify the leaf with the root and ICA succeeds.
|
||||
X509CertChain test_chain;
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestPemIca));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestPemIca));
|
||||
ASSERT_EQ(1, test_chain.GetNumCerts());
|
||||
X509Cert leaf_cert;
|
||||
ASSERT_EQ(util::OkStatus(), leaf_cert.LoadPem(kTestPemCert));
|
||||
EXPECT_EQ(util::OkStatus(), ca.VerifyCertWithChain(leaf_cert, test_chain));
|
||||
ASSERT_EQ(OkStatus(), leaf_cert.LoadPem(kTestPemCert));
|
||||
EXPECT_EQ(OkStatus(), ca.VerifyCertWithChain(leaf_cert, test_chain));
|
||||
}
|
||||
|
||||
TEST(X509CertTest, VerifyCertWithChainLeafMissincIca) {
|
||||
std::unique_ptr<X509Cert> ca_cert(new X509Cert);
|
||||
ASSERT_EQ(util::OkStatus(), ca_cert->LoadPem(kTestRootCaPemCert));
|
||||
ASSERT_EQ(OkStatus(), ca_cert->LoadPem(kTestRootCaPemCert));
|
||||
X509CA ca(ca_cert.release());
|
||||
|
||||
// Verify the leaf with only the root fails (ICA missing).
|
||||
X509CertChain test_chain;
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestRootCaPemCert));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestRootCaPemCert));
|
||||
ASSERT_EQ(1, test_chain.GetNumCerts());
|
||||
X509Cert leaf_cert;
|
||||
ASSERT_EQ(util::OkStatus(), leaf_cert.LoadPem(kTestPemCert));
|
||||
EXPECT_NE(util::OkStatus(), ca.VerifyCertWithChain(leaf_cert, test_chain));
|
||||
ASSERT_EQ(OkStatus(), leaf_cert.LoadPem(kTestPemCert));
|
||||
EXPECT_NE(OkStatus(), ca.VerifyCertWithChain(leaf_cert, test_chain));
|
||||
}
|
||||
|
||||
TEST(X509CertTest, GetPkcs7) {
|
||||
X509CertChain test_chain;
|
||||
ASSERT_EQ(util::OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
ASSERT_EQ(OkStatus(), test_chain.LoadPem(kTestPemCertChain));
|
||||
std::string pkcs7_certificate = test_chain.GetPkcs7();
|
||||
ASSERT_NE(pkcs7_certificate.size(), 0);
|
||||
X509CertChain new_test_chain;
|
||||
ASSERT_EQ(util::OkStatus(), new_test_chain.LoadPkcs7(pkcs7_certificate));
|
||||
ASSERT_EQ(OkStatus(), new_test_chain.LoadPkcs7(pkcs7_certificate));
|
||||
ASSERT_EQ(test_chain.GetNumCerts(), new_test_chain.GetNumCerts());
|
||||
for (int i = 0; i < test_chain.GetNumCerts(); i++) {
|
||||
ASSERT_EQ(test_chain.GetCert(i)->GetPem(),
|
||||
@@ -518,12 +518,12 @@ TEST(X509CertTest, GetPkcs7) {
|
||||
|
||||
TEST(X509CertTest, BooleanExtension) {
|
||||
std::unique_ptr<X509Cert> cert1(new X509Cert);
|
||||
ASSERT_EQ(util::OkStatus(), cert1->LoadPem(kTestPemCert));
|
||||
ASSERT_EQ(OkStatus(), cert1->LoadPem(kTestPemCert));
|
||||
bool extension_value;
|
||||
EXPECT_FALSE(cert1->GetV3BooleanExtension(kDevCertFlagOid, &extension_value));
|
||||
|
||||
std::unique_ptr<X509Cert> cert2(new X509Cert);
|
||||
ASSERT_EQ(util::OkStatus(), cert2->LoadPem(kTestDevCodeSigningCert));
|
||||
ASSERT_EQ(OkStatus(), cert2->LoadPem(kTestDevCodeSigningCert));
|
||||
ASSERT_TRUE(cert2->GetV3BooleanExtension(kDevCertFlagOid, &extension_value));
|
||||
EXPECT_EQ(kTestDevCodeSigningCertFlagValue, extension_value);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user