1 /*
2 * Copyright 2018 Google LLC
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "fcp/secagg/testing/ecdh_pregenerated_test_keys.h"
18
19 #include <string>
20 #include <vector>
21
22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h"
24 #include "fcp/secagg/shared/ecdh_key_agreement.h"
25 #include "fcp/secagg/shared/ecdh_keys.h"
26
27 namespace fcp {
28 namespace secagg {
29
30 constexpr int EcdhPregeneratedTestKeys::kNumTestEcdhKeys;
31
EcdhPregeneratedTestKeys()32 EcdhPregeneratedTestKeys::EcdhPregeneratedTestKeys() {
33 // These were generated by EcdhKeyAgreement::CreateFromRandomKeys.
34 // Despite the odd line wrapping, there are 8 individual strings in each
35 // vector.
36 private_key_strings_ = {
37 "\x6\x8D\xCC\xDD\x96Sv\x1Ams\xED\x83\x86\xB0vW\xB2"
38 "9,\xEA\xBE\x1C\xAD\xEF\x8E\xC6\xC1\xEE\xD5@\xC1\x98",
39 "\x99\xB7\x18\x91\x8E\xC1\xD5=\x86\xDB\xF0\x1D"
40 "4\x9D\xFD\xDC\xE6\xCC\xBB`=\x94iO\xBBU<x'%\xF9\x99",
41 "V\xA2"
42 "fLD\xA8"
43 "a\xA8\xCD"
44 "B\x93N\xF1|\xE7:\xDB U&g\\\xAA\xD8'P\xEF\x8F\xA5\xF8"
45 "do",
46 "R\xAB\xCF\x11\xC6\xA1P@\xD5VS}C\x3\xD2\x1\xC8\x8A\x96\x10Z\xF8"
47 "C\x1\xA0\xD2\x9C\xB6\xF9\x6\n\xEF",
48 "\x8A\xFCxv\x95\xB5n\xA3v{\xD4\x9F"
49 "6\x89^@\xB0Oa\xB3\x8B"
50 "C\xB0\x2\xA5\xD7\xE9\x14\x8DXf1",
51 "\xF4\xDD\xAF\x19"
52 "D\xCBi\x94\x8F\x9C\xEAq\xFWXE\xE0\xFA\xF2\x8B[\xCD \xE4"
53 "Aa;\x9A\x8E}\xA0\x85",
54 "pC\x18\xDD\xFW\xDF\xA0\n\v9\xBB\xE8\xCAU\x1D\xCA\x93"
55 "B\xA2\x12-\x9DoJju\xDB\x9FVD\xD6",
56 "\xF0\xD4\x99\xB7\xBE\x1B\xC3QMU\x99\xE1\xA1"
57 "f\xF2X\x13\xAC\xB4\x96"
58 "2)=U\xE6\xEC#\xCE\xA5y\xCE\x9B"};
59 public_key_strings_ = {
60 "\x2^\x8D\x95\xEmW\xA4\x99y\x19ZT\x87;\xC1.R\xC3_r\xAE"
61 "1=nh\xD2\x82xZ\xC9L\x83",
62 "\x3S\xD3zo\xB5.\xB3"
63 "3f\x94\x14\xAE\xC3,\xC3\xB9r,\xB3\\\xE8\xBD\x8E\xF2\t\xEB\x1\f\xE1\x83"
64 "9\xED",
65 "\x2 \xB3-\xC4\x1\x8D\x9A"
66 "BM\x98W\xB3=Y\x1\xEA\x80WGS&r\x1A\x12\xE0z\x9EzC:\xCA\x9D",
67 "\x2"
68 "3\xCBn\x5\x5\xBC\xB5\x6y\x13h\xD5\x14\xA8\x19L\xCBG/"
69 "N\x12\xEA\x98\xA7\xA2/\xE4\x5\xCD\xC2\xE1\xC1",
70 "\x2\x1C"
71 "C\x85\xE3\xFF\x1B\xA8\xF1\xE7\xF2\xF9\x8C(\x85\x1CZ\xC9\xFB\xE3.\x8D "
72 "'\xB5\xCC"
73 "A\x12\x19\x80\xED)\xD3",
74 "\x3\xF3\xB6h\t\xB3\x80\xD0%\xCD> "
75 "'\xA2\xFBz\xA5\xB5K\x94\xE5==\t\aIt\xCD\x98'\x1"
76 "5)",
77 "\x2"
78 "4\xFF\xA5\xA2\x1B\xF1!q\xBEH\xEB\xE7*\xD8\xBF\x87(!\xBDM "
79 "(\xC1mK\xC2\xB8\xDA\xAB"
80 "al\x8E",
81 "\x3Jr+~\x19kht\xE1\xD7\x10\x9B\xB9\xAD}U\xB2\xE4\xF1\x89%\xCF"
82 "b\xAA\n\x83"
83 "5\x8B"
84 "7G\xA3\xF2"};
85
86 // These were generated by a Java ECDH implementation. They do not correspond
87 // to the private keys, and have X.509 headers.
88 uncompressed_public_key_strings_ = {
89 "0Y0\023\006\a*\206H\316=\002\001\006\b*\206H\316="
90 "\003\001\a\003B\000\004Pv\301\226\312Y\326\323I\271\265\310Vj\353\236"
91 "\336}\230a\265\312:kh\315\365\270nW\332\271$\v\b\277%"
92 "\246\375d\361H\274\343q\362\254\235\252\220\204a\303\222\020\234\000\372"
93 "\332]%p3\006",
94 "0Y0\023\006\a*\206H\316=\002\001\006\b*\206H\316="
95 "\003\001\a\003B\000\004\221f\267\002lX?\325\261\353\\\3430U\365["
96 "\005\222\214ey\300s`"
97 "F\\\251\370\t\310\310\n4\375\005\324\360\316\377\025\320\341\363e]4["
98 "\317??\276\227\"p\353\314\377\260\213\024\300\003\250\253",
99 "0Y0\023\006\a*\206H\316=\002\001\006\b*\206H\316="
100 "\003\001\a\003B\000\004\256\000g\0247\365!<$"
101 "\234eYA\323u\341\346x\350\271=F\220n\257\201\210\034z0\315s\221="
102 "\357\226\'%O\342\270\346\035\277\2465\223\036^H+"
103 "Q\246mAZ\021cf\000\016\221\350c",
104 "0Y0\023\006\a*\206H\316=\002\001\006\b*\206H\316="
105 "\003\001\a\003B\000\004\034\230\204\000y\022e\226\330\3547\346\212~5Z-"
106 "0\2342)\315\'B\271\235\226R~\252]\256\305\353$%"
107 "Sq\376\337\254Z\022\213eH%!\225\271-,/\227s\263!J3Ln\3503,",
108 "0Y0\023\006\a*\206H\316=\002\001\006\b*\206H\316="
109 "\003\001\a\003B\000\004u\273R8\212\335\302c\341\237\373\"\270\350UL\342R"
110 "\330]l\272C\346[\312\240\fl\207[\201\241\022\a\035? !\210 "
111 "l\264\241H}2*\004<E\034n\367!8\226Z\263p\214\tY@",
112 "0Y0\023\006\a*\206H\316=\002\001\006\b*\206H\316="
113 "\003\001\a\003B\000\004\375\211:E5j\373\357\257\276|"
114 "\023\003\a\214\2751\200n\374\306\300\313\266EL\306\364Vq\205\000\031R6"
115 "\357I2\253r\024j\235\264^\340_\363\225*\306?"
116 "\352\270\017\371\351EN\362K8\020\244",
117 "0Y0\023\006\a*\206H\316=\002\001\006\b*\206H\316="
118 "\003\001\a\003B\000\004\322\333\350*"
119 "3\016\246D\t\177\226GL\332\356\336\365k\303\331?H\020\235\235\206\373*"
120 "\322c\006\206\030\200k\363\233]\231\260=\363\003\2221\337:\021E?"
121 "ra\370\026\340\267\"5\n\317\vN\375\235",
122 "0Y0\023\006\a*\206H\316=\002\001\006\b*\206H\316="
123 "\003\001\a\003B\000\004\224\326\324\2577{z\364sTf\321YD\317\177QR\034}"
124 "\030\241\211\026\366\255\256t\352\322\363\027\201\031F\026\260\3706h\330"
125 "\026\022\\\022\'\255Y!\321a\324c\324\337\276\256?\002\235 \2636\034"};
126
127 for (int i = 0; i < kNumTestEcdhKeys; ++i) {
128 private_keys_.push_back(EcdhPrivateKey(
129 reinterpret_cast<const uint8_t*>(private_key_strings_[i])));
130 public_keys_.push_back(EcdhPublicKey(
131 reinterpret_cast<const uint8_t*>(public_key_strings_[i])));
132 // Move pointer ahead 26 bytes to skip header
133 uncompressed_public_keys_.push_back(EcdhPublicKey(
134 reinterpret_cast<const uint8_t*>(uncompressed_public_key_strings_[i] +
135 26),
136 EcdhPublicKey::kUncompressed));
137 }
138 }
139
GetPrivateKey(size_t index)140 EcdhPrivateKey EcdhPregeneratedTestKeys::GetPrivateKey(size_t index) {
141 EXPECT_THAT(index, testing::Lt(kNumTestEcdhKeys));
142 return private_keys_[index];
143 }
GetPublicKey(size_t index)144 EcdhPublicKey EcdhPregeneratedTestKeys::GetPublicKey(size_t index) {
145 EXPECT_THAT(index, testing::Lt(kNumTestEcdhKeys));
146 return public_keys_[index];
147 }
GetUncompressedPublicKey(size_t index)148 EcdhPublicKey EcdhPregeneratedTestKeys::GetUncompressedPublicKey(size_t index) {
149 EXPECT_THAT(index, testing::Lt(kNumTestEcdhKeys));
150 return uncompressed_public_keys_[index];
151 }
152
GetPrivateKeyString(size_t index)153 std::string EcdhPregeneratedTestKeys::GetPrivateKeyString(size_t index) {
154 EXPECT_THAT(index, testing::Lt(kNumTestEcdhKeys));
155 return std::string(private_key_strings_[index], EcdhPrivateKey::kSize);
156 }
GetPublicKeyString(size_t index)157 std::string EcdhPregeneratedTestKeys::GetPublicKeyString(size_t index) {
158 EXPECT_THAT(index, testing::Lt(kNumTestEcdhKeys));
159 return std::string(public_key_strings_[index], EcdhPublicKey::kSize);
160 }
GetUncompressedPublicKeyString(size_t index)161 std::string EcdhPregeneratedTestKeys::GetUncompressedPublicKeyString(
162 size_t index) {
163 EXPECT_THAT(index, testing::Lt(kNumTestEcdhKeys));
164 return std::string(public_key_strings_[index], EcdhPublicKey::kSize);
165 }
166
167 } // namespace secagg
168 } // namespace fcp
169