11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromeos/dbus/fake_easy_unlock_client.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Callback for |GenerateEcP256KeyPair| method. Saves keys returned by the
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// method in |private_key_target| and |public_key_target|.
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RecordKeyPair(std::string* private_key_target,
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   std::string* public_key_target,
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   const std::string& private_key_source,
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   const std::string& public_key_source) {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *private_key_target = private_key_source;
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *public_key_target = public_key_source;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Callback for |EasyUnlockClient| methods that return a single piece of data.
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// It saves the returned data in |data_target|.
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RecordData(std::string* data_target,
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                const std::string& data_source) {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  *data_target = data_source;
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, GenerateEcP256KeyPair) {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::FakeEasyUnlockClient client;
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string private_key_1;
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string public_key_1;
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.GenerateEcP256KeyPair(
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&RecordKeyPair, &private_key_1, &public_key_1));
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ("{\"ec_p256_private_key\": 1}", private_key_1);
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ("{\"ec_p256_public_key\": 1}", public_key_1);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string private_key_2;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string public_key_2;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.GenerateEcP256KeyPair(
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&RecordKeyPair, &private_key_2, &public_key_2));
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ("{\"ec_p256_private_key\": 2}", private_key_2);
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ("{\"ec_p256_public_key\": 2}", public_key_2);
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_NE(private_key_1, private_key_2);
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_NE(public_key_1, public_key_2);
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, IsEcP256KeyPair) {
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair(
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_private_key\": 12}",
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_public_key\": 12}"));
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_KeysFromDiffrentPairs) {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair(
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_private_key\": 12}",
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_public_key\": 34}"));
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_KeyOrderSwitched) {
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair(
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_public_key\": 34}",
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_private_key\": 34}"));
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_PrivateKeyInvalidFormat) {
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair(
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "\"ec_p256_private_key\": 12",
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_public_key\": 12}"));
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_PublicKeyInvalidFormat) {
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair(
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_private_key\": 12}",
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "\"ec_p256_public_key\": 12"));
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_PrivateKeyInvalidDictKey) {
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair(
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"invalid\": 12}",
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_public_key\": 12}"));
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_PublicKeyInvalidDictKey) {
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair(
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_private_key\": 12}",
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"invalid\": 12}"));
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, IsEcP256KeyPair_InvalidDictValues) {
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(chromeos::FakeEasyUnlockClient::IsEcP256KeyPair(
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_private_key\": \"12\"}",
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"ec_p256_public_key\": \"12\"}"));
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies the fake |PerformECDHKeyAgreement| method is symetric in respect to
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// key pairs from which private and public key used in the key agreement
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// originate.
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, ECDHKeyAgreementSuccess) {
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::FakeEasyUnlockClient client;
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // (Fake) key pairs used in the test to generate fake shared keys.
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string private_key_1 = "{\"ec_p256_private_key\": 32}";
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string public_key_1 = "{\"ec_p256_public_key\": 32}";
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string private_key_2 = "{\"ec_p256_private_key\": 352}";
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string public_key_2 = "{\"ec_p256_public_key\": 352}";
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string private_key_3 = "{\"ec_p256_private_key\": 432}";
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string public_key_3 = "{\"ec_p256_public_key\": 432}";
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Generate shared key for key pairs 1 and 2, using private key from the
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // second key pair and public key from the first key pair.
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string shared_key_1;
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.PerformECDHKeyAgreement(private_key_2,
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 public_key_1,
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 base::Bind(&RecordData, &shared_key_1));
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(shared_key_1.empty());
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Generate shared key for key pairs 1 and 2, using private key from the
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // first key pair and public key from the second key pair.
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string shared_key_2;
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.PerformECDHKeyAgreement(private_key_1,
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 public_key_2,
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 base::Bind(&RecordData, &shared_key_2));
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(shared_key_2.empty());
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The generated keys should be equal. They were generated using keys from
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the same key pairs, even though key pairs from which private and public key
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // originate were switched.
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(shared_key_1, shared_key_2);
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Generate a key using key pairs 1 and 3.
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string shared_key_3;
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.PerformECDHKeyAgreement(private_key_1,
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 public_key_3,
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 base::Bind(&RecordData, &shared_key_3));
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(shared_key_3.empty());
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The new key should be different from the previously generated ones, since
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the used key pairs are different.
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_NE(shared_key_3, shared_key_1);
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_NE(shared_key_3, shared_key_1);
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, ECDHKeyAgreementFailsIfKeyOrderSwitched) {
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::FakeEasyUnlockClient client;
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string private_key = "{\"ec_p256_private_key\": 415}";
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string public_key = "{\"ec_p256_public_key\": 345}";
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string shared_key;
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.PerformECDHKeyAgreement(public_key,
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 private_key,
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 base::Bind(&RecordData, &shared_key));
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shared_key.empty());
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, ECDHKeyAgreementFailsIfKeyDictKeyInvalid) {
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::FakeEasyUnlockClient client;
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string private_key = "{\"ec_p256_private_key_invalid\": 415}";
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string public_key = "{\"ec_p256_public_key_invalid\": 345}";
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string shared_key;
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.PerformECDHKeyAgreement(private_key,
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 public_key,
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 base::Bind(&RecordData, &shared_key));
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shared_key.empty());
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, ECDHKeyAgreementFailsIfKeyDictValueInvalid) {
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::FakeEasyUnlockClient client;
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string private_key = "{\"ec_p256_private_key\": 415}";
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string public_key = "{\"ec_p256_public_key\": \"345__\"}";
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string shared_key;
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.PerformECDHKeyAgreement(private_key,
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 public_key,
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 base::Bind(&RecordData, &shared_key));
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shared_key.empty());
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, ECDHKeyAgreementFailsIfKeyFormatInvalid) {
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::FakeEasyUnlockClient client;
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string private_key = "invalid";
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string public_key = "{\"ec_p256_public_key\": 345}";
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string shared_key;
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.PerformECDHKeyAgreement(private_key,
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 public_key,
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 base::Bind(&RecordData, &shared_key));
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shared_key.empty());
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, CreateSecureMessage) {
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::FakeEasyUnlockClient client;
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string message;
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::EasyUnlockClient::CreateSecureMessageOptions options;
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.key = "KEY";
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.associated_data = "ASSOCIATED_DATA";
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.public_metadata = "PUBLIC_METADATA";
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.verification_key_id = "VERIFICATION_KEY_ID";
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.decryption_key_id = "DECRYPTION_KEY_ID";
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.encryption_type = "ENCRYPTION_TYPE";
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.signature_type = "SIGNATURE_TYPE";
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.CreateSecureMessage(
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "PAYLOAD",
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      options,
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&RecordData, &message));
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string expected_message(
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"securemessage\": {"
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"payload\": \"PAYLOAD\","
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"key\": \"KEY\","
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"associated_data\": \"ASSOCIATED_DATA\","
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"public_metadata\": \"PUBLIC_METADATA\","
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"verification_key_id\": \"VERIFICATION_KEY_ID\","
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"decryption_key_id\": \"DECRYPTION_KEY_ID\","
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"encryption_type\": \"ENCRYPTION_TYPE\","
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"signature_type\": \"SIGNATURE_TYPE\"}"
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "}");
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(expected_message, message);
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(FakeEasyUnlockClientTest, UnwrapSecureMessage) {
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::FakeEasyUnlockClient client;
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string message;
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chromeos::EasyUnlockClient::UnwrapSecureMessageOptions options;
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.key = "KEY";
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.associated_data = "ASSOCIATED_DATA";
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.encryption_type = "ENCRYPTION_TYPE";
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  options.signature_type = "SIGNATURE_TYPE";
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  client.UnwrapSecureMessage(
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "MESSAGE",
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      options,
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&RecordData, &message));
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string expected_message(
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{\"unwrapped_securemessage\": {"
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"message\": \"MESSAGE\","
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"key\": \"KEY\","
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"associated_data\": \"ASSOCIATED_DATA\","
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"encryption_type\": \"ENCRYPTION_TYPE\","
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          "\"signature_type\": \"SIGNATURE_TYPE\"}"
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "}");
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(expected_message, message);
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
264