| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 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/nigori.h" | |
| 6 | |
| 7 #include <string> | |
| 8 | |
| 9 #include "base/memory/scoped_ptr.h" | |
| 10 #include "base/string_util.h" | |
| 11 #include "testing/gtest/include/gtest/gtest.h" | |
| 12 | |
| 13 namespace browser_sync { | |
| 14 namespace { | |
| 15 | |
| 16 TEST(SyncNigoriTest, Permute) { | |
| 17 Nigori nigori; | |
| 18 EXPECT_TRUE(nigori.InitByDerivation("example.com", "username", "password")); | |
| 19 | |
| 20 std::string permuted; | |
| 21 EXPECT_TRUE(nigori.Permute(Nigori::Password, "test name", | |
| 22 &permuted)); | |
| 23 | |
| 24 std::string expected = | |
| 25 "prewwdJj2PrGDczvmsHJEE5ndcCyVze8sY9kD5hjY/Tm" | |
| 26 "c5kOjXFK7zB3Ss4LlHjEDirMu+vh85JwHOnGrMVe+g=="; | |
| 27 EXPECT_EQ(expected, permuted); | |
| 28 } | |
| 29 | |
| 30 TEST(SyncNigoriTest, PermuteIsConstant) { | |
| 31 Nigori nigori1; | |
| 32 EXPECT_TRUE(nigori1.InitByDerivation("example.com", "username", "password")); | |
| 33 | |
| 34 std::string permuted1; | |
| 35 EXPECT_TRUE(nigori1.Permute(Nigori::Password, | |
| 36 "name", | |
| 37 &permuted1)); | |
| 38 | |
| 39 Nigori nigori2; | |
| 40 EXPECT_TRUE(nigori2.InitByDerivation("example.com", "username", "password")); | |
| 41 | |
| 42 std::string permuted2; | |
| 43 EXPECT_TRUE(nigori2.Permute(Nigori::Password, | |
| 44 "name", | |
| 45 &permuted2)); | |
| 46 | |
| 47 EXPECT_LT(0U, permuted1.size()); | |
| 48 EXPECT_EQ(permuted1, permuted2); | |
| 49 } | |
| 50 | |
| 51 TEST(SyncNigoriTest, EncryptDifferentIv) { | |
| 52 Nigori nigori; | |
| 53 EXPECT_TRUE(nigori.InitByDerivation("example.com", "username", "password")); | |
| 54 | |
| 55 std::string plaintext("value"); | |
| 56 | |
| 57 std::string encrypted1; | |
| 58 EXPECT_TRUE(nigori.Encrypt(plaintext, &encrypted1)); | |
| 59 | |
| 60 std::string encrypted2; | |
| 61 EXPECT_TRUE(nigori.Encrypt(plaintext, &encrypted2)); | |
| 62 | |
| 63 EXPECT_NE(encrypted1, encrypted2); | |
| 64 } | |
| 65 | |
| 66 TEST(SyncNigoriTest, Decrypt) { | |
| 67 Nigori nigori; | |
| 68 EXPECT_TRUE(nigori.InitByDerivation("example.com", "username", "password")); | |
| 69 | |
| 70 std::string encrypted = | |
| 71 "e7+JyS6ibj6F5qqvpseukNRTZ+oBpu5iuv2VYjOfrH1dNiFLNf7Ov0" | |
| 72 "kx/zicKFn0lJcbG1UmkNWqIuR4x+quDNVuLaZGbrJPhrJuj7cokCM="; | |
| 73 | |
| 74 std::string plaintext; | |
| 75 EXPECT_TRUE(nigori.Decrypt(encrypted, &plaintext)); | |
| 76 | |
| 77 std::string expected("test, test, 1, 2, 3"); | |
| 78 EXPECT_EQ(expected, plaintext); | |
| 79 } | |
| 80 | |
| 81 TEST(SyncNigoriTest, EncryptDecrypt) { | |
| 82 Nigori nigori; | |
| 83 EXPECT_TRUE(nigori.InitByDerivation("example.com", "username", "password")); | |
| 84 | |
| 85 std::string plaintext("value"); | |
| 86 | |
| 87 std::string encrypted; | |
| 88 EXPECT_TRUE(nigori.Encrypt(plaintext, &encrypted)); | |
| 89 | |
| 90 std::string decrypted; | |
| 91 EXPECT_TRUE(nigori.Decrypt(encrypted, &decrypted)); | |
| 92 | |
| 93 EXPECT_EQ(plaintext, decrypted); | |
| 94 } | |
| 95 | |
| 96 TEST(SyncNigoriTest, CorruptedIv) { | |
| 97 Nigori nigori; | |
| 98 EXPECT_TRUE(nigori.InitByDerivation("example.com", "username", "password")); | |
| 99 | |
| 100 std::string plaintext("test"); | |
| 101 | |
| 102 std::string encrypted; | |
| 103 EXPECT_TRUE(nigori.Encrypt(plaintext, &encrypted)); | |
| 104 | |
| 105 // Corrupt the IV by changing one of its byte. | |
| 106 encrypted[0] = (encrypted[0] == 'a' ? 'b' : 'a'); | |
| 107 | |
| 108 std::string decrypted; | |
| 109 EXPECT_TRUE(nigori.Decrypt(encrypted, &decrypted)); | |
| 110 | |
| 111 EXPECT_NE(plaintext, decrypted); | |
| 112 } | |
| 113 | |
| 114 TEST(SyncNigoriTest, CorruptedCiphertext) { | |
| 115 Nigori nigori; | |
| 116 EXPECT_TRUE(nigori.InitByDerivation("example.com", "username", "password")); | |
| 117 | |
| 118 std::string plaintext("test"); | |
| 119 | |
| 120 std::string encrypted; | |
| 121 EXPECT_TRUE(nigori.Encrypt(plaintext, &encrypted)); | |
| 122 | |
| 123 // Corrput the ciphertext by changing one of its bytes. | |
| 124 encrypted[Nigori::kIvSize + 10] = | |
| 125 (encrypted[Nigori::kIvSize + 10] == 'a' ? 'b' : 'a'); | |
| 126 | |
| 127 std::string decrypted; | |
| 128 EXPECT_FALSE(nigori.Decrypt(encrypted, &decrypted)); | |
| 129 | |
| 130 EXPECT_NE(plaintext, decrypted); | |
| 131 } | |
| 132 | |
| 133 // Crashes, Bug 55180. | |
| 134 #if defined(OS_WIN) | |
| 135 #define MAYBE_ExportImport DISABLED_ExportImport | |
| 136 #else | |
| 137 #define MAYBE_ExportImport ExportImport | |
| 138 #endif | |
| 139 TEST(SyncNigoriTest, MAYBE_ExportImport) { | |
| 140 Nigori nigori1; | |
| 141 EXPECT_TRUE(nigori1.InitByDerivation("example.com", "username", "password")); | |
| 142 | |
| 143 std::string user_key; | |
| 144 std::string encryption_key; | |
| 145 std::string mac_key; | |
| 146 EXPECT_TRUE(nigori1.ExportKeys(&user_key, &encryption_key, &mac_key)); | |
| 147 | |
| 148 Nigori nigori2; | |
| 149 EXPECT_TRUE(nigori2.InitByImport(user_key, encryption_key, mac_key)); | |
| 150 | |
| 151 std::string original("test"); | |
| 152 std::string plaintext; | |
| 153 std::string ciphertext; | |
| 154 | |
| 155 EXPECT_TRUE(nigori1.Encrypt(original, &ciphertext)); | |
| 156 EXPECT_TRUE(nigori2.Decrypt(ciphertext, &plaintext)); | |
| 157 EXPECT_EQ(original, plaintext); | |
| 158 | |
| 159 EXPECT_TRUE(nigori2.Encrypt(original, &ciphertext)); | |
| 160 EXPECT_TRUE(nigori1.Decrypt(ciphertext, &plaintext)); | |
| 161 EXPECT_EQ(original, plaintext); | |
| 162 | |
| 163 std::string permuted1, permuted2; | |
| 164 EXPECT_TRUE(nigori1.Permute(Nigori::Password, original, &permuted1)); | |
| 165 EXPECT_TRUE(nigori2.Permute(Nigori::Password, original, &permuted2)); | |
| 166 EXPECT_EQ(permuted1, permuted2); | |
| 167 } | |
| 168 | |
| 169 } // anonymous namespace | |
| 170 } // namespace browser_sync | |
| OLD | NEW |