Index: webrtc/base/sslidentity_unittest.cc |
diff --git a/webrtc/base/sslidentity_unittest.cc b/webrtc/base/sslidentity_unittest.cc |
index fd754114288c1cd7a9b97bc429973df42a5ec474..dc033924cdfb1cd0a0ee859906856df04dbe5c82 100644 |
--- a/webrtc/base/sslidentity_unittest.cc |
+++ b/webrtc/base/sslidentity_unittest.cc |
@@ -38,33 +38,46 @@ const unsigned char kTestCertSha1[] = {0xA6, 0xC8, 0x59, 0xEA, |
class SSLIdentityTest : public testing::Test { |
public: |
- SSLIdentityTest() : |
- identity1_(), identity2_() { |
- } |
+ SSLIdentityTest() |
+ : identityrsa1_(), |
+ identityrsa2_(), |
+ identityecdsa1_(), |
+ identityecdsa2_() {} |
~SSLIdentityTest() { |
} |
virtual void SetUp() { |
- identity1_.reset(SSLIdentity::Generate("test1")); |
- identity2_.reset(SSLIdentity::Generate("test2")); |
+ identityrsa1_.reset(SSLIdentity::Generate("test1", rtc::KT_RSA)); |
+ identityrsa2_.reset(SSLIdentity::Generate("test2", rtc::KT_RSA)); |
+ identityecdsa1_.reset(SSLIdentity::Generate("test3", rtc::KT_ECDSA)); |
+ identityecdsa2_.reset(SSLIdentity::Generate("test4", rtc::KT_ECDSA)); |
- ASSERT_TRUE(identity1_); |
- ASSERT_TRUE(identity2_); |
+ ASSERT_TRUE(identityrsa1_); |
+ ASSERT_TRUE(identityrsa2_); |
+ ASSERT_TRUE(identityecdsa1_); |
+ ASSERT_TRUE(identityecdsa2_); |
- test_cert_.reset( |
- rtc::SSLCertificate::FromPEMString(kTestCertificate)); |
+ test_cert_.reset(rtc::SSLCertificate::FromPEMString(kTestCertificate)); |
ASSERT_TRUE(test_cert_); |
} |
void TestGetSignatureDigestAlgorithm() { |
std::string digest_algorithm; |
- // Both NSSIdentity::Generate and OpenSSLIdentity::Generate are |
- // hard-coded to generate RSA-SHA256 certificates. |
- ASSERT_TRUE(identity1_->certificate().GetSignatureDigestAlgorithm( |
+ |
+ ASSERT_TRUE(identityrsa1_->certificate().GetSignatureDigestAlgorithm( |
+ &digest_algorithm)); |
+ ASSERT_EQ(rtc::DIGEST_SHA_256, digest_algorithm); |
+ |
+ ASSERT_TRUE(identityrsa2_->certificate().GetSignatureDigestAlgorithm( |
+ &digest_algorithm)); |
+ ASSERT_EQ(rtc::DIGEST_SHA_256, digest_algorithm); |
+ |
+ ASSERT_TRUE(identityecdsa1_->certificate().GetSignatureDigestAlgorithm( |
&digest_algorithm)); |
ASSERT_EQ(rtc::DIGEST_SHA_256, digest_algorithm); |
- ASSERT_TRUE(identity2_->certificate().GetSignatureDigestAlgorithm( |
+ |
+ ASSERT_TRUE(identityecdsa2_->certificate().GetSignatureDigestAlgorithm( |
&digest_algorithm)); |
ASSERT_EQ(rtc::DIGEST_SHA_256, digest_algorithm); |
@@ -75,38 +88,59 @@ class SSLIdentityTest : public testing::Test { |
void TestDigest(const std::string &algorithm, size_t expected_len, |
const unsigned char *expected_digest = NULL) { |
- unsigned char digest1[64]; |
- unsigned char digest1b[64]; |
- unsigned char digest2[64]; |
- size_t digest1_len; |
- size_t digest1b_len; |
- size_t digest2_len; |
+ typedef unsigned char digest_type[64]; // 64 is the largest hash used here. |
juberti1
2015/07/03 03:15:18
proper style for this would be DigestType
torbjorng (webrtc)
2015/07/06 10:11:55
Done.
|
+ digest_type digest1; |
+ digest_type digest[4]; |
+ size_t digest_len; |
bool rv; |
- rv = identity1_->certificate().ComputeDigest(algorithm, |
- digest1, sizeof(digest1), |
- &digest1_len); |
+ ASSERT_TRUE(expected_len <= 64); |
+ |
+ // Record digests of our 4 identities. |
+ memset(digest[0], 0, expected_len); |
juberti1
2015/07/03 03:15:18
This seems like a lot of redundant code. Suggest e
torbjorng (webrtc)
2015/07/06 10:11:55
Done.
|
+ rv = identityrsa1_->certificate().ComputeDigest( |
+ algorithm, digest[0], sizeof(digest_type), &digest_len); |
EXPECT_TRUE(rv); |
- EXPECT_EQ(expected_len, digest1_len); |
+ EXPECT_EQ(expected_len, digest_len); |
- rv = identity1_->certificate().ComputeDigest(algorithm, |
- digest1b, sizeof(digest1b), |
- &digest1b_len); |
+ memset(digest[1], 0, expected_len); |
+ rv = identityrsa2_->certificate().ComputeDigest( |
+ algorithm, digest[1], sizeof(digest_type), &digest_len); |
EXPECT_TRUE(rv); |
- EXPECT_EQ(expected_len, digest1b_len); |
- EXPECT_EQ(0, memcmp(digest1, digest1b, expected_len)); |
+ EXPECT_EQ(expected_len, digest_len); |
+ memset(digest[2], 0, expected_len); |
+ rv = identityecdsa1_->certificate().ComputeDigest( |
+ algorithm, digest[2], sizeof(digest_type), &digest_len); |
+ EXPECT_TRUE(rv); |
+ EXPECT_EQ(expected_len, digest_len); |
- rv = identity2_->certificate().ComputeDigest(algorithm, |
- digest2, sizeof(digest2), |
- &digest2_len); |
+ memset(digest[3], 0, expected_len); |
+ rv = identityecdsa2_->certificate().ComputeDigest( |
+ algorithm, digest[3], sizeof(digest_type), &digest_len); |
EXPECT_TRUE(rv); |
- EXPECT_EQ(expected_len, digest2_len); |
- EXPECT_NE(0, memcmp(digest1, digest2, expected_len)); |
+ EXPECT_EQ(expected_len, digest_len); |
+ |
+ // Repeat digest computation for one identity as a sanity check. |
+ memset(digest1, 0xff, expected_len); |
+ rv = identityrsa1_->certificate().ComputeDigest( |
+ algorithm, digest1, sizeof(digest_type), &digest_len); |
+ EXPECT_TRUE(rv); |
+ EXPECT_EQ(expected_len, digest_len); |
+ EXPECT_EQ(0, memcmp(digest[0], digest1, expected_len)); |
+ |
+ // Sanity check that all four digests are unique. This could theoretically |
juberti1
2015/07/03 03:15:18
This seems like it might not be all that valuable
torbjorng (webrtc)
2015/07/06 10:11:55
I inherited this check from the old code, I only g
|
+ // fail, since SHA256 collisions have a non-zero probability. |
+ for (int i = 0; i < 4; i++) { |
+ for (int j = 0; j < 4; j++) { |
+ if (i != j) |
+ EXPECT_NE(0, memcmp(digest[i], digest[j], expected_len)); |
+ } |
+ } |
// If we have an expected hash for the test cert, check it. |
if (expected_digest) { |
juberti1
2015/07/03 03:15:18
This is only used in one case, so suggest factorin
torbjorng (webrtc)
2015/07/06 10:11:55
Done.
|
- unsigned char digest3[64]; |
+ digest_type digest3; |
size_t digest3_len; |
rv = test_cert_->ComputeDigest(algorithm, digest3, sizeof(digest3), |
@@ -118,8 +152,10 @@ class SSLIdentityTest : public testing::Test { |
} |
private: |
- rtc::scoped_ptr<SSLIdentity> identity1_; |
- rtc::scoped_ptr<SSLIdentity> identity2_; |
+ rtc::scoped_ptr<SSLIdentity> identityrsa1_; |
juberti1
2015/07/03 03:15:18
identiy_rsa1_, etc would be more readable
torbjorng (webrtc)
2015/07/06 10:11:55
Done.
|
+ rtc::scoped_ptr<SSLIdentity> identityrsa2_; |
+ rtc::scoped_ptr<SSLIdentity> identityecdsa1_; |
+ rtc::scoped_ptr<SSLIdentity> identityecdsa2_; |
rtc::scoped_ptr<rtc::SSLCertificate> test_cert_; |
}; |
@@ -148,7 +184,7 @@ TEST_F(SSLIdentityTest, DigestSHA512) { |
TestDigest(rtc::DIGEST_SHA_512, 64); |
} |
-TEST_F(SSLIdentityTest, FromPEMStrings) { |
+TEST_F(SSLIdentityTest, FromPEMStringsRSA) { |
static const char kRSA_PRIVATE_KEY_PEM[] = |
"-----BEGIN RSA PRIVATE KEY-----\n" |
"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n" |
@@ -186,6 +222,39 @@ TEST_F(SSLIdentityTest, FromPEMStrings) { |
EXPECT_EQ(kCERT_PEM, identity->certificate().ToPEMString()); |
} |
+#if SSL_USE_OPENSSL |
+// This will not work on NSS as PK11_ImportDERPrivateKeyInfoAndReturnKey is not |
+// ready for EC keys. Furthermore, NSSIdentity::FromPEMStrings is currently |
+// hardwired for RSA (the header matching via kPemTypeRsaPrivateKey needs |
+// trivial generalization). |
+TEST_F(SSLIdentityTest, FromPEMStringsEC) { |
+ static const char kRSA_PRIVATE_KEY_PEM[] = |
+ "-----BEGIN EC PRIVATE KEY-----\n" |
+ "MHcCAQEEIKkIztWLPbs4Y2zWv7VW2Ov4is2ifleCuPgRB8fRv3IkoAoGCCqGSM49\n" |
+ "AwEHoUQDQgAEDPV33NrhSdhg9cBRkUWUXnVMXc3h17i9ARbSmNgminKcBXb8/y8L\n" |
+ "A76cMWQPPM0ybHO8OS7ZVg2U/m+TwE1M2g==\n" |
+ "-----END EC PRIVATE KEY-----\n"; |
+ static const char kCERT_PEM[] = |
+ "-----BEGIN CERTIFICATE-----\n" |
+ "MIIB0jCCAXmgAwIBAgIJAMCjpFt9t6LMMAoGCCqGSM49BAMCMEUxCzAJBgNVBAYT\n" |
+ "AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn\n" |
+ "aXRzIFB0eSBMdGQwIBcNMTUwNjMwMTMwMTIyWhgPMjI4OTA0MTMxMzAxMjJaMEUx\n" |
+ "CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl\n" |
+ "cm5ldCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQM\n" |
+ "9Xfc2uFJ2GD1wFGRRZRedUxdzeHXuL0BFtKY2CaKcpwFdvz/LwsDvpwxZA88zTJs\n" |
+ "c7w5LtlWDZT+b5PATUzao1AwTjAdBgNVHQ4EFgQUYHq6nxNNIE832ZmaHc/noODO\n" |
+ "rtAwHwYDVR0jBBgwFoAUYHq6nxNNIE832ZmaHc/noODOrtAwDAYDVR0TBAUwAwEB\n" |
+ "/zAKBggqhkjOPQQDAgNHADBEAiAQRojsTyZG0BlKoU7gOt5h+yAMLl2cxmDtOIQr\n" |
+ "GWP/PwIgJynB4AUDsPT0DWmethOXYijB5sY5UPd9DvgmiS/Mr6s=\n" |
+ "-----END CERTIFICATE-----\n"; |
+ |
+ rtc::scoped_ptr<SSLIdentity> identity( |
+ SSLIdentity::FromPEMStrings(kRSA_PRIVATE_KEY_PEM, kCERT_PEM)); |
+ EXPECT_TRUE(identity); |
+ EXPECT_EQ(kCERT_PEM, identity->certificate().ToPEMString()); |
+} |
+#endif |
+ |
TEST_F(SSLIdentityTest, PemDerConversion) { |
std::string der; |
EXPECT_TRUE(SSLIdentity::PemToDer("CERTIFICATE", kTestCertificate, &der)); |