Take 2 for: Add support for SymmetricKey to import raw keys when using NSS.

BUG=48701
TEST=unittests

Review URL: http://codereview.chromium.org/2985008

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@53077 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/base/crypto/symmetric_key_unittest.cc b/base/crypto/symmetric_key_unittest.cc
index 9be846ce..341e45b 100644
--- a/base/crypto/symmetric_key_unittest.cc
+++ b/base/crypto/symmetric_key_unittest.cc
@@ -13,7 +13,7 @@
 TEST(SymmetricKeyTest, GenerateRandomKey) {
   scoped_ptr<base::SymmetricKey> key(
       base::SymmetricKey::GenerateRandomKey(base::SymmetricKey::AES, 256));
-  EXPECT_TRUE(NULL != key.get());
+  ASSERT_TRUE(NULL != key.get());
   std::string raw_key;
   EXPECT_TRUE(key->GetRawKey(&raw_key));
   EXPECT_EQ(32U, raw_key.size());
@@ -22,13 +22,54 @@
   // (Note: this has a one-in-10^77 chance of failure!)
   scoped_ptr<base::SymmetricKey> key2(
       base::SymmetricKey::GenerateRandomKey(base::SymmetricKey::AES, 256));
-  EXPECT_TRUE(NULL != key2.get());
+  ASSERT_TRUE(NULL != key2.get());
   std::string raw_key2;
   EXPECT_TRUE(key2->GetRawKey(&raw_key2));
   EXPECT_EQ(32U, raw_key2.size());
   EXPECT_NE(raw_key, raw_key2);
 }
 
+// TODO(albertb): Port this test to Mac.
+#if defined(USE_NSS) || defined(OS_WIN)
+TEST(SymmetricKeyTest, ImportGeneratedKey) {
+  scoped_ptr<base::SymmetricKey> key1(
+      base::SymmetricKey::GenerateRandomKey(base::SymmetricKey::AES, 256));
+  ASSERT_TRUE(NULL != key1.get());
+  std::string raw_key1;
+  EXPECT_TRUE(key1->GetRawKey(&raw_key1));
+
+  scoped_ptr<base::SymmetricKey> key2(
+      base::SymmetricKey::Import(base::SymmetricKey::AES, raw_key1));
+  ASSERT_TRUE(NULL != key2.get());
+
+  std::string raw_key2;
+  EXPECT_TRUE(key2->GetRawKey(&raw_key2));
+
+  EXPECT_EQ(raw_key1, raw_key2);
+}
+#endif  // USE_NSS || OS_WIN
+
+// TODO(albertb): Port this test to Win and Mac.
+#if defined(USE_NSS)
+TEST(SymmetricKeyTest, ImportDerivedKey) {
+  scoped_ptr<base::SymmetricKey> key1(
+      base::SymmetricKey::DeriveKeyFromPassword(base::SymmetricKey::HMAC_SHA1,
+                                                "password", "salt", 1024, 160));
+  ASSERT_TRUE(NULL != key1.get());
+  std::string raw_key1;
+  EXPECT_TRUE(key1->GetRawKey(&raw_key1));
+
+  scoped_ptr<base::SymmetricKey> key2(
+      base::SymmetricKey::Import(base::SymmetricKey::HMAC_SHA1, raw_key1));
+  ASSERT_TRUE(NULL != key2.get());
+
+  std::string raw_key2;
+  EXPECT_TRUE(key2->GetRawKey(&raw_key2));
+
+  EXPECT_EQ(raw_key1, raw_key2);
+}
+#endif  // USE_NSS
+
 struct PBKDF2TestVector {
   const char* password;
   const char* salt;
@@ -37,8 +78,6 @@
   const uint8 expected[21];  // string literals need 1 extra NUL byte
 };
 
-// These are the test vectors suggested in:
-// http://www.ietf.org/id/draft-josefsson-pbkdf2-test-vectors-00.txt
 static const PBKDF2TestVector test_vectors[] = {
   // These tests come from
   // http://www.ietf.org/id/draft-josefsson-pbkdf2-test-vectors-00.txt