Index: components/proximity_auth/cryptauth/fake_secure_message_delegate_unittest.cc |
diff --git a/components/proximity_auth/cryptauth/fake_secure_message_delegate_unittest.cc b/components/proximity_auth/cryptauth/fake_secure_message_delegate_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..12a02cd6068021b5e0529dda01802100ecf84075 |
--- /dev/null |
+++ b/components/proximity_auth/cryptauth/fake_secure_message_delegate_unittest.cc |
@@ -0,0 +1,196 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "components/proximity_auth/cryptauth/fake_secure_message_delegate.h" |
+ |
+#include "base/bind.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace proximity_auth { |
+ |
+namespace { |
+ |
+const char kTestPublicKey[] = "the private key is in another castle"; |
+const char kPayload[] = "500 tons of uranium"; |
+const char kSymmetricKey[] = "hunter2"; |
+const char kPublicMetadata[] = "brought to you by our sponsors"; |
+const char kAssociatedData[] = "save 20% bytes on your nonce insurance"; |
+const char kVerificationKeyId[] = "the one with the red stripes"; |
+const char kDecryptionKeyId[] = "it's in your pocket somewhere"; |
+ |
+// Callback for saving the result of GenerateKeys(). |
+void SaveKeyPair(std::string* private_key_out, |
+ std::string* public_key_out, |
+ const std::string& private_key, |
+ const std::string& public_key) { |
+ *private_key_out = private_key; |
+ *public_key_out = public_key; |
+} |
+ |
+// Callback for saving the result of DeriveKey() and CreateSecureMessage(). |
+void SaveString(std::string* out, const std::string& value) { |
+ *out = value; |
+} |
+ |
+// Callback for saving the result of UnwrapSecureMessage(). |
+void SaveUnwrapResults(std::string* payload_out, |
+ securemessage::Header* header_out, |
+ bool verified, |
+ const std::string& payload, |
+ const securemessage::Header& header) { |
+ ASSERT_TRUE(verified); |
+ *payload_out = payload; |
+ *header_out = header; |
+} |
+ |
+// Returns the CreateOptions struct to create the test message. |
+SecureMessageDelegate::CreateOptions GetCreateOptions( |
+ securemessage::EncScheme encryption_scheme, |
+ securemessage::SigScheme signature_scheme) { |
+ SecureMessageDelegate::CreateOptions create_options; |
+ create_options.encryption_scheme = encryption_scheme; |
+ create_options.signature_scheme = signature_scheme; |
+ create_options.public_metadata = kPublicMetadata; |
+ create_options.associated_data = kAssociatedData; |
+ create_options.verification_key_id = kVerificationKeyId; |
+ create_options.decryption_key_id = kDecryptionKeyId; |
+ return create_options; |
+} |
+ |
+// Returns the UnwrapOptions struct to unwrap the test message. |
+SecureMessageDelegate::UnwrapOptions GetUnwrapOptions( |
+ securemessage::EncScheme encryption_scheme, |
+ securemessage::SigScheme signature_scheme) { |
+ SecureMessageDelegate::UnwrapOptions unwrap_options; |
+ unwrap_options.encryption_scheme = encryption_scheme; |
+ unwrap_options.signature_scheme = signature_scheme; |
+ unwrap_options.associated_data = kAssociatedData; |
+ return unwrap_options; |
+} |
+ |
+void CheckSerializedSecureMessage( |
+ const std::string& serialized_message, |
+ const SecureMessageDelegate::CreateOptions& create_options) { |
+ securemessage::SecureMessage secure_message; |
+ ASSERT_TRUE(secure_message.ParseFromString(serialized_message)); |
+ securemessage::HeaderAndBody header_and_body; |
+ ASSERT_TRUE( |
+ header_and_body.ParseFromString(secure_message.header_and_body())); |
+ |
+ const securemessage::Header& header = header_and_body.header(); |
+ EXPECT_EQ(create_options.signature_scheme, header.signature_scheme()); |
+ EXPECT_EQ(create_options.encryption_scheme, header.encryption_scheme()); |
+ EXPECT_EQ(create_options.verification_key_id, header.verification_key_id()); |
+ EXPECT_EQ(create_options.decryption_key_id, header.decryption_key_id()); |
+ EXPECT_EQ(create_options.public_metadata, header.public_metadata()); |
+} |
+ |
+} // namespace |
+ |
+class ProximityAuthFakeSecureMessageDelegateTest : public testing::Test { |
+ protected: |
+ ProximityAuthFakeSecureMessageDelegateTest() {} |
+ |
+ FakeSecureMessageDelegate delegate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ProximityAuthFakeSecureMessageDelegateTest); |
+}; |
+ |
+TEST_F(ProximityAuthFakeSecureMessageDelegateTest, GenerateKeyPair) { |
+ std::string public_key1, private_key1; |
+ delegate_.GenerateKeyPair( |
+ base::Bind(&SaveKeyPair, &public_key1, &private_key1)); |
+ EXPECT_NE(private_key1, public_key1); |
+ |
+ std::string public_key2, private_key2; |
+ delegate_.GenerateKeyPair( |
+ base::Bind(&SaveKeyPair, &public_key2, &private_key2)); |
+ EXPECT_NE(private_key2, public_key2); |
+ |
+ EXPECT_NE(public_key1, public_key2); |
+ EXPECT_NE(private_key1, private_key2); |
+ |
+ delegate_.set_next_public_key(kTestPublicKey); |
+ std::string public_key3, private_key3; |
+ delegate_.GenerateKeyPair( |
+ base::Bind(&SaveKeyPair, &public_key3, &private_key3)); |
+ EXPECT_EQ(kTestPublicKey, public_key3); |
+ EXPECT_NE(private_key3, public_key3); |
+ |
+ EXPECT_NE(public_key1, public_key3); |
+ EXPECT_NE(private_key1, private_key3); |
+} |
+ |
+TEST_F(ProximityAuthFakeSecureMessageDelegateTest, DeriveKey) { |
+ delegate_.set_next_public_key("key_pair_1"); |
+ std::string public_key1, private_key1; |
+ delegate_.GenerateKeyPair( |
+ base::Bind(&SaveKeyPair, &public_key1, &private_key1)); |
+ |
+ delegate_.set_next_public_key("key_pair_2"); |
+ std::string public_key2, private_key2; |
+ delegate_.GenerateKeyPair( |
+ base::Bind(&SaveKeyPair, &public_key2, &private_key2)); |
+ |
+ std::string symmetric_key1, symmetric_key2; |
+ delegate_.DeriveKey(private_key1, public_key2, |
+ base::Bind(&SaveString, &symmetric_key1)); |
+ delegate_.DeriveKey(private_key2, public_key1, |
+ base::Bind(&SaveString, &symmetric_key2)); |
+ |
+ EXPECT_EQ(symmetric_key1, symmetric_key2); |
+} |
+ |
+TEST_F(ProximityAuthFakeSecureMessageDelegateTest, |
+ CreateAndUnwrapWithSymmetricKey) { |
+ // Create SecureMessage using symmetric key. |
+ SecureMessageDelegate::CreateOptions create_options = |
+ GetCreateOptions(securemessage::AES_256_CBC, securemessage::HMAC_SHA256); |
+ std::string serialized_message; |
+ delegate_.CreateSecureMessage(kPayload, kSymmetricKey, create_options, |
+ base::Bind(&SaveString, &serialized_message)); |
+ |
+ CheckSerializedSecureMessage(serialized_message, create_options); |
+ |
+ // Unwrap SecureMessage using symmetric key. |
+ SecureMessageDelegate::UnwrapOptions unwrap_options = |
+ GetUnwrapOptions(securemessage::AES_256_CBC, securemessage::HMAC_SHA256); |
+ std::string payload; |
+ securemessage::Header header; |
+ delegate_.UnwrapSecureMessage( |
+ serialized_message, kSymmetricKey, unwrap_options, |
+ base::Bind(&SaveUnwrapResults, &payload, &header)); |
+ |
+ EXPECT_EQ(kPayload, payload); |
+} |
+ |
+TEST_F(ProximityAuthFakeSecureMessageDelegateTest, |
+ CreateAndUnwrapWithAsymmetricKey) { |
+ delegate_.set_next_public_key(kTestPublicKey); |
+ std::string public_key, private_key; |
+ delegate_.GenerateKeyPair( |
+ base::Bind(&SaveKeyPair, &public_key, &private_key)); |
+ |
+ // Create SecureMessage using asymmetric key. |
+ SecureMessageDelegate::CreateOptions create_options = |
+ GetCreateOptions(securemessage::NONE, securemessage::ECDSA_P256_SHA256); |
+ std::string serialized_message; |
+ delegate_.CreateSecureMessage(kPayload, private_key, create_options, |
+ base::Bind(&SaveString, &serialized_message)); |
+ |
+ CheckSerializedSecureMessage(serialized_message, create_options); |
+ |
+ // Unwrap SecureMessage using symmetric key. |
+ SecureMessageDelegate::UnwrapOptions unwrap_options = |
+ GetUnwrapOptions(securemessage::NONE, securemessage::ECDSA_P256_SHA256); |
+ std::string payload; |
+ securemessage::Header header; |
+ delegate_.UnwrapSecureMessage( |
+ serialized_message, public_key, unwrap_options, |
+ base::Bind(&SaveUnwrapResults, &payload, &header)); |
+ |
+ EXPECT_EQ(kPayload, payload); |
+} |
+ |
+} // proximity_auth |