Home | History | Annotate | Download | only in util
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/sync/util/cryptographer.h"
      6 
      7 #include <string>
      8 
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/string_util.h"
     11 #include "chrome/browser/password_manager/encryptor.h"
     12 #include "chrome/browser/sync/protocol/password_specifics.pb.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 
     15 namespace browser_sync {
     16 
     17 TEST(CryptographerTest, EmptyCantDecrypt) {
     18   Cryptographer cryptographer;
     19   EXPECT_FALSE(cryptographer.is_ready());
     20 
     21   sync_pb::EncryptedData encrypted;
     22   encrypted.set_key_name("foo");
     23   encrypted.set_blob("bar");
     24 
     25   EXPECT_FALSE(cryptographer.CanDecrypt(encrypted));
     26 }
     27 
     28 TEST(CryptographerTest, MissingCantDecrypt) {
     29   Cryptographer cryptographer;
     30 
     31   KeyParams params = {"localhost", "dummy", "dummy"};
     32   cryptographer.AddKey(params);
     33   EXPECT_TRUE(cryptographer.is_ready());
     34 
     35   sync_pb::EncryptedData encrypted;
     36   encrypted.set_key_name("foo");
     37   encrypted.set_blob("bar");
     38 
     39   EXPECT_FALSE(cryptographer.CanDecrypt(encrypted));
     40 }
     41 
     42 TEST(CryptographerTest, CanEncryptAndDecrypt) {
     43   Cryptographer cryptographer;
     44 
     45   KeyParams params = {"localhost", "dummy", "dummy"};
     46   EXPECT_TRUE(cryptographer.AddKey(params));
     47   EXPECT_TRUE(cryptographer.is_ready());
     48 
     49   sync_pb::PasswordSpecificsData original;
     50   original.set_origin("http://example.com");
     51   original.set_username_value("azure");
     52   original.set_password_value("hunter2");
     53 
     54   sync_pb::EncryptedData encrypted;
     55   EXPECT_TRUE(cryptographer.Encrypt(original, &encrypted));
     56 
     57   sync_pb::PasswordSpecificsData decrypted;
     58   EXPECT_TRUE(cryptographer.Decrypt(encrypted, &decrypted));
     59 
     60   EXPECT_EQ(original.SerializeAsString(), decrypted.SerializeAsString());
     61 }
     62 
     63 TEST(CryptographerTest, AddKeySetsDefault) {
     64   Cryptographer cryptographer;
     65 
     66   KeyParams params1 = {"localhost", "dummy", "dummy1"};
     67   EXPECT_TRUE(cryptographer.AddKey(params1));
     68   EXPECT_TRUE(cryptographer.is_ready());
     69 
     70   sync_pb::PasswordSpecificsData original;
     71   original.set_origin("http://example.com");
     72   original.set_username_value("azure");
     73   original.set_password_value("hunter2");
     74 
     75   sync_pb::EncryptedData encrypted1;
     76   EXPECT_TRUE(cryptographer.Encrypt(original, &encrypted1));
     77   sync_pb::EncryptedData encrypted2;
     78   EXPECT_TRUE(cryptographer.Encrypt(original, &encrypted2));
     79 
     80   KeyParams params2 = {"localhost", "dummy", "dummy2"};
     81   EXPECT_TRUE(cryptographer.AddKey(params2));
     82   EXPECT_TRUE(cryptographer.is_ready());
     83 
     84   sync_pb::EncryptedData encrypted3;
     85   EXPECT_TRUE(cryptographer.Encrypt(original, &encrypted3));
     86   sync_pb::EncryptedData encrypted4;
     87   EXPECT_TRUE(cryptographer.Encrypt(original, &encrypted4));
     88 
     89   EXPECT_EQ(encrypted1.key_name(), encrypted2.key_name());
     90   EXPECT_NE(encrypted1.key_name(), encrypted3.key_name());
     91   EXPECT_EQ(encrypted3.key_name(), encrypted4.key_name());
     92 }
     93 
     94 // Crashes, Bug 55178.
     95 #if defined(OS_WIN)
     96 #define MAYBE_EncryptExportDecrypt DISABLED_EncryptExportDecrypt
     97 #else
     98 #define MAYBE_EncryptExportDecrypt EncryptExportDecrypt
     99 #endif
    100 TEST(CryptographerTest, MAYBE_EncryptExportDecrypt) {
    101   sync_pb::EncryptedData nigori;
    102   sync_pb::EncryptedData encrypted;
    103 
    104   sync_pb::PasswordSpecificsData original;
    105   original.set_origin("http://example.com");
    106   original.set_username_value("azure");
    107   original.set_password_value("hunter2");
    108 
    109   {
    110     Cryptographer cryptographer;
    111 
    112     KeyParams params = {"localhost", "dummy", "dummy"};
    113     cryptographer.AddKey(params);
    114     EXPECT_TRUE(cryptographer.is_ready());
    115 
    116     EXPECT_TRUE(cryptographer.Encrypt(original, &encrypted));
    117     EXPECT_TRUE(cryptographer.GetKeys(&nigori));
    118   }
    119 
    120   {
    121     Cryptographer cryptographer;
    122     EXPECT_FALSE(cryptographer.CanDecrypt(nigori));
    123 
    124     cryptographer.SetPendingKeys(nigori);
    125     EXPECT_FALSE(cryptographer.is_ready());
    126     EXPECT_TRUE(cryptographer.has_pending_keys());
    127 
    128     KeyParams params = {"localhost", "dummy", "dummy"};
    129     EXPECT_TRUE(cryptographer.DecryptPendingKeys(params));
    130     EXPECT_TRUE(cryptographer.is_ready());
    131     EXPECT_FALSE(cryptographer.has_pending_keys());
    132 
    133     sync_pb::PasswordSpecificsData decrypted;
    134     EXPECT_TRUE(cryptographer.Decrypt(encrypted, &decrypted));
    135     EXPECT_EQ(original.SerializeAsString(), decrypted.SerializeAsString());
    136   }
    137 }
    138 
    139 // Crashes, Bug 55178.
    140 #if defined(OS_WIN)
    141 #define MAYBE_PackUnpack DISABLED_PackUnpack
    142 #else
    143 #define MAYBE_PackUnpack PackUnpack
    144 #endif
    145 TEST(CryptographerTest, MAYBE_PackUnpack) {
    146 #if defined(OS_MACOSX)
    147   Encryptor::UseMockKeychain(true);
    148 #endif
    149 
    150   Nigori nigori;
    151   ASSERT_TRUE(nigori.InitByDerivation("example.com", "username", "password"));
    152   std::string expected_user, expected_encryption, expected_mac;
    153   ASSERT_TRUE(nigori.ExportKeys(&expected_user, &expected_encryption,
    154                                 &expected_mac));
    155 
    156   Cryptographer cryptographer;
    157   std::string token;
    158   EXPECT_TRUE(cryptographer.PackBootstrapToken(&nigori, &token));
    159   EXPECT_TRUE(IsStringUTF8(token));
    160 
    161   scoped_ptr<Nigori> unpacked(cryptographer.UnpackBootstrapToken(token));
    162   EXPECT_NE(static_cast<Nigori*>(NULL), unpacked.get());
    163 
    164   std::string user_key, encryption_key, mac_key;
    165   ASSERT_TRUE(unpacked->ExportKeys(&user_key, &encryption_key, &mac_key));
    166 
    167   EXPECT_EQ(expected_user, user_key);
    168   EXPECT_EQ(expected_encryption, encryption_key);
    169   EXPECT_EQ(expected_mac, mac_key);
    170 }
    171 
    172 }  // namespace browser_sync
    173