2 * Copyright (c) 2017 - 2020 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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
19 #include <boost_macros_wrapper.h>
20 #include <test_common.h>
23 #include <key-aes-impl.h>
24 #include <data-type.h>
30 constexpr char PASS[] = "password";
38 const KeyData KEYS[] = {
40 KeyType::KEY_RSA_PRIVATE,
42 "-----BEGIN RSA PRIVATE KEY-----\n"
43 "MIICXAIBAAKBgQDMP6sKttnQ58BAi27b8X+8KVQtJgpJhhCF0RtWaTVqAhVDG3y4\n"
44 "x6IuAvXDtPSjLe/2E01fYGVxNComPJOmUOfUD06BCWPYH2+7jOfQIOy/TMlt+W7x\n"
45 "fou9rqnPRoKRaodoLqH5WK0ahkntWCAjstoKZoG+3Op0tEjy0jpmzeyNiQIDAQAB\n"
46 "AoGBAJRDX1CuvNx1bkwsKvQDkTqwMYd4hp0qcVICIbsPMhPaoT6OdHHZkHOf+HDx\n"
47 "KWhOj1LsXgzu95Q+Tp5k+LURI8ayu2RTsz/gYECgPNUsZ7gXl4co1bK+g5kiC+qr\n"
48 "sgSfkbYpp0OXefnl5x4KaJlZeSpn0UdDqx0kwI1x2E098i1VAkEA5thNY9YZNQdN\n"
49 "p6aopxOF5OmAjbLkq6wu255rDM5YgeepXXro/lmPociobtv8vPzbWKfoYZJL0Zj4\n"
50 "Qzj7Qz7s0wJBAOKBbpeG9PuNP1nR1h8kvyuILW8F89JOcIOUeqwokq4eJVqXdFIj\n"
51 "ct8eSEFmyXNqXD7b9+Tcw6vRIZuddVhNcrMCQAlpaD5ZzE1NLu1W7ilhsmPS4Vrl\n"
52 "oE0fiAmMO/EZuKITP+R/zmAQZrrB45whe/x4krjan67auByjj/utpxDmz+ECQEg/\n"
53 "UK80dN/n5dUYgVvdtLyF6zgGhgcGzgyqR5ayOlcfdnq25Htuoy1X02RJDOirfFDw\n"
54 "iNmPMTqUskuYpd1MltECQBwcy1cpnJWIXwCTQwg3enjkOVw80Tbr3iU9ASjHJTH2\n"
55 "N6FGHC4BQCm1fL6Bo0/0oSra+Ika3/1Vw1WwijUSiO8=\n"
56 "-----END RSA PRIVATE KEY-----"
58 KeyType::KEY_RSA_PRIVATE,
60 "-----BEGIN RSA PRIVATE KEY-----\n"
61 "Proc-Type: 4,ENCRYPTED\n"
62 "DEK-Info: AES-128-CBC,C73D912AE0B2F3AE9DDF4E4ACBA904A6\n"
64 "Q4jKICSZm6cNDavb1WFWJTKfqyr+XYkXTfpVVtMcJ/34dcLxzqxOzigjiSR7RfeN\n"
65 "0JQHUKJgUHz5eCg4uCwaEBE+WkWzwREsD34bY73fLqqSL9Dpx5/6eHvXNI/zcueP\n"
66 "SZphgUpV4xSUPnlZ3M39NUaDmHmGccdInmsd8AB+StuT/2M2hVUgFQiYKL6XcyFt\n"
67 "xsARQo0IfeSgUV5M7gwxJkwbdlEzENPpRLif8g1yVDGMUefoNiC46mxlvADq9Lt6\n"
68 "fI1FVH5yMeADgTXcW/YJ/1wIY3RspDOXZQK/RlNxjt3KOGUL1h7dD3a4R+8Xwjxi\n"
69 "lk1m8HDFZc35PBBNkEL0qGtRzlWuU1Gpsef4MAJpm6VsdCXDXoeu8be4EsKUXNif\n"
70 "8DyBqaTYmqg6TD3ZtHFqmRq+mv6dYUYBLA6BJvfPwDagUmkju8maXet/fQ+8Xse/\n"
71 "zZFl59pz5jm6d9fxRI+5eWaw6b7gD7nREgpbgToaJHbWw2yrVHkhEs37gtS9DR3O\n"
72 "+a4eOMJMwAspI/RK3K+4QND6ffmCbJH8hroz4PtbBb2war4C+SLN7XoOhcQQK5tU\n"
73 "WBVuJR4CharlRwG5hO7wIBWAdwgpv5IZ/SM9D561ktHLnAhCp66RCjcmAmy7dGVq\n"
74 "KX2g0Iu7yGGALDbdmznrkt6TeaPrSXd3Kn6qZCYLWV8i/XpDknelii2mqlrztPog\n"
75 "K04bvdDXX80vtLyGiG+kmteaT45+nhrl22siOaokxQuiCuZax6pXKFLJDr1n1KIi\n"
76 "O8eHDDfjNrxdjA23KJmfzMbHU+/G65jBomeS6opwMrVfD/ee0rlVCBQxCiNRrnlx\n"
77 "-----END RSA PRIVATE KEY-----\n"
79 KeyType::KEY_RSA_PUBLIC,
81 "-----BEGIN PUBLIC KEY-----\n"
82 "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMP6sKttnQ58BAi27b8X+8KVQt\n"
83 "JgpJhhCF0RtWaTVqAhVDG3y4x6IuAvXDtPSjLe/2E01fYGVxNComPJOmUOfUD06B\n"
84 "CWPYH2+7jOfQIOy/TMlt+W7xfou9rqnPRoKRaodoLqH5WK0ahkntWCAjstoKZoG+\n"
85 "3Op0tEjy0jpmzeyNiQIDAQAB\n"
86 "-----END PUBLIC KEY-----"
88 KeyType::KEY_DSA_PRIVATE,
90 "-----BEGIN DSA PRIVATE KEY-----\n"
91 "MIIBuwIBAAKBgQDIsQRYgnU4mm5VrMyykpNNzeHTQAO8E2hJAcOwNPBrdos8amak\n"
92 "rcJnyBaNh56ZslcuXNEKJuxiDsy4VM9KUR8fHTqTiF5s+4NArzdrdwNQpKWjAqJN\n"
93 "fgpCdaLZHw9o857flcQ4dyYNnAz1/SNGnv03Dm8EYRNRFNaFNw7zBPjyVwIVANyj\n"
94 "7ijLfrCbDZDi6ond5Np1Ns0hAoGBAIcS1ceWtw6DAGmYww27r/1lLtqjrq8j0w0a\n"
95 "F6Ly+pZ/y+WTw9KT18eRKPmVgruVSn3VVVJeN00XaoKvfPSHkTRIE5rro2ZEInhp\n"
96 "3g0Vak7EXJWe7KKBRXqSMNFkndjKv1nyNKeWSEq9Xql6SPn8J8TfmbyUpPSIglZR\n"
97 "vJ2DHwHJAoGAPZLRdIhIIJi4UWoyQrCqk1iF3pkBeukXzeZGqNWEjgzLAjMZEVYM\n"
98 "DLLKippahjxLZSWB7LOoS+XE4fonpBBute/tgF23ToR8fQuiBu+KvtAP/QuCOJ/L\n"
99 "S0aYYr1/eXmMByYPZ58Vf93KuUgoUAkWmc+mLBn6J2+fygnWcOOSo6sCFC/slPOv\n"
100 "yAKPlW7WQzgV5jLLNUW7\n"
101 "-----END DSA PRIVATE KEY-----"
103 KeyType::KEY_DSA_PRIVATE,
105 "-----BEGIN DSA PRIVATE KEY-----\n"
106 "Proc-Type: 4,ENCRYPTED\n"
107 "DEK-Info: AES-128-CBC,048C0CDD71CF9AF8D647C364365C44F1\n"
109 "lBUAm8XCQ0xoa7P3s8VCRK8Dw0oqDlk2P1Yr9oQZ4zq7eEz4ozocOeANLEsarTrT\n"
110 "IaxrZnuGs+lg6NqEk3UdHCvocJr4TP+jommMYYXCZcX7l0D/CjqJZ/EWb8xrvVqN\n"
111 "Ra+JuZQobFnhDJLC0eHzhuNSZJe2OViEnWEyv3cYvztekzY7ldR3A5MhLScXJ9fZ\n"
112 "Ufabu5ZbJNsNdcZp/kVE6piriANqy2CECGKp7BycVjHRGE44+jpI5TrXoxuaPUsR\n"
113 "cFvaeWRdhUHGjuxiSaDjSn3LR6UenpfYDFKPl5h6TLKcHZLx1kjtiN+Fed4Y7Xzb\n"
114 "Va8OMj/g7AsJmzrl4+qdfgTz0SnbbLAXTpHMg7DBJDM6eNDgXsOeLHoJp4t+50vQ\n"
115 "M4qCmhoUZ5cMiTUpbGQMqwawXORe0JM+Qg/6jdWHnH5zdyYxbqk7wIhPAGMm0Gbd\n"
116 "6bXHutc+AaMVIdqoBvhppeedEUNFVSkoxyglJY3fb24n81Us/r1IUwWL4exWLXsl\n"
117 "DizasdaCWN43k45BJ+It9L6RcKJLwCQpppfPcZBPCavYh4wW93NXVsbpPesDyXwX\n"
118 "87h4JnKOgH5wtt/xforC+g==\n"
119 "-----END DSA PRIVATE KEY-----\n"
121 KeyType::KEY_DSA_PUBLIC,
123 "-----BEGIN PUBLIC KEY-----\n"
124 "MIIBtzCCASwGByqGSM44BAEwggEfAoGBAMixBFiCdTiablWszLKSk03N4dNAA7wT\n"
125 "aEkBw7A08Gt2izxqZqStwmfIFo2HnpmyVy5c0Qom7GIOzLhUz0pRHx8dOpOIXmz7\n"
126 "g0CvN2t3A1CkpaMCok1+CkJ1otkfD2jznt+VxDh3Jg2cDPX9I0ae/TcObwRhE1EU\n"
127 "1oU3DvME+PJXAhUA3KPuKMt+sJsNkOLqid3k2nU2zSECgYEAhxLVx5a3DoMAaZjD\n"
128 "Dbuv/WUu2qOuryPTDRoXovL6ln/L5ZPD0pPXx5Eo+ZWCu5VKfdVVUl43TRdqgq98\n"
129 "9IeRNEgTmuujZkQieGneDRVqTsRclZ7sooFFepIw0WSd2Mq/WfI0p5ZISr1eqXpI\n"
130 "+fwnxN+ZvJSk9IiCVlG8nYMfAckDgYQAAoGAPZLRdIhIIJi4UWoyQrCqk1iF3pkB\n"
131 "eukXzeZGqNWEjgzLAjMZEVYMDLLKippahjxLZSWB7LOoS+XE4fonpBBute/tgF23\n"
132 "ToR8fQuiBu+KvtAP/QuCOJ/LS0aYYr1/eXmMByYPZ58Vf93KuUgoUAkWmc+mLBn6\n"
134 "-----END PUBLIC KEY-----"
136 KeyType::KEY_ECDSA_PRIVATE,
138 "-----BEGIN EC PRIVATE KEY-----\n"
139 "MF8CAQEEGF3rz8OuFpcESrlqCm0G96oovr0XbX+DRKAKBggqhkjOPQMBAaE0AzIA\n"
140 "BHiZYByQiRNQ91GWNnTfoBbp9G8DP9oJYc/cDZlk4lKUpmbvm//RWf1U7ag3tOVy\n"
142 "-----END EC PRIVATE KEY-----"
144 KeyType::KEY_ECDSA_PRIVATE,
146 "-----BEGIN EC PRIVATE KEY-----\n"
147 "Proc-Type: 4,ENCRYPTED\n"
148 "DEK-Info: AES-128-CBC,F9C394444D857C605B9F12265A7F5530\n"
150 "D5k5JXXUFNytJVxhTOotRRE2/J8Ur9hSMYkIil2uQszpxRD8Pay8GsIEjiO7hi4S\n"
151 "fn2CdmrqKuX7xOa5uaD3hn0fZzKrSASfhKVBb153nWF4r7tvwAa9gIs3dK9379xC\n"
152 "3zZhim3HX6gG9WXdwC4rHRkglEGTMFTf1Okr9A8Uu+hYv2yAd8b8kumLwhXw6vMC\n"
153 "rIH/GTe6jp4l2xEkdBFQ//Xyd/xEmMxP+28mMKEb6tSiLbN2glBxuj6FWgEYZNJS\n"
154 "BVcctKSvXJY4MpsWxso73CFWZJPeOZ/lNicYkPRsGfU=\n"
155 "-----END EC PRIVATE KEY-----"
157 KeyType::KEY_ECDSA_PUBLIC,
159 "-----BEGIN PUBLIC KEY-----\n"
160 "MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEeJlgHJCJE1D3UZY2dN+gFun0bwM/\n"
161 "2glhz9wNmWTiUpSmZu+b/9FZ/VTtqDe05XKx\n"
162 "-----END PUBLIC KEY-----"
166 void requireKey(const Key& key, KeyType type, int size)
168 BOOST_REQUIRE(!key.empty());
169 BOOST_REQUIRE(key.getType() == type);
170 BOOST_REQUIRE(!key.getDER().empty());
171 BOOST_REQUIRE(key.getSize() == size);
174 void requireKeyImpl(const KeyImpl& key, KeyType type)
176 requireKey(key, type, 0);
178 BOOST_REQUIRE(key.getEvpShPtr());
180 if (DataType(type).isKeyPrivate()) {
181 BOOST_REQUIRE(key.getDER() == key.getDERPRV());
182 BOOST_REQUIRE(!key.getDERPRV().empty());
184 BOOST_REQUIRE(key.getDER() == key.getDERPUB());
188 void requireNoKey(const Key& key)
190 BOOST_REQUIRE(key.empty());
191 BOOST_REQUIRE(key.getType() == KeyType::KEY_NONE);
192 BOOST_REQUIRE(key.getDER().empty());
193 BOOST_REQUIRE(key.getSize() == 0);
196 void requireNoKeyImpl(const KeyImpl& key)
199 BOOST_REQUIRE(!key.getEvpShPtr());
200 BOOST_REQUIRE(key.getDERPRV().empty());
201 BOOST_REQUIRE(key.getDERPUB().empty());
204 KeyType privateType(KeyType type)
208 case KeyType::KEY_RSA_PUBLIC:
209 return KeyType::KEY_RSA_PRIVATE;
210 case KeyType::KEY_DSA_PUBLIC:
211 return KeyType::KEY_DSA_PRIVATE;
212 case KeyType::KEY_ECDSA_PUBLIC:
213 return KeyType::KEY_ECDSA_PRIVATE;
219 } // anonymous namespace
221 BOOST_AUTO_TEST_SUITE(KEY_TEST)
223 POSITIVE_TEST_CASE(KeyImpl)
225 for (auto& keyInfo : KEYS) {
226 RawBuffer keyBuf(keyInfo.data.begin(), keyInfo.data.end());
229 KeyImpl keyPem(keyBuf, keyInfo.pass ? PASS : "");
230 requireKeyImpl(keyPem, keyInfo.type);
233 KeyImpl keyDer(keyPem.getDER());
234 requireKeyImpl(keyDer, keyInfo.type);
237 KeyImpl keyEvp(keyPem.getEvpShPtr(), keyInfo.type);
238 requireKeyImpl(keyEvp, keyInfo.type);
241 auto keyPtr = Key::create(keyBuf, keyInfo.pass ? PASS : "");
242 BOOST_REQUIRE(keyPtr);
243 requireKey(*keyPtr, keyInfo.type, 0);
247 NEGATIVE_TEST_CASE(KeyImpl)
250 requireNoKeyImpl(KeyImpl(RawBuffer()));
252 auto keyPtr = Key::create(RawBuffer());
253 BOOST_REQUIRE(!keyPtr);
255 for (auto& keyInfo : KEYS) {
256 RawBuffer keyBuf(keyInfo.data.begin(), keyInfo.data.end());
260 requireNoKeyImpl(KeyImpl(keyBuf, "wrong password"));
261 auto keyBuf2 = keyBuf;
262 keyBuf2.resize(keyBuf.size() - 2);
263 requireNoKeyImpl(KeyImpl(keyBuf2, keyInfo.pass ? PASS : ""));
264 KeyImpl keyPem(keyBuf, keyInfo.pass ? PASS : "");
267 auto der = keyPem.getDER();
268 der.resize(der.size() - 1);
270 requireNoKeyImpl(keyDer);
273 requireNoKeyImpl(KeyImpl(KeyImpl::EvpShPtr(), keyInfo.type));
274 for (int i = -1; i <= static_cast<int>(KeyType::KEY_AES) + 1; i++) {
275 KeyType otherType = static_cast<KeyType>(i);
276 if (privateType(otherType) == privateType(keyInfo.type))
279 requireNoKeyImpl(KeyImpl(keyPem.getEvpShPtr(), otherType));
284 BOOST_REQUIRE(!Key::create(keyBuf, ""));
288 POSITIVE_TEST_CASE(KeyAesImpl)
290 auto testAes = [](size_t size){
291 auto keyBuf = createRandom(size);
292 auto key = Key::createAES(keyBuf);
294 requireKey(*key, KeyType::KEY_AES, size);
295 BOOST_REQUIRE(key->getDER() == keyBuf);
303 NEGATIVE_TEST_CASE(KeyAesImpl)
305 auto testNoAes = [](size_t size){
306 auto keyBuf = createRandom(size);
307 auto key = Key::createAES(keyBuf);
309 requireNoKey(KeyAESImpl(keyBuf));
322 BOOST_AUTO_TEST_SUITE_END()