Index: chromeos/dbus/fake_easy_unlock_client_unittest.cc |
diff --git a/chromeos/dbus/fake_easy_unlock_client_unittest.cc b/chromeos/dbus/fake_easy_unlock_client_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3e65e93010923c41881794e6fbc7ac1294ba3c6b |
--- /dev/null |
+++ b/chromeos/dbus/fake_easy_unlock_client_unittest.cc |
@@ -0,0 +1,253 @@ |
+// 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 "chromeos/dbus/fake_easy_unlock_client.h" |
+ |
+#include <string> |
+ |
+#include "base/bind.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+ |
+// Callback for |GenerateEcP256KeyPair| method. Saves keys returned by the |
+// method in |private_key_target| and |public_key_target|. |
+void RecordKeyPair(std::string* private_key_target, |
+ std::string* public_key_target, |
+ const std::string& private_key_source, |
+ const std::string& public_key_source) { |
+ *private_key_target = private_key_source; |
+ *public_key_target = public_key_source; |
+} |
+ |
+// Callback for |EasyUnlockClient| methods that return a single piece of data. |
+// It saves the returned data in |data_target|. |
+void RecordData(std::string* data_target, |
+ const std::string& data_source) { |
+ *data_target = data_source; |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, GenerateEcP256KeyPair) { |
+ chromeos::FakeEasyUnlockClient client; |
+ |
+ std::string private_key_1; |
+ std::string public_key_1; |
+ client.GenerateEcP256KeyPair( |
+ base::Bind(&RecordKeyPair, &private_key_1, &public_key_1)); |
+ ASSERT_EQ("{\"ec_p256_private_key\": 1}", private_key_1); |
+ ASSERT_EQ("{\"ec_p256_public_key\": 1}", public_key_1); |
+ |
+ std::string private_key_2; |
+ std::string public_key_2; |
+ client.GenerateEcP256KeyPair( |
+ base::Bind(&RecordKeyPair, &private_key_2, &public_key_2)); |
+ ASSERT_EQ("{\"ec_p256_private_key\": 2}", private_key_2); |
+ ASSERT_EQ("{\"ec_p256_public_key\": 2}", public_key_2); |
+ |
+ EXPECT_NE(private_key_1, private_key_2); |
+ EXPECT_NE(public_key_1, public_key_2); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, IsEcP256KeyPair) { |
+ ASSERT_TRUE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair( |
+ "{\"ec_p256_private_key\": 12}", |
+ "{\"ec_p256_public_key\": 12}")); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_KeysFromDiffrentPairs) { |
+ ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair( |
+ "{\"ec_p256_private_key\": 12}", |
+ "{\"ec_p256_public_key\": 34}")); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_KeyOrderSwitched) { |
+ ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair( |
+ "{\"ec_p256_public_key\": 34}", |
+ "{\"ec_p256_private_key\": 34}")); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_PrivateKeyInvalidFormat) { |
+ ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair( |
+ "\"ec_p256_private_key\": 12", |
+ "{\"ec_p256_public_key\": 12}")); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_PublicKeyInvalidFormat) { |
+ ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair( |
+ "{\"ec_p256_private_key\": 12}", |
+ "\"ec_p256_public_key\": 12")); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_PrivateKeyInvalidDictKey) { |
+ ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair( |
+ "{\"invalid\": 12}", |
+ "{\"ec_p256_public_key\": 12}")); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_PublicKeyInvalidDictKey) { |
+ ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair( |
+ "{\"ec_p256_private_key\": 12}", |
+ "{\"invalid\": 12}")); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_InvalidDictValues) { |
+ ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair( |
+ "{\"ec_p256_private_key\": \"12\"}", |
+ "{\"ec_p256_public_key\": \"12\"}")); |
+} |
+ |
+// Verifies the fake |PerformECDHKeyAgreement| method is symetric in respect to |
+// key pairs from which private and public key used in the key agreement |
+// originate. |
+TEST(FakeEasyUnlockClientTest, ECDHKeyAgreementSuccess) { |
+ chromeos::FakeEasyUnlockClient client; |
+ |
+ // (Fake) key pairs used in the test to generate fake shared keys. |
+ const std::string private_key_1 = "{\"ec_p256_private_key\": 32}"; |
+ const std::string public_key_1 = "{\"ec_p256_public_key\": 32}"; |
+ |
+ const std::string private_key_2 = "{\"ec_p256_private_key\": 352}"; |
+ const std::string public_key_2 = "{\"ec_p256_public_key\": 352}"; |
+ |
+ const std::string private_key_3 = "{\"ec_p256_private_key\": 432}"; |
+ const std::string public_key_3 = "{\"ec_p256_public_key\": 432}"; |
+ |
+ // Generate shared key for key pairs 1 and 2, using private key from the |
+ // second key pair and public key from the first key pair. |
+ std::string shared_key_1; |
+ client.PerformECDHKeyAgreement(private_key_2, |
+ public_key_1, |
+ base::Bind(&RecordData, &shared_key_1)); |
+ EXPECT_FALSE(shared_key_1.empty()); |
+ |
+ // Generate shared key for key pairs 1 and 2, using private key from the |
+ // first key pair and public key from the second key pair. |
+ std::string shared_key_2; |
+ client.PerformECDHKeyAgreement(private_key_1, |
+ public_key_2, |
+ base::Bind(&RecordData, &shared_key_2)); |
+ EXPECT_FALSE(shared_key_2.empty()); |
+ |
+ // The generated keys should be equal. They were generated using keys from |
+ // the same key pairs, even though key pairs from which private and public key |
+ // originate were switched. |
+ EXPECT_EQ(shared_key_1, shared_key_2); |
+ |
+ // Generate a key using key pairs 1 and 3. |
+ std::string shared_key_3; |
+ client.PerformECDHKeyAgreement(private_key_1, |
+ public_key_3, |
+ base::Bind(&RecordData, &shared_key_3)); |
+ EXPECT_FALSE(shared_key_3.empty()); |
+ |
+ // The new key should be different from the previously generated ones, since |
+ // the used key pairs are different. |
+ EXPECT_NE(shared_key_3, shared_key_1); |
+ EXPECT_NE(shared_key_3, shared_key_1); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, ECDHKeyAgreementFailsIfKeyOrderSwitched) { |
+ chromeos::FakeEasyUnlockClient client; |
+ |
+ const std::string private_key = "{\"ec_p256_private_key\": 415}"; |
+ const std::string public_key = "{\"ec_p256_public_key\": 345}"; |
+ |
+ std::string shared_key; |
+ client.PerformECDHKeyAgreement(public_key, |
+ private_key, |
+ base::Bind(&RecordData, &shared_key)); |
+ EXPECT_TRUE(shared_key.empty()); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, ECDHKeyAgreementFailsIfKeyDictKeyInvalid) { |
+ chromeos::FakeEasyUnlockClient client; |
+ |
+ const std::string private_key = "{\"ec_p256_private_key_invalid\": 415}"; |
+ const std::string public_key = "{\"ec_p256_public_key_invalid\": 345}"; |
+ |
+ std::string shared_key; |
+ client.PerformECDHKeyAgreement(private_key, |
+ public_key, |
+ base::Bind(&RecordData, &shared_key)); |
+ EXPECT_TRUE(shared_key.empty()); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, ECDHKeyAgreementFailsIfKeyDictValueInvalid) { |
+ chromeos::FakeEasyUnlockClient client; |
+ |
+ const std::string private_key = "{\"ec_p256_private_key\": 415}"; |
+ const std::string public_key = "{\"ec_p256_public_key\": \"345__\"}"; |
+ |
+ std::string shared_key; |
+ client.PerformECDHKeyAgreement(private_key, |
+ public_key, |
+ base::Bind(&RecordData, &shared_key)); |
+ EXPECT_TRUE(shared_key.empty()); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, ECDHKeyAgreementFailsIfKeyFormatInvalid) { |
+ chromeos::FakeEasyUnlockClient client; |
+ |
+ const std::string private_key = "invalid"; |
+ const std::string public_key = "{\"ec_p256_public_key\": 345}"; |
+ |
+ std::string shared_key; |
+ client.PerformECDHKeyAgreement(private_key, |
+ public_key, |
+ base::Bind(&RecordData, &shared_key)); |
+ EXPECT_TRUE(shared_key.empty()); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, CreateSecureMessage) { |
+ chromeos::FakeEasyUnlockClient client; |
+ |
+ std::string message; |
+ client.CreateSecureMessage( |
+ "PAYLOAD", |
+ "KEY", |
+ "ASSOCIATED_DATA", |
+ "PUBLIC_METADATA", |
+ "VERIFICATION_KEY_ID", |
+ "ENCRYPTION_TYPE", |
+ "SIGNATURE_TYPE", |
+ base::Bind(&RecordData, &message)); |
+ |
+ const std::string expected_message( |
+ "{\"securemessage\": {" |
+ "\"payload\": \"PAYLOAD\"," |
+ "\"key\": \"KEY\"," |
+ "\"associated_data\": \"ASSOCIATED_DATA\"," |
+ "\"public_metadata\": \"PUBLIC_METADATA\"," |
+ "\"verification_key_id\": \"VERIFICATION_KEY_ID\"," |
+ "\"encryption_type\": \"ENCRYPTION_TYPE\"," |
+ "\"signature_type\": \"SIGNATURE_TYPE\"}" |
+ "}"); |
+ ASSERT_EQ(expected_message, message); |
+} |
+ |
+TEST(FakeEasyUnlockClientTest, UnwrapSecureMessage) { |
+ chromeos::FakeEasyUnlockClient client; |
+ |
+ std::string message; |
+ client.UnwrapSecureMessage( |
+ "MESSAGE", |
+ "KEY", |
+ "ASSOCIATED_DATA", |
+ "ENCRYPTION_TYPE", |
+ "SIGNATURE_TYPE", |
+ base::Bind(&RecordData, &message)); |
+ |
+ const std::string expected_message( |
+ "{\"unwrapped_securemessage\": {" |
+ "\"message\": \"MESSAGE\"," |
+ "\"key\": \"KEY\"," |
+ "\"associated_data\": \"ASSOCIATED_DATA\"," |
+ "\"encryption_type\": \"ENCRYPTION_TYPE\"," |
+ "\"signature_type\": \"SIGNATURE_TYPE\"}" |
+ "}"); |
+ ASSERT_EQ(expected_message, message); |
+} |
+ |
+} // namespace |
+ |