blob: f273e4d94e6607e3f4087d885535f2f38b6d7e40 [file] [log] [blame]
Selene Huang31ab4042020-04-29 04:22:39 -07001/*
2 * Copyright (C) 2020 The Android Open Source Project
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
Shawn Willden7c130392020-12-21 09:58:22 -070017#define LOG_TAG "keymint_1_test"
Selene Huang31ab4042020-04-29 04:22:39 -070018#include <cutils/log.h>
19
20#include <signal.h>
David Drysdale37af4b32021-05-14 16:46:59 +010021
22#include <algorithm>
Selene Huang31ab4042020-04-29 04:22:39 -070023#include <iostream>
24
David Drysdale42fe1892021-10-14 14:43:46 +010025#include <openssl/curve25519.h>
David Zeuthene0c40892021-01-08 12:54:11 -050026#include <openssl/ec.h>
Selene Huang31ab4042020-04-29 04:22:39 -070027#include <openssl/evp.h>
28#include <openssl/mem.h>
David Zeuthene0c40892021-01-08 12:54:11 -050029#include <openssl/x509v3.h>
Selene Huang31ab4042020-04-29 04:22:39 -070030
31#include <cutils/properties.h>
32
David Drysdale4dc01072021-04-01 12:17:35 +010033#include <android/binder_manager.h>
34
35#include <aidl/android/hardware/security/keymint/IRemotelyProvisionedComponent.h>
Janis Danisevskis24c04702020-12-16 18:28:39 -080036#include <aidl/android/hardware/security/keymint/KeyFormat.h>
Selene Huang31ab4042020-04-29 04:22:39 -070037
Shawn Willden08a7e432020-12-11 13:05:27 +000038#include <keymint_support/key_param_output.h>
39#include <keymint_support/openssl_utils.h>
Selene Huang31ab4042020-04-29 04:22:39 -070040
41#include "KeyMintAidlTestBase.h"
42
Janis Danisevskis24c04702020-12-16 18:28:39 -080043using aidl::android::hardware::security::keymint::AuthorizationSet;
44using aidl::android::hardware::security::keymint::KeyCharacteristics;
45using aidl::android::hardware::security::keymint::KeyFormat;
Selene Huang31ab4042020-04-29 04:22:39 -070046
Selene Huang31ab4042020-04-29 04:22:39 -070047namespace std {
48
Janis Danisevskis24c04702020-12-16 18:28:39 -080049using namespace aidl::android::hardware::security::keymint;
Selene Huang31ab4042020-04-29 04:22:39 -070050
51template <>
52struct std::equal_to<KeyCharacteristics> {
53 bool operator()(const KeyCharacteristics& a, const KeyCharacteristics& b) const {
Shawn Willden7f424372021-01-10 18:06:50 -070054 if (a.securityLevel != b.securityLevel) return false;
Selene Huang31ab4042020-04-29 04:22:39 -070055
Shawn Willden7f424372021-01-10 18:06:50 -070056 // this isn't very efficient. Oh, well.
57 AuthorizationSet a_auths(a.authorizations);
58 AuthorizationSet b_auths(b.authorizations);
Selene Huang31ab4042020-04-29 04:22:39 -070059
Shawn Willden7f424372021-01-10 18:06:50 -070060 a_auths.Sort();
61 b_auths.Sort();
62
63 return a_auths == b_auths;
Selene Huang31ab4042020-04-29 04:22:39 -070064 }
65};
66
67} // namespace std
68
Janis Danisevskis24c04702020-12-16 18:28:39 -080069namespace aidl::android::hardware::security::keymint::test {
Shawn Willden08a7e432020-12-11 13:05:27 +000070
Selene Huang31ab4042020-04-29 04:22:39 -070071namespace {
72
David Drysdalefeab5d92022-01-06 15:46:23 +000073// Maximum supported Ed25519 message size.
74const size_t MAX_ED25519_MSG_SIZE = 16 * 1024;
75
David Drysdaledbbbe2e2021-12-02 07:44:23 +000076// Whether to check that BOOT_PATCHLEVEL is populated.
77bool check_boot_pl = true;
78
Seth Moore7a55ae32021-06-23 14:28:11 -070079// The maximum number of times we'll attempt to verify that corruption
David Drysdale4c1f6ac2021-11-25 16:08:29 +000080// of an encrypted blob results in an error. Retries are necessary as there
Seth Moore7a55ae32021-06-23 14:28:11 -070081// is a small (roughly 1/256) chance that corrupting ciphertext still results
82// in valid PKCS7 padding.
83constexpr size_t kMaxPaddingCorruptionRetries = 8;
84
Selene Huang31ab4042020-04-29 04:22:39 -070085template <TagType tag_type, Tag tag, typename ValueT>
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +000086bool contains(const vector<KeyParameter>& set, TypedTag<tag_type, tag> ttag,
87 ValueT expected_value) {
Selene Huang31ab4042020-04-29 04:22:39 -070088 auto it = std::find_if(set.begin(), set.end(), [&](const KeyParameter& param) {
Janis Danisevskis5ba09332020-12-17 10:05:15 -080089 if (auto p = authorizationValue(ttag, param)) {
90 return *p == expected_value;
91 }
92 return false;
Selene Huang31ab4042020-04-29 04:22:39 -070093 });
94 return (it != set.end());
95}
96
97template <TagType tag_type, Tag tag>
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +000098bool contains(const vector<KeyParameter>& set, TypedTag<tag_type, tag>) {
Selene Huang31ab4042020-04-29 04:22:39 -070099 auto it = std::find_if(set.begin(), set.end(),
100 [&](const KeyParameter& param) { return param.tag == tag; });
101 return (it != set.end());
102}
103
104constexpr char hex_value[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
105 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
106 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
107 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, // '0'..'9'
108 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 'A'..'F'
109 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
110 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 'a'..'f'
111 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
116 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
117 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
118 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //
119 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
120
121string hex2str(string a) {
122 string b;
123 size_t num = a.size() / 2;
124 b.resize(num);
125 for (size_t i = 0; i < num; i++) {
126 b[i] = (hex_value[a[i * 2] & 0xFF] << 4) + (hex_value[a[i * 2 + 1] & 0xFF]);
127 }
128 return b;
129}
130
David Drysdaled2cc8c22021-04-15 13:29:45 +0100131string rsa_key = hex2str(
132 // RFC 5208 s5
133 "30820275" // SEQUENCE length 0x275 (PrivateKeyInfo) {
134 "020100" // INTEGER length 1 value 0x00 (version)
135 "300d" // SEQUENCE length 0x0d (AlgorithmIdentifier) {
136 "0609" // OBJECT IDENTIFIER length 9 (algorithm)
137 "2a864886f70d010101" // 1.2.840.113549.1.1.1 (rsaEncryption)
138 "0500" // NULL (parameters)
139 // } end SEQUENCE (AlgorithmIdentifier)
140 "0482025f" // OCTET STRING length 0x25f (privateKey) holding...
141 // RFC 8017 A.1.2
142 "3082025b" // SEQUENCE length 0x25b (RSAPrivateKey) {
143 "020100" // INTEGER length 1 value 0x00 (version)
144 "028181" // INTEGER length 0x81 value (modulus) ...
145 "00c6095409047d8634812d5a218176e4"
146 "5c41d60a75b13901f234226cffe77652"
147 "1c5a77b9e389417b71c0b6a44d13afe4"
148 "e4a2805d46c9da2935adb1ff0c1f24ea"
149 "06e62b20d776430a4d435157233c6f91"
150 "6783c30e310fcbd89b85c2d567711697"
151 "85ac12bca244abda72bfb19fc44d27c8"
152 "1e1d92de284f4061edfd99280745ea6d"
153 "25"
154 "0203010001" // INTEGER length 3 value 0x10001 (publicExponent)
155 "028180" // INTEGER length 0x80 (privateExponent) value...
156 "1be0f04d9cae3718691f035338308e91"
157 "564b55899ffb5084d2460e6630257e05"
158 "b3ceab02972dfabcd6ce5f6ee2589eb6"
159 "7911ed0fac16e43a444b8c861e544a05"
160 "93365772f8baf6b22fc9e3c5f1024b06"
161 "3ac080a7b2234cf8aee8f6c47bbf4fd3"
162 "ace7240290bef16c0b3f7f3cdd64ce3a"
163 "b5912cf6e32f39ab188358afcccd8081"
164 "0241" // INTEGER length 0x41 (prime1)
165 "00e4b49ef50f765d3b24dde01aceaaf1"
166 "30f2c76670a91a61ae08af497b4a82be"
167 "6dee8fcdd5e3f7ba1cfb1f0c926b88f8"
168 "8c92bfab137fba2285227b83c342ff7c"
169 "55"
170 "0241" // INTEGER length 0x41 (prime2)
171 "00ddabb5839c4c7f6bf3d4183231f005"
172 "b31aa58affdda5c79e4cce217f6bc930"
173 "dbe563d480706c24e9ebfcab28a6cdef"
174 "d324b77e1bf7251b709092c24ff501fd"
175 "91"
176 "0240" // INTEGER length 0x40 (exponent1)
177 "23d4340eda3445d8cd26c14411da6fdc"
178 "a63c1ccd4b80a98ad52b78cc8ad8beb2"
179 "842c1d280405bc2f6c1bea214a1d742a"
180 "b996b35b63a82a5e470fa88dbf823cdd"
181 "0240" // INTEGER length 0x40 (exponent2)
182 "1b7b57449ad30d1518249a5f56bb9829"
183 "4d4b6ac12ffc86940497a5a5837a6cf9"
184 "46262b494526d328c11e1126380fde04"
185 "c24f916dec250892db09a6d77cdba351"
186 "0240" // INTEGER length 0x40 (coefficient)
187 "7762cd8f4d050da56bd591adb515d24d"
188 "7ccd32cca0d05f866d583514bd7324d5"
189 "f33645e8ed8b4a1cb3cc4a1d67987399"
190 "f2a09f5b3fb68c88d5e5d90ac33492d6"
191 // } end SEQUENCE (PrivateKey)
192 // } end SEQUENCE (PrivateKeyInfo)
193);
Selene Huang31ab4042020-04-29 04:22:39 -0700194
Selene Huange5727e62021-04-13 22:41:20 -0700195/*
196 * DER-encoded PKCS#8 format RSA key. Generated using:
197 *
198 * openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | hexdump -e '30/1 "%02X" "\n"'
199 */
David Drysdaled2cc8c22021-04-15 13:29:45 +0100200string rsa_2048_key = hex2str(
201 // RFC 5208 s5
202 "308204BD" // SEQUENCE length 0x4bd (PrivateKeyInfo) {
203 "020100" // INTEGER length 1 value 0x00 (version)
204 "300D" // SEQUENCE length 0x0d (AlgorithmIdentifier) {
205 "0609" // OBJECT IDENTIFIER length 9 (algorithm)
206 "2A864886F70D010101" // 1.2.840.113549.1.1.1 (rsaEncryption)
207 "0500" // NULL (parameters)
208 // } end SEQUENCE (AlgorithmIdentifier)
209 "048204A7" // OCTET STRING length 0x25f (privateKey) holding...
210 // RFC 8017 A.1.2
211 "308204A3" // SEQUENCE length 0x4a3 (RSAPrivateKey) {
212 "020100" // INTEGER length 1 value 0x00 (version)
213 "02820101" // INTEGER length 0x101 value (modulus) ...
214 "00BEBC342B56D443B1299F9A6A7056E8"
215 "0A897E318476A5A18029E63B2ED739A6"
216 "1791D339F58DC763D9D14911F2EDEC38"
217 "3DEE11F6319B44510E7A3ECD9B79B973"
218 "82E49500ACF8117DC89CAF0E621F7775"
219 "6554A2FD4664BFE7AB8B59AB48340DBF"
220 "A27B93B5A81F6ECDEB02D0759307128D"
221 "F3E3BAD4055C8B840216DFAA5700670E"
222 "6C5126F0962FCB70FF308F25049164CC"
223 "F76CC2DA66A7DD9A81A714C2809D6918"
224 "6133D29D84568E892B6FFBF3199BDB14"
225 "383EE224407F190358F111A949552ABA"
226 "6714227D1BD7F6B20DD0CB88F9467B71"
227 "9339F33BFF35B3870B3F62204E4286B0"
228 "948EA348B524544B5F9838F29EE643B0"
229 "79EEF8A713B220D7806924CDF7295070"
230 "C5"
231 "0203010001" // INTEGER length 3 value 0x10001 (publicExponent)
232 "02820100" // INTEGER length 0x100 (privateExponent) value...
233 "69F377F35F2F584EF075353CCD1CA997"
234 "38DB3DBC7C7FF35F9366CE176DFD1B13"
235 "5AB10030344ABF5FBECF1D4659FDEF1C"
236 "0FC430834BE1BE3911951377BB3D563A"
237 "2EA9CA8F4AD9C48A8CE6FD516A735C66"
238 "2686C7B4B3C09A7B8354133E6F93F790"
239 "D59EAEB92E84C9A4339302CCE28FDF04"
240 "CCCAFA7DE3F3A827D4F6F7D38E68B0EC"
241 "6AB706645BF074A4E4090D06FB163124"
242 "365FD5EE7A20D350E9958CC30D91326E"
243 "1B292E9EF5DB408EC42DAF737D201497"
244 "04D0A678A0FB5B5446863B099228A352"
245 "D604BA8091A164D01D5AB05397C71EAD"
246 "20BE2A08FC528FE442817809C787FEE4"
247 "AB97F97B9130D022153EDC6EB6CBE7B0"
248 "F8E3473F2E901209B5DB10F93604DB01"
249 "028181" // INTEGER length 0x81 (prime1)
250 "00E83C0998214941EA4F9293F1B77E2E"
251 "99E6CF305FAF358238E126124FEAF2EB"
252 "9724B2EA7B78E6032343821A80E55D1D"
253 "88FB12D220C3F41A56142FEC85796D19"
254 "17F1E8C774F142B67D3D6E7B7E6B4383"
255 "E94DB5929089DBB346D5BDAB40CC2D96"
256 "EE0409475E175C63BF78CFD744136740"
257 "838127EA723FF3FE7FA368C1311B4A4E"
258 "05"
259 "028181" // INTEGER length 0x81 (prime2)
260 "00D240FCC0F5D7715CDE21CB2DC86EA1"
261 "46132EA3B06F61FF2AF54BF38473F59D"
262 "ADCCE32B5F4CC32DD0BA6F509347B4B5"
263 "B1B58C39F95E4798CCBB43E83D0119AC"
264 "F532F359CA743C85199F0286610E2009"
265 "97D7312917179AC9B67558773212EC96"
266 "1E8BCE7A3CC809BC5486A96E4B0E6AF3"
267 "94D94E066A0900B7B70E82A44FB30053"
268 "C1"
269 "028181" // INTEGER length 0x81 (exponent1)
270 "00AD15DA1CBD6A492B66851BA8C316D3"
271 "8AB700E2CFDDD926A658003513C54BAA"
272 "152B30021D667D20078F500F8AD3E7F3"
273 "945D74A891ED1A28EAD0FEEAEC8C14A8"
274 "E834CF46A13D1378C99D18940823CFDD"
275 "27EC5810D59339E0C34198AC638E09C8"
276 "7CBB1B634A9864AE9F4D5EB2D53514F6"
277 "7B4CAEC048C8AB849A02E397618F3271"
278 "35"
279 "028180" // INTEGER length 0x80 (exponent2)
280 "1FA2C1A5331880A92D8F3E281C617108"
281 "BF38244F16E352E69ED417C7153F9EC3"
282 "18F211839C643DCF8B4DD67CE2AC312E"
283 "95178D5D952F06B1BF779F4916924B70"
284 "F582A23F11304E02A5E7565AE22A35E7"
285 "4FECC8B6FDC93F92A1A37703E4CF0E63"
286 "783BD02EB716A7ECBBFA606B10B74D01"
287 "579522E7EF84D91FC522292108D902C1"
288 "028180" // INTEGER length 0x80 (coefficient)
289 "796FE3825F9DCC85DF22D58690065D93"
290 "898ACD65C087BEA8DA3A63BF4549B795"
291 "E2CD0E3BE08CDEBD9FCF1720D9CDC507"
292 "0D74F40DED8E1102C52152A31B6165F8"
293 "3A6722AECFCC35A493D7634664B888A0"
294 "8D3EB034F12EA28BFEE346E205D33482"
295 "7F778B16ED40872BD29FCB36536B6E93"
296 "FFB06778696B4A9D81BB0A9423E63DE5"
297 // } end SEQUENCE (PrivateKey)
298 // } end SEQUENCE (PrivateKeyInfo)
299);
Selene Huange5727e62021-04-13 22:41:20 -0700300
David Drysdaled2cc8c22021-04-15 13:29:45 +0100301string ec_256_key = hex2str(
302 // RFC 5208 s5
303 "308187" // SEQUENCE length 0x87 (PrivateKeyInfo) {
304 "020100" // INTEGER length 1 value 0 (version)
305 "3013" // SEQUENCE length 0x13 (AlgorithmIdentifier) {
306 "0607" // OBJECT IDENTIFIER length 7 (algorithm)
307 "2a8648ce3d0201" // 1.2.840.10045.2.1 (ecPublicKey)
308 "0608" // OBJECT IDENTIFIER length 8 (param)
309 "2a8648ce3d030107" // 1.2.840.10045.3.1.7 (secp256r1)
310 // } end SEQUENCE (AlgorithmIdentifier)
311 "046d" // OCTET STRING length 0x6d (privateKey) holding...
312 "306b" // SEQUENCE length 0x6b (ECPrivateKey)
313 "020101" // INTEGER length 1 value 1 (version)
314 "0420" // OCTET STRING length 0x20 (privateKey)
315 "737c2ecd7b8d1940bf2930aa9b4ed3ff"
316 "941eed09366bc03299986481f3a4d859"
317 "a144" // TAG [1] len 0x44 (publicKey) {
318 "03420004bf85d7720d07c25461683bc6"
319 "48b4778a9a14dd8a024e3bdd8c7ddd9a"
320 "b2b528bbc7aa1b51f14ebbbb0bd0ce21"
321 "bcc41c6eb00083cf3376d11fd44949e0"
322 "b2183bfe"
323 // } end SEQUENCE (ECPrivateKey)
324 // } end SEQUENCE (PrivateKeyInfo)
325);
Selene Huang31ab4042020-04-29 04:22:39 -0700326
David Drysdaled2cc8c22021-04-15 13:29:45 +0100327string ec_521_key = hex2str(
328 // RFC 5208 s5
329 "3081EE" // SEQUENCE length 0xee (PrivateKeyInfo) {
330 "020100" // INTEGER length 1 value 0 (version)
331 "3010" // SEQUENCE length 0x10 (AlgorithmIdentifier) {
332 "0607" // OBJECT IDENTIFIER length 7 (algorithm)
333 "2A8648CE3D0201" // 1.2.840.10045.2.1 (ecPublicKey)
334 "0605" // OBJECT IDENTIFIER length 5 (param)
335 "2B81040023" // 1.3.132.0.35 (secp521r1)
336 // } end SEQUENCE (AlgorithmIdentifier)
337 "0481D6" // OCTET STRING length 0xd6 (privateKey) holding...
338 "3081D3" // SEQUENCE length 0xd3 (ECPrivateKey)
339 "020101" // INTEGER length 1 value 1 (version)
340 "0442" // OCTET STRING length 0x42 (privateKey)
341 "0011458C586DB5DAA92AFAB03F4FE46A"
342 "A9D9C3CE9A9B7A006A8384BEC4C78E8E"
343 "9D18D7D08B5BCFA0E53C75B064AD51C4"
344 "49BAE0258D54B94B1E885DED08ED4FB2"
345 "5CE9"
346 "A18189" // TAG [1] len 0x89 (publicKey) {
347 "03818600040149EC11C6DF0FA122C6A9"
348 "AFD9754A4FA9513A627CA329E349535A"
349 "5629875A8ADFBE27DCB932C051986377"
350 "108D054C28C6F39B6F2C9AF81802F9F3"
351 "26B842FF2E5F3C00AB7635CFB36157FC"
352 "0882D574A10D839C1A0C049DC5E0D775"
353 "E2EE50671A208431BB45E78E70BEFE93"
354 "0DB34818EE4D5C26259F5C6B8E28A652"
355 "950F9F88D7B4B2C9D9"
356 // } end SEQUENCE (ECPrivateKey)
357 // } end SEQUENCE (PrivateKeyInfo)
358);
Selene Huang31ab4042020-04-29 04:22:39 -0700359
David Drysdaled2cc8c22021-04-15 13:29:45 +0100360string ec_256_key_rfc5915 = hex2str(
361 // RFC 5208 s5
362 "308193" // SEQUENCE length 0x93 (PrivateKeyInfo) {
363 "020100" // INTEGER length 1 value 0 (version)
364 "3013" // SEQUENCE length 0x13 (AlgorithmIdentifier) {
365 "0607" // OBJECT IDENTIFIER length 7 (algorithm)
366 "2a8648ce3d0201" // 1.2.840.10045.2.1 (ecPublicKey)
367 "0608" // OBJECT IDENTIFIER length 8 (param)
368 "2a8648ce3d030107" // 1.2.840.10045.3.1.7 (secp256r1)
369 // } end SEQUENCE (AlgorithmIdentifier)
370 "0479" // OCTET STRING length 0x79 (privateKey) holding...
371 // RFC 5915 s3
372 "3077" // SEQUENCE length 0x77 (ECPrivateKey)
373 "020101" // INTEGER length 1 value 1 (version)
374 "0420" // OCTET STRING length 0x42 (privateKey)
375 "782370a8c8ce5537baadd04dcff079c8"
376 "158cfa9c67b818b38e8d21c9fa750c1d"
377 "a00a" // TAG [0] length 0xa (parameters)
378 "0608" // OBJECT IDENTIFIER length 8
379 "2a8648ce3d030107" // 1.2.840.10045.3.1.7 (secp256r1)
380 // } end TAG [0]
381 "a144" // TAG [1] length 0x44 (publicKey) {
382 "0342" // BIT STRING length 0x42
383 "00" // no pad bits
384 "04e2cc561ee701da0ad0ef0d176bb0c9"
385 "19d42e79c393fdc1bd6c4010d85cf2cf"
386 "8e68c905464666f98dad4f01573ba810"
387 "78b3428570a439ba3229fbc026c55068"
388 "2f"
389 // } end SEQUENCE (ECPrivateKey)
390 // } end SEQUENCE (PrivateKeyInfo)
391);
Selene Huang31ab4042020-04-29 04:22:39 -0700392
David Drysdaled2cc8c22021-04-15 13:29:45 +0100393string ec_256_key_sec1 = hex2str(
394 // RFC 5208 s5
395 "308187" // SEQUENCE length 0x87 (PrivateKeyInfo) {
396 "020100" // INTEGER length 1 value 0 (version)
397 "3013" // SEQUENCE length 0x13 (AlgorithmIdentifier) {
398 "0607" // OBJECT IDENTIFIER length 7 (algorithm)
399 "2a8648ce3d0201" // 1.2.840.10045.2.1 (ecPublicKey)
400 "0608" // OBJECT IDENTIFIER length 8 (param)
401 "2a8648ce3d030107" // 1.2.840.10045.3.1.7 (secp256r1)
402 // } end SEQUENCE (AlgorithmIdentifier)
403 "046d" // OCTET STRING length 0x6d (privateKey) holding...
404 // SEC1-v2 C.4
405 "306b" // SEQUENCE length 0x6b (ECPrivateKey)
406 "020101" // INTEGER length 1 value 0x01 (version)
407 "0420" // OCTET STRING length 0x20 (privateKey)
408 "782370a8c8ce5537baadd04dcff079c8"
409 "158cfa9c67b818b38e8d21c9fa750c1d"
410 "a144" // TAG [1] length 0x44 (publicKey) {
411 "0342" // BIT STRING length 0x42
412 "00" // no pad bits
413 "04e2cc561ee701da0ad0ef0d176bb0c9"
414 "19d42e79c393fdc1bd6c4010d85cf2cf"
415 "8e68c905464666f98dad4f01573ba810"
416 "78b3428570a439ba3229fbc026c55068"
417 "2f"
418 // } end TAG [1] (publicKey)
419 // } end SEQUENCE (PrivateKeyInfo)
420);
Selene Huang31ab4042020-04-29 04:22:39 -0700421
David Drysdale42fe1892021-10-14 14:43:46 +0100422/**
423 * Ed25519 key pair generated as follows:
424 * ```
425 * % openssl req -x509 -newkey ED25519 -days 700 -nodes \
426 * -keyout ed25519_priv.key -out ed25519.pem * -subj "/CN=fake.ed25519.com"
427 * Generating a ED25519 private key writing new private key to
428 * 'ed25519_priv.key'
429 * -----
430 * % cat ed25519_priv.key
431 * -----BEGIN PRIVATE KEY-----
432 * MC4CAQAwBQYDK2VwBCIEIKl3A5quNywcj1P+0XI9SBalFPIvO52NxceMLRH6dVmR
433 * -----END PRIVATE KEY-----
434 * % der2ascii -pem -i ed25519_priv.key
435 * SEQUENCE {
436 * INTEGER { 0 }
437 * SEQUENCE {
438 * # ed25519
439 * OBJECT_IDENTIFIER { 1.3.101.112 }
440 * }
441 * OCTET_STRING {
442 * OCTET_STRING { `a977039aae372c1c8f53fed1723d4816a514f22f3b9d8dc5c78c2d11fa755991` }
443 * }
444 * }
445 * % cat ed25519.pem
446 * -----BEGIN CERTIFICATE-----
447 * MIIBSjCB/aADAgECAhR0Jron3eKcdgqyecv/eEfGWAzn8DAFBgMrZXAwGzEZMBcG
448 * A1UEAwwQZmFrZS5lZDI1NTE5LmNvbTAeFw0yMTEwMjAwODI3NDJaFw0yMzA5MjAw
449 * ODI3NDJaMBsxGTAXBgNVBAMMEGZha2UuZWQyNTUxOS5jb20wKjAFBgMrZXADIQDv
450 * uwHz+3TaQ69D2digxlz0fFfsZg0rPqgQae3jBPRWkaNTMFEwHQYDVR0OBBYEFN9O
451 * od30SY4JTs66ZR403UPya+iXMB8GA1UdIwQYMBaAFN9Ood30SY4JTs66ZR403UPy
452 * a+iXMA8GA1UdEwEB/wQFMAMBAf8wBQYDK2VwA0EAKjVrYQjuE/gEL2j/ABpDbFjV
453 * Ilg5tJ6MN/P3psAv3Cs7f0X1lFqdlt15nJ/6aj2cmGCwNRXt5wcyYDKNu+v2Dw==
454 * -----END CERTIFICATE-----
455 * % openssl x509 -in ed25519.pem -text -noout
456 * Certificate:
457 * Data:
458 * Version: 3 (0x2)
459 * Serial Number:
460 * 74:26:ba:27:dd:e2:9c:76:0a:b2:79:cb:ff:78:47:c6:58:0c:e7:f0
461 * Signature Algorithm: ED25519
462 * Issuer: CN = fake.ed25519.com
463 * Validity
464 * Not Before: Oct 20 08:27:42 2021 GMT
465 * Not After : Sep 20 08:27:42 2023 GMT
466 * Subject: CN = fake.ed25519.com
467 * Subject Public Key Info:
468 * Public Key Algorithm: ED25519
469 * ED25519 Public-Key:
470 * pub:
471 * ef:bb:01:f3:fb:74:da:43:af:43:d9:d8:a0:c6:5c:
472 * f4:7c:57:ec:66:0d:2b:3e:a8:10:69:ed:e3:04:f4:
473 * 56:91
474 * X509v3 extensions:
475 * X509v3 Subject Key Identifier:
476 * DF:4E:A1:DD:F4:49:8E:09:4E:CE:BA:65:1E:34:DD:43:F2:6B:E8:97
477 * X509v3 Authority Key Identifier:
478 * keyid:DF:4E:A1:DD:F4:49:8E:09:4E:CE:BA:65:1E:34:DD:43:F2:6B:E8:97
479 *
480 * X509v3 Basic Constraints: critical
481 * CA:TRUE
482 * Signature Algorithm: ED25519
483 * 2a:35:6b:61:08:ee:13:f8:04:2f:68:ff:00:1a:43:6c:58:d5:
484 * 22:58:39:b4:9e:8c:37:f3:f7:a6:c0:2f:dc:2b:3b:7f:45:f5:
485 * 94:5a:9d:96:dd:79:9c:9f:fa:6a:3d:9c:98:60:b0:35:15:ed:
486 * e7:07:32:60:32:8d:bb:eb:f6:0f
487 * ```
488 */
489string ed25519_key = hex2str("a977039aae372c1c8f53fed1723d4816a514f22f3b9d8dc5c78c2d11fa755991");
490string ed25519_pkcs8_key = hex2str(
491 // RFC 5208 s5
492 "302e" // SEQUENCE length 0x2e (PrivateKeyInfo) {
493 "0201" // INTEGER length 1 (Version)
494 "00" // version 0
495 "3005" // SEQUENCE length 05 (AlgorithmIdentifier) {
496 "0603" // OBJECT IDENTIFIER length 3 (algorithm)
497 "2b6570" // 1.3.101.112 (id-Ed125519 RFC 8410 s3)
498 // } end SEQUENCE (AlgorithmIdentifier)
499 "0422" // OCTET STRING length 0x22 (PrivateKey)
500 "0420" // OCTET STRING length 0x20 (RFC 8410 s7)
501 "a977039aae372c1c8f53fed1723d4816a514f22f3b9d8dc5c78c2d11fa755991"
502 // } end SEQUENCE (PrivateKeyInfo)
503);
504string ed25519_pubkey = hex2str("efbb01f3fb74da43af43d9d8a0c65cf47c57ec660d2b3ea81069ede304f45691");
505
506/**
507 * X25519 key pair generated as follows:
508 * ```
509 * % openssl genpkey -algorithm X25519 > x25519_priv.key
510 * % cat x25519_priv.key
511 * -----BEGIN PRIVATE KEY-----
512 * MC4CAQAwBQYDK2VuBCIEIGgPwF3NLwQx/Sfwr2nfJvXitwlDNh3Skzh+TISN/y1C
513 * -----END PRIVATE KEY-----
514 * % der2ascii -pem -i x25519_priv.key
515 * SEQUENCE {
516 * INTEGER { 0 }
517 * SEQUENCE {
518 * # x25519
519 * OBJECT_IDENTIFIER { 1.3.101.110 }
520 * }
521 * OCTET_STRING {
522 * OCTET_STRING { `680fc05dcd2f0431fd27f0af69df26f5e2b70943361dd293387e4c848dff2d42` }
523 * }
524 * }
525 * ```
526 */
527
528string x25519_key = hex2str("680fc05dcd2f0431fd27f0af69df26f5e2b70943361dd293387e4c848dff2d42");
529string x25519_pkcs8_key = hex2str(
530 // RFC 5208 s5
531 "302e" // SEQUENCE length 0x2e (PrivateKeyInfo) {
532 "0201" // INTEGER length 1 (Version)
533 "00" // version 0
534 "3005" // SEQUENCE length 05 (AlgorithmIdentifier) {
535 "0603" // OBJECT IDENTIFIER length 3 (algorithm)
536 "2b656e" // 1.3.101.110 (id-X125519 RFC 8410 s3)
537 "0422" // OCTET STRING length 0x22 (PrivateKey)
538 "0420" // OCTET STRING length 0x20 (RFC 8410 s7)
539 "680fc05dcd2f0431fd27f0af69df26f5e2b70943361dd293387e4c848dff2d42");
540string x25519_pubkey = hex2str("be46925a857f17831d6d454b9d3d36a4a30166edf80eb82b684661c3e258f768");
541
Selene Huang31ab4042020-04-29 04:22:39 -0700542struct RSA_Delete {
543 void operator()(RSA* p) { RSA_free(p); }
544};
545
Selene Huang31ab4042020-04-29 04:22:39 -0700546std::string make_string(const uint8_t* data, size_t length) {
547 return std::string(reinterpret_cast<const char*>(data), length);
548}
549
550template <size_t N>
551std::string make_string(const uint8_t (&a)[N]) {
552 return make_string(a, N);
553}
554
555class AidlBuf : public vector<uint8_t> {
556 typedef vector<uint8_t> super;
557
558 public:
559 AidlBuf() {}
560 AidlBuf(const super& other) : super(other) {}
561 AidlBuf(super&& other) : super(std::move(other)) {}
562 explicit AidlBuf(const std::string& other) : AidlBuf() { *this = other; }
563
564 AidlBuf& operator=(const super& other) {
565 super::operator=(other);
566 return *this;
567 }
568
569 AidlBuf& operator=(super&& other) {
570 super::operator=(std::move(other));
571 return *this;
572 }
573
574 AidlBuf& operator=(const string& other) {
575 resize(other.size());
576 for (size_t i = 0; i < other.size(); ++i) {
577 (*this)[i] = static_cast<uint8_t>(other[i]);
578 }
579 return *this;
580 }
581
582 string to_string() const { return string(reinterpret_cast<const char*>(data()), size()); }
583};
584
David Drysdale4dc01072021-04-01 12:17:35 +0100585string device_suffix(const string& name) {
586 size_t pos = name.find('/');
587 if (pos == string::npos) {
588 return name;
589 }
590 return name.substr(pos + 1);
591}
592
593bool matching_rp_instance(const string& km_name,
594 std::shared_ptr<IRemotelyProvisionedComponent>* rp) {
595 string km_suffix = device_suffix(km_name);
596
597 vector<string> rp_names =
598 ::android::getAidlHalInstanceNames(IRemotelyProvisionedComponent::descriptor);
599 for (const string& rp_name : rp_names) {
600 // If the suffix of the RemotelyProvisionedComponent instance equals the suffix of the
601 // KeyMint instance, assume they match.
602 if (device_suffix(rp_name) == km_suffix && AServiceManager_isDeclared(rp_name.c_str())) {
603 ::ndk::SpAIBinder binder(AServiceManager_waitForService(rp_name.c_str()));
604 *rp = IRemotelyProvisionedComponent::fromBinder(binder);
605 return true;
606 }
607 }
608 return false;
609}
610
Selene Huang31ab4042020-04-29 04:22:39 -0700611} // namespace
612
613class NewKeyGenerationTest : public KeyMintAidlTestBase {
614 protected:
Shawn Willden7f424372021-01-10 18:06:50 -0700615 void CheckBaseParams(const vector<KeyCharacteristics>& keyCharacteristics) {
David Drysdale7de9feb2021-03-05 14:56:19 +0000616 AuthorizationSet auths = CheckCommonParams(keyCharacteristics);
Selene Huang31ab4042020-04-29 04:22:39 -0700617 EXPECT_TRUE(auths.Contains(TAG_PURPOSE, KeyPurpose::SIGN));
Selene Huang31ab4042020-04-29 04:22:39 -0700618
Selene Huang31ab4042020-04-29 04:22:39 -0700619 // Check that some unexpected tags/values are NOT present.
620 EXPECT_FALSE(auths.Contains(TAG_PURPOSE, KeyPurpose::ENCRYPT));
621 EXPECT_FALSE(auths.Contains(TAG_PURPOSE, KeyPurpose::DECRYPT));
David Drysdale7de9feb2021-03-05 14:56:19 +0000622 }
623
624 void CheckSymmetricParams(const vector<KeyCharacteristics>& keyCharacteristics) {
625 AuthorizationSet auths = CheckCommonParams(keyCharacteristics);
626 EXPECT_TRUE(auths.Contains(TAG_PURPOSE, KeyPurpose::ENCRYPT));
627 EXPECT_TRUE(auths.Contains(TAG_PURPOSE, KeyPurpose::DECRYPT));
628
629 EXPECT_FALSE(auths.Contains(TAG_PURPOSE, KeyPurpose::SIGN));
David Drysdale7de9feb2021-03-05 14:56:19 +0000630 }
631
632 AuthorizationSet CheckCommonParams(const vector<KeyCharacteristics>& keyCharacteristics) {
633 // TODO(swillden): Distinguish which params should be in which auth list.
634 AuthorizationSet auths;
635 for (auto& entry : keyCharacteristics) {
636 auths.push_back(AuthorizationSet(entry.authorizations));
637 }
638 EXPECT_TRUE(auths.Contains(TAG_ORIGIN, KeyOrigin::GENERATED));
639
640 // Verify that App data, ROT and auth timeout are NOT included.
641 EXPECT_FALSE(auths.Contains(TAG_ROOT_OF_TRUST));
642 EXPECT_FALSE(auths.Contains(TAG_APPLICATION_DATA));
Selene Huang31ab4042020-04-29 04:22:39 -0700643 EXPECT_FALSE(auths.Contains(TAG_AUTH_TIMEOUT, 301U));
644
David Drysdaled2cc8c22021-04-15 13:29:45 +0100645 // None of the tests specify CREATION_DATETIME so check that the KeyMint implementation
646 // never adds it.
647 EXPECT_FALSE(auths.Contains(TAG_CREATION_DATETIME));
648
David Drysdale7de9feb2021-03-05 14:56:19 +0000649 // Check OS details match the original hardware info.
Shawn Willden7f424372021-01-10 18:06:50 -0700650 auto os_ver = auths.GetTagValue(TAG_OS_VERSION);
David Drysdale7de9feb2021-03-05 14:56:19 +0000651 EXPECT_TRUE(os_ver);
Shawn Willden7f424372021-01-10 18:06:50 -0700652 EXPECT_EQ(*os_ver, os_version());
Shawn Willden7f424372021-01-10 18:06:50 -0700653 auto os_pl = auths.GetTagValue(TAG_OS_PATCHLEVEL);
David Drysdale7de9feb2021-03-05 14:56:19 +0000654 EXPECT_TRUE(os_pl);
Shawn Willden7f424372021-01-10 18:06:50 -0700655 EXPECT_EQ(*os_pl, os_patch_level());
David Drysdale7de9feb2021-03-05 14:56:19 +0000656
David Drysdaledbbbe2e2021-12-02 07:44:23 +0000657 // Should include vendor patchlevel.
David Drysdalef5bfa002021-09-27 17:30:41 +0100658 auto vendor_pl = auths.GetTagValue(TAG_VENDOR_PATCHLEVEL);
659 EXPECT_TRUE(vendor_pl);
660 EXPECT_EQ(*vendor_pl, vendor_patch_level());
David Drysdaledbbbe2e2021-12-02 07:44:23 +0000661
662 // Should include boot patchlevel (but there are some test scenarios where this is not
663 // possible).
664 if (check_boot_pl) {
665 auto boot_pl = auths.GetTagValue(TAG_BOOT_PATCHLEVEL);
666 EXPECT_TRUE(boot_pl);
667 }
David Drysdalebb3d85e2021-04-13 11:15:51 +0100668
David Drysdale7de9feb2021-03-05 14:56:19 +0000669 return auths;
Selene Huang31ab4042020-04-29 04:22:39 -0700670 }
671};
672
673/*
David Drysdale7de9feb2021-03-05 14:56:19 +0000674 * NewKeyGenerationTest.Aes
675 *
676 * Verifies that keymint can generate all required AES key sizes, and that the resulting keys
677 * have correct characteristics.
678 */
679TEST_P(NewKeyGenerationTest, Aes) {
680 for (auto key_size : ValidKeySizes(Algorithm::AES)) {
681 for (auto block_mode : ValidBlockModes(Algorithm::AES)) {
682 for (auto padding_mode : ValidPaddingModes(Algorithm::AES, block_mode)) {
683 SCOPED_TRACE(testing::Message()
684 << "AES-" << key_size << "-" << block_mode << "-" << padding_mode);
685 vector<uint8_t> key_blob;
686 vector<KeyCharacteristics> key_characteristics;
687 auto builder = AuthorizationSetBuilder()
688 .AesEncryptionKey(key_size)
689 .BlockMode(block_mode)
690 .Padding(padding_mode)
691 .SetDefaultValidity();
692 if (block_mode == BlockMode::GCM) {
693 builder.Authorization(TAG_MIN_MAC_LENGTH, 128);
694 }
695 ASSERT_EQ(ErrorCode::OK, GenerateKey(builder, &key_blob, &key_characteristics));
696
697 EXPECT_GT(key_blob.size(), 0U);
698 CheckSymmetricParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +0100699 CheckCharacteristics(key_blob, key_characteristics);
David Drysdale7de9feb2021-03-05 14:56:19 +0000700
701 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
702
703 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::AES));
704 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
705 << "Key size " << key_size << "missing";
706
707 CheckedDeleteKey(&key_blob);
708 }
709 }
710 }
711}
712
713/*
714 * NewKeyGenerationTest.AesInvalidSize
715 *
716 * Verifies that specifying an invalid key size for AES key generation returns
717 * UNSUPPORTED_KEY_SIZE.
718 */
719TEST_P(NewKeyGenerationTest, AesInvalidSize) {
720 for (auto key_size : InvalidKeySizes(Algorithm::AES)) {
721 for (auto block_mode : ValidBlockModes(Algorithm::AES)) {
722 for (auto padding_mode : ValidPaddingModes(Algorithm::AES, block_mode)) {
723 SCOPED_TRACE(testing::Message()
724 << "AES-" << key_size << "-" << block_mode << "-" << padding_mode);
725 vector<uint8_t> key_blob;
726 vector<KeyCharacteristics> key_characteristics;
727 auto builder = AuthorizationSetBuilder()
728 .AesEncryptionKey(key_size)
729 .BlockMode(block_mode)
730 .Padding(padding_mode)
731 .SetDefaultValidity();
732 if (block_mode == BlockMode::GCM) {
733 builder.Authorization(TAG_MIN_MAC_LENGTH, 128);
734 }
735 EXPECT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
736 GenerateKey(builder, &key_blob, &key_characteristics));
737 }
738 }
739 }
740
741 for (auto block_mode : ValidBlockModes(Algorithm::AES)) {
742 for (auto padding_mode : ValidPaddingModes(Algorithm::AES, block_mode)) {
743 vector<uint8_t> key_blob;
744 vector<KeyCharacteristics> key_characteristics;
745 // No key size specified
746 auto builder = AuthorizationSetBuilder()
747 .Authorization(TAG_ALGORITHM, Algorithm::AES)
748 .BlockMode(block_mode)
749 .Padding(padding_mode)
750 .SetDefaultValidity();
751 if (block_mode == BlockMode::GCM) {
752 builder.Authorization(TAG_MIN_MAC_LENGTH, 128);
753 }
754 EXPECT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
755 GenerateKey(builder, &key_blob, &key_characteristics));
756 }
757 }
758}
759
760/*
761 * NewKeyGenerationTest.AesInvalidPadding
762 *
763 * Verifies that specifying an invalid padding on AES keys gives a failure
764 * somewhere along the way.
765 */
766TEST_P(NewKeyGenerationTest, AesInvalidPadding) {
767 for (auto key_size : ValidKeySizes(Algorithm::AES)) {
768 for (auto block_mode : ValidBlockModes(Algorithm::AES)) {
769 for (auto padding_mode : InvalidPaddingModes(Algorithm::AES, block_mode)) {
770 SCOPED_TRACE(testing::Message()
771 << "AES-" << key_size << "-" << block_mode << "-" << padding_mode);
David Drysdale7de9feb2021-03-05 14:56:19 +0000772 auto builder = AuthorizationSetBuilder()
Tommy Chiu3950b452021-05-03 22:01:46 +0800773 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdale7de9feb2021-03-05 14:56:19 +0000774 .AesEncryptionKey(key_size)
775 .BlockMode(block_mode)
776 .Padding(padding_mode)
777 .SetDefaultValidity();
778 if (block_mode == BlockMode::GCM) {
779 builder.Authorization(TAG_MIN_MAC_LENGTH, 128);
780 }
781
Tommy Chiu3950b452021-05-03 22:01:46 +0800782 auto result = GenerateKey(builder);
David Drysdale7de9feb2021-03-05 14:56:19 +0000783 if (result == ErrorCode::OK) {
784 // Key creation was OK but has generated a key that cannot be used.
785 auto params =
786 AuthorizationSetBuilder().BlockMode(block_mode).Padding(padding_mode);
Tommy Chiu3950b452021-05-03 22:01:46 +0800787 if (block_mode == BlockMode::GCM) {
788 params.Authorization(TAG_MAC_LENGTH, 128);
789 }
David Drysdale7de9feb2021-03-05 14:56:19 +0000790 auto result = Begin(KeyPurpose::ENCRYPT, params);
791 EXPECT_TRUE(result == ErrorCode::INCOMPATIBLE_PADDING_MODE ||
David Drysdalec9bc2f72021-05-04 10:47:58 +0100792 result == ErrorCode::INVALID_KEY_BLOB)
793 << "unexpected result: " << result;
David Drysdale7de9feb2021-03-05 14:56:19 +0000794 } else {
795 // The KeyMint implementation detected that the generated key
796 // is unusable.
797 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PADDING_MODE, result);
798 }
799 }
800 }
801 }
802}
803
804/*
805 * NewKeyGenerationTest.AesGcmMissingMinMac
806 *
807 * Verifies that specifying an invalid key size for AES key generation returns
808 * UNSUPPORTED_KEY_SIZE.
809 */
810TEST_P(NewKeyGenerationTest, AesGcmMissingMinMac) {
811 for (auto key_size : ValidKeySizes(Algorithm::AES)) {
812 BlockMode block_mode = BlockMode::GCM;
813 for (auto padding_mode : ValidPaddingModes(Algorithm::AES, block_mode)) {
814 SCOPED_TRACE(testing::Message()
815 << "AES-" << key_size << "-" << block_mode << "-" << padding_mode);
816 vector<uint8_t> key_blob;
817 vector<KeyCharacteristics> key_characteristics;
818 // No MIN_MAC_LENGTH provided.
819 auto builder = AuthorizationSetBuilder()
820 .AesEncryptionKey(key_size)
821 .BlockMode(block_mode)
822 .Padding(padding_mode)
823 .SetDefaultValidity();
824 EXPECT_EQ(ErrorCode::MISSING_MIN_MAC_LENGTH,
825 GenerateKey(builder, &key_blob, &key_characteristics));
826 }
827 }
828}
829
830/*
David Drysdaled2cc8c22021-04-15 13:29:45 +0100831 * NewKeyGenerationTest.AesGcmMinMacOutOfRange
832 *
833 * Verifies that specifying an invalid min MAC size for AES key generation returns
834 * UNSUPPORTED_MIN_MAC_LENGTH.
835 */
836TEST_P(NewKeyGenerationTest, AesGcmMinMacOutOfRange) {
837 for (size_t min_mac_len : {88, 136}) {
838 for (auto key_size : ValidKeySizes(Algorithm::AES)) {
839 BlockMode block_mode = BlockMode::GCM;
840 for (auto padding_mode : ValidPaddingModes(Algorithm::AES, block_mode)) {
841 SCOPED_TRACE(testing::Message()
842 << "AES-" << key_size << "-" << block_mode << "-" << padding_mode);
843 vector<uint8_t> key_blob;
844 vector<KeyCharacteristics> key_characteristics;
845 auto builder = AuthorizationSetBuilder()
846 .AesEncryptionKey(key_size)
847 .BlockMode(block_mode)
848 .Padding(padding_mode)
849 .Authorization(TAG_MIN_MAC_LENGTH, min_mac_len)
850 .SetDefaultValidity();
851 EXPECT_EQ(ErrorCode::UNSUPPORTED_MIN_MAC_LENGTH,
852 GenerateKey(builder, &key_blob, &key_characteristics));
853 }
854 }
855 }
856}
857
858/*
David Drysdale7de9feb2021-03-05 14:56:19 +0000859 * NewKeyGenerationTest.TripleDes
860 *
861 * Verifies that keymint can generate all required 3DES key sizes, and that the resulting keys
862 * have correct characteristics.
863 */
864TEST_P(NewKeyGenerationTest, TripleDes) {
865 for (auto key_size : ValidKeySizes(Algorithm::TRIPLE_DES)) {
866 for (auto block_mode : ValidBlockModes(Algorithm::TRIPLE_DES)) {
867 for (auto padding_mode : ValidPaddingModes(Algorithm::AES, block_mode)) {
868 SCOPED_TRACE(testing::Message()
869 << "3DES-" << key_size << "-" << block_mode << "-" << padding_mode);
870 vector<uint8_t> key_blob;
871 vector<KeyCharacteristics> key_characteristics;
872 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
873 .TripleDesEncryptionKey(key_size)
874 .BlockMode(block_mode)
875 .Padding(padding_mode)
876 .Authorization(TAG_NO_AUTH_REQUIRED)
877 .SetDefaultValidity(),
878 &key_blob, &key_characteristics));
879
880 EXPECT_GT(key_blob.size(), 0U);
881 CheckSymmetricParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +0100882 CheckCharacteristics(key_blob, key_characteristics);
David Drysdale7de9feb2021-03-05 14:56:19 +0000883
884 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
885
886 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::TRIPLE_DES));
887 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
888 << "Key size " << key_size << "missing";
889
890 CheckedDeleteKey(&key_blob);
891 }
892 }
893 }
894}
895
896/*
897 * NewKeyGenerationTest.TripleDesWithAttestation
898 *
899 * Verifies that keymint can generate all required 3DES key sizes, and that the resulting keys
900 * have correct characteristics.
901 *
902 * Request attestation, which doesn't help for symmetric keys (as there is no public key to
903 * put in a certificate) but which isn't an error.
904 */
905TEST_P(NewKeyGenerationTest, TripleDesWithAttestation) {
906 for (auto key_size : ValidKeySizes(Algorithm::TRIPLE_DES)) {
907 for (auto block_mode : ValidBlockModes(Algorithm::TRIPLE_DES)) {
908 for (auto padding_mode : ValidPaddingModes(Algorithm::AES, block_mode)) {
909 SCOPED_TRACE(testing::Message()
910 << "3DES-" << key_size << "-" << block_mode << "-" << padding_mode);
911
912 auto challenge = "hello";
913 auto app_id = "foo";
914
915 vector<uint8_t> key_blob;
916 vector<KeyCharacteristics> key_characteristics;
917 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
918 .TripleDesEncryptionKey(key_size)
919 .BlockMode(block_mode)
920 .Padding(padding_mode)
921 .Authorization(TAG_NO_AUTH_REQUIRED)
922 .AttestationChallenge(challenge)
923 .AttestationApplicationId(app_id)
924 .SetDefaultValidity(),
925 &key_blob, &key_characteristics));
926
927 EXPECT_GT(key_blob.size(), 0U);
928 CheckSymmetricParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +0100929 CheckCharacteristics(key_blob, key_characteristics);
David Drysdale7de9feb2021-03-05 14:56:19 +0000930
931 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
932
933 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::TRIPLE_DES));
934 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
935 << "Key size " << key_size << "missing";
936
937 CheckedDeleteKey(&key_blob);
938 }
939 }
940 }
941}
942
943/*
944 * NewKeyGenerationTest.TripleDesInvalidSize
945 *
946 * Verifies that specifying an invalid key size for 3-DES key generation returns
947 * UNSUPPORTED_KEY_SIZE.
948 */
949TEST_P(NewKeyGenerationTest, TripleDesInvalidSize) {
950 for (auto key_size : InvalidKeySizes(Algorithm::TRIPLE_DES)) {
951 for (auto block_mode : ValidBlockModes(Algorithm::TRIPLE_DES)) {
952 for (auto padding_mode : ValidPaddingModes(Algorithm::AES, block_mode)) {
953 SCOPED_TRACE(testing::Message()
954 << "3DES-" << key_size << "-" << block_mode << "-" << padding_mode);
955 vector<uint8_t> key_blob;
956 vector<KeyCharacteristics> key_characteristics;
957 EXPECT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
958 GenerateKey(AuthorizationSetBuilder()
959 .TripleDesEncryptionKey(key_size)
960 .BlockMode(block_mode)
961 .Padding(padding_mode)
962 .Authorization(TAG_NO_AUTH_REQUIRED)
963 .SetDefaultValidity(),
964 &key_blob, &key_characteristics));
965 }
966 }
967 }
968
969 // Omitting the key size fails.
970 for (auto block_mode : ValidBlockModes(Algorithm::TRIPLE_DES)) {
971 for (auto padding_mode : ValidPaddingModes(Algorithm::AES, block_mode)) {
972 SCOPED_TRACE(testing::Message()
973 << "3DES-default-" << block_mode << "-" << padding_mode);
974 vector<uint8_t> key_blob;
975 vector<KeyCharacteristics> key_characteristics;
976 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
977 GenerateKey(AuthorizationSetBuilder()
978 .Authorization(TAG_ALGORITHM, Algorithm::TRIPLE_DES)
979 .BlockMode(block_mode)
980 .Padding(padding_mode)
981 .Authorization(TAG_NO_AUTH_REQUIRED)
982 .SetDefaultValidity(),
983 &key_blob, &key_characteristics));
984 }
985 }
986}
987
988/*
Selene Huang31ab4042020-04-29 04:22:39 -0700989 * NewKeyGenerationTest.Rsa
990 *
991 * Verifies that keymint can generate all required RSA key sizes, and that the resulting keys
992 * have correct characteristics.
993 */
994TEST_P(NewKeyGenerationTest, Rsa) {
995 for (auto key_size : ValidKeySizes(Algorithm::RSA)) {
996 vector<uint8_t> key_blob;
Shawn Willden7f424372021-01-10 18:06:50 -0700997 vector<KeyCharacteristics> key_characteristics;
Selene Huang31ab4042020-04-29 04:22:39 -0700998 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
999 .RsaSigningKey(key_size, 65537)
1000 .Digest(Digest::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08001001 .Padding(PaddingMode::NONE)
1002 .SetDefaultValidity(),
Selene Huang31ab4042020-04-29 04:22:39 -07001003 &key_blob, &key_characteristics));
1004
1005 ASSERT_GT(key_blob.size(), 0U);
1006 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01001007 CheckCharacteristics(key_blob, key_characteristics);
Selene Huang31ab4042020-04-29 04:22:39 -07001008
Shawn Willden7f424372021-01-10 18:06:50 -07001009 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
Selene Huang31ab4042020-04-29 04:22:39 -07001010
1011 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::RSA));
1012 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
1013 << "Key size " << key_size << "missing";
1014 EXPECT_TRUE(crypto_params.Contains(TAG_RSA_PUBLIC_EXPONENT, 65537U));
1015
1016 CheckedDeleteKey(&key_blob);
1017 }
1018}
1019
1020/*
Prashant Patil6c1adf02021-11-22 06:21:21 +00001021 * NewKeyGenerationTest.RsaWithMissingValidity
1022 *
1023 * Verifies that keymint returns an error while generating asymmetric key
1024 * without providing NOT_BEFORE and NOT_AFTER parameters.
1025 */
1026TEST_P(NewKeyGenerationTest, RsaWithMissingValidity) {
1027 // Per RFC 5280 4.1.2.5, an undefined expiration (not-after) field should be set to
1028 // GeneralizedTime 999912312359559, which is 253402300799000 ms from Jan 1, 1970.
1029 constexpr uint64_t kUndefinedExpirationDateTime = 253402300799000;
1030
1031 vector<uint8_t> key_blob;
1032 vector<KeyCharacteristics> key_characteristics;
1033 ASSERT_EQ(ErrorCode::MISSING_NOT_BEFORE,
1034 GenerateKey(AuthorizationSetBuilder()
1035 .RsaSigningKey(2048, 65537)
1036 .Digest(Digest::NONE)
1037 .Padding(PaddingMode::NONE)
1038 .Authorization(TAG_CERTIFICATE_NOT_AFTER,
1039 kUndefinedExpirationDateTime),
1040 &key_blob, &key_characteristics));
1041
1042 ASSERT_EQ(ErrorCode::MISSING_NOT_AFTER,
1043 GenerateKey(AuthorizationSetBuilder()
1044 .RsaSigningKey(2048, 65537)
1045 .Digest(Digest::NONE)
1046 .Padding(PaddingMode::NONE)
1047 .Authorization(TAG_CERTIFICATE_NOT_BEFORE, 0),
1048 &key_blob, &key_characteristics));
1049}
1050
1051/*
Qi Wud22ec842020-11-26 13:27:53 +08001052 * NewKeyGenerationTest.RsaWithAttestation
Shawn Willden0e80b5d2020-12-17 09:07:27 -07001053 *
David Drysdaled2cc8c22021-04-15 13:29:45 +01001054 * Verifies that keymint can generate all required RSA key sizes with attestation, and that the
1055 * resulting keys have correct characteristics.
Shawn Willden0e80b5d2020-12-17 09:07:27 -07001056 */
1057TEST_P(NewKeyGenerationTest, RsaWithAttestation) {
Selene Huang4f64c222021-04-13 19:54:36 -07001058 auto challenge = "hello";
1059 auto app_id = "foo";
Shawn Willden0e80b5d2020-12-17 09:07:27 -07001060
Selene Huang6e46f142021-04-20 19:20:11 -07001061 auto subject = "cert subj 2";
1062 vector<uint8_t> subject_der(make_name_from_str(subject));
1063
1064 uint64_t serial_int = 66;
1065 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
1066
Selene Huang4f64c222021-04-13 19:54:36 -07001067 for (auto key_size : ValidKeySizes(Algorithm::RSA)) {
Shawn Willden0e80b5d2020-12-17 09:07:27 -07001068 vector<uint8_t> key_blob;
1069 vector<KeyCharacteristics> key_characteristics;
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001070 auto builder = AuthorizationSetBuilder()
1071 .RsaSigningKey(key_size, 65537)
1072 .Digest(Digest::NONE)
1073 .Padding(PaddingMode::NONE)
1074 .AttestationChallenge(challenge)
1075 .AttestationApplicationId(app_id)
1076 .Authorization(TAG_NO_AUTH_REQUIRED)
1077 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
1078 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
1079 .SetDefaultValidity();
1080
1081 auto result = GenerateKey(builder, &key_blob, &key_characteristics);
subrahmanyaman05642492022-02-05 07:10:56 +00001082 // Strongbox may not support factory provisioned attestation key.
1083 if (SecLevel() == SecurityLevel::STRONGBOX) {
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001084 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
1085 result = GenerateKeyWithSelfSignedAttestKey(
1086 AuthorizationSetBuilder()
1087 .RsaKey(key_size, 65537)
1088 .AttestKey()
1089 .SetDefaultValidity(), /* attest key params */
1090 builder, &key_blob, &key_characteristics);
1091 }
subrahmanyaman05642492022-02-05 07:10:56 +00001092 }
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001093 ASSERT_EQ(ErrorCode::OK, result);
Shawn Willden0e80b5d2020-12-17 09:07:27 -07001094 ASSERT_GT(key_blob.size(), 0U);
1095 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01001096 CheckCharacteristics(key_blob, key_characteristics);
Shawn Willden0e80b5d2020-12-17 09:07:27 -07001097
1098 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
1099
1100 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::RSA));
1101 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
1102 << "Key size " << key_size << "missing";
1103 EXPECT_TRUE(crypto_params.Contains(TAG_RSA_PUBLIC_EXPONENT, 65537U));
1104
Selene Huang6e46f142021-04-20 19:20:11 -07001105 verify_subject_and_serial(cert_chain_[0], serial_int, subject, false);
Shawn Willden7c130392020-12-21 09:58:22 -07001106 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
Shawn Willden0e80b5d2020-12-17 09:07:27 -07001107 ASSERT_GT(cert_chain_.size(), 0);
1108
1109 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
1110 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
David Drysdale7dff4fc2021-12-10 10:10:52 +00001111 EXPECT_TRUE(verify_attestation_record(AidlVersion(), challenge, app_id, //
Shawn Willden0e80b5d2020-12-17 09:07:27 -07001112 sw_enforced, hw_enforced, SecLevel(),
1113 cert_chain_[0].encodedCertificate));
1114
1115 CheckedDeleteKey(&key_blob);
1116 }
1117}
1118
1119/*
David Drysdale4dc01072021-04-01 12:17:35 +01001120 * NewKeyGenerationTest.RsaWithRpkAttestation
1121 *
1122 * Verifies that keymint can generate all required RSA key sizes, using an attestation key
1123 * that has been generated using an associate IRemotelyProvisionedComponent.
David Drysdale0fce69d2021-04-13 17:22:13 +01001124 *
1125 * This test is disabled because the KeyMint specification does not require that implementations
1126 * of the first version of KeyMint have to also implement IRemotelyProvisionedComponent.
1127 * However, the test is kept in the code because KeyMint v2 will impose this requirement.
David Drysdale4dc01072021-04-01 12:17:35 +01001128 */
David Drysdale0fce69d2021-04-13 17:22:13 +01001129TEST_P(NewKeyGenerationTest, DISABLED_RsaWithRpkAttestation) {
David Drysdale4dc01072021-04-01 12:17:35 +01001130 // There should be an IRemotelyProvisionedComponent instance associated with the KeyMint
1131 // instance.
1132 std::shared_ptr<IRemotelyProvisionedComponent> rp;
1133 ASSERT_TRUE(matching_rp_instance(GetParam(), &rp))
1134 << "No IRemotelyProvisionedComponent found that matches KeyMint device " << GetParam();
1135
1136 // Generate a P-256 keypair to use as an attestation key.
1137 MacedPublicKey macedPubKey;
1138 std::vector<uint8_t> privateKeyBlob;
1139 auto status =
1140 rp->generateEcdsaP256KeyPair(/* testMode= */ false, &macedPubKey, &privateKeyBlob);
1141 ASSERT_TRUE(status.isOk());
1142 vector<uint8_t> coseKeyData;
1143 check_maced_pubkey(macedPubKey, /* testMode= */ false, &coseKeyData);
1144
1145 AttestationKey attestation_key;
1146 attestation_key.keyBlob = std::move(privateKeyBlob);
1147 attestation_key.issuerSubjectName = make_name_from_str("Android Keystore Key");
1148
1149 for (auto key_size : ValidKeySizes(Algorithm::RSA)) {
1150 auto challenge = "hello";
1151 auto app_id = "foo";
1152
1153 vector<uint8_t> key_blob;
1154 vector<KeyCharacteristics> key_characteristics;
1155 ASSERT_EQ(ErrorCode::OK,
1156 GenerateKey(AuthorizationSetBuilder()
1157 .RsaSigningKey(key_size, 65537)
1158 .Digest(Digest::NONE)
1159 .Padding(PaddingMode::NONE)
1160 .AttestationChallenge(challenge)
1161 .AttestationApplicationId(app_id)
1162 .Authorization(TAG_NO_AUTH_REQUIRED)
1163 .SetDefaultValidity(),
1164 attestation_key, &key_blob, &key_characteristics, &cert_chain_));
1165
1166 ASSERT_GT(key_blob.size(), 0U);
1167 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01001168 CheckCharacteristics(key_blob, key_characteristics);
David Drysdale4dc01072021-04-01 12:17:35 +01001169
1170 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
1171
1172 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::RSA));
1173 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
1174 << "Key size " << key_size << "missing";
1175 EXPECT_TRUE(crypto_params.Contains(TAG_RSA_PUBLIC_EXPONENT, 65537U));
1176
1177 // Attestation by itself is not valid (last entry is not self-signed).
1178 EXPECT_FALSE(ChainSignaturesAreValid(cert_chain_));
1179
1180 // The signature over the attested key should correspond to the P256 public key.
1181 X509_Ptr key_cert(parse_cert_blob(cert_chain_[0].encodedCertificate));
1182 ASSERT_TRUE(key_cert.get());
1183 EVP_PKEY_Ptr signing_pubkey;
1184 p256_pub_key(coseKeyData, &signing_pubkey);
1185 ASSERT_TRUE(signing_pubkey.get());
1186
1187 ASSERT_TRUE(X509_verify(key_cert.get(), signing_pubkey.get()))
1188 << "Verification of attested certificate failed "
1189 << "OpenSSL error string: " << ERR_error_string(ERR_get_error(), NULL);
1190
1191 CheckedDeleteKey(&key_blob);
1192 }
1193}
1194
1195/*
Selene Huang4f64c222021-04-13 19:54:36 -07001196 * NewKeyGenerationTest.RsaEncryptionWithAttestation
1197 *
1198 * Verifies that keymint attestation for RSA encryption keys with challenge and
1199 * app id is also successful.
1200 */
1201TEST_P(NewKeyGenerationTest, RsaEncryptionWithAttestation) {
1202 auto key_size = 2048;
1203 auto challenge = "hello";
1204 auto app_id = "foo";
1205
Selene Huang6e46f142021-04-20 19:20:11 -07001206 auto subject = "subj 2";
1207 vector<uint8_t> subject_der(make_name_from_str(subject));
1208
1209 uint64_t serial_int = 111166;
1210 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
1211
Selene Huang4f64c222021-04-13 19:54:36 -07001212 vector<uint8_t> key_blob;
1213 vector<KeyCharacteristics> key_characteristics;
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001214 auto builder = AuthorizationSetBuilder()
1215 .RsaEncryptionKey(key_size, 65537)
1216 .Padding(PaddingMode::NONE)
1217 .AttestationChallenge(challenge)
1218 .AttestationApplicationId(app_id)
1219 .Authorization(TAG_NO_AUTH_REQUIRED)
1220 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
1221 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
1222 .SetDefaultValidity();
1223
1224 auto result = GenerateKey(builder, &key_blob, &key_characteristics);
subrahmanyaman05642492022-02-05 07:10:56 +00001225 // Strongbox may not support factory provisioned attestation key.
1226 if (SecLevel() == SecurityLevel::STRONGBOX) {
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001227 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
1228 result = GenerateKeyWithSelfSignedAttestKey(
1229 AuthorizationSetBuilder()
1230 .RsaKey(key_size, 65537)
1231 .AttestKey()
1232 .SetDefaultValidity(), /* attest key params */
1233 builder, &key_blob, &key_characteristics);
1234 }
subrahmanyaman05642492022-02-05 07:10:56 +00001235 }
1236 ASSERT_EQ(ErrorCode::OK, result);
Selene Huang4f64c222021-04-13 19:54:36 -07001237
1238 ASSERT_GT(key_blob.size(), 0U);
1239 AuthorizationSet auths;
1240 for (auto& entry : key_characteristics) {
1241 auths.push_back(AuthorizationSet(entry.authorizations));
1242 }
1243
1244 EXPECT_TRUE(auths.Contains(TAG_ORIGIN, KeyOrigin::GENERATED));
1245 EXPECT_TRUE(auths.Contains(TAG_PURPOSE, KeyPurpose::DECRYPT));
1246
1247 // Verify that App data and ROT are NOT included.
1248 EXPECT_FALSE(auths.Contains(TAG_ROOT_OF_TRUST));
1249 EXPECT_FALSE(auths.Contains(TAG_APPLICATION_DATA));
1250
1251 // Check that some unexpected tags/values are NOT present.
1252 EXPECT_FALSE(auths.Contains(TAG_PURPOSE, KeyPurpose::SIGN));
1253 EXPECT_FALSE(auths.Contains(TAG_PURPOSE, KeyPurpose::VERIFY));
1254
1255 EXPECT_FALSE(auths.Contains(TAG_AUTH_TIMEOUT, 301U));
1256
1257 auto os_ver = auths.GetTagValue(TAG_OS_VERSION);
1258 ASSERT_TRUE(os_ver);
1259 EXPECT_EQ(*os_ver, os_version());
1260
1261 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
1262
1263 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::RSA));
1264 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
1265 << "Key size " << key_size << "missing";
1266 EXPECT_TRUE(crypto_params.Contains(TAG_RSA_PUBLIC_EXPONENT, 65537U));
1267
Selene Huang6e46f142021-04-20 19:20:11 -07001268 verify_subject_and_serial(cert_chain_[0], serial_int, subject, false);
Selene Huang4f64c222021-04-13 19:54:36 -07001269 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
1270 ASSERT_GT(cert_chain_.size(), 0);
1271
1272 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
1273 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
David Drysdale7dff4fc2021-12-10 10:10:52 +00001274 EXPECT_TRUE(verify_attestation_record(AidlVersion(), challenge, app_id, //
Selene Huang4f64c222021-04-13 19:54:36 -07001275 sw_enforced, hw_enforced, SecLevel(),
1276 cert_chain_[0].encodedCertificate));
1277
1278 CheckedDeleteKey(&key_blob);
1279}
1280
1281/*
1282 * NewKeyGenerationTest.RsaWithSelfSign
1283 *
1284 * Verifies that attesting to RSA key generation is successful, and returns
1285 * self signed certificate if no challenge is provided. And signing etc
1286 * works as expected.
1287 */
1288TEST_P(NewKeyGenerationTest, RsaWithSelfSign) {
Selene Huang6e46f142021-04-20 19:20:11 -07001289 auto subject = "cert subj subj subj subj subj subj 22222222222222222222";
1290 vector<uint8_t> subject_der(make_name_from_str(subject));
1291
1292 uint64_t serial_int = 0;
1293 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
1294
Selene Huang4f64c222021-04-13 19:54:36 -07001295 for (auto key_size : ValidKeySizes(Algorithm::RSA)) {
1296 vector<uint8_t> key_blob;
1297 vector<KeyCharacteristics> key_characteristics;
Selene Huang6e46f142021-04-20 19:20:11 -07001298 ASSERT_EQ(ErrorCode::OK,
1299 GenerateKey(AuthorizationSetBuilder()
1300 .RsaSigningKey(key_size, 65537)
1301 .Digest(Digest::NONE)
1302 .Padding(PaddingMode::NONE)
1303 .Authorization(TAG_NO_AUTH_REQUIRED)
1304 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
1305 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
1306 .SetDefaultValidity(),
1307 &key_blob, &key_characteristics));
Selene Huang4f64c222021-04-13 19:54:36 -07001308
1309 ASSERT_GT(key_blob.size(), 0U);
1310 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01001311 CheckCharacteristics(key_blob, key_characteristics);
Selene Huang4f64c222021-04-13 19:54:36 -07001312
1313 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
1314
1315 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::RSA));
1316 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
1317 << "Key size " << key_size << "missing";
1318 EXPECT_TRUE(crypto_params.Contains(TAG_RSA_PUBLIC_EXPONENT, 65537U));
1319
Selene Huang6e46f142021-04-20 19:20:11 -07001320 verify_subject_and_serial(cert_chain_[0], serial_int, subject, false);
Selene Huang4f64c222021-04-13 19:54:36 -07001321 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
1322 ASSERT_EQ(cert_chain_.size(), 1);
1323
1324 CheckedDeleteKey(&key_blob);
1325 }
1326}
1327
1328/*
1329 * NewKeyGenerationTest.RsaWithAttestationMissAppId
1330 *
1331 * Verifies that attesting to RSA checks for missing app ID.
1332 */
1333TEST_P(NewKeyGenerationTest, RsaWithAttestationMissAppId) {
1334 auto challenge = "hello";
1335 vector<uint8_t> key_blob;
1336 vector<KeyCharacteristics> key_characteristics;
1337
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001338 auto builder = AuthorizationSetBuilder()
1339 .RsaSigningKey(2048, 65537)
1340 .Digest(Digest::NONE)
1341 .Padding(PaddingMode::NONE)
1342 .AttestationChallenge(challenge)
1343 .Authorization(TAG_NO_AUTH_REQUIRED)
1344 .SetDefaultValidity();
1345
1346 auto result = GenerateKey(builder, &key_blob, &key_characteristics);
subrahmanyaman05642492022-02-05 07:10:56 +00001347 // Strongbox may not support factory provisioned attestation key.
1348 if (SecLevel() == SecurityLevel::STRONGBOX) {
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001349 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
1350 result = GenerateKeyWithSelfSignedAttestKey(
1351 AuthorizationSetBuilder()
1352 .RsaKey(2048, 65537)
1353 .AttestKey()
1354 .SetDefaultValidity(), /* attest key params */
1355 builder, &key_blob, &key_characteristics);
1356 }
subrahmanyaman05642492022-02-05 07:10:56 +00001357 }
1358 ASSERT_EQ(ErrorCode::ATTESTATION_APPLICATION_ID_MISSING, result);
Selene Huang4f64c222021-04-13 19:54:36 -07001359}
1360
1361/*
1362 * NewKeyGenerationTest.RsaWithAttestationAppIdIgnored
1363 *
1364 * Verifies that attesting to RSA ignores app id if challenge is missing.
1365 */
1366TEST_P(NewKeyGenerationTest, RsaWithAttestationAppIdIgnored) {
1367 auto key_size = 2048;
1368 auto app_id = "foo";
1369
Selene Huang6e46f142021-04-20 19:20:11 -07001370 auto subject = "cert subj 2";
1371 vector<uint8_t> subject_der(make_name_from_str(subject));
1372
1373 uint64_t serial_int = 1;
1374 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
1375
Selene Huang4f64c222021-04-13 19:54:36 -07001376 vector<uint8_t> key_blob;
1377 vector<KeyCharacteristics> key_characteristics;
Selene Huang6e46f142021-04-20 19:20:11 -07001378 ASSERT_EQ(ErrorCode::OK,
1379 GenerateKey(AuthorizationSetBuilder()
1380 .RsaSigningKey(key_size, 65537)
1381 .Digest(Digest::NONE)
1382 .Padding(PaddingMode::NONE)
1383 .AttestationApplicationId(app_id)
1384 .Authorization(TAG_NO_AUTH_REQUIRED)
1385 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
1386 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
1387 .SetDefaultValidity(),
1388 &key_blob, &key_characteristics));
Selene Huang4f64c222021-04-13 19:54:36 -07001389
1390 ASSERT_GT(key_blob.size(), 0U);
1391 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01001392 CheckCharacteristics(key_blob, key_characteristics);
Selene Huang4f64c222021-04-13 19:54:36 -07001393
1394 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
1395
1396 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::RSA));
1397 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
1398 << "Key size " << key_size << "missing";
1399 EXPECT_TRUE(crypto_params.Contains(TAG_RSA_PUBLIC_EXPONENT, 65537U));
1400
Selene Huang6e46f142021-04-20 19:20:11 -07001401 verify_subject_and_serial(cert_chain_[0], serial_int, subject, false);
Selene Huang4f64c222021-04-13 19:54:36 -07001402 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
1403 ASSERT_EQ(cert_chain_.size(), 1);
1404
1405 CheckedDeleteKey(&key_blob);
1406}
1407
1408/*
Qi Wud22ec842020-11-26 13:27:53 +08001409 * NewKeyGenerationTest.LimitedUsageRsa
1410 *
1411 * Verifies that KeyMint can generate all required RSA key sizes with limited usage, and that the
1412 * resulting keys have correct characteristics.
1413 */
1414TEST_P(NewKeyGenerationTest, LimitedUsageRsa) {
1415 for (auto key_size : ValidKeySizes(Algorithm::RSA)) {
1416 vector<uint8_t> key_blob;
1417 vector<KeyCharacteristics> key_characteristics;
1418 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
1419 .RsaSigningKey(key_size, 65537)
1420 .Digest(Digest::NONE)
1421 .Padding(PaddingMode::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08001422 .Authorization(TAG_USAGE_COUNT_LIMIT, 1)
1423 .SetDefaultValidity(),
Qi Wud22ec842020-11-26 13:27:53 +08001424 &key_blob, &key_characteristics));
1425
1426 ASSERT_GT(key_blob.size(), 0U);
1427 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01001428 CheckCharacteristics(key_blob, key_characteristics);
Qi Wud22ec842020-11-26 13:27:53 +08001429
1430 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
1431
1432 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::RSA));
1433 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
1434 << "Key size " << key_size << "missing";
1435 EXPECT_TRUE(crypto_params.Contains(TAG_RSA_PUBLIC_EXPONENT, 65537U));
1436
1437 // Check the usage count limit tag appears in the authorizations.
1438 AuthorizationSet auths;
1439 for (auto& entry : key_characteristics) {
1440 auths.push_back(AuthorizationSet(entry.authorizations));
1441 }
1442 EXPECT_TRUE(auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U))
1443 << "key usage count limit " << 1U << " missing";
1444
1445 CheckedDeleteKey(&key_blob);
1446 }
1447}
1448
1449/*
Qi Wubeefae42021-01-28 23:16:37 +08001450 * NewKeyGenerationTest.LimitedUsageRsaWithAttestation
1451 *
1452 * Verifies that KeyMint can generate all required RSA key sizes with limited usage, and that the
1453 * resulting keys have correct characteristics and attestation.
1454 */
1455TEST_P(NewKeyGenerationTest, LimitedUsageRsaWithAttestation) {
Selene Huang4f64c222021-04-13 19:54:36 -07001456 auto challenge = "hello";
1457 auto app_id = "foo";
Qi Wubeefae42021-01-28 23:16:37 +08001458
Selene Huang6e46f142021-04-20 19:20:11 -07001459 auto subject = "cert subj 2";
1460 vector<uint8_t> subject_der(make_name_from_str(subject));
1461
1462 uint64_t serial_int = 66;
1463 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
1464
Selene Huang4f64c222021-04-13 19:54:36 -07001465 for (auto key_size : ValidKeySizes(Algorithm::RSA)) {
Qi Wubeefae42021-01-28 23:16:37 +08001466 vector<uint8_t> key_blob;
1467 vector<KeyCharacteristics> key_characteristics;
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001468 auto builder = AuthorizationSetBuilder()
1469 .RsaSigningKey(key_size, 65537)
1470 .Digest(Digest::NONE)
1471 .Padding(PaddingMode::NONE)
1472 .AttestationChallenge(challenge)
1473 .AttestationApplicationId(app_id)
1474 .Authorization(TAG_NO_AUTH_REQUIRED)
1475 .Authorization(TAG_USAGE_COUNT_LIMIT, 1)
1476 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
1477 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
1478 .SetDefaultValidity();
1479
1480 auto result = GenerateKey(builder, &key_blob, &key_characteristics);
subrahmanyaman05642492022-02-05 07:10:56 +00001481 // Strongbox may not support factory provisioned attestation key.
1482 if (SecLevel() == SecurityLevel::STRONGBOX) {
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001483 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
1484 result = GenerateKeyWithSelfSignedAttestKey(
1485 AuthorizationSetBuilder()
1486 .RsaKey(key_size, 65537)
1487 .AttestKey()
1488 .SetDefaultValidity(), /* attest key params */
1489 builder, &key_blob, &key_characteristics);
1490 }
subrahmanyaman05642492022-02-05 07:10:56 +00001491 }
1492 ASSERT_EQ(ErrorCode::OK, result);
Qi Wubeefae42021-01-28 23:16:37 +08001493
1494 ASSERT_GT(key_blob.size(), 0U);
1495 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01001496 CheckCharacteristics(key_blob, key_characteristics);
Qi Wubeefae42021-01-28 23:16:37 +08001497
1498 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
1499
1500 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::RSA));
1501 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
1502 << "Key size " << key_size << "missing";
1503 EXPECT_TRUE(crypto_params.Contains(TAG_RSA_PUBLIC_EXPONENT, 65537U));
1504
1505 // Check the usage count limit tag appears in the authorizations.
1506 AuthorizationSet auths;
1507 for (auto& entry : key_characteristics) {
1508 auths.push_back(AuthorizationSet(entry.authorizations));
1509 }
1510 EXPECT_TRUE(auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U))
1511 << "key usage count limit " << 1U << " missing";
1512
1513 // Check the usage count limit tag also appears in the attestation.
Shawn Willden7c130392020-12-21 09:58:22 -07001514 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
Qi Wubeefae42021-01-28 23:16:37 +08001515 ASSERT_GT(cert_chain_.size(), 0);
Selene Huang6e46f142021-04-20 19:20:11 -07001516 verify_subject_and_serial(cert_chain_[0], serial_int, subject, false);
Qi Wubeefae42021-01-28 23:16:37 +08001517
1518 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
1519 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
David Drysdale7dff4fc2021-12-10 10:10:52 +00001520 EXPECT_TRUE(verify_attestation_record(AidlVersion(), challenge, app_id, //
Qi Wubeefae42021-01-28 23:16:37 +08001521 sw_enforced, hw_enforced, SecLevel(),
1522 cert_chain_[0].encodedCertificate));
1523
1524 CheckedDeleteKey(&key_blob);
1525 }
1526}
1527
1528/*
Selene Huang31ab4042020-04-29 04:22:39 -07001529 * NewKeyGenerationTest.NoInvalidRsaSizes
1530 *
1531 * Verifies that keymint cannot generate any RSA key sizes that are designated as invalid.
1532 */
1533TEST_P(NewKeyGenerationTest, NoInvalidRsaSizes) {
1534 for (auto key_size : InvalidKeySizes(Algorithm::RSA)) {
1535 vector<uint8_t> key_blob;
Shawn Willden7f424372021-01-10 18:06:50 -07001536 vector<KeyCharacteristics> key_characteristics;
Selene Huang31ab4042020-04-29 04:22:39 -07001537 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
1538 GenerateKey(AuthorizationSetBuilder()
1539 .RsaSigningKey(key_size, 65537)
1540 .Digest(Digest::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08001541 .Padding(PaddingMode::NONE)
1542 .SetDefaultValidity(),
Selene Huang31ab4042020-04-29 04:22:39 -07001543 &key_blob, &key_characteristics));
1544 }
1545}
1546
1547/*
1548 * NewKeyGenerationTest.RsaNoDefaultSize
1549 *
1550 * Verifies that failing to specify a key size for RSA key generation returns
1551 * UNSUPPORTED_KEY_SIZE.
1552 */
1553TEST_P(NewKeyGenerationTest, RsaNoDefaultSize) {
1554 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
1555 GenerateKey(AuthorizationSetBuilder()
1556 .Authorization(TAG_ALGORITHM, Algorithm::RSA)
1557 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3U)
Janis Danisevskis164bb872021-02-09 11:30:25 -08001558 .SigningKey()
1559 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07001560}
1561
1562/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01001563 * NewKeyGenerationTest.RsaMissingParams
1564 *
1565 * Verifies that omitting optional tags works.
1566 */
1567TEST_P(NewKeyGenerationTest, RsaMissingParams) {
1568 for (auto key_size : ValidKeySizes(Algorithm::RSA)) {
1569 ASSERT_EQ(ErrorCode::OK,
1570 GenerateKey(
1571 AuthorizationSetBuilder().RsaKey(key_size, 65537).SetDefaultValidity()));
1572 CheckedDeleteKey();
1573 }
1574}
1575
1576/*
Selene Huang31ab4042020-04-29 04:22:39 -07001577 * NewKeyGenerationTest.Ecdsa
1578 *
David Drysdale42fe1892021-10-14 14:43:46 +01001579 * Verifies that keymint can generate all required EC curves, and that the resulting keys
Selene Huang31ab4042020-04-29 04:22:39 -07001580 * have correct characteristics.
1581 */
1582TEST_P(NewKeyGenerationTest, Ecdsa) {
David Drysdaledf09e542021-06-08 15:46:11 +01001583 for (auto curve : ValidCurves()) {
Selene Huang31ab4042020-04-29 04:22:39 -07001584 vector<uint8_t> key_blob;
Shawn Willden7f424372021-01-10 18:06:50 -07001585 vector<KeyCharacteristics> key_characteristics;
Janis Danisevskis164bb872021-02-09 11:30:25 -08001586 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
David Drysdaledf09e542021-06-08 15:46:11 +01001587 .EcdsaSigningKey(curve)
Janis Danisevskis164bb872021-02-09 11:30:25 -08001588 .Digest(Digest::NONE)
1589 .SetDefaultValidity(),
1590 &key_blob, &key_characteristics));
Selene Huang31ab4042020-04-29 04:22:39 -07001591 ASSERT_GT(key_blob.size(), 0U);
1592 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01001593 CheckCharacteristics(key_blob, key_characteristics);
Selene Huang31ab4042020-04-29 04:22:39 -07001594
Shawn Willden7f424372021-01-10 18:06:50 -07001595 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
Selene Huang31ab4042020-04-29 04:22:39 -07001596
1597 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::EC));
David Drysdaledf09e542021-06-08 15:46:11 +01001598 EXPECT_TRUE(crypto_params.Contains(TAG_EC_CURVE, curve)) << "Curve " << curve << "missing";
Selene Huang31ab4042020-04-29 04:22:39 -07001599
1600 CheckedDeleteKey(&key_blob);
1601 }
1602}
1603
1604/*
David Drysdale42fe1892021-10-14 14:43:46 +01001605 * NewKeyGenerationTest.EcdsaCurve25519
1606 *
1607 * Verifies that keymint can generate a curve25519 key, and that the resulting key
1608 * has correct characteristics.
1609 */
1610TEST_P(NewKeyGenerationTest, EcdsaCurve25519) {
1611 if (!Curve25519Supported()) {
1612 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
1613 }
1614
1615 EcCurve curve = EcCurve::CURVE_25519;
1616 vector<uint8_t> key_blob;
1617 vector<KeyCharacteristics> key_characteristics;
1618 ErrorCode result = GenerateKey(AuthorizationSetBuilder()
1619 .EcdsaSigningKey(curve)
1620 .Digest(Digest::NONE)
1621 .SetDefaultValidity(),
1622 &key_blob, &key_characteristics);
1623 ASSERT_EQ(result, ErrorCode::OK);
1624 ASSERT_GT(key_blob.size(), 0U);
1625
1626 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
1627 ASSERT_GT(cert_chain_.size(), 0);
1628
1629 CheckBaseParams(key_characteristics);
1630 CheckCharacteristics(key_blob, key_characteristics);
1631
1632 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
1633
1634 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::EC));
1635 EXPECT_TRUE(crypto_params.Contains(TAG_EC_CURVE, curve)) << "Curve " << curve << "missing";
1636
1637 CheckedDeleteKey(&key_blob);
1638}
1639
1640/*
1641 * NewKeyGenerationTest.EcCurve25519MultiPurposeFail
1642 *
1643 * Verifies that KeyMint rejects an attempt to generate a curve 25519 key for both
1644 * SIGN and AGREE_KEY.
1645 */
1646TEST_P(NewKeyGenerationTest, EcdsaCurve25519MultiPurposeFail) {
1647 if (!Curve25519Supported()) {
1648 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
1649 }
1650
1651 EcCurve curve = EcCurve::CURVE_25519;
1652 vector<uint8_t> key_blob;
1653 vector<KeyCharacteristics> key_characteristics;
1654 ErrorCode result = GenerateKey(AuthorizationSetBuilder()
1655 .Authorization(TAG_PURPOSE, KeyPurpose::AGREE_KEY)
1656 .EcdsaSigningKey(curve)
1657 .Digest(Digest::NONE)
1658 .SetDefaultValidity(),
1659 &key_blob, &key_characteristics);
1660 ASSERT_EQ(result, ErrorCode::INCOMPATIBLE_PURPOSE);
1661}
1662
1663/*
Prashant Patil6c1adf02021-11-22 06:21:21 +00001664 * NewKeyGenerationTest.EcdsaWithMissingValidity
1665 *
1666 * Verifies that keymint returns an error while generating asymmetric key
1667 * without providing NOT_BEFORE and NOT_AFTER parameters.
1668 */
1669TEST_P(NewKeyGenerationTest, EcdsaWithMissingValidity) {
1670 // Per RFC 5280 4.1.2.5, an undefined expiration (not-after) field should be set to
1671 // GeneralizedTime 999912312359559, which is 253402300799000 ms from Jan 1, 1970.
1672 constexpr uint64_t kUndefinedExpirationDateTime = 253402300799000;
1673
1674 vector<uint8_t> key_blob;
1675 vector<KeyCharacteristics> key_characteristics;
1676 ASSERT_EQ(ErrorCode::MISSING_NOT_BEFORE,
1677 GenerateKey(AuthorizationSetBuilder()
1678 .EcdsaSigningKey(EcCurve::P_256)
1679 .Digest(Digest::NONE)
1680 .Authorization(TAG_CERTIFICATE_NOT_AFTER,
1681 kUndefinedExpirationDateTime),
1682 &key_blob, &key_characteristics));
1683
1684 ASSERT_EQ(ErrorCode::MISSING_NOT_AFTER,
1685 GenerateKey(AuthorizationSetBuilder()
1686 .EcdsaSigningKey(EcCurve::P_256)
1687 .Digest(Digest::NONE)
1688 .Authorization(TAG_CERTIFICATE_NOT_BEFORE, 0),
1689 &key_blob, &key_characteristics));
1690}
1691
1692/*
Selene Huang4f64c222021-04-13 19:54:36 -07001693 * NewKeyGenerationTest.EcdsaAttestation
1694 *
1695 * Verifies that for all Ecdsa key sizes, if challenge and app id is provided,
1696 * an attestation will be generated.
1697 */
1698TEST_P(NewKeyGenerationTest, EcdsaAttestation) {
1699 auto challenge = "hello";
1700 auto app_id = "foo";
1701
Selene Huang6e46f142021-04-20 19:20:11 -07001702 auto subject = "cert subj 2";
1703 vector<uint8_t> subject_der(make_name_from_str(subject));
1704
1705 uint64_t serial_int = 0xFFFFFFFFFFFFFFFF;
1706 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
1707
David Drysdaledf09e542021-06-08 15:46:11 +01001708 for (auto curve : ValidCurves()) {
Selene Huang4f64c222021-04-13 19:54:36 -07001709 vector<uint8_t> key_blob;
1710 vector<KeyCharacteristics> key_characteristics;
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001711 auto builder = AuthorizationSetBuilder()
1712 .Authorization(TAG_NO_AUTH_REQUIRED)
1713 .EcdsaSigningKey(curve)
1714 .Digest(Digest::NONE)
1715 .AttestationChallenge(challenge)
1716 .AttestationApplicationId(app_id)
1717 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
1718 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
1719 .SetDefaultValidity();
1720
1721 auto result = GenerateKey(builder, &key_blob, &key_characteristics);
subrahmanyaman05642492022-02-05 07:10:56 +00001722 // Strongbox may not support factory provisioned attestation key.
1723 if (SecLevel() == SecurityLevel::STRONGBOX) {
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001724 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
1725 result = GenerateKeyWithSelfSignedAttestKey(
1726 AuthorizationSetBuilder()
1727 .EcdsaKey(curve)
1728 .AttestKey()
1729 .SetDefaultValidity(), /* attest key params */
1730 builder, &key_blob, &key_characteristics);
1731 }
subrahmanyaman05642492022-02-05 07:10:56 +00001732 }
1733 ASSERT_EQ(ErrorCode::OK, result);
Selene Huang4f64c222021-04-13 19:54:36 -07001734 ASSERT_GT(key_blob.size(), 0U);
1735 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01001736 CheckCharacteristics(key_blob, key_characteristics);
Selene Huang4f64c222021-04-13 19:54:36 -07001737
1738 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
1739
1740 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::EC));
David Drysdaledf09e542021-06-08 15:46:11 +01001741 EXPECT_TRUE(crypto_params.Contains(TAG_EC_CURVE, curve)) << "Curve " << curve << "missing";
Selene Huang4f64c222021-04-13 19:54:36 -07001742
1743 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
1744 ASSERT_GT(cert_chain_.size(), 0);
Selene Huang6e46f142021-04-20 19:20:11 -07001745 verify_subject_and_serial(cert_chain_[0], serial_int, subject, false);
Selene Huang4f64c222021-04-13 19:54:36 -07001746
1747 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
1748 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
David Drysdale7dff4fc2021-12-10 10:10:52 +00001749 EXPECT_TRUE(verify_attestation_record(AidlVersion(), challenge, app_id, //
Selene Huang4f64c222021-04-13 19:54:36 -07001750 sw_enforced, hw_enforced, SecLevel(),
1751 cert_chain_[0].encodedCertificate));
1752
1753 CheckedDeleteKey(&key_blob);
1754 }
1755}
1756
1757/*
David Drysdale42fe1892021-10-14 14:43:46 +01001758 * NewKeyGenerationTest.EcdsaAttestationCurve25519
1759 *
1760 * Verifies that for a curve 25519 key, if challenge and app id is provided,
1761 * an attestation will be generated.
1762 */
1763TEST_P(NewKeyGenerationTest, EcdsaAttestationCurve25519) {
1764 if (!Curve25519Supported()) {
1765 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
1766 }
1767
1768 EcCurve curve = EcCurve::CURVE_25519;
1769 auto challenge = "hello";
1770 auto app_id = "foo";
1771
1772 auto subject = "cert subj 2";
1773 vector<uint8_t> subject_der(make_name_from_str(subject));
1774
1775 uint64_t serial_int = 0xFFFFFFFFFFFFFFFF;
1776 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
1777
1778 vector<uint8_t> key_blob;
1779 vector<KeyCharacteristics> key_characteristics;
1780 ErrorCode result = GenerateKey(AuthorizationSetBuilder()
1781 .Authorization(TAG_NO_AUTH_REQUIRED)
1782 .EcdsaSigningKey(curve)
1783 .Digest(Digest::NONE)
1784 .AttestationChallenge(challenge)
1785 .AttestationApplicationId(app_id)
1786 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
1787 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
1788 .SetDefaultValidity(),
1789 &key_blob, &key_characteristics);
1790 ASSERT_EQ(ErrorCode::OK, result);
1791 ASSERT_GT(key_blob.size(), 0U);
1792 CheckBaseParams(key_characteristics);
1793 CheckCharacteristics(key_blob, key_characteristics);
1794
1795 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
1796
1797 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::EC));
1798 EXPECT_TRUE(crypto_params.Contains(TAG_EC_CURVE, curve)) << "Curve " << curve << "missing";
1799
1800 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
1801 ASSERT_GT(cert_chain_.size(), 0);
1802 verify_subject_and_serial(cert_chain_[0], serial_int, subject, false);
1803
1804 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
1805 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
1806 EXPECT_TRUE(verify_attestation_record(AidlVersion(), challenge, app_id, //
1807 sw_enforced, hw_enforced, SecLevel(),
1808 cert_chain_[0].encodedCertificate));
1809
1810 CheckedDeleteKey(&key_blob);
1811}
1812
1813/*
David Drysdale37af4b32021-05-14 16:46:59 +01001814 * NewKeyGenerationTest.EcdsaAttestationTags
1815 *
1816 * Verifies that creation of an attested ECDSA key includes various tags in the
1817 * attestation extension.
1818 */
1819TEST_P(NewKeyGenerationTest, EcdsaAttestationTags) {
1820 auto challenge = "hello";
1821 auto app_id = "foo";
1822 auto subject = "cert subj 2";
1823 vector<uint8_t> subject_der(make_name_from_str(subject));
1824 uint64_t serial_int = 0x1010;
1825 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
1826 const AuthorizationSetBuilder base_builder =
1827 AuthorizationSetBuilder()
1828 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdaledf09e542021-06-08 15:46:11 +01001829 .EcdsaSigningKey(EcCurve::P_256)
David Drysdale37af4b32021-05-14 16:46:59 +01001830 .Digest(Digest::NONE)
1831 .AttestationChallenge(challenge)
1832 .AttestationApplicationId(app_id)
1833 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
1834 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
1835 .SetDefaultValidity();
1836
1837 // Various tags that map to fields in the attestation extension ASN.1 schema.
1838 auto extra_tags = AuthorizationSetBuilder()
1839 .Authorization(TAG_ROLLBACK_RESISTANCE)
1840 .Authorization(TAG_EARLY_BOOT_ONLY)
1841 .Authorization(TAG_ACTIVE_DATETIME, 1619621648000)
1842 .Authorization(TAG_ORIGINATION_EXPIRE_DATETIME, 1619621648000)
1843 .Authorization(TAG_USAGE_EXPIRE_DATETIME, 1619621999000)
1844 .Authorization(TAG_USAGE_COUNT_LIMIT, 42)
1845 .Authorization(TAG_AUTH_TIMEOUT, 100000)
1846 .Authorization(TAG_ALLOW_WHILE_ON_BODY)
1847 .Authorization(TAG_TRUSTED_USER_PRESENCE_REQUIRED)
1848 .Authorization(TAG_TRUSTED_CONFIRMATION_REQUIRED)
1849 .Authorization(TAG_UNLOCKED_DEVICE_REQUIRED)
1850 .Authorization(TAG_CREATION_DATETIME, 1619621648000);
David Drysdalec53b7d92021-10-11 12:35:58 +01001851
David Drysdale37af4b32021-05-14 16:46:59 +01001852 for (const KeyParameter& tag : extra_tags) {
1853 SCOPED_TRACE(testing::Message() << "tag-" << tag);
1854 vector<uint8_t> key_blob;
1855 vector<KeyCharacteristics> key_characteristics;
1856 AuthorizationSetBuilder builder = base_builder;
1857 builder.push_back(tag);
1858 auto result = GenerateKey(builder, &key_blob, &key_characteristics);
1859 if (result == ErrorCode::ROLLBACK_RESISTANCE_UNAVAILABLE &&
1860 tag.tag == TAG_ROLLBACK_RESISTANCE) {
1861 continue;
1862 }
Seth Mooreb393b082021-07-12 14:18:28 -07001863 if (result == ErrorCode::UNSUPPORTED_TAG && tag.tag == TAG_TRUSTED_USER_PRESENCE_REQUIRED) {
1864 // Tag not required to be supported by all KeyMint implementations.
David Drysdale37af4b32021-05-14 16:46:59 +01001865 continue;
1866 }
subrahmanyaman05642492022-02-05 07:10:56 +00001867 // Strongbox may not support factory provisioned attestation key.
1868 if (SecLevel() == SecurityLevel::STRONGBOX) {
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001869 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
1870 result = GenerateKeyWithSelfSignedAttestKey(
1871 AuthorizationSetBuilder()
1872 .EcdsaKey(EcCurve::P_256)
1873 .AttestKey()
1874 .SetDefaultValidity(), /* attest key params */
1875 builder, &key_blob, &key_characteristics);
1876 }
subrahmanyaman05642492022-02-05 07:10:56 +00001877 }
David Drysdale37af4b32021-05-14 16:46:59 +01001878 ASSERT_EQ(result, ErrorCode::OK);
1879 ASSERT_GT(key_blob.size(), 0U);
1880
1881 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
1882 ASSERT_GT(cert_chain_.size(), 0);
1883 verify_subject_and_serial(cert_chain_[0], serial_int, subject, /* self_signed = */ false);
1884
1885 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
1886 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
Seth Mooreb393b082021-07-12 14:18:28 -07001887 // Some tags are optional, so don't require them to be in the enforcements.
1888 if (tag.tag != TAG_ATTESTATION_APPLICATION_ID && tag.tag != TAG_ALLOW_WHILE_ON_BODY) {
David Drysdale37af4b32021-05-14 16:46:59 +01001889 EXPECT_TRUE(hw_enforced.Contains(tag.tag) || sw_enforced.Contains(tag.tag))
1890 << tag << " not in hw:" << hw_enforced << " nor sw:" << sw_enforced;
1891 }
1892
1893 // Verifying the attestation record will check for the specific tag because
1894 // it's included in the authorizations.
David Drysdale7dff4fc2021-12-10 10:10:52 +00001895 EXPECT_TRUE(verify_attestation_record(AidlVersion(), challenge, app_id, sw_enforced,
1896 hw_enforced, SecLevel(),
1897 cert_chain_[0].encodedCertificate));
David Drysdale37af4b32021-05-14 16:46:59 +01001898
1899 CheckedDeleteKey(&key_blob);
1900 }
1901
David Drysdalec53b7d92021-10-11 12:35:58 +01001902 // Collection of invalid attestation ID tags.
1903 auto invalid_tags =
1904 AuthorizationSetBuilder()
1905 .Authorization(TAG_ATTESTATION_ID_BRAND, "bogus-brand")
1906 .Authorization(TAG_ATTESTATION_ID_DEVICE, "devious-device")
1907 .Authorization(TAG_ATTESTATION_ID_PRODUCT, "punctured-product")
1908 .Authorization(TAG_ATTESTATION_ID_SERIAL, "suspicious-serial")
1909 .Authorization(TAG_ATTESTATION_ID_IMEI, "invalid-imei")
1910 .Authorization(TAG_ATTESTATION_ID_MEID, "mismatching-meid")
1911 .Authorization(TAG_ATTESTATION_ID_MANUFACTURER, "malformed-manufacturer")
1912 .Authorization(TAG_ATTESTATION_ID_MODEL, "malicious-model");
David Drysdale37af4b32021-05-14 16:46:59 +01001913 for (const KeyParameter& tag : invalid_tags) {
David Drysdalec53b7d92021-10-11 12:35:58 +01001914 SCOPED_TRACE(testing::Message() << "-incorrect-tag-" << tag);
David Drysdale37af4b32021-05-14 16:46:59 +01001915 vector<uint8_t> key_blob;
1916 vector<KeyCharacteristics> key_characteristics;
1917 AuthorizationSetBuilder builder =
1918 AuthorizationSetBuilder()
1919 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdaledf09e542021-06-08 15:46:11 +01001920 .EcdsaSigningKey(EcCurve::P_256)
David Drysdale37af4b32021-05-14 16:46:59 +01001921 .Digest(Digest::NONE)
1922 .AttestationChallenge(challenge)
1923 .AttestationApplicationId(app_id)
1924 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
1925 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
1926 .SetDefaultValidity();
1927 builder.push_back(tag);
subrahmanyaman7d9bc462022-03-16 01:40:39 +00001928
1929 auto error = GenerateKey(builder, &key_blob, &key_characteristics);
1930 // Strongbox may not support factory provisioned attestation key.
1931 if (SecLevel() == SecurityLevel::STRONGBOX) {
1932 if (error == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
1933 error = GenerateKeyWithSelfSignedAttestKey(
1934 AuthorizationSetBuilder()
1935 .EcdsaKey(EcCurve::P_256)
1936 .AttestKey()
1937 .SetDefaultValidity(), /* attest key params */
1938 builder, &key_blob, &key_characteristics);
1939 }
1940 }
1941 ASSERT_EQ(error, ErrorCode::CANNOT_ATTEST_IDS);
David Drysdale37af4b32021-05-14 16:46:59 +01001942 }
1943}
1944
1945/*
David Drysdalec53b7d92021-10-11 12:35:58 +01001946 * NewKeyGenerationTest.EcdsaAttestationIdTags
1947 *
1948 * Verifies that creation of an attested ECDSA key includes various ID tags in the
1949 * attestation extension.
1950 */
1951TEST_P(NewKeyGenerationTest, EcdsaAttestationIdTags) {
1952 auto challenge = "hello";
1953 auto app_id = "foo";
1954 auto subject = "cert subj 2";
1955 vector<uint8_t> subject_der(make_name_from_str(subject));
1956 uint64_t serial_int = 0x1010;
1957 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
1958 const AuthorizationSetBuilder base_builder =
1959 AuthorizationSetBuilder()
1960 .Authorization(TAG_NO_AUTH_REQUIRED)
1961 .EcdsaSigningKey(EcCurve::P_256)
1962 .Digest(Digest::NONE)
1963 .AttestationChallenge(challenge)
1964 .AttestationApplicationId(app_id)
1965 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
1966 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
1967 .SetDefaultValidity();
1968
1969 // Various ATTESTATION_ID_* tags that map to fields in the attestation extension ASN.1 schema.
1970 auto extra_tags = AuthorizationSetBuilder();
1971 add_tag_from_prop(&extra_tags, TAG_ATTESTATION_ID_BRAND, "ro.product.brand");
1972 add_tag_from_prop(&extra_tags, TAG_ATTESTATION_ID_DEVICE, "ro.product.device");
1973 add_tag_from_prop(&extra_tags, TAG_ATTESTATION_ID_PRODUCT, "ro.product.name");
1974 add_tag_from_prop(&extra_tags, TAG_ATTESTATION_ID_SERIAL, "ro.serial");
1975 add_tag_from_prop(&extra_tags, TAG_ATTESTATION_ID_MANUFACTURER, "ro.product.manufacturer");
1976 add_tag_from_prop(&extra_tags, TAG_ATTESTATION_ID_MODEL, "ro.product.model");
1977
1978 for (const KeyParameter& tag : extra_tags) {
1979 SCOPED_TRACE(testing::Message() << "tag-" << tag);
1980 vector<uint8_t> key_blob;
1981 vector<KeyCharacteristics> key_characteristics;
1982 AuthorizationSetBuilder builder = base_builder;
1983 builder.push_back(tag);
1984 auto result = GenerateKey(builder, &key_blob, &key_characteristics);
subrahmanyaman05642492022-02-05 07:10:56 +00001985 // Strongbox may not support factory provisioned attestation key.
1986 if (SecLevel() == SecurityLevel::STRONGBOX) {
1987 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) return;
1988 }
David Drysdalec53b7d92021-10-11 12:35:58 +01001989 if (result == ErrorCode::CANNOT_ATTEST_IDS) {
1990 // Device ID attestation is optional; KeyMint may not support it at all.
1991 continue;
1992 }
1993 ASSERT_EQ(result, ErrorCode::OK);
1994 ASSERT_GT(key_blob.size(), 0U);
1995
1996 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
1997 ASSERT_GT(cert_chain_.size(), 0);
1998 verify_subject_and_serial(cert_chain_[0], serial_int, subject, /* self_signed = */ false);
1999
2000 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
2001 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
2002
2003 // The attested key characteristics will not contain APPLICATION_ID_* fields (their
2004 // spec definitions all have "Must never appear in KeyCharacteristics"), but the
2005 // attestation extension should contain them, so make sure the extra tag is added.
2006 hw_enforced.push_back(tag);
2007
2008 // Verifying the attestation record will check for the specific tag because
2009 // it's included in the authorizations.
David Drysdale7dff4fc2021-12-10 10:10:52 +00002010 EXPECT_TRUE(verify_attestation_record(AidlVersion(), challenge, app_id, sw_enforced,
2011 hw_enforced, SecLevel(),
2012 cert_chain_[0].encodedCertificate));
David Drysdalec53b7d92021-10-11 12:35:58 +01002013
2014 CheckedDeleteKey(&key_blob);
2015 }
2016}
2017
2018/*
David Drysdale565ccc72021-10-11 12:49:50 +01002019 * NewKeyGenerationTest.EcdsaAttestationUniqueId
2020 *
2021 * Verifies that creation of an attested ECDSA key with a UNIQUE_ID included.
2022 */
2023TEST_P(NewKeyGenerationTest, EcdsaAttestationUniqueId) {
2024 auto get_unique_id = [this](const std::string& app_id, uint64_t datetime,
David Drysdale13f2a402021-11-01 11:40:08 +00002025 vector<uint8_t>* unique_id, bool reset = false) {
David Drysdale565ccc72021-10-11 12:49:50 +01002026 auto challenge = "hello";
2027 auto subject = "cert subj 2";
2028 vector<uint8_t> subject_der(make_name_from_str(subject));
2029 uint64_t serial_int = 0x1010;
2030 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
David Drysdale13f2a402021-11-01 11:40:08 +00002031 AuthorizationSetBuilder builder =
David Drysdale565ccc72021-10-11 12:49:50 +01002032 AuthorizationSetBuilder()
2033 .Authorization(TAG_NO_AUTH_REQUIRED)
2034 .Authorization(TAG_INCLUDE_UNIQUE_ID)
2035 .EcdsaSigningKey(EcCurve::P_256)
2036 .Digest(Digest::NONE)
2037 .AttestationChallenge(challenge)
2038 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
2039 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
2040 .AttestationApplicationId(app_id)
2041 .Authorization(TAG_CREATION_DATETIME, datetime)
2042 .SetDefaultValidity();
David Drysdale13f2a402021-11-01 11:40:08 +00002043 if (reset) {
2044 builder.Authorization(TAG_RESET_SINCE_ID_ROTATION);
2045 }
subrahmanyaman7d9bc462022-03-16 01:40:39 +00002046 auto result = GenerateKey(builder);
2047 if (SecLevel() == SecurityLevel::STRONGBOX) {
2048 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
2049 result = GenerateKeyWithSelfSignedAttestKey(
2050 AuthorizationSetBuilder()
2051 .EcdsaKey(EcCurve::P_256)
2052 .AttestKey()
2053 .SetDefaultValidity(), /* attest key params */
2054 builder, &key_blob_, &key_characteristics_, &cert_chain_);
2055 }
2056 }
2057 ASSERT_EQ(ErrorCode::OK, result);
David Drysdale565ccc72021-10-11 12:49:50 +01002058 ASSERT_GT(key_blob_.size(), 0U);
2059
2060 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
2061 ASSERT_GT(cert_chain_.size(), 0);
2062 verify_subject_and_serial(cert_chain_[0], serial_int, subject, /* self_signed = */ false);
2063
2064 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics_);
2065 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics_);
2066
2067 // Check that the unique ID field in the extension is non-empty.
David Drysdale7dff4fc2021-12-10 10:10:52 +00002068 EXPECT_TRUE(verify_attestation_record(AidlVersion(), challenge, app_id, sw_enforced,
2069 hw_enforced, SecLevel(),
2070 cert_chain_[0].encodedCertificate, unique_id));
David Drysdale565ccc72021-10-11 12:49:50 +01002071 EXPECT_GT(unique_id->size(), 0);
2072 CheckedDeleteKey();
2073 };
2074
2075 // Generate unique ID
2076 auto app_id = "foo";
2077 uint64_t cert_date = 1619621648000; // Wed Apr 28 14:54:08 2021 in ms since epoch
2078 vector<uint8_t> unique_id;
2079 get_unique_id(app_id, cert_date, &unique_id);
2080
2081 // Generating a new key with the same parameters should give the same unique ID.
2082 vector<uint8_t> unique_id2;
2083 get_unique_id(app_id, cert_date, &unique_id2);
2084 EXPECT_EQ(unique_id, unique_id2);
2085
2086 // Generating a new key with a slightly different date should give the same unique ID.
2087 uint64_t rounded_date = cert_date / 2592000000LLU;
2088 uint64_t min_date = rounded_date * 2592000000LLU;
2089 uint64_t max_date = ((rounded_date + 1) * 2592000000LLU) - 1;
2090
2091 vector<uint8_t> unique_id3;
2092 get_unique_id(app_id, min_date, &unique_id3);
2093 EXPECT_EQ(unique_id, unique_id3);
2094
2095 vector<uint8_t> unique_id4;
2096 get_unique_id(app_id, max_date, &unique_id4);
2097 EXPECT_EQ(unique_id, unique_id4);
2098
2099 // A different attestation application ID should yield a different unique ID.
2100 auto app_id2 = "different_foo";
2101 vector<uint8_t> unique_id5;
2102 get_unique_id(app_id2, cert_date, &unique_id5);
2103 EXPECT_NE(unique_id, unique_id5);
2104
2105 // A radically different date should yield a different unique ID.
2106 vector<uint8_t> unique_id6;
2107 get_unique_id(app_id, 1611621648000, &unique_id6);
2108 EXPECT_NE(unique_id, unique_id6);
2109
2110 vector<uint8_t> unique_id7;
2111 get_unique_id(app_id, max_date + 1, &unique_id7);
2112 EXPECT_NE(unique_id, unique_id7);
2113
2114 vector<uint8_t> unique_id8;
2115 get_unique_id(app_id, min_date - 1, &unique_id8);
2116 EXPECT_NE(unique_id, unique_id8);
David Drysdale13f2a402021-11-01 11:40:08 +00002117
2118 // Marking RESET_SINCE_ID_ROTATION should give a different unique ID.
2119 vector<uint8_t> unique_id9;
2120 get_unique_id(app_id, cert_date, &unique_id9, /* reset_id = */ true);
2121 EXPECT_NE(unique_id, unique_id9);
David Drysdale565ccc72021-10-11 12:49:50 +01002122}
2123
2124/*
David Drysdale37af4b32021-05-14 16:46:59 +01002125 * NewKeyGenerationTest.EcdsaAttestationTagNoApplicationId
2126 *
2127 * Verifies that creation of an attested ECDSA key does not include APPLICATION_ID.
2128 */
2129TEST_P(NewKeyGenerationTest, EcdsaAttestationTagNoApplicationId) {
2130 auto challenge = "hello";
2131 auto attest_app_id = "foo";
2132 auto subject = "cert subj 2";
2133 vector<uint8_t> subject_der(make_name_from_str(subject));
2134 uint64_t serial_int = 0x1010;
2135 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
2136
2137 // Earlier versions of the attestation extension schema included a slot:
2138 // applicationId [601] EXPLICIT OCTET_STRING OPTIONAL,
2139 // This should never have been included, and should never be filled in.
2140 // Generate an attested key that include APPLICATION_ID and APPLICATION_DATA,
2141 // to confirm that this field never makes it into the attestation extension.
2142 vector<uint8_t> key_blob;
2143 vector<KeyCharacteristics> key_characteristics;
subrahmanyaman7d9bc462022-03-16 01:40:39 +00002144 auto builder = AuthorizationSetBuilder()
2145 .Authorization(TAG_NO_AUTH_REQUIRED)
2146 .EcdsaSigningKey(EcCurve::P_256)
2147 .Digest(Digest::NONE)
2148 .AttestationChallenge(challenge)
2149 .AttestationApplicationId(attest_app_id)
2150 .Authorization(TAG_APPLICATION_ID, "client_id")
2151 .Authorization(TAG_APPLICATION_DATA, "appdata")
2152 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
2153 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
2154 .SetDefaultValidity();
2155
2156 auto result = GenerateKey(builder, &key_blob, &key_characteristics);
subrahmanyaman05642492022-02-05 07:10:56 +00002157 // Strongbox may not support factory provisioned attestation key.
2158 if (SecLevel() == SecurityLevel::STRONGBOX) {
subrahmanyaman7d9bc462022-03-16 01:40:39 +00002159 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
2160 result = GenerateKeyWithSelfSignedAttestKey(
2161 AuthorizationSetBuilder()
2162 .EcdsaKey(EcCurve::P_256)
2163 .AttestKey()
2164 .SetDefaultValidity(), /* attest key params */
2165 builder, &key_blob, &key_characteristics);
2166 }
subrahmanyaman05642492022-02-05 07:10:56 +00002167 }
David Drysdale37af4b32021-05-14 16:46:59 +01002168 ASSERT_EQ(result, ErrorCode::OK);
2169 ASSERT_GT(key_blob.size(), 0U);
2170
2171 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
2172 ASSERT_GT(cert_chain_.size(), 0);
2173 verify_subject_and_serial(cert_chain_[0], serial_int, subject, /* self_signed = */ false);
2174
2175 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
2176 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
David Drysdale7dff4fc2021-12-10 10:10:52 +00002177 EXPECT_TRUE(verify_attestation_record(AidlVersion(), challenge, attest_app_id, sw_enforced,
2178 hw_enforced, SecLevel(),
2179 cert_chain_[0].encodedCertificate));
David Drysdale37af4b32021-05-14 16:46:59 +01002180
2181 // Check that the app id is not in the cert.
2182 string app_id = "clientid";
2183 std::vector<uint8_t> needle(reinterpret_cast<const uint8_t*>(app_id.data()),
2184 reinterpret_cast<const uint8_t*>(app_id.data()) + app_id.size());
2185 ASSERT_EQ(std::search(cert_chain_[0].encodedCertificate.begin(),
2186 cert_chain_[0].encodedCertificate.end(), needle.begin(), needle.end()),
2187 cert_chain_[0].encodedCertificate.end());
2188
2189 CheckedDeleteKey(&key_blob);
2190}
2191
2192/*
Selene Huang4f64c222021-04-13 19:54:36 -07002193 * NewKeyGenerationTest.EcdsaSelfSignAttestation
2194 *
2195 * Verifies that if no challenge is provided to an Ecdsa key generation, then
2196 * the key will generate a self signed attestation.
2197 */
2198TEST_P(NewKeyGenerationTest, EcdsaSelfSignAttestation) {
Selene Huang6e46f142021-04-20 19:20:11 -07002199 auto subject = "cert subj 2";
2200 vector<uint8_t> subject_der(make_name_from_str(subject));
2201
2202 uint64_t serial_int = 0x123456FFF1234;
2203 vector<uint8_t> serial_blob(build_serial_blob(serial_int));
2204
David Drysdaledf09e542021-06-08 15:46:11 +01002205 for (auto curve : ValidCurves()) {
Selene Huang4f64c222021-04-13 19:54:36 -07002206 vector<uint8_t> key_blob;
2207 vector<KeyCharacteristics> key_characteristics;
Selene Huang6e46f142021-04-20 19:20:11 -07002208 ASSERT_EQ(ErrorCode::OK,
2209 GenerateKey(AuthorizationSetBuilder()
David Drysdaledf09e542021-06-08 15:46:11 +01002210 .EcdsaSigningKey(curve)
Selene Huang6e46f142021-04-20 19:20:11 -07002211 .Digest(Digest::NONE)
2212 .Authorization(TAG_CERTIFICATE_SERIAL, serial_blob)
2213 .Authorization(TAG_CERTIFICATE_SUBJECT, subject_der)
2214 .SetDefaultValidity(),
2215 &key_blob, &key_characteristics));
Selene Huang4f64c222021-04-13 19:54:36 -07002216 ASSERT_GT(key_blob.size(), 0U);
2217 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01002218 CheckCharacteristics(key_blob, key_characteristics);
Selene Huang4f64c222021-04-13 19:54:36 -07002219
2220 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
2221
2222 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::EC));
David Drysdaledf09e542021-06-08 15:46:11 +01002223 EXPECT_TRUE(crypto_params.Contains(TAG_EC_CURVE, curve)) << "Curve " << curve << "missing";
Selene Huang4f64c222021-04-13 19:54:36 -07002224
2225 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
Selene Huang6e46f142021-04-20 19:20:11 -07002226 verify_subject_and_serial(cert_chain_[0], serial_int, subject, false);
Selene Huang4f64c222021-04-13 19:54:36 -07002227 ASSERT_EQ(cert_chain_.size(), 1);
2228
2229 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
2230 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
2231
2232 CheckedDeleteKey(&key_blob);
2233 }
2234}
2235
2236/*
2237 * NewKeyGenerationTest.EcdsaAttestationRequireAppId
2238 *
2239 * Verifies that if attestation challenge is provided to Ecdsa key generation, then
2240 * app id must also be provided or else it will fail.
2241 */
2242TEST_P(NewKeyGenerationTest, EcdsaAttestationRequireAppId) {
2243 auto challenge = "hello";
2244 vector<uint8_t> key_blob;
2245 vector<KeyCharacteristics> key_characteristics;
subrahmanyaman7d9bc462022-03-16 01:40:39 +00002246 auto builder = AuthorizationSetBuilder()
2247 .EcdsaSigningKey(EcCurve::P_256)
2248 .Digest(Digest::NONE)
2249 .AttestationChallenge(challenge)
2250 .SetDefaultValidity();
Selene Huang4f64c222021-04-13 19:54:36 -07002251
subrahmanyaman7d9bc462022-03-16 01:40:39 +00002252 auto result = GenerateKey(builder, &key_blob, &key_characteristics);
subrahmanyaman05642492022-02-05 07:10:56 +00002253 // Strongbox may not support factory provisioned attestation key.
2254 if (SecLevel() == SecurityLevel::STRONGBOX) {
subrahmanyaman7d9bc462022-03-16 01:40:39 +00002255 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
2256 result = GenerateKeyWithSelfSignedAttestKey(
2257 AuthorizationSetBuilder()
2258 .EcdsaKey(EcCurve::P_256)
2259 .AttestKey()
2260 .SetDefaultValidity(), /* attest key params */
2261 builder, &key_blob, &key_characteristics);
2262 }
subrahmanyaman05642492022-02-05 07:10:56 +00002263 }
2264 ASSERT_EQ(ErrorCode::ATTESTATION_APPLICATION_ID_MISSING, result);
Selene Huang4f64c222021-04-13 19:54:36 -07002265}
2266
2267/*
2268 * NewKeyGenerationTest.EcdsaIgnoreAppId
2269 *
2270 * Verifies that if no challenge is provided to the Ecdsa key generation, then
2271 * any appid will be ignored, and keymint will generate a self sign certificate.
2272 */
2273TEST_P(NewKeyGenerationTest, EcdsaIgnoreAppId) {
2274 auto app_id = "foo";
2275
David Drysdaledf09e542021-06-08 15:46:11 +01002276 for (auto curve : ValidCurves()) {
Selene Huang4f64c222021-04-13 19:54:36 -07002277 vector<uint8_t> key_blob;
2278 vector<KeyCharacteristics> key_characteristics;
2279 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
David Drysdaledf09e542021-06-08 15:46:11 +01002280 .EcdsaSigningKey(curve)
Selene Huang4f64c222021-04-13 19:54:36 -07002281 .Digest(Digest::NONE)
2282 .AttestationApplicationId(app_id)
2283 .SetDefaultValidity(),
2284 &key_blob, &key_characteristics));
2285
2286 ASSERT_GT(key_blob.size(), 0U);
2287 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01002288 CheckCharacteristics(key_blob, key_characteristics);
Selene Huang4f64c222021-04-13 19:54:36 -07002289
2290 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
2291
2292 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::EC));
David Drysdaledf09e542021-06-08 15:46:11 +01002293 EXPECT_TRUE(crypto_params.Contains(TAG_EC_CURVE, curve)) << "Curve " << curve << "missing";
Selene Huang4f64c222021-04-13 19:54:36 -07002294
2295 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
2296 ASSERT_EQ(cert_chain_.size(), 1);
2297
2298 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
2299 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
2300
2301 CheckedDeleteKey(&key_blob);
2302 }
2303}
2304
2305/*
2306 * NewKeyGenerationTest.AttestationApplicationIDLengthProperlyEncoded
2307 *
2308 * Verifies that the Attestation Application ID software enforced tag has a proper length encoding.
2309 * Some implementations break strict encoding rules by encoding a length between 127 and 256 in one
2310 * byte. Proper DER encoding specifies that for lengths greater than 127, one byte should be used
2311 * to specify how many following bytes will be used to encode the length.
2312 */
2313TEST_P(NewKeyGenerationTest, AttestationApplicationIDLengthProperlyEncoded) {
2314 auto challenge = "hello";
Selene Huang4f64c222021-04-13 19:54:36 -07002315 std::vector<uint32_t> app_id_lengths{143, 258};
2316
2317 for (uint32_t length : app_id_lengths) {
2318 const string app_id(length, 'a');
2319 vector<uint8_t> key_blob;
2320 vector<KeyCharacteristics> key_characteristics;
subrahmanyaman7d9bc462022-03-16 01:40:39 +00002321 auto builder = AuthorizationSetBuilder()
2322 .Authorization(TAG_NO_AUTH_REQUIRED)
2323 .EcdsaSigningKey(EcCurve::P_256)
2324 .Digest(Digest::NONE)
2325 .AttestationChallenge(challenge)
2326 .AttestationApplicationId(app_id)
2327 .SetDefaultValidity();
2328
2329 auto result = GenerateKey(builder, &key_blob, &key_characteristics);
subrahmanyaman05642492022-02-05 07:10:56 +00002330 // Strongbox may not support factory provisioned attestation key.
2331 if (SecLevel() == SecurityLevel::STRONGBOX) {
subrahmanyaman7d9bc462022-03-16 01:40:39 +00002332 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
2333 result = GenerateKeyWithSelfSignedAttestKey(
2334 AuthorizationSetBuilder()
2335 .EcdsaKey(EcCurve::P_256)
2336 .AttestKey()
2337 .SetDefaultValidity(), /* attest key params */
2338 builder, &key_blob, &key_characteristics);
2339 }
subrahmanyaman05642492022-02-05 07:10:56 +00002340 }
2341 ASSERT_EQ(ErrorCode::OK, result);
Selene Huang4f64c222021-04-13 19:54:36 -07002342 ASSERT_GT(key_blob.size(), 0U);
2343 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01002344 CheckCharacteristics(key_blob, key_characteristics);
Selene Huang4f64c222021-04-13 19:54:36 -07002345
2346 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
2347
2348 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::EC));
David Drysdaledf09e542021-06-08 15:46:11 +01002349 EXPECT_TRUE(crypto_params.Contains(TAG_EC_CURVE, EcCurve::P_256)) << "Curve P256 missing";
Selene Huang4f64c222021-04-13 19:54:36 -07002350
2351 EXPECT_TRUE(ChainSignaturesAreValid(cert_chain_));
2352 ASSERT_GT(cert_chain_.size(), 0);
2353
2354 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
2355 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
David Drysdale7dff4fc2021-12-10 10:10:52 +00002356 EXPECT_TRUE(verify_attestation_record(AidlVersion(), challenge, app_id, //
Selene Huang4f64c222021-04-13 19:54:36 -07002357 sw_enforced, hw_enforced, SecLevel(),
2358 cert_chain_[0].encodedCertificate));
2359
2360 CheckedDeleteKey(&key_blob);
2361 }
2362}
2363
2364/*
Qi Wud22ec842020-11-26 13:27:53 +08002365 * NewKeyGenerationTest.LimitedUsageEcdsa
2366 *
2367 * Verifies that KeyMint can generate all required EC key sizes with limited usage, and that the
2368 * resulting keys have correct characteristics.
2369 */
2370TEST_P(NewKeyGenerationTest, LimitedUsageEcdsa) {
David Drysdaledf09e542021-06-08 15:46:11 +01002371 for (auto curve : ValidCurves()) {
Qi Wud22ec842020-11-26 13:27:53 +08002372 vector<uint8_t> key_blob;
2373 vector<KeyCharacteristics> key_characteristics;
2374 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
David Drysdaledf09e542021-06-08 15:46:11 +01002375 .EcdsaSigningKey(curve)
Qi Wud22ec842020-11-26 13:27:53 +08002376 .Digest(Digest::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08002377 .Authorization(TAG_USAGE_COUNT_LIMIT, 1)
2378 .SetDefaultValidity(),
Qi Wud22ec842020-11-26 13:27:53 +08002379 &key_blob, &key_characteristics));
2380
2381 ASSERT_GT(key_blob.size(), 0U);
2382 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01002383 CheckCharacteristics(key_blob, key_characteristics);
Qi Wud22ec842020-11-26 13:27:53 +08002384
2385 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
2386
2387 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::EC));
David Drysdaledf09e542021-06-08 15:46:11 +01002388 EXPECT_TRUE(crypto_params.Contains(TAG_EC_CURVE, curve)) << "Curve " << curve << "missing";
Qi Wud22ec842020-11-26 13:27:53 +08002389
2390 // Check the usage count limit tag appears in the authorizations.
2391 AuthorizationSet auths;
2392 for (auto& entry : key_characteristics) {
2393 auths.push_back(AuthorizationSet(entry.authorizations));
2394 }
2395 EXPECT_TRUE(auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U))
2396 << "key usage count limit " << 1U << " missing";
2397
2398 CheckedDeleteKey(&key_blob);
2399 }
2400}
2401
2402/*
Selene Huang31ab4042020-04-29 04:22:39 -07002403 * NewKeyGenerationTest.EcdsaDefaultSize
2404 *
David Drysdaledf09e542021-06-08 15:46:11 +01002405 * Verifies that failing to specify a curve for EC key generation returns
Selene Huang31ab4042020-04-29 04:22:39 -07002406 * UNSUPPORTED_KEY_SIZE.
2407 */
2408TEST_P(NewKeyGenerationTest, EcdsaDefaultSize) {
2409 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
2410 GenerateKey(AuthorizationSetBuilder()
2411 .Authorization(TAG_ALGORITHM, Algorithm::EC)
2412 .SigningKey()
Janis Danisevskis164bb872021-02-09 11:30:25 -08002413 .Digest(Digest::NONE)
2414 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07002415}
2416
2417/*
David Drysdale42fe1892021-10-14 14:43:46 +01002418 * NewKeyGenerationTest.EcdsaInvalidCurve
Selene Huang31ab4042020-04-29 04:22:39 -07002419 *
David Drysdale42fe1892021-10-14 14:43:46 +01002420 * Verifies that specifying an invalid curve for EC key generation returns
Selene Huang31ab4042020-04-29 04:22:39 -07002421 * UNSUPPORTED_KEY_SIZE.
2422 */
David Drysdale42fe1892021-10-14 14:43:46 +01002423TEST_P(NewKeyGenerationTest, EcdsaInvalidCurve) {
David Drysdaledf09e542021-06-08 15:46:11 +01002424 for (auto curve : InvalidCurves()) {
Selene Huang31ab4042020-04-29 04:22:39 -07002425 vector<uint8_t> key_blob;
Shawn Willden7f424372021-01-10 18:06:50 -07002426 vector<KeyCharacteristics> key_characteristics;
David Drysdale42fe1892021-10-14 14:43:46 +01002427 auto result = GenerateKey(AuthorizationSetBuilder()
2428 .EcdsaSigningKey(curve)
2429 .Digest(Digest::NONE)
2430 .SetDefaultValidity(),
2431 &key_blob, &key_characteristics);
2432 ASSERT_TRUE(result == ErrorCode::UNSUPPORTED_KEY_SIZE ||
2433 result == ErrorCode::UNSUPPORTED_EC_CURVE);
Selene Huang31ab4042020-04-29 04:22:39 -07002434 }
2435
David Drysdaledf09e542021-06-08 15:46:11 +01002436 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
2437 GenerateKey(AuthorizationSetBuilder()
2438 .Authorization(TAG_ALGORITHM, Algorithm::EC)
2439 .Authorization(TAG_KEY_SIZE, 190)
2440 .SigningKey()
2441 .Digest(Digest::NONE)
2442 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07002443}
2444
2445/*
2446 * NewKeyGenerationTest.EcdsaMismatchKeySize
2447 *
2448 * Verifies that specifying mismatched key size and curve for EC key generation returns
2449 * INVALID_ARGUMENT.
2450 */
2451TEST_P(NewKeyGenerationTest, EcdsaMismatchKeySize) {
David Drysdale513bf122021-10-06 11:53:13 +01002452 if (SecLevel() == SecurityLevel::STRONGBOX) {
2453 GTEST_SKIP() << "Test not applicable to StrongBox device";
2454 }
Selene Huang31ab4042020-04-29 04:22:39 -07002455
David Drysdaledf09e542021-06-08 15:46:11 +01002456 auto result = GenerateKey(AuthorizationSetBuilder()
David Drysdaleff819282021-08-18 16:45:50 +01002457 .Authorization(TAG_ALGORITHM, Algorithm::EC)
David Drysdaledf09e542021-06-08 15:46:11 +01002458 .Authorization(TAG_KEY_SIZE, 224)
2459 .Authorization(TAG_EC_CURVE, EcCurve::P_256)
David Drysdaleff819282021-08-18 16:45:50 +01002460 .SigningKey()
David Drysdaledf09e542021-06-08 15:46:11 +01002461 .Digest(Digest::NONE)
2462 .SetDefaultValidity());
David Drysdaleff819282021-08-18 16:45:50 +01002463 ASSERT_TRUE(result == ErrorCode::INVALID_ARGUMENT);
Selene Huang31ab4042020-04-29 04:22:39 -07002464}
2465
2466/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01002467 * NewKeyGenerationTest.EcdsaAllValidCurves
Selene Huang31ab4042020-04-29 04:22:39 -07002468 *
2469 * Verifies that keymint does not support any curve designated as unsupported.
2470 */
2471TEST_P(NewKeyGenerationTest, EcdsaAllValidCurves) {
2472 Digest digest;
2473 if (SecLevel() == SecurityLevel::STRONGBOX) {
2474 digest = Digest::SHA_2_256;
2475 } else {
2476 digest = Digest::SHA_2_512;
2477 }
2478 for (auto curve : ValidCurves()) {
Janis Danisevskis164bb872021-02-09 11:30:25 -08002479 EXPECT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2480 .EcdsaSigningKey(curve)
2481 .Digest(digest)
2482 .SetDefaultValidity()))
Selene Huang31ab4042020-04-29 04:22:39 -07002483 << "Failed to generate key on curve: " << curve;
2484 CheckedDeleteKey();
2485 }
2486}
2487
2488/*
2489 * NewKeyGenerationTest.Hmac
2490 *
2491 * Verifies that keymint supports all required digests, and that the resulting keys have correct
2492 * characteristics.
2493 */
2494TEST_P(NewKeyGenerationTest, Hmac) {
2495 for (auto digest : ValidDigests(false /* withNone */, true /* withMD5 */)) {
2496 vector<uint8_t> key_blob;
Shawn Willden7f424372021-01-10 18:06:50 -07002497 vector<KeyCharacteristics> key_characteristics;
Selene Huang31ab4042020-04-29 04:22:39 -07002498 constexpr size_t key_size = 128;
2499 ASSERT_EQ(ErrorCode::OK,
2500 GenerateKey(
2501 AuthorizationSetBuilder().HmacKey(key_size).Digest(digest).Authorization(
2502 TAG_MIN_MAC_LENGTH, 128),
2503 &key_blob, &key_characteristics));
2504
2505 ASSERT_GT(key_blob.size(), 0U);
2506 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01002507 CheckCharacteristics(key_blob, key_characteristics);
Selene Huang31ab4042020-04-29 04:22:39 -07002508
Shawn Willden7f424372021-01-10 18:06:50 -07002509 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
2510 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::HMAC));
2511 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
2512 << "Key size " << key_size << "missing";
Selene Huang31ab4042020-04-29 04:22:39 -07002513
2514 CheckedDeleteKey(&key_blob);
2515 }
2516}
2517
2518/*
Selene Huang4f64c222021-04-13 19:54:36 -07002519 * NewKeyGenerationTest.HmacNoAttestation
2520 *
2521 * Verifies that for Hmac key generation, no attestation will be generated even if challenge
2522 * and app id are provided.
2523 */
2524TEST_P(NewKeyGenerationTest, HmacNoAttestation) {
2525 auto challenge = "hello";
2526 auto app_id = "foo";
2527
2528 for (auto digest : ValidDigests(false /* withNone */, true /* withMD5 */)) {
2529 vector<uint8_t> key_blob;
2530 vector<KeyCharacteristics> key_characteristics;
2531 constexpr size_t key_size = 128;
2532 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2533 .HmacKey(key_size)
2534 .Digest(digest)
2535 .AttestationChallenge(challenge)
2536 .AttestationApplicationId(app_id)
2537 .Authorization(TAG_MIN_MAC_LENGTH, 128),
2538 &key_blob, &key_characteristics));
2539
2540 ASSERT_GT(key_blob.size(), 0U);
2541 ASSERT_EQ(cert_chain_.size(), 0);
2542 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01002543 CheckCharacteristics(key_blob, key_characteristics);
Selene Huang4f64c222021-04-13 19:54:36 -07002544
2545 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
2546 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::HMAC));
2547 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
2548 << "Key size " << key_size << "missing";
2549
2550 CheckedDeleteKey(&key_blob);
2551 }
2552}
2553
2554/*
Qi Wud22ec842020-11-26 13:27:53 +08002555 * NewKeyGenerationTest.LimitedUsageHmac
2556 *
2557 * Verifies that KeyMint supports all required digests with limited usage Hmac, and that the
2558 * resulting keys have correct characteristics.
2559 */
2560TEST_P(NewKeyGenerationTest, LimitedUsageHmac) {
2561 for (auto digest : ValidDigests(false /* withNone */, true /* withMD5 */)) {
2562 vector<uint8_t> key_blob;
2563 vector<KeyCharacteristics> key_characteristics;
2564 constexpr size_t key_size = 128;
2565 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2566 .HmacKey(key_size)
2567 .Digest(digest)
2568 .Authorization(TAG_MIN_MAC_LENGTH, 128)
2569 .Authorization(TAG_USAGE_COUNT_LIMIT, 1),
2570 &key_blob, &key_characteristics));
2571
2572 ASSERT_GT(key_blob.size(), 0U);
2573 CheckBaseParams(key_characteristics);
David Drysdale300b5552021-05-20 12:05:26 +01002574 CheckCharacteristics(key_blob, key_characteristics);
Qi Wud22ec842020-11-26 13:27:53 +08002575
2576 AuthorizationSet crypto_params = SecLevelAuthorizations(key_characteristics);
2577 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::HMAC));
2578 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))
2579 << "Key size " << key_size << "missing";
2580
2581 // Check the usage count limit tag appears in the authorizations.
2582 AuthorizationSet auths;
2583 for (auto& entry : key_characteristics) {
2584 auths.push_back(AuthorizationSet(entry.authorizations));
2585 }
2586 EXPECT_TRUE(auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U))
2587 << "key usage count limit " << 1U << " missing";
2588
2589 CheckedDeleteKey(&key_blob);
2590 }
2591}
2592
2593/*
Selene Huang31ab4042020-04-29 04:22:39 -07002594 * NewKeyGenerationTest.HmacCheckKeySizes
2595 *
2596 * Verifies that keymint supports all key sizes, and rejects all invalid key sizes.
2597 */
2598TEST_P(NewKeyGenerationTest, HmacCheckKeySizes) {
2599 for (size_t key_size = 0; key_size <= 512; ++key_size) {
2600 if (key_size < 64 || key_size % 8 != 0) {
2601 // To keep this test from being very slow, we only test a random fraction of
2602 // non-byte key sizes. We test only ~10% of such cases. Since there are 392 of
2603 // them, we expect to run ~40 of them in each run.
2604 if (key_size % 8 == 0 || random() % 10 == 0) {
2605 EXPECT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
2606 GenerateKey(AuthorizationSetBuilder()
2607 .HmacKey(key_size)
2608 .Digest(Digest::SHA_2_256)
2609 .Authorization(TAG_MIN_MAC_LENGTH, 256)))
2610 << "HMAC key size " << key_size << " invalid";
2611 }
2612 } else {
2613 EXPECT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2614 .HmacKey(key_size)
2615 .Digest(Digest::SHA_2_256)
2616 .Authorization(TAG_MIN_MAC_LENGTH, 256)))
2617 << "Failed to generate HMAC key of size " << key_size;
2618 CheckedDeleteKey();
2619 }
2620 }
David Drysdaled2cc8c22021-04-15 13:29:45 +01002621 if (SecLevel() == SecurityLevel::STRONGBOX) {
2622 // STRONGBOX devices must not support keys larger than 512 bits.
2623 size_t key_size = 520;
2624 EXPECT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
2625 GenerateKey(AuthorizationSetBuilder()
2626 .HmacKey(key_size)
2627 .Digest(Digest::SHA_2_256)
2628 .Authorization(TAG_MIN_MAC_LENGTH, 256)))
2629 << "HMAC key size " << key_size << " unexpectedly valid";
2630 }
Selene Huang31ab4042020-04-29 04:22:39 -07002631}
2632
2633/*
2634 * NewKeyGenerationTest.HmacCheckMinMacLengths
2635 *
2636 * Verifies that keymint supports all required MAC lengths and rejects all invalid lengths. This
2637 * test is probabilistic in order to keep the runtime down, but any failure prints out the
2638 * specific MAC length that failed, so reproducing a failed run will be easy.
2639 */
2640TEST_P(NewKeyGenerationTest, HmacCheckMinMacLengths) {
2641 for (size_t min_mac_length = 0; min_mac_length <= 256; ++min_mac_length) {
2642 if (min_mac_length < 64 || min_mac_length % 8 != 0) {
2643 // To keep this test from being very long, we only test a random fraction of
2644 // non-byte lengths. We test only ~10% of such cases. Since there are 172 of them,
2645 // we expect to run ~17 of them in each run.
2646 if (min_mac_length % 8 == 0 || random() % 10 == 0) {
2647 EXPECT_EQ(ErrorCode::UNSUPPORTED_MIN_MAC_LENGTH,
2648 GenerateKey(AuthorizationSetBuilder()
2649 .HmacKey(128)
2650 .Digest(Digest::SHA_2_256)
2651 .Authorization(TAG_MIN_MAC_LENGTH, min_mac_length)))
2652 << "HMAC min mac length " << min_mac_length << " invalid.";
2653 }
2654 } else {
2655 EXPECT_EQ(ErrorCode::OK,
2656 GenerateKey(AuthorizationSetBuilder()
2657 .HmacKey(128)
2658 .Digest(Digest::SHA_2_256)
2659 .Authorization(TAG_MIN_MAC_LENGTH, min_mac_length)))
2660 << "Failed to generate HMAC key with min MAC length " << min_mac_length;
2661 CheckedDeleteKey();
2662 }
2663 }
David Drysdaled2cc8c22021-04-15 13:29:45 +01002664
2665 // Minimum MAC length must be no more than 512 bits.
2666 size_t min_mac_length = 520;
2667 EXPECT_EQ(ErrorCode::UNSUPPORTED_MIN_MAC_LENGTH,
2668 GenerateKey(AuthorizationSetBuilder()
2669 .HmacKey(128)
2670 .Digest(Digest::SHA_2_256)
2671 .Authorization(TAG_MIN_MAC_LENGTH, min_mac_length)))
2672 << "HMAC min mac length " << min_mac_length << " invalid.";
Selene Huang31ab4042020-04-29 04:22:39 -07002673}
2674
2675/*
2676 * NewKeyGenerationTest.HmacMultipleDigests
2677 *
2678 * Verifies that keymint rejects HMAC key generation with multiple specified digest algorithms.
2679 */
2680TEST_P(NewKeyGenerationTest, HmacMultipleDigests) {
David Drysdale513bf122021-10-06 11:53:13 +01002681 if (SecLevel() == SecurityLevel::STRONGBOX) {
2682 GTEST_SKIP() << "Test not applicable to StrongBox device";
2683 }
Selene Huang31ab4042020-04-29 04:22:39 -07002684
2685 ASSERT_EQ(ErrorCode::UNSUPPORTED_DIGEST,
2686 GenerateKey(AuthorizationSetBuilder()
2687 .HmacKey(128)
2688 .Digest(Digest::SHA1)
2689 .Digest(Digest::SHA_2_256)
2690 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
2691}
2692
2693/*
2694 * NewKeyGenerationTest.HmacDigestNone
2695 *
2696 * Verifies that keymint rejects HMAC key generation with no digest or Digest::NONE
2697 */
2698TEST_P(NewKeyGenerationTest, HmacDigestNone) {
2699 ASSERT_EQ(ErrorCode::UNSUPPORTED_DIGEST,
2700 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Authorization(TAG_MIN_MAC_LENGTH,
2701 128)));
2702
2703 ASSERT_EQ(ErrorCode::UNSUPPORTED_DIGEST,
2704 GenerateKey(AuthorizationSetBuilder()
2705 .HmacKey(128)
2706 .Digest(Digest::NONE)
2707 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
2708}
2709
Selene Huang4f64c222021-04-13 19:54:36 -07002710/*
2711 * NewKeyGenerationTest.AesNoAttestation
2712 *
2713 * Verifies that attestation parameters to AES keys are ignored and generateKey
2714 * will succeed.
2715 */
2716TEST_P(NewKeyGenerationTest, AesNoAttestation) {
2717 auto challenge = "hello";
2718 auto app_id = "foo";
2719
2720 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2721 .Authorization(TAG_NO_AUTH_REQUIRED)
2722 .AesEncryptionKey(128)
2723 .EcbMode()
2724 .Padding(PaddingMode::PKCS7)
2725 .AttestationChallenge(challenge)
2726 .AttestationApplicationId(app_id)));
2727
2728 ASSERT_EQ(cert_chain_.size(), 0);
2729}
2730
2731/*
2732 * NewKeyGenerationTest.TripleDesNoAttestation
2733 *
2734 * Verifies that attesting parameters to 3DES keys are ignored and generate key
2735 * will be successful. No attestation should be generated.
2736 */
2737TEST_P(NewKeyGenerationTest, TripleDesNoAttestation) {
2738 auto challenge = "hello";
2739 auto app_id = "foo";
2740
2741 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2742 .TripleDesEncryptionKey(168)
2743 .BlockMode(BlockMode::ECB)
2744 .Authorization(TAG_NO_AUTH_REQUIRED)
2745 .Padding(PaddingMode::NONE)
2746 .AttestationChallenge(challenge)
2747 .AttestationApplicationId(app_id)));
2748 ASSERT_EQ(cert_chain_.size(), 0);
2749}
2750
Selene Huang31ab4042020-04-29 04:22:39 -07002751INSTANTIATE_KEYMINT_AIDL_TEST(NewKeyGenerationTest);
2752
2753typedef KeyMintAidlTestBase SigningOperationsTest;
2754
2755/*
2756 * SigningOperationsTest.RsaSuccess
2757 *
2758 * Verifies that raw RSA signature operations succeed.
2759 */
2760TEST_P(SigningOperationsTest, RsaSuccess) {
2761 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2762 .RsaSigningKey(2048, 65537)
2763 .Digest(Digest::NONE)
2764 .Padding(PaddingMode::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08002765 .Authorization(TAG_NO_AUTH_REQUIRED)
2766 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07002767 string message = "12345678901234567890123456789012";
2768 string signature = SignMessage(
2769 message, AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE));
David Drysdaledf8f52e2021-05-06 08:10:58 +01002770 LocalVerifyMessage(message, signature,
2771 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE));
2772}
2773
2774/*
2775 * SigningOperationsTest.RsaAllPaddingsAndDigests
2776 *
2777 * Verifies RSA signature/verification for all padding modes and digests.
2778 */
2779TEST_P(SigningOperationsTest, RsaAllPaddingsAndDigests) {
2780 auto authorizations = AuthorizationSetBuilder()
2781 .Authorization(TAG_NO_AUTH_REQUIRED)
2782 .RsaSigningKey(2048, 65537)
2783 .Digest(ValidDigests(true /* withNone */, true /* withMD5 */))
2784 .Padding(PaddingMode::NONE)
2785 .Padding(PaddingMode::RSA_PSS)
2786 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)
2787 .SetDefaultValidity();
2788
2789 ASSERT_EQ(ErrorCode::OK, GenerateKey(authorizations));
2790
2791 string message(128, 'a');
2792 string corrupt_message(message);
2793 ++corrupt_message[corrupt_message.size() / 2];
2794
2795 for (auto padding :
2796 {PaddingMode::NONE, PaddingMode::RSA_PSS, PaddingMode::RSA_PKCS1_1_5_SIGN}) {
2797 for (auto digest : ValidDigests(true /* withNone */, true /* withMD5 */)) {
2798 if (padding == PaddingMode::NONE && digest != Digest::NONE) {
2799 // Digesting only makes sense with padding.
2800 continue;
2801 }
2802
2803 if (padding == PaddingMode::RSA_PSS && digest == Digest::NONE) {
2804 // PSS requires digesting.
2805 continue;
2806 }
2807
2808 string signature =
2809 SignMessage(message, AuthorizationSetBuilder().Digest(digest).Padding(padding));
2810 LocalVerifyMessage(message, signature,
2811 AuthorizationSetBuilder().Digest(digest).Padding(padding));
2812 }
2813 }
Selene Huang31ab4042020-04-29 04:22:39 -07002814}
2815
2816/*
2817 * SigningOperationsTest.RsaUseRequiresCorrectAppIdAppData
2818 *
Shawn Willden7f424372021-01-10 18:06:50 -07002819 * Verifies that using an RSA key requires the correct app data.
Selene Huang31ab4042020-04-29 04:22:39 -07002820 */
2821TEST_P(SigningOperationsTest, RsaUseRequiresCorrectAppIdAppData) {
2822 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2823 .Authorization(TAG_NO_AUTH_REQUIRED)
2824 .RsaSigningKey(2048, 65537)
2825 .Digest(Digest::NONE)
2826 .Padding(PaddingMode::NONE)
2827 .Authorization(TAG_APPLICATION_ID, "clientid")
Janis Danisevskis164bb872021-02-09 11:30:25 -08002828 .Authorization(TAG_APPLICATION_DATA, "appdata")
2829 .SetDefaultValidity()));
David Drysdale300b5552021-05-20 12:05:26 +01002830
2831 CheckAppIdCharacteristics(key_blob_, "clientid", "appdata", key_characteristics_);
2832
Selene Huang31ab4042020-04-29 04:22:39 -07002833 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB,
2834 Begin(KeyPurpose::SIGN,
2835 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE)));
2836 AbortIfNeeded();
2837 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB,
2838 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
2839 .Digest(Digest::NONE)
2840 .Padding(PaddingMode::NONE)
2841 .Authorization(TAG_APPLICATION_ID, "clientid")));
2842 AbortIfNeeded();
2843 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB,
2844 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
2845 .Digest(Digest::NONE)
2846 .Padding(PaddingMode::NONE)
2847 .Authorization(TAG_APPLICATION_DATA, "appdata")));
2848 AbortIfNeeded();
2849 EXPECT_EQ(ErrorCode::OK,
2850 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
2851 .Digest(Digest::NONE)
2852 .Padding(PaddingMode::NONE)
2853 .Authorization(TAG_APPLICATION_DATA, "appdata")
2854 .Authorization(TAG_APPLICATION_ID, "clientid")));
2855 AbortIfNeeded();
2856}
2857
2858/*
2859 * SigningOperationsTest.RsaPssSha256Success
2860 *
2861 * Verifies that RSA-PSS signature operations succeed.
2862 */
2863TEST_P(SigningOperationsTest, RsaPssSha256Success) {
2864 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2865 .RsaSigningKey(2048, 65537)
2866 .Digest(Digest::SHA_2_256)
2867 .Padding(PaddingMode::RSA_PSS)
Janis Danisevskis164bb872021-02-09 11:30:25 -08002868 .Authorization(TAG_NO_AUTH_REQUIRED)
2869 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07002870 // Use large message, which won't work without digesting.
2871 string message(1024, 'a');
2872 string signature = SignMessage(
2873 message,
2874 AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Padding(PaddingMode::RSA_PSS));
2875}
2876
2877/*
2878 * SigningOperationsTest.RsaPaddingNoneDoesNotAllowOther
2879 *
2880 * Verifies that keymint rejects signature operations that specify a padding mode when the key
2881 * supports only unpadded operations.
2882 */
2883TEST_P(SigningOperationsTest, RsaPaddingNoneDoesNotAllowOther) {
2884 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2885 .RsaSigningKey(2048, 65537)
2886 .Digest(Digest::NONE)
2887 .Authorization(TAG_NO_AUTH_REQUIRED)
Janis Danisevskis164bb872021-02-09 11:30:25 -08002888 .Padding(PaddingMode::NONE)
2889 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07002890 string message = "12345678901234567890123456789012";
2891 string signature;
2892
2893 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PADDING_MODE,
2894 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
2895 .Digest(Digest::NONE)
2896 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)));
2897}
2898
2899/*
2900 * SigningOperationsTest.NoUserConfirmation
2901 *
2902 * Verifies that keymint rejects signing operations for keys with
2903 * TRUSTED_CONFIRMATION_REQUIRED and no valid confirmation token
2904 * presented.
2905 */
2906TEST_P(SigningOperationsTest, NoUserConfirmation) {
David Drysdale513bf122021-10-06 11:53:13 +01002907 if (SecLevel() == SecurityLevel::STRONGBOX) {
2908 GTEST_SKIP() << "Test not applicable to StrongBox device";
2909 }
Janis Danisevskis164bb872021-02-09 11:30:25 -08002910 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2911 .RsaSigningKey(1024, 65537)
2912 .Digest(Digest::NONE)
2913 .Padding(PaddingMode::NONE)
2914 .Authorization(TAG_NO_AUTH_REQUIRED)
2915 .Authorization(TAG_TRUSTED_CONFIRMATION_REQUIRED)
2916 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07002917
2918 const string message = "12345678901234567890123456789012";
2919 EXPECT_EQ(ErrorCode::OK,
2920 Begin(KeyPurpose::SIGN,
2921 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE)));
2922 string signature;
2923 EXPECT_EQ(ErrorCode::NO_USER_CONFIRMATION, Finish(message, &signature));
2924}
2925
2926/*
2927 * SigningOperationsTest.RsaPkcs1Sha256Success
2928 *
2929 * Verifies that digested RSA-PKCS1 signature operations succeed.
2930 */
2931TEST_P(SigningOperationsTest, RsaPkcs1Sha256Success) {
2932 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2933 .RsaSigningKey(2048, 65537)
2934 .Digest(Digest::SHA_2_256)
2935 .Authorization(TAG_NO_AUTH_REQUIRED)
Janis Danisevskis164bb872021-02-09 11:30:25 -08002936 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)
2937 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07002938 string message(1024, 'a');
2939 string signature = SignMessage(message, AuthorizationSetBuilder()
2940 .Digest(Digest::SHA_2_256)
2941 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN));
2942}
2943
2944/*
2945 * SigningOperationsTest.RsaPkcs1NoDigestSuccess
2946 *
2947 * Verifies that undigested RSA-PKCS1 signature operations succeed.
2948 */
2949TEST_P(SigningOperationsTest, RsaPkcs1NoDigestSuccess) {
2950 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2951 .RsaSigningKey(2048, 65537)
2952 .Digest(Digest::NONE)
2953 .Authorization(TAG_NO_AUTH_REQUIRED)
Janis Danisevskis164bb872021-02-09 11:30:25 -08002954 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)
2955 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07002956 string message(53, 'a');
2957 string signature = SignMessage(message, AuthorizationSetBuilder()
2958 .Digest(Digest::NONE)
2959 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN));
2960}
2961
2962/*
2963 * SigningOperationsTest.RsaPkcs1NoDigestTooLarge
2964 *
2965 * Verifies that undigested RSA-PKCS1 signature operations fail with the correct error code when
2966 * given a too-long message.
2967 */
2968TEST_P(SigningOperationsTest, RsaPkcs1NoDigestTooLong) {
2969 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
2970 .RsaSigningKey(2048, 65537)
2971 .Digest(Digest::NONE)
2972 .Authorization(TAG_NO_AUTH_REQUIRED)
Janis Danisevskis164bb872021-02-09 11:30:25 -08002973 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)
2974 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07002975 string message(257, 'a');
2976
2977 EXPECT_EQ(ErrorCode::OK,
2978 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
2979 .Digest(Digest::NONE)
2980 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)));
2981 string signature;
2982 EXPECT_EQ(ErrorCode::INVALID_INPUT_LENGTH, Finish(message, &signature));
2983}
2984
2985/*
2986 * SigningOperationsTest.RsaPssSha512TooSmallKey
2987 *
2988 * Verifies that undigested RSA-PSS signature operations fail with the correct error code when
2989 * used with a key that is too small for the message.
2990 *
2991 * A PSS-padded message is of length salt_size + digest_size + 16 (sizes in bits), and the
2992 * keymint specification requires that salt_size == digest_size, so the message will be
2993 * digest_size * 2 +
2994 * 16. Such a message can only be signed by a given key if the key is at least that size. This
2995 * test uses SHA512, which has a digest_size == 512, so the message size is 1040 bits, too large
2996 * for a 1024-bit key.
2997 */
2998TEST_P(SigningOperationsTest, RsaPssSha512TooSmallKey) {
David Drysdale513bf122021-10-06 11:53:13 +01002999 if (SecLevel() == SecurityLevel::STRONGBOX) {
3000 GTEST_SKIP() << "Test not applicable to StrongBox device";
3001 }
Selene Huang31ab4042020-04-29 04:22:39 -07003002 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3003 .RsaSigningKey(1024, 65537)
3004 .Digest(Digest::SHA_2_512)
3005 .Authorization(TAG_NO_AUTH_REQUIRED)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003006 .Padding(PaddingMode::RSA_PSS)
3007 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07003008 EXPECT_EQ(ErrorCode::INCOMPATIBLE_DIGEST,
3009 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
3010 .Digest(Digest::SHA_2_512)
3011 .Padding(PaddingMode::RSA_PSS)));
3012}
3013
3014/*
3015 * SigningOperationsTest.RsaNoPaddingTooLong
3016 *
3017 * Verifies that raw RSA signature operations fail with the correct error code when
3018 * given a too-long message.
3019 */
3020TEST_P(SigningOperationsTest, RsaNoPaddingTooLong) {
3021 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3022 .RsaSigningKey(2048, 65537)
3023 .Digest(Digest::NONE)
3024 .Authorization(TAG_NO_AUTH_REQUIRED)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003025 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)
3026 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07003027 // One byte too long
3028 string message(2048 / 8 + 1, 'a');
3029 ASSERT_EQ(ErrorCode::OK,
3030 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
3031 .Digest(Digest::NONE)
3032 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)));
3033 string result;
3034 ErrorCode finish_error_code = Finish(message, &result);
3035 EXPECT_TRUE(finish_error_code == ErrorCode::INVALID_INPUT_LENGTH ||
3036 finish_error_code == ErrorCode::INVALID_ARGUMENT);
3037
3038 // Very large message that should exceed the transfer buffer size of any reasonable TEE.
3039 message = string(128 * 1024, 'a');
3040 ASSERT_EQ(ErrorCode::OK,
3041 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
3042 .Digest(Digest::NONE)
3043 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)));
3044 finish_error_code = Finish(message, &result);
3045 EXPECT_TRUE(finish_error_code == ErrorCode::INVALID_INPUT_LENGTH ||
3046 finish_error_code == ErrorCode::INVALID_ARGUMENT);
3047}
3048
3049/*
3050 * SigningOperationsTest.RsaAbort
3051 *
3052 * Verifies that operations can be aborted correctly. Uses an RSA signing operation for the
3053 * test, but the behavior should be algorithm and purpose-independent.
3054 */
3055TEST_P(SigningOperationsTest, RsaAbort) {
3056 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3057 .RsaSigningKey(2048, 65537)
3058 .Digest(Digest::NONE)
3059 .Authorization(TAG_NO_AUTH_REQUIRED)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003060 .Padding(PaddingMode::NONE)
3061 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07003062
3063 ASSERT_EQ(ErrorCode::OK,
3064 Begin(KeyPurpose::SIGN,
3065 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE)));
3066 EXPECT_EQ(ErrorCode::OK, Abort());
3067
3068 // Another abort should fail
3069 EXPECT_EQ(ErrorCode::INVALID_OPERATION_HANDLE, Abort());
3070
3071 // Set to sentinel, so TearDown() doesn't try to abort again.
Janis Danisevskis24c04702020-12-16 18:28:39 -08003072 op_.reset();
Selene Huang31ab4042020-04-29 04:22:39 -07003073}
3074
3075/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01003076 * SigningOperationsTest.RsaNonUniqueParams
3077 *
3078 * Verifies that an operation with multiple padding modes is rejected.
3079 */
3080TEST_P(SigningOperationsTest, RsaNonUniqueParams) {
3081 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3082 .RsaSigningKey(2048, 65537)
3083 .Digest(Digest::NONE)
3084 .Digest(Digest::SHA1)
3085 .Authorization(TAG_NO_AUTH_REQUIRED)
3086 .Padding(PaddingMode::NONE)
3087 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)
3088 .SetDefaultValidity()));
3089
3090 ASSERT_EQ(ErrorCode::UNSUPPORTED_PADDING_MODE,
3091 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
3092 .Digest(Digest::NONE)
3093 .Padding(PaddingMode::NONE)
3094 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)));
3095
Tommy Chiuc93c4392021-05-11 18:36:50 +08003096 auto result = Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
3097 .Digest(Digest::NONE)
3098 .Digest(Digest::SHA1)
3099 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN));
3100 ASSERT_TRUE(result == ErrorCode::UNSUPPORTED_DIGEST || result == ErrorCode::INVALID_ARGUMENT);
David Drysdaled2cc8c22021-04-15 13:29:45 +01003101
3102 ASSERT_EQ(ErrorCode::UNSUPPORTED_DIGEST,
3103 Begin(KeyPurpose::SIGN,
3104 AuthorizationSetBuilder().Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)));
3105}
3106
3107/*
Selene Huang31ab4042020-04-29 04:22:39 -07003108 * SigningOperationsTest.RsaUnsupportedPadding
3109 *
3110 * Verifies that RSA operations fail with the correct error (but key gen succeeds) when used
3111 * with a padding mode inappropriate for RSA.
3112 */
3113TEST_P(SigningOperationsTest, RsaUnsupportedPadding) {
3114 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3115 .RsaSigningKey(2048, 65537)
3116 .Authorization(TAG_NO_AUTH_REQUIRED)
3117 .Digest(Digest::SHA_2_256 /* supported digest */)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003118 .Padding(PaddingMode::PKCS7)
3119 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07003120 ASSERT_EQ(
3121 ErrorCode::UNSUPPORTED_PADDING_MODE,
3122 Begin(KeyPurpose::SIGN,
3123 AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Padding(PaddingMode::PKCS7)));
David Drysdaled2cc8c22021-04-15 13:29:45 +01003124 CheckedDeleteKey();
3125
3126 ASSERT_EQ(ErrorCode::OK,
3127 GenerateKey(
3128 AuthorizationSetBuilder()
3129 .RsaSigningKey(2048, 65537)
3130 .Authorization(TAG_NO_AUTH_REQUIRED)
3131 .Digest(Digest::SHA_2_256 /* supported digest */)
3132 .Padding(PaddingMode::RSA_OAEP) /* padding mode for encryption only */
3133 .SetDefaultValidity()));
3134 ASSERT_EQ(ErrorCode::UNSUPPORTED_PADDING_MODE,
3135 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
3136 .Digest(Digest::SHA_2_256)
3137 .Padding(PaddingMode::RSA_OAEP)));
Selene Huang31ab4042020-04-29 04:22:39 -07003138}
3139
3140/*
3141 * SigningOperationsTest.RsaPssNoDigest
3142 *
3143 * Verifies that RSA PSS operations fail when no digest is used. PSS requires a digest.
3144 */
3145TEST_P(SigningOperationsTest, RsaNoDigest) {
3146 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3147 .RsaSigningKey(2048, 65537)
3148 .Authorization(TAG_NO_AUTH_REQUIRED)
3149 .Digest(Digest::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003150 .Padding(PaddingMode::RSA_PSS)
3151 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07003152 ASSERT_EQ(ErrorCode::INCOMPATIBLE_DIGEST,
3153 Begin(KeyPurpose::SIGN,
3154 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::RSA_PSS)));
3155
3156 ASSERT_EQ(ErrorCode::UNSUPPORTED_DIGEST,
3157 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder().Padding(PaddingMode::RSA_PSS)));
3158}
3159
3160/*
David Drysdale7de9feb2021-03-05 14:56:19 +00003161 * SigningOperationsTest.RsaPssNoPadding
Selene Huang31ab4042020-04-29 04:22:39 -07003162 *
3163 * Verifies that RSA operations fail when no padding mode is specified. PaddingMode::NONE is
3164 * supported in some cases (as validated in other tests), but a mode must be specified.
3165 */
3166TEST_P(SigningOperationsTest, RsaNoPadding) {
3167 // Padding must be specified
3168 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3169 .RsaKey(2048, 65537)
3170 .Authorization(TAG_NO_AUTH_REQUIRED)
3171 .SigningKey()
Janis Danisevskis164bb872021-02-09 11:30:25 -08003172 .Digest(Digest::NONE)
3173 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07003174 ASSERT_EQ(ErrorCode::UNSUPPORTED_PADDING_MODE,
3175 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder().Digest(Digest::NONE)));
3176}
3177
3178/*
3179 * SigningOperationsTest.RsaShortMessage
3180 *
3181 * Verifies that raw RSA signatures succeed with a message shorter than the key size.
3182 */
3183TEST_P(SigningOperationsTest, RsaTooShortMessage) {
3184 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3185 .Authorization(TAG_NO_AUTH_REQUIRED)
3186 .RsaSigningKey(2048, 65537)
3187 .Digest(Digest::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003188 .Padding(PaddingMode::NONE)
3189 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07003190
3191 // Barely shorter
3192 string message(2048 / 8 - 1, 'a');
3193 SignMessage(message, AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE));
3194
3195 // Much shorter
3196 message = "a";
3197 SignMessage(message, AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE));
3198}
3199
3200/*
3201 * SigningOperationsTest.RsaSignWithEncryptionKey
3202 *
3203 * Verifies that RSA encryption keys cannot be used to sign.
3204 */
3205TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
3206 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3207 .Authorization(TAG_NO_AUTH_REQUIRED)
3208 .RsaEncryptionKey(2048, 65537)
3209 .Digest(Digest::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003210 .Padding(PaddingMode::NONE)
3211 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07003212 ASSERT_EQ(ErrorCode::INCOMPATIBLE_PURPOSE,
3213 Begin(KeyPurpose::SIGN,
3214 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE)));
3215}
3216
3217/*
3218 * SigningOperationsTest.RsaSignTooLargeMessage
3219 *
3220 * Verifies that attempting a raw signature of a message which is the same length as the key,
3221 * but numerically larger than the public modulus, fails with the correct error.
3222 */
3223TEST_P(SigningOperationsTest, RsaSignTooLargeMessage) {
3224 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3225 .Authorization(TAG_NO_AUTH_REQUIRED)
3226 .RsaSigningKey(2048, 65537)
3227 .Digest(Digest::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003228 .Padding(PaddingMode::NONE)
3229 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07003230
3231 // Largest possible message will always be larger than the public modulus.
3232 string message(2048 / 8, static_cast<char>(0xff));
3233 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
3234 .Authorization(TAG_NO_AUTH_REQUIRED)
3235 .Digest(Digest::NONE)
3236 .Padding(PaddingMode::NONE)));
3237 string signature;
3238 ASSERT_EQ(ErrorCode::INVALID_ARGUMENT, Finish(message, &signature));
3239}
3240
3241/*
David Drysdaledf8f52e2021-05-06 08:10:58 +01003242 * SigningOperationsTest.EcdsaAllDigestsAndCurves
3243 *
David Drysdale42fe1892021-10-14 14:43:46 +01003244 * Verifies ECDSA signature/verification for all digests and required curves.
David Drysdaledf8f52e2021-05-06 08:10:58 +01003245 */
3246TEST_P(SigningOperationsTest, EcdsaAllDigestsAndCurves) {
David Drysdaledf8f52e2021-05-06 08:10:58 +01003247
3248 string message = "1234567890";
3249 string corrupt_message = "2234567890";
3250 for (auto curve : ValidCurves()) {
3251 SCOPED_TRACE(testing::Message() << "Curve::" << curve);
David Drysdale42fe1892021-10-14 14:43:46 +01003252 // Ed25519 only allows Digest::NONE.
3253 auto digests = (curve == EcCurve::CURVE_25519)
3254 ? std::vector<Digest>(1, Digest::NONE)
3255 : ValidDigests(true /* withNone */, false /* withMD5 */);
3256
David Drysdaledf8f52e2021-05-06 08:10:58 +01003257 ErrorCode error = GenerateKey(AuthorizationSetBuilder()
3258 .Authorization(TAG_NO_AUTH_REQUIRED)
3259 .EcdsaSigningKey(curve)
3260 .Digest(digests)
3261 .SetDefaultValidity());
3262 EXPECT_EQ(ErrorCode::OK, error) << "Failed to generate key for EC curve " << curve;
3263 if (error != ErrorCode::OK) {
3264 continue;
3265 }
3266
3267 for (auto digest : digests) {
3268 SCOPED_TRACE(testing::Message() << "Digest::" << digest);
3269 string signature = SignMessage(message, AuthorizationSetBuilder().Digest(digest));
3270 LocalVerifyMessage(message, signature, AuthorizationSetBuilder().Digest(digest));
3271 }
3272
3273 auto rc = DeleteKey();
3274 ASSERT_TRUE(rc == ErrorCode::OK || rc == ErrorCode::UNIMPLEMENTED);
3275 }
3276}
3277
3278/*
Selene Huang31ab4042020-04-29 04:22:39 -07003279 * SigningOperationsTest.EcdsaAllCurves
3280 *
David Drysdale42fe1892021-10-14 14:43:46 +01003281 * Verifies that ECDSA operations succeed with all required curves.
Selene Huang31ab4042020-04-29 04:22:39 -07003282 */
3283TEST_P(SigningOperationsTest, EcdsaAllCurves) {
3284 for (auto curve : ValidCurves()) {
David Drysdale42fe1892021-10-14 14:43:46 +01003285 Digest digest = (curve == EcCurve::CURVE_25519 ? Digest::NONE : Digest::SHA_2_256);
3286 SCOPED_TRACE(testing::Message() << "Curve::" << curve);
Selene Huang31ab4042020-04-29 04:22:39 -07003287 ErrorCode error = GenerateKey(AuthorizationSetBuilder()
3288 .Authorization(TAG_NO_AUTH_REQUIRED)
3289 .EcdsaSigningKey(curve)
David Drysdale42fe1892021-10-14 14:43:46 +01003290 .Digest(digest)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003291 .SetDefaultValidity());
Selene Huang31ab4042020-04-29 04:22:39 -07003292 EXPECT_EQ(ErrorCode::OK, error) << "Failed to generate ECDSA key with curve " << curve;
3293 if (error != ErrorCode::OK) continue;
3294
3295 string message(1024, 'a');
David Drysdale42fe1892021-10-14 14:43:46 +01003296 SignMessage(message, AuthorizationSetBuilder().Digest(digest));
Selene Huang31ab4042020-04-29 04:22:39 -07003297 CheckedDeleteKey();
3298 }
3299}
3300
3301/*
David Drysdale42fe1892021-10-14 14:43:46 +01003302 * SigningOperationsTest.EcdsaCurve25519
3303 *
3304 * Verifies that ECDSA operations succeed with curve25519.
3305 */
3306TEST_P(SigningOperationsTest, EcdsaCurve25519) {
3307 if (!Curve25519Supported()) {
3308 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
3309 }
3310
3311 EcCurve curve = EcCurve::CURVE_25519;
3312 ErrorCode error = GenerateKey(AuthorizationSetBuilder()
3313 .Authorization(TAG_NO_AUTH_REQUIRED)
3314 .EcdsaSigningKey(curve)
3315 .Digest(Digest::NONE)
3316 .SetDefaultValidity());
3317 ASSERT_EQ(ErrorCode::OK, error) << "Failed to generate ECDSA key with curve " << curve;
3318
3319 string message(1024, 'a');
3320 SignMessage(message, AuthorizationSetBuilder().Digest(Digest::NONE));
3321 CheckedDeleteKey();
3322}
3323
3324/*
David Drysdalefeab5d92022-01-06 15:46:23 +00003325 * SigningOperationsTest.EcdsaCurve25519MaxSize
3326 *
3327 * Verifies that EDDSA operations with curve25519 under the maximum message size succeed.
3328 */
3329TEST_P(SigningOperationsTest, EcdsaCurve25519MaxSize) {
3330 if (!Curve25519Supported()) {
3331 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
3332 }
3333
3334 EcCurve curve = EcCurve::CURVE_25519;
3335 ErrorCode error = GenerateKey(AuthorizationSetBuilder()
3336 .Authorization(TAG_NO_AUTH_REQUIRED)
3337 .EcdsaSigningKey(curve)
3338 .Digest(Digest::NONE)
3339 .SetDefaultValidity());
3340 ASSERT_EQ(ErrorCode::OK, error) << "Failed to generate ECDSA key with curve " << curve;
3341
3342 auto params = AuthorizationSetBuilder().Digest(Digest::NONE);
3343
3344 for (size_t msg_size : {MAX_ED25519_MSG_SIZE - 1, MAX_ED25519_MSG_SIZE}) {
3345 SCOPED_TRACE(testing::Message() << "-msg-size=" << msg_size);
3346 string message(msg_size, 'a');
3347
3348 // Attempt to sign via Begin+Finish.
3349 AuthorizationSet out_params;
3350 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::SIGN, key_blob_, params, &out_params));
3351 EXPECT_TRUE(out_params.empty());
3352 string signature;
3353 auto result = Finish(message, &signature);
3354 EXPECT_EQ(result, ErrorCode::OK);
3355 LocalVerifyMessage(message, signature, params);
3356
3357 // Attempt to sign via Begin+Update+Finish
3358 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::SIGN, key_blob_, params, &out_params));
3359 EXPECT_TRUE(out_params.empty());
3360 string output;
3361 result = Update(message, &output);
3362 EXPECT_EQ(result, ErrorCode::OK);
3363 EXPECT_EQ(output.size(), 0);
3364 string signature2;
3365 EXPECT_EQ(ErrorCode::OK, Finish({}, &signature2));
3366 LocalVerifyMessage(message, signature2, params);
3367 }
3368
3369 CheckedDeleteKey();
3370}
3371
3372/*
3373 * SigningOperationsTest.EcdsaCurve25519MaxSizeFail
3374 *
3375 * Verifies that EDDSA operations with curve25519 fail when message size is too large.
3376 */
3377TEST_P(SigningOperationsTest, EcdsaCurve25519MaxSizeFail) {
3378 if (!Curve25519Supported()) {
3379 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
3380 }
3381
3382 EcCurve curve = EcCurve::CURVE_25519;
3383 ErrorCode error = GenerateKey(AuthorizationSetBuilder()
3384 .Authorization(TAG_NO_AUTH_REQUIRED)
3385 .EcdsaSigningKey(curve)
3386 .Digest(Digest::NONE)
3387 .SetDefaultValidity());
3388 ASSERT_EQ(ErrorCode::OK, error) << "Failed to generate ECDSA key with curve " << curve;
3389
3390 auto params = AuthorizationSetBuilder().Digest(Digest::NONE);
3391
3392 for (size_t msg_size : {MAX_ED25519_MSG_SIZE + 1, MAX_ED25519_MSG_SIZE * 2}) {
3393 SCOPED_TRACE(testing::Message() << "-msg-size=" << msg_size);
3394 string message(msg_size, 'a');
3395
3396 // Attempt to sign via Begin+Finish.
3397 AuthorizationSet out_params;
3398 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::SIGN, key_blob_, params, &out_params));
3399 EXPECT_TRUE(out_params.empty());
3400 string signature;
3401 auto result = Finish(message, &signature);
3402 EXPECT_EQ(result, ErrorCode::INVALID_INPUT_LENGTH);
3403
3404 // Attempt to sign via Begin+Update (but never get to Finish)
3405 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::SIGN, key_blob_, params, &out_params));
3406 EXPECT_TRUE(out_params.empty());
3407 string output;
3408 result = Update(message, &output);
3409 EXPECT_EQ(result, ErrorCode::INVALID_INPUT_LENGTH);
3410 }
3411
3412 CheckedDeleteKey();
3413}
3414
3415/*
Selene Huang31ab4042020-04-29 04:22:39 -07003416 * SigningOperationsTest.EcdsaNoDigestHugeData
3417 *
3418 * Verifies that ECDSA operations support very large messages, even without digesting. This
3419 * should work because ECDSA actually only signs the leftmost L_n bits of the message, however
3420 * large it may be. Not using digesting is a bad idea, but in some cases digesting is done by
3421 * the framework.
3422 */
3423TEST_P(SigningOperationsTest, EcdsaNoDigestHugeData) {
3424 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3425 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdaledf09e542021-06-08 15:46:11 +01003426 .EcdsaSigningKey(EcCurve::P_256)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003427 .Digest(Digest::NONE)
3428 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07003429 string message(1 * 1024, 'a');
3430 SignMessage(message, AuthorizationSetBuilder().Digest(Digest::NONE));
3431}
3432
3433/*
3434 * SigningOperationsTest.EcUseRequiresCorrectAppIdAppData
3435 *
3436 * Verifies that using an EC key requires the correct app ID/data.
3437 */
3438TEST_P(SigningOperationsTest, EcUseRequiresCorrectAppIdAppData) {
3439 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3440 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdaledf09e542021-06-08 15:46:11 +01003441 .EcdsaSigningKey(EcCurve::P_256)
Selene Huang31ab4042020-04-29 04:22:39 -07003442 .Digest(Digest::NONE)
3443 .Authorization(TAG_APPLICATION_ID, "clientid")
Janis Danisevskis164bb872021-02-09 11:30:25 -08003444 .Authorization(TAG_APPLICATION_DATA, "appdata")
3445 .SetDefaultValidity()));
David Drysdale300b5552021-05-20 12:05:26 +01003446
3447 CheckAppIdCharacteristics(key_blob_, "clientid", "appdata", key_characteristics_);
3448
Selene Huang31ab4042020-04-29 04:22:39 -07003449 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB,
3450 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder().Digest(Digest::NONE)));
3451 AbortIfNeeded();
3452 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB,
3453 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
3454 .Digest(Digest::NONE)
3455 .Authorization(TAG_APPLICATION_ID, "clientid")));
3456 AbortIfNeeded();
3457 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB,
3458 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
3459 .Digest(Digest::NONE)
3460 .Authorization(TAG_APPLICATION_DATA, "appdata")));
3461 AbortIfNeeded();
3462 EXPECT_EQ(ErrorCode::OK,
3463 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder()
3464 .Digest(Digest::NONE)
3465 .Authorization(TAG_APPLICATION_DATA, "appdata")
3466 .Authorization(TAG_APPLICATION_ID, "clientid")));
3467 AbortIfNeeded();
3468}
3469
3470/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01003471 * SigningOperationsTest.EcdsaIncompatibleDigest
3472 *
3473 * Verifies that using an EC key requires compatible digest.
3474 */
3475TEST_P(SigningOperationsTest, EcdsaIncompatibleDigest) {
3476 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3477 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdaledf09e542021-06-08 15:46:11 +01003478 .EcdsaSigningKey(EcCurve::P_256)
David Drysdaled2cc8c22021-04-15 13:29:45 +01003479 .Digest(Digest::NONE)
3480 .Digest(Digest::SHA1)
3481 .SetDefaultValidity()));
3482 EXPECT_EQ(ErrorCode::INCOMPATIBLE_DIGEST,
3483 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder().Digest(Digest::SHA_2_256)));
3484 AbortIfNeeded();
3485}
3486
3487/*
Selene Huang31ab4042020-04-29 04:22:39 -07003488 * SigningOperationsTest.AesEcbSign
3489 *
3490 * Verifies that attempts to use AES keys to sign fail in the correct way.
3491 */
3492TEST_P(SigningOperationsTest, AesEcbSign) {
3493 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3494 .Authorization(TAG_NO_AUTH_REQUIRED)
3495 .SigningKey()
3496 .AesEncryptionKey(128)
3497 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB)));
3498
3499 AuthorizationSet out_params;
3500 EXPECT_EQ(ErrorCode::UNSUPPORTED_PURPOSE,
3501 Begin(KeyPurpose::SIGN, AuthorizationSet() /* in_params */, &out_params));
3502 EXPECT_EQ(ErrorCode::UNSUPPORTED_PURPOSE,
3503 Begin(KeyPurpose::VERIFY, AuthorizationSet() /* in_params */, &out_params));
3504}
3505
3506/*
3507 * SigningOperationsTest.HmacAllDigests
3508 *
3509 * Verifies that HMAC works with all digests.
3510 */
3511TEST_P(SigningOperationsTest, HmacAllDigests) {
3512 for (auto digest : ValidDigests(false /* withNone */, false /* withMD5 */)) {
3513 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3514 .Authorization(TAG_NO_AUTH_REQUIRED)
3515 .HmacKey(128)
3516 .Digest(digest)
3517 .Authorization(TAG_MIN_MAC_LENGTH, 160)))
3518 << "Failed to create HMAC key with digest " << digest;
3519 string message = "12345678901234567890123456789012";
3520 string signature = MacMessage(message, digest, 160);
3521 EXPECT_EQ(160U / 8U, signature.size())
3522 << "Failed to sign with HMAC key with digest " << digest;
3523 CheckedDeleteKey();
3524 }
3525}
3526
3527/*
3528 * SigningOperationsTest.HmacSha256TooLargeMacLength
3529 *
3530 * Verifies that HMAC fails in the correct way when asked to generate a MAC larger than the
3531 * digest size.
3532 */
3533TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
3534 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3535 .Authorization(TAG_NO_AUTH_REQUIRED)
3536 .HmacKey(128)
3537 .Digest(Digest::SHA_2_256)
3538 .Authorization(TAG_MIN_MAC_LENGTH, 256)));
3539 AuthorizationSet output_params;
3540 EXPECT_EQ(ErrorCode::UNSUPPORTED_MAC_LENGTH, Begin(KeyPurpose::SIGN, key_blob_,
3541 AuthorizationSetBuilder()
3542 .Digest(Digest::SHA_2_256)
3543 .Authorization(TAG_MAC_LENGTH, 264),
3544 &output_params));
3545}
3546
3547/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01003548 * SigningOperationsTest.HmacSha256InvalidMacLength
3549 *
3550 * Verifies that HMAC fails in the correct way when asked to generate a MAC whose length is
3551 * not a multiple of 8.
3552 */
3553TEST_P(SigningOperationsTest, HmacSha256InvalidMacLength) {
3554 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3555 .Authorization(TAG_NO_AUTH_REQUIRED)
3556 .HmacKey(128)
3557 .Digest(Digest::SHA_2_256)
3558 .Authorization(TAG_MIN_MAC_LENGTH, 160)));
3559 AuthorizationSet output_params;
3560 EXPECT_EQ(ErrorCode::UNSUPPORTED_MAC_LENGTH, Begin(KeyPurpose::SIGN, key_blob_,
3561 AuthorizationSetBuilder()
3562 .Digest(Digest::SHA_2_256)
3563 .Authorization(TAG_MAC_LENGTH, 161),
3564 &output_params));
3565}
3566
3567/*
Selene Huang31ab4042020-04-29 04:22:39 -07003568 * SigningOperationsTest.HmacSha256TooSmallMacLength
3569 *
3570 * Verifies that HMAC fails in the correct way when asked to generate a MAC smaller than the
3571 * specified minimum MAC length.
3572 */
3573TEST_P(SigningOperationsTest, HmacSha256TooSmallMacLength) {
3574 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
3575 .Authorization(TAG_NO_AUTH_REQUIRED)
3576 .HmacKey(128)
3577 .Digest(Digest::SHA_2_256)
3578 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
3579 AuthorizationSet output_params;
3580 EXPECT_EQ(ErrorCode::INVALID_MAC_LENGTH, Begin(KeyPurpose::SIGN, key_blob_,
3581 AuthorizationSetBuilder()
3582 .Digest(Digest::SHA_2_256)
3583 .Authorization(TAG_MAC_LENGTH, 120),
3584 &output_params));
3585}
3586
3587/*
3588 * SigningOperationsTest.HmacRfc4231TestCase3
3589 *
3590 * Validates against the test vectors from RFC 4231 test case 3.
3591 */
3592TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
3593 string key(20, 0xaa);
3594 string message(50, 0xdd);
3595 uint8_t sha_224_expected[] = {
3596 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
3597 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
3598 };
3599 uint8_t sha_256_expected[] = {
3600 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
3601 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
3602 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
3603 };
3604 uint8_t sha_384_expected[] = {
3605 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
3606 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
3607 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
3608 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
3609 };
3610 uint8_t sha_512_expected[] = {
3611 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
3612 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
3613 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
3614 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
3615 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
3616 };
3617
3618 CheckHmacTestVector(key, message, Digest::SHA_2_256, make_string(sha_256_expected));
3619 if (SecLevel() != SecurityLevel::STRONGBOX) {
3620 CheckHmacTestVector(key, message, Digest::SHA_2_224, make_string(sha_224_expected));
3621 CheckHmacTestVector(key, message, Digest::SHA_2_384, make_string(sha_384_expected));
3622 CheckHmacTestVector(key, message, Digest::SHA_2_512, make_string(sha_512_expected));
3623 }
3624}
3625
3626/*
3627 * SigningOperationsTest.HmacRfc4231TestCase5
3628 *
3629 * Validates against the test vectors from RFC 4231 test case 5.
3630 */
3631TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
3632 string key(20, 0x0c);
3633 string message = "Test With Truncation";
3634
3635 uint8_t sha_224_expected[] = {
3636 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
3637 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
3638 };
3639 uint8_t sha_256_expected[] = {
3640 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
3641 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
3642 };
3643 uint8_t sha_384_expected[] = {
3644 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
3645 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
3646 };
3647 uint8_t sha_512_expected[] = {
3648 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
3649 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
3650 };
3651
3652 CheckHmacTestVector(key, message, Digest::SHA_2_256, make_string(sha_256_expected));
3653 if (SecLevel() != SecurityLevel::STRONGBOX) {
3654 CheckHmacTestVector(key, message, Digest::SHA_2_224, make_string(sha_224_expected));
3655 CheckHmacTestVector(key, message, Digest::SHA_2_384, make_string(sha_384_expected));
3656 CheckHmacTestVector(key, message, Digest::SHA_2_512, make_string(sha_512_expected));
3657 }
3658}
3659
3660INSTANTIATE_KEYMINT_AIDL_TEST(SigningOperationsTest);
3661
3662typedef KeyMintAidlTestBase VerificationOperationsTest;
3663
3664/*
Selene Huang31ab4042020-04-29 04:22:39 -07003665 * VerificationOperationsTest.HmacSigningKeyCannotVerify
3666 *
3667 * Verifies HMAC signing and verification, but that a signing key cannot be used to verify.
3668 */
3669TEST_P(VerificationOperationsTest, HmacSigningKeyCannotVerify) {
3670 string key_material = "HelloThisIsAKey";
3671
3672 vector<uint8_t> signing_key, verification_key;
Shawn Willden7f424372021-01-10 18:06:50 -07003673 vector<KeyCharacteristics> signing_key_chars, verification_key_chars;
Selene Huang31ab4042020-04-29 04:22:39 -07003674 EXPECT_EQ(ErrorCode::OK,
3675 ImportKey(AuthorizationSetBuilder()
3676 .Authorization(TAG_NO_AUTH_REQUIRED)
3677 .Authorization(TAG_ALGORITHM, Algorithm::HMAC)
3678 .Authorization(TAG_PURPOSE, KeyPurpose::SIGN)
3679 .Digest(Digest::SHA_2_256)
3680 .Authorization(TAG_MIN_MAC_LENGTH, 160),
3681 KeyFormat::RAW, key_material, &signing_key, &signing_key_chars));
3682 EXPECT_EQ(ErrorCode::OK,
3683 ImportKey(AuthorizationSetBuilder()
3684 .Authorization(TAG_NO_AUTH_REQUIRED)
3685 .Authorization(TAG_ALGORITHM, Algorithm::HMAC)
3686 .Authorization(TAG_PURPOSE, KeyPurpose::VERIFY)
3687 .Digest(Digest::SHA_2_256)
3688 .Authorization(TAG_MIN_MAC_LENGTH, 160),
3689 KeyFormat::RAW, key_material, &verification_key, &verification_key_chars));
3690
3691 string message = "This is a message.";
3692 string signature = SignMessage(
3693 signing_key, message,
3694 AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Authorization(TAG_MAC_LENGTH, 160));
3695
3696 // Signing key should not work.
3697 AuthorizationSet out_params;
3698 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PURPOSE,
3699 Begin(KeyPurpose::VERIFY, signing_key,
3700 AuthorizationSetBuilder().Digest(Digest::SHA_2_256), &out_params));
3701
3702 // Verification key should work.
3703 VerifyMessage(verification_key, message, signature,
3704 AuthorizationSetBuilder().Digest(Digest::SHA_2_256));
3705
3706 CheckedDeleteKey(&signing_key);
3707 CheckedDeleteKey(&verification_key);
3708}
3709
Prashant Patildec9fdc2021-12-08 15:25:47 +00003710/*
3711 * VerificationOperationsTest.HmacVerificationFailsForCorruptSignature
3712 *
3713 * Verifies HMAC signature verification should fails if message or signature is corrupted.
3714 */
3715TEST_P(VerificationOperationsTest, HmacVerificationFailsForCorruptSignature) {
3716 string key_material = "HelloThisIsAKey";
3717
3718 vector<uint8_t> signing_key, verification_key;
3719 vector<KeyCharacteristics> signing_key_chars, verification_key_chars;
3720 EXPECT_EQ(ErrorCode::OK,
3721 ImportKey(AuthorizationSetBuilder()
3722 .Authorization(TAG_NO_AUTH_REQUIRED)
3723 .Authorization(TAG_ALGORITHM, Algorithm::HMAC)
3724 .Authorization(TAG_PURPOSE, KeyPurpose::SIGN)
3725 .Digest(Digest::SHA_2_256)
3726 .Authorization(TAG_MIN_MAC_LENGTH, 160),
3727 KeyFormat::RAW, key_material, &signing_key, &signing_key_chars));
3728 EXPECT_EQ(ErrorCode::OK,
3729 ImportKey(AuthorizationSetBuilder()
3730 .Authorization(TAG_NO_AUTH_REQUIRED)
3731 .Authorization(TAG_ALGORITHM, Algorithm::HMAC)
3732 .Authorization(TAG_PURPOSE, KeyPurpose::VERIFY)
3733 .Digest(Digest::SHA_2_256)
3734 .Authorization(TAG_MIN_MAC_LENGTH, 160),
3735 KeyFormat::RAW, key_material, &verification_key, &verification_key_chars));
3736
3737 string message = "This is a message.";
3738 string signature = SignMessage(
3739 signing_key, message,
3740 AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Authorization(TAG_MAC_LENGTH, 160));
3741
3742 AuthorizationSet begin_out_params;
3743 ASSERT_EQ(ErrorCode::OK,
3744 Begin(KeyPurpose::VERIFY, verification_key,
3745 AuthorizationSetBuilder().Digest(Digest::SHA_2_256), &begin_out_params));
3746
3747 string corruptMessage = "This is b message."; // Corrupted message
3748 string output;
3749 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(corruptMessage, signature, &output));
3750
3751 ASSERT_EQ(ErrorCode::OK,
3752 Begin(KeyPurpose::VERIFY, verification_key,
3753 AuthorizationSetBuilder().Digest(Digest::SHA_2_256), &begin_out_params));
3754
3755 signature[0] += 1; // Corrupt a signature
3756 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(message, signature, &output));
3757
3758 CheckedDeleteKey(&signing_key);
3759 CheckedDeleteKey(&verification_key);
3760}
3761
Selene Huang31ab4042020-04-29 04:22:39 -07003762INSTANTIATE_KEYMINT_AIDL_TEST(VerificationOperationsTest);
3763
3764typedef KeyMintAidlTestBase ExportKeyTest;
3765
3766/*
3767 * ExportKeyTest.RsaUnsupportedKeyFormat
3768 *
3769 * Verifies that attempting to export RSA keys in PKCS#8 format fails with the correct error.
3770 */
3771// TODO(seleneh) add ExportKey to GenerateKey
3772// check result
3773
3774class ImportKeyTest : public KeyMintAidlTestBase {
3775 public:
3776 template <TagType tag_type, Tag tag, typename ValueT>
3777 void CheckCryptoParam(TypedTag<tag_type, tag> ttag, ValueT expected) {
3778 SCOPED_TRACE("CheckCryptoParam");
Shawn Willden7f424372021-01-10 18:06:50 -07003779 for (auto& entry : key_characteristics_) {
3780 if (entry.securityLevel == SecLevel()) {
3781 EXPECT_TRUE(contains(entry.authorizations, ttag, expected))
3782 << "Tag " << tag << " with value " << expected
3783 << " not found at security level" << entry.securityLevel;
3784 } else {
3785 EXPECT_FALSE(contains(entry.authorizations, ttag, expected))
3786 << "Tag " << tag << " found at security level " << entry.securityLevel;
3787 }
Selene Huang31ab4042020-04-29 04:22:39 -07003788 }
3789 }
3790
3791 void CheckOrigin() {
3792 SCOPED_TRACE("CheckOrigin");
Shawn Willden7f424372021-01-10 18:06:50 -07003793 // Origin isn't a crypto param, but it always lives with them.
3794 return CheckCryptoParam(TAG_ORIGIN, KeyOrigin::IMPORTED);
Selene Huang31ab4042020-04-29 04:22:39 -07003795 }
3796};
3797
3798/*
3799 * ImportKeyTest.RsaSuccess
3800 *
3801 * Verifies that importing and using an RSA key pair works correctly.
3802 */
3803TEST_P(ImportKeyTest, RsaSuccess) {
Selene Huange5727e62021-04-13 22:41:20 -07003804 uint32_t key_size;
3805 string key;
3806
3807 if (SecLevel() == SecurityLevel::STRONGBOX) {
3808 key_size = 2048;
3809 key = rsa_2048_key;
3810 } else {
3811 key_size = 1024;
3812 key = rsa_key;
3813 }
3814
Selene Huang31ab4042020-04-29 04:22:39 -07003815 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
3816 .Authorization(TAG_NO_AUTH_REQUIRED)
Selene Huange5727e62021-04-13 22:41:20 -07003817 .RsaSigningKey(key_size, 65537)
Selene Huang31ab4042020-04-29 04:22:39 -07003818 .Digest(Digest::SHA_2_256)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003819 .Padding(PaddingMode::RSA_PSS)
3820 .SetDefaultValidity(),
Selene Huange5727e62021-04-13 22:41:20 -07003821 KeyFormat::PKCS8, key));
Selene Huang31ab4042020-04-29 04:22:39 -07003822
3823 CheckCryptoParam(TAG_ALGORITHM, Algorithm::RSA);
Selene Huange5727e62021-04-13 22:41:20 -07003824 CheckCryptoParam(TAG_KEY_SIZE, key_size);
Selene Huang31ab4042020-04-29 04:22:39 -07003825 CheckCryptoParam(TAG_RSA_PUBLIC_EXPONENT, 65537U);
3826 CheckCryptoParam(TAG_DIGEST, Digest::SHA_2_256);
3827 CheckCryptoParam(TAG_PADDING, PaddingMode::RSA_PSS);
3828 CheckOrigin();
3829
3830 string message(1024 / 8, 'a');
3831 auto params = AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Padding(PaddingMode::RSA_PSS);
3832 string signature = SignMessage(message, params);
David Drysdaledf8f52e2021-05-06 08:10:58 +01003833 LocalVerifyMessage(message, signature, params);
Selene Huang31ab4042020-04-29 04:22:39 -07003834}
3835
3836/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01003837 * ImportKeyTest.RsaSuccessWithoutParams
3838 *
3839 * Verifies that importing and using an RSA key pair without specifying parameters
3840 * works correctly.
3841 */
3842TEST_P(ImportKeyTest, RsaSuccessWithoutParams) {
3843 uint32_t key_size;
3844 string key;
3845
3846 if (SecLevel() == SecurityLevel::STRONGBOX) {
3847 key_size = 2048;
3848 key = rsa_2048_key;
3849 } else {
3850 key_size = 1024;
3851 key = rsa_key;
3852 }
3853
3854 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
3855 .Authorization(TAG_NO_AUTH_REQUIRED)
3856 .SigningKey()
3857 .Authorization(TAG_ALGORITHM, Algorithm::RSA)
3858 .Digest(Digest::SHA_2_256)
3859 .Padding(PaddingMode::RSA_PSS)
3860 .SetDefaultValidity(),
3861 KeyFormat::PKCS8, key));
3862
3863 // Key size and public exponent are determined from the imported key material.
3864 CheckCryptoParam(TAG_KEY_SIZE, key_size);
3865 CheckCryptoParam(TAG_RSA_PUBLIC_EXPONENT, 65537U);
3866
3867 CheckCryptoParam(TAG_ALGORITHM, Algorithm::RSA);
3868 CheckCryptoParam(TAG_DIGEST, Digest::SHA_2_256);
3869 CheckCryptoParam(TAG_PADDING, PaddingMode::RSA_PSS);
3870 CheckOrigin();
3871
3872 string message(1024 / 8, 'a');
3873 auto params = AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Padding(PaddingMode::RSA_PSS);
3874 string signature = SignMessage(message, params);
David Drysdaledf8f52e2021-05-06 08:10:58 +01003875 LocalVerifyMessage(message, signature, params);
David Drysdaled2cc8c22021-04-15 13:29:45 +01003876}
3877
3878/*
Selene Huang31ab4042020-04-29 04:22:39 -07003879 * ImportKeyTest.RsaKeySizeMismatch
3880 *
3881 * Verifies that importing an RSA key pair with a size that doesn't match the key fails in the
3882 * correct way.
3883 */
3884TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
3885 ASSERT_EQ(ErrorCode::IMPORT_PARAMETER_MISMATCH,
3886 ImportKey(AuthorizationSetBuilder()
3887 .RsaSigningKey(2048 /* Doesn't match key */, 65537)
3888 .Digest(Digest::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003889 .Padding(PaddingMode::NONE)
3890 .SetDefaultValidity(),
Selene Huang31ab4042020-04-29 04:22:39 -07003891 KeyFormat::PKCS8, rsa_key));
3892}
3893
3894/*
3895 * ImportKeyTest.RsaPublicExponentMismatch
3896 *
3897 * Verifies that importing an RSA key pair with a public exponent that doesn't match the key
3898 * fails in the correct way.
3899 */
3900TEST_P(ImportKeyTest, RsaPublicExponentMismatch) {
3901 ASSERT_EQ(ErrorCode::IMPORT_PARAMETER_MISMATCH,
3902 ImportKey(AuthorizationSetBuilder()
3903 .RsaSigningKey(1024, 3 /* Doesn't match key */)
3904 .Digest(Digest::NONE)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003905 .Padding(PaddingMode::NONE)
3906 .SetDefaultValidity(),
Selene Huang31ab4042020-04-29 04:22:39 -07003907 KeyFormat::PKCS8, rsa_key));
3908}
3909
3910/*
David Drysdalee60248c2021-10-04 12:54:13 +01003911 * ImportKeyTest.RsaAttestMultiPurposeFail
3912 *
3913 * Verifies that importing an RSA key pair with purpose ATTEST_KEY+SIGN fails.
3914 */
3915TEST_P(ImportKeyTest, RsaAttestMultiPurposeFail) {
3916 uint32_t key_size = 2048;
3917 string key = rsa_2048_key;
3918
3919 ASSERT_EQ(ErrorCode::INCOMPATIBLE_PURPOSE,
3920 ImportKey(AuthorizationSetBuilder()
3921 .Authorization(TAG_NO_AUTH_REQUIRED)
3922 .RsaSigningKey(key_size, 65537)
3923 .AttestKey()
3924 .Digest(Digest::SHA_2_256)
3925 .Padding(PaddingMode::RSA_PSS)
3926 .SetDefaultValidity(),
3927 KeyFormat::PKCS8, key));
3928}
3929
3930/*
Selene Huang31ab4042020-04-29 04:22:39 -07003931 * ImportKeyTest.EcdsaSuccess
3932 *
3933 * Verifies that importing and using an ECDSA P-256 key pair works correctly.
3934 */
3935TEST_P(ImportKeyTest, EcdsaSuccess) {
3936 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
3937 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdaledf09e542021-06-08 15:46:11 +01003938 .EcdsaSigningKey(EcCurve::P_256)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003939 .Digest(Digest::SHA_2_256)
3940 .SetDefaultValidity(),
Selene Huang31ab4042020-04-29 04:22:39 -07003941 KeyFormat::PKCS8, ec_256_key));
3942
3943 CheckCryptoParam(TAG_ALGORITHM, Algorithm::EC);
Selene Huang31ab4042020-04-29 04:22:39 -07003944 CheckCryptoParam(TAG_DIGEST, Digest::SHA_2_256);
3945 CheckCryptoParam(TAG_EC_CURVE, EcCurve::P_256);
3946
3947 CheckOrigin();
3948
3949 string message(32, 'a');
3950 auto params = AuthorizationSetBuilder().Digest(Digest::SHA_2_256);
3951 string signature = SignMessage(message, params);
David Drysdaledf8f52e2021-05-06 08:10:58 +01003952 LocalVerifyMessage(message, signature, params);
Selene Huang31ab4042020-04-29 04:22:39 -07003953}
3954
3955/*
3956 * ImportKeyTest.EcdsaP256RFC5915Success
3957 *
3958 * Verifies that importing and using an ECDSA P-256 key pair encoded using RFC5915 works
3959 * correctly.
3960 */
3961TEST_P(ImportKeyTest, EcdsaP256RFC5915Success) {
3962 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
3963 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdaledf09e542021-06-08 15:46:11 +01003964 .EcdsaSigningKey(EcCurve::P_256)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003965 .Digest(Digest::SHA_2_256)
3966 .SetDefaultValidity(),
Selene Huang31ab4042020-04-29 04:22:39 -07003967 KeyFormat::PKCS8, ec_256_key_rfc5915));
3968
3969 CheckCryptoParam(TAG_ALGORITHM, Algorithm::EC);
Selene Huang31ab4042020-04-29 04:22:39 -07003970 CheckCryptoParam(TAG_DIGEST, Digest::SHA_2_256);
3971 CheckCryptoParam(TAG_EC_CURVE, EcCurve::P_256);
3972
3973 CheckOrigin();
3974
3975 string message(32, 'a');
3976 auto params = AuthorizationSetBuilder().Digest(Digest::SHA_2_256);
3977 string signature = SignMessage(message, params);
David Drysdaledf8f52e2021-05-06 08:10:58 +01003978 LocalVerifyMessage(message, signature, params);
Selene Huang31ab4042020-04-29 04:22:39 -07003979}
3980
3981/*
3982 * ImportKeyTest.EcdsaP256SEC1Success
3983 *
3984 * Verifies that importing and using an ECDSA P-256 key pair encoded using SEC1 works correctly.
3985 */
3986TEST_P(ImportKeyTest, EcdsaP256SEC1Success) {
3987 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
3988 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdaledf09e542021-06-08 15:46:11 +01003989 .EcdsaSigningKey(EcCurve::P_256)
Janis Danisevskis164bb872021-02-09 11:30:25 -08003990 .Digest(Digest::SHA_2_256)
3991 .SetDefaultValidity(),
Selene Huang31ab4042020-04-29 04:22:39 -07003992 KeyFormat::PKCS8, ec_256_key_sec1));
3993
3994 CheckCryptoParam(TAG_ALGORITHM, Algorithm::EC);
Selene Huang31ab4042020-04-29 04:22:39 -07003995 CheckCryptoParam(TAG_DIGEST, Digest::SHA_2_256);
3996 CheckCryptoParam(TAG_EC_CURVE, EcCurve::P_256);
3997
3998 CheckOrigin();
3999
4000 string message(32, 'a');
4001 auto params = AuthorizationSetBuilder().Digest(Digest::SHA_2_256);
4002 string signature = SignMessage(message, params);
David Drysdaledf8f52e2021-05-06 08:10:58 +01004003 LocalVerifyMessage(message, signature, params);
Selene Huang31ab4042020-04-29 04:22:39 -07004004}
4005
4006/*
4007 * ImportKeyTest.Ecdsa521Success
4008 *
4009 * Verifies that importing and using an ECDSA P-521 key pair works correctly.
4010 */
4011TEST_P(ImportKeyTest, Ecdsa521Success) {
David Drysdale513bf122021-10-06 11:53:13 +01004012 if (SecLevel() == SecurityLevel::STRONGBOX) {
4013 GTEST_SKIP() << "Test not applicable to StrongBox device";
4014 }
Selene Huang31ab4042020-04-29 04:22:39 -07004015 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4016 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdaledf09e542021-06-08 15:46:11 +01004017 .EcdsaSigningKey(EcCurve::P_521)
Janis Danisevskis164bb872021-02-09 11:30:25 -08004018 .Digest(Digest::SHA_2_256)
4019 .SetDefaultValidity(),
Selene Huang31ab4042020-04-29 04:22:39 -07004020 KeyFormat::PKCS8, ec_521_key));
4021
4022 CheckCryptoParam(TAG_ALGORITHM, Algorithm::EC);
Selene Huang31ab4042020-04-29 04:22:39 -07004023 CheckCryptoParam(TAG_DIGEST, Digest::SHA_2_256);
4024 CheckCryptoParam(TAG_EC_CURVE, EcCurve::P_521);
4025 CheckOrigin();
4026
4027 string message(32, 'a');
4028 auto params = AuthorizationSetBuilder().Digest(Digest::SHA_2_256);
4029 string signature = SignMessage(message, params);
David Drysdaledf8f52e2021-05-06 08:10:58 +01004030 LocalVerifyMessage(message, signature, params);
Selene Huang31ab4042020-04-29 04:22:39 -07004031}
4032
4033/*
Selene Huang31ab4042020-04-29 04:22:39 -07004034 * ImportKeyTest.EcdsaCurveMismatch
4035 *
4036 * Verifies that importing an ECDSA key pair with a curve that doesn't match the key fails in
4037 * the correct way.
4038 */
4039TEST_P(ImportKeyTest, EcdsaCurveMismatch) {
4040 ASSERT_EQ(ErrorCode::IMPORT_PARAMETER_MISMATCH,
4041 ImportKey(AuthorizationSetBuilder()
4042 .EcdsaSigningKey(EcCurve::P_224 /* Doesn't match key */)
Janis Danisevskis164bb872021-02-09 11:30:25 -08004043 .Digest(Digest::NONE)
4044 .SetDefaultValidity(),
Selene Huang31ab4042020-04-29 04:22:39 -07004045 KeyFormat::PKCS8, ec_256_key));
4046}
4047
4048/*
David Drysdalee60248c2021-10-04 12:54:13 +01004049 * ImportKeyTest.EcdsaAttestMultiPurposeFail
4050 *
4051 * Verifies that importing and using an ECDSA P-256 key pair with purpose ATTEST_KEY+SIGN fails.
4052 */
4053TEST_P(ImportKeyTest, EcdsaAttestMultiPurposeFail) {
4054 ASSERT_EQ(ErrorCode::INCOMPATIBLE_PURPOSE,
4055 ImportKey(AuthorizationSetBuilder()
4056 .Authorization(TAG_NO_AUTH_REQUIRED)
4057 .EcdsaSigningKey(EcCurve::P_256)
4058 .AttestKey()
4059 .Digest(Digest::SHA_2_256)
4060 .SetDefaultValidity(),
4061 KeyFormat::PKCS8, ec_256_key));
4062}
4063
4064/*
David Drysdale42fe1892021-10-14 14:43:46 +01004065 * ImportKeyTest.Ed25519RawSuccess
4066 *
4067 * Verifies that importing and using a raw Ed25519 private key works correctly.
4068 */
4069TEST_P(ImportKeyTest, Ed25519RawSuccess) {
4070 if (!Curve25519Supported()) {
4071 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
4072 }
4073
4074 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4075 .Authorization(TAG_NO_AUTH_REQUIRED)
4076 .EcdsaSigningKey(EcCurve::CURVE_25519)
4077 .Digest(Digest::NONE)
4078 .SetDefaultValidity(),
4079 KeyFormat::RAW, ed25519_key));
4080 CheckCryptoParam(TAG_ALGORITHM, Algorithm::EC);
4081 CheckCryptoParam(TAG_EC_CURVE, EcCurve::CURVE_25519);
4082 CheckOrigin();
4083
4084 // The returned cert should hold the correct public key.
4085 ASSERT_GT(cert_chain_.size(), 0);
4086 X509_Ptr kmKeyCert(parse_cert_blob(cert_chain_[0].encodedCertificate));
4087 ASSERT_NE(kmKeyCert, nullptr);
4088 EVP_PKEY_Ptr kmPubKey(X509_get_pubkey(kmKeyCert.get()));
4089 ASSERT_NE(kmPubKey.get(), nullptr);
4090 size_t kmPubKeySize = 32;
4091 uint8_t kmPubKeyData[32];
4092 ASSERT_EQ(1, EVP_PKEY_get_raw_public_key(kmPubKey.get(), kmPubKeyData, &kmPubKeySize));
4093 ASSERT_EQ(kmPubKeySize, 32);
4094 EXPECT_EQ(string(kmPubKeyData, kmPubKeyData + 32), ed25519_pubkey);
4095
4096 string message(32, 'a');
4097 auto params = AuthorizationSetBuilder().Digest(Digest::NONE);
4098 string signature = SignMessage(message, params);
4099 LocalVerifyMessage(message, signature, params);
4100}
4101
4102/*
4103 * ImportKeyTest.Ed25519Pkcs8Success
4104 *
4105 * Verifies that importing and using a PKCS#8-encoded Ed25519 private key works correctly.
4106 */
4107TEST_P(ImportKeyTest, Ed25519Pkcs8Success) {
4108 if (!Curve25519Supported()) {
4109 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
4110 }
4111
4112 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4113 .Authorization(TAG_NO_AUTH_REQUIRED)
4114 .EcdsaSigningKey(EcCurve::CURVE_25519)
4115 .Digest(Digest::NONE)
4116 .SetDefaultValidity(),
4117 KeyFormat::PKCS8, ed25519_pkcs8_key));
4118 CheckCryptoParam(TAG_ALGORITHM, Algorithm::EC);
4119 CheckCryptoParam(TAG_EC_CURVE, EcCurve::CURVE_25519);
4120 CheckOrigin();
4121
4122 // The returned cert should hold the correct public key.
4123 ASSERT_GT(cert_chain_.size(), 0);
4124 X509_Ptr kmKeyCert(parse_cert_blob(cert_chain_[0].encodedCertificate));
4125 ASSERT_NE(kmKeyCert, nullptr);
4126 EVP_PKEY_Ptr kmPubKey(X509_get_pubkey(kmKeyCert.get()));
4127 ASSERT_NE(kmPubKey.get(), nullptr);
4128 size_t kmPubKeySize = 32;
4129 uint8_t kmPubKeyData[32];
4130 ASSERT_EQ(1, EVP_PKEY_get_raw_public_key(kmPubKey.get(), kmPubKeyData, &kmPubKeySize));
4131 ASSERT_EQ(kmPubKeySize, 32);
4132 EXPECT_EQ(string(kmPubKeyData, kmPubKeyData + 32), ed25519_pubkey);
4133
4134 string message(32, 'a');
4135 auto params = AuthorizationSetBuilder().Digest(Digest::NONE);
4136 string signature = SignMessage(message, params);
4137 LocalVerifyMessage(message, signature, params);
4138}
4139
4140/*
4141 * ImportKeyTest.Ed25519CurveMismatch
4142 *
4143 * Verifies that importing an Ed25519 key pair with a curve that doesn't match the key fails in
4144 * the correct way.
4145 */
4146TEST_P(ImportKeyTest, Ed25519CurveMismatch) {
4147 if (!Curve25519Supported()) {
4148 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
4149 }
4150
4151 ASSERT_NE(ErrorCode::OK,
4152 ImportKey(AuthorizationSetBuilder()
4153 .EcdsaSigningKey(EcCurve::P_224 /* Doesn't match key */)
4154 .Digest(Digest::NONE)
4155 .SetDefaultValidity(),
4156 KeyFormat::RAW, ed25519_key));
4157}
4158
4159/*
4160 * ImportKeyTest.Ed25519FormatMismatch
4161 *
4162 * Verifies that importing an Ed25519 key pair with an invalid format fails.
4163 */
4164TEST_P(ImportKeyTest, Ed25519FormatMismatch) {
4165 if (!Curve25519Supported()) {
4166 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
4167 }
4168
4169 ASSERT_NE(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4170 .EcdsaSigningKey(EcCurve::CURVE_25519)
4171 .Digest(Digest::NONE)
4172 .SetDefaultValidity(),
4173 KeyFormat::PKCS8, ed25519_key));
4174 ASSERT_NE(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4175 .EcdsaSigningKey(EcCurve::CURVE_25519)
4176 .Digest(Digest::NONE)
4177 .SetDefaultValidity(),
4178 KeyFormat::RAW, ed25519_pkcs8_key));
4179}
4180
4181/*
4182 * ImportKeyTest.Ed25519PurposeMismatch
4183 *
4184 * Verifies that importing an Ed25519 key pair with an invalid purpose fails.
4185 */
4186TEST_P(ImportKeyTest, Ed25519PurposeMismatch) {
4187 if (!Curve25519Supported()) {
4188 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
4189 }
4190
4191 // Can't have both SIGN and ATTEST_KEY
4192 ASSERT_NE(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4193 .EcdsaSigningKey(EcCurve::CURVE_25519)
4194 .Authorization(TAG_PURPOSE, KeyPurpose::ATTEST_KEY)
4195 .Digest(Digest::NONE)
4196 .SetDefaultValidity(),
4197 KeyFormat::RAW, ed25519_key));
4198 // AGREE_KEY is for X25519 (but can only tell the difference if the import key is in
4199 // PKCS#8 format and so includes an OID).
4200 ASSERT_NE(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4201 .EcdsaKey(EcCurve::CURVE_25519)
4202 .Authorization(TAG_PURPOSE, KeyPurpose::AGREE_KEY)
4203 .Digest(Digest::NONE)
4204 .SetDefaultValidity(),
4205 KeyFormat::PKCS8, ed25519_pkcs8_key));
4206}
4207
4208/*
4209 * ImportKeyTest.X25519RawSuccess
4210 *
4211 * Verifies that importing and using a raw X25519 private key works correctly.
4212 */
4213TEST_P(ImportKeyTest, X25519RawSuccess) {
4214 if (!Curve25519Supported()) {
4215 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
4216 }
4217
4218 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4219 .Authorization(TAG_NO_AUTH_REQUIRED)
4220 .EcdsaKey(EcCurve::CURVE_25519)
4221 .Authorization(TAG_PURPOSE, KeyPurpose::AGREE_KEY)
4222 .SetDefaultValidity(),
4223 KeyFormat::RAW, x25519_key));
4224
4225 CheckCryptoParam(TAG_ALGORITHM, Algorithm::EC);
4226 CheckCryptoParam(TAG_EC_CURVE, EcCurve::CURVE_25519);
4227 CheckOrigin();
4228}
4229
4230/*
4231 * ImportKeyTest.X25519Pkcs8Success
4232 *
4233 * Verifies that importing and using a PKCS#8-encoded X25519 private key works correctly.
4234 */
4235TEST_P(ImportKeyTest, X25519Pkcs8Success) {
4236 if (!Curve25519Supported()) {
4237 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
4238 }
4239
4240 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4241 .Authorization(TAG_NO_AUTH_REQUIRED)
4242 .EcdsaKey(EcCurve::CURVE_25519)
4243 .Authorization(TAG_PURPOSE, KeyPurpose::AGREE_KEY)
4244 .SetDefaultValidity(),
4245 KeyFormat::PKCS8, x25519_pkcs8_key));
4246
4247 CheckCryptoParam(TAG_ALGORITHM, Algorithm::EC);
4248 CheckCryptoParam(TAG_EC_CURVE, EcCurve::CURVE_25519);
4249 CheckOrigin();
4250}
4251
4252/*
4253 * ImportKeyTest.X25519CurveMismatch
4254 *
4255 * Verifies that importing an X25519 key with a curve that doesn't match the key fails in
4256 * the correct way.
4257 */
4258TEST_P(ImportKeyTest, X25519CurveMismatch) {
4259 if (!Curve25519Supported()) {
4260 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
4261 }
4262
4263 ASSERT_NE(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4264 .EcdsaKey(EcCurve::P_224 /* Doesn't match key */)
4265 .Authorization(TAG_PURPOSE, KeyPurpose::AGREE_KEY)
4266 .SetDefaultValidity(),
4267 KeyFormat::RAW, x25519_key));
4268}
4269
4270/*
4271 * ImportKeyTest.X25519FormatMismatch
4272 *
4273 * Verifies that importing an X25519 key with an invalid format fails.
4274 */
4275TEST_P(ImportKeyTest, X25519FormatMismatch) {
4276 if (!Curve25519Supported()) {
4277 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
4278 }
4279
4280 ASSERT_NE(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4281 .EcdsaKey(EcCurve::CURVE_25519)
4282 .Authorization(TAG_PURPOSE, KeyPurpose::AGREE_KEY)
4283 .SetDefaultValidity(),
4284 KeyFormat::PKCS8, x25519_key));
4285 ASSERT_NE(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4286 .EcdsaKey(EcCurve::CURVE_25519)
4287 .Authorization(TAG_PURPOSE, KeyPurpose::AGREE_KEY)
4288 .SetDefaultValidity(),
4289 KeyFormat::RAW, x25519_pkcs8_key));
4290}
4291
4292/*
4293 * ImportKeyTest.X25519PurposeMismatch
4294 *
4295 * Verifies that importing an X25519 key pair with an invalid format fails.
4296 */
4297TEST_P(ImportKeyTest, X25519PurposeMismatch) {
4298 if (!Curve25519Supported()) {
4299 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
4300 }
4301
4302 ASSERT_NE(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4303 .EcdsaKey(EcCurve::CURVE_25519)
4304 .Authorization(TAG_PURPOSE, KeyPurpose::ATTEST_KEY)
4305 .SetDefaultValidity(),
4306 KeyFormat::PKCS8, x25519_pkcs8_key));
4307 ASSERT_NE(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4308 .EcdsaSigningKey(EcCurve::CURVE_25519)
4309 .SetDefaultValidity(),
4310 KeyFormat::PKCS8, x25519_pkcs8_key));
4311}
4312
4313/*
Selene Huang31ab4042020-04-29 04:22:39 -07004314 * ImportKeyTest.AesSuccess
4315 *
4316 * Verifies that importing and using an AES key works.
4317 */
4318TEST_P(ImportKeyTest, AesSuccess) {
4319 string key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
4320 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4321 .Authorization(TAG_NO_AUTH_REQUIRED)
4322 .AesEncryptionKey(key.size() * 8)
4323 .EcbMode()
4324 .Padding(PaddingMode::PKCS7),
4325 KeyFormat::RAW, key));
4326
4327 CheckCryptoParam(TAG_ALGORITHM, Algorithm::AES);
4328 CheckCryptoParam(TAG_KEY_SIZE, 128U);
4329 CheckCryptoParam(TAG_PADDING, PaddingMode::PKCS7);
4330 CheckCryptoParam(TAG_BLOCK_MODE, BlockMode::ECB);
4331 CheckOrigin();
4332
4333 string message = "Hello World!";
4334 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7);
4335 string ciphertext = EncryptMessage(message, params);
4336 string plaintext = DecryptMessage(ciphertext, params);
4337 EXPECT_EQ(message, plaintext);
4338}
4339
4340/*
David Drysdale7de9feb2021-03-05 14:56:19 +00004341 * ImportKeyTest.AesFailure
4342 *
4343 * Verifies that importing an invalid AES key fails.
4344 */
4345TEST_P(ImportKeyTest, AesFailure) {
4346 string key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
4347 uint32_t bitlen = key.size() * 8;
4348 for (uint32_t key_size : {bitlen - 1, bitlen + 1, bitlen - 8, bitlen + 8}) {
David Drysdalec9bc2f72021-05-04 10:47:58 +01004349 // Explicit key size doesn't match that of the provided key.
Tommy Chiu3950b452021-05-03 22:01:46 +08004350 auto result = ImportKey(AuthorizationSetBuilder()
Shawn Willden9a7410e2021-08-02 12:28:42 -06004351 .Authorization(TAG_NO_AUTH_REQUIRED)
4352 .AesEncryptionKey(key_size)
4353 .EcbMode()
4354 .Padding(PaddingMode::PKCS7),
Tommy Chiu3950b452021-05-03 22:01:46 +08004355 KeyFormat::RAW, key);
4356 ASSERT_TRUE(result == ErrorCode::IMPORT_PARAMETER_MISMATCH ||
David Drysdalec9bc2f72021-05-04 10:47:58 +01004357 result == ErrorCode::UNSUPPORTED_KEY_SIZE)
4358 << "unexpected result: " << result;
David Drysdale7de9feb2021-03-05 14:56:19 +00004359 }
David Drysdalec9bc2f72021-05-04 10:47:58 +01004360
4361 // Explicit key size matches that of the provided key, but it's not a valid size.
4362 string long_key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
4363 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
4364 ImportKey(AuthorizationSetBuilder()
4365 .Authorization(TAG_NO_AUTH_REQUIRED)
4366 .AesEncryptionKey(long_key.size() * 8)
4367 .EcbMode()
4368 .Padding(PaddingMode::PKCS7),
4369 KeyFormat::RAW, long_key));
4370 string short_key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
4371 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
4372 ImportKey(AuthorizationSetBuilder()
4373 .Authorization(TAG_NO_AUTH_REQUIRED)
4374 .AesEncryptionKey(short_key.size() * 8)
4375 .EcbMode()
4376 .Padding(PaddingMode::PKCS7),
4377 KeyFormat::RAW, short_key));
David Drysdale7de9feb2021-03-05 14:56:19 +00004378}
4379
4380/*
4381 * ImportKeyTest.TripleDesSuccess
4382 *
4383 * Verifies that importing and using a 3DES key works.
4384 */
4385TEST_P(ImportKeyTest, TripleDesSuccess) {
4386 string key = hex2str("a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f7358");
4387 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4388 .Authorization(TAG_NO_AUTH_REQUIRED)
4389 .TripleDesEncryptionKey(168)
4390 .EcbMode()
4391 .Padding(PaddingMode::PKCS7),
4392 KeyFormat::RAW, key));
4393
4394 CheckCryptoParam(TAG_ALGORITHM, Algorithm::TRIPLE_DES);
4395 CheckCryptoParam(TAG_KEY_SIZE, 168U);
4396 CheckCryptoParam(TAG_PADDING, PaddingMode::PKCS7);
4397 CheckCryptoParam(TAG_BLOCK_MODE, BlockMode::ECB);
4398 CheckOrigin();
4399
4400 string message = "Hello World!";
4401 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7);
4402 string ciphertext = EncryptMessage(message, params);
4403 string plaintext = DecryptMessage(ciphertext, params);
4404 EXPECT_EQ(message, plaintext);
4405}
4406
4407/*
4408 * ImportKeyTest.TripleDesFailure
4409 *
4410 * Verifies that importing an invalid 3DES key fails.
4411 */
4412TEST_P(ImportKeyTest, TripleDesFailure) {
4413 string key = hex2str("a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f7358");
David Drysdale2a73db32021-05-10 10:58:58 +01004414 uint32_t bitlen = key.size() * 7;
David Drysdale7de9feb2021-03-05 14:56:19 +00004415 for (uint32_t key_size : {bitlen - 1, bitlen + 1, bitlen - 8, bitlen + 8}) {
David Drysdalec9bc2f72021-05-04 10:47:58 +01004416 // Explicit key size doesn't match that of the provided key.
Tommy Chiu3950b452021-05-03 22:01:46 +08004417 auto result = ImportKey(AuthorizationSetBuilder()
Shawn Willden9a7410e2021-08-02 12:28:42 -06004418 .Authorization(TAG_NO_AUTH_REQUIRED)
4419 .TripleDesEncryptionKey(key_size)
4420 .EcbMode()
4421 .Padding(PaddingMode::PKCS7),
Tommy Chiu3950b452021-05-03 22:01:46 +08004422 KeyFormat::RAW, key);
4423 ASSERT_TRUE(result == ErrorCode::IMPORT_PARAMETER_MISMATCH ||
David Drysdalec9bc2f72021-05-04 10:47:58 +01004424 result == ErrorCode::UNSUPPORTED_KEY_SIZE)
4425 << "unexpected result: " << result;
David Drysdale7de9feb2021-03-05 14:56:19 +00004426 }
David Drysdalec9bc2f72021-05-04 10:47:58 +01004427 // Explicit key size matches that of the provided key, but it's not a valid size.
David Drysdale2a73db32021-05-10 10:58:58 +01004428 string long_key = hex2str("a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f735800");
David Drysdalec9bc2f72021-05-04 10:47:58 +01004429 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
4430 ImportKey(AuthorizationSetBuilder()
4431 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdale2a73db32021-05-10 10:58:58 +01004432 .TripleDesEncryptionKey(long_key.size() * 7)
David Drysdalec9bc2f72021-05-04 10:47:58 +01004433 .EcbMode()
4434 .Padding(PaddingMode::PKCS7),
4435 KeyFormat::RAW, long_key));
David Drysdale2a73db32021-05-10 10:58:58 +01004436 string short_key = hex2str("a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f73");
David Drysdalec9bc2f72021-05-04 10:47:58 +01004437 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE,
4438 ImportKey(AuthorizationSetBuilder()
4439 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdale2a73db32021-05-10 10:58:58 +01004440 .TripleDesEncryptionKey(short_key.size() * 7)
David Drysdalec9bc2f72021-05-04 10:47:58 +01004441 .EcbMode()
4442 .Padding(PaddingMode::PKCS7),
4443 KeyFormat::RAW, short_key));
David Drysdale7de9feb2021-03-05 14:56:19 +00004444}
4445
4446/*
4447 * ImportKeyTest.HmacKeySuccess
Selene Huang31ab4042020-04-29 04:22:39 -07004448 *
4449 * Verifies that importing and using an HMAC key works.
4450 */
4451TEST_P(ImportKeyTest, HmacKeySuccess) {
4452 string key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
4453 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
4454 .Authorization(TAG_NO_AUTH_REQUIRED)
4455 .HmacKey(key.size() * 8)
4456 .Digest(Digest::SHA_2_256)
4457 .Authorization(TAG_MIN_MAC_LENGTH, 256),
4458 KeyFormat::RAW, key));
4459
4460 CheckCryptoParam(TAG_ALGORITHM, Algorithm::HMAC);
4461 CheckCryptoParam(TAG_KEY_SIZE, 128U);
4462 CheckCryptoParam(TAG_DIGEST, Digest::SHA_2_256);
4463 CheckOrigin();
4464
4465 string message = "Hello World!";
4466 string signature = MacMessage(message, Digest::SHA_2_256, 256);
4467 VerifyMessage(message, signature, AuthorizationSetBuilder().Digest(Digest::SHA_2_256));
4468}
4469
4470INSTANTIATE_KEYMINT_AIDL_TEST(ImportKeyTest);
4471
4472auto wrapped_key = hex2str(
David Drysdaled2cc8c22021-04-15 13:29:45 +01004473 // IKeyMintDevice.aidl
4474 "30820179" // SEQUENCE length 0x179 (SecureKeyWrapper) {
4475 "020100" // INTEGER length 1 value 0x00 (version)
4476 "04820100" // OCTET STRING length 0x100 (encryptedTransportKey)
4477 "934bf94e2aa28a3f83c9f79297250262"
4478 "fbe3276b5a1c91159bbfa3ef8957aac8"
4479 "4b59b30b455a79c2973480823d8b3863"
4480 "c3deef4a8e243590268d80e18751a0e1"
4481 "30f67ce6a1ace9f79b95e097474febc9"
4482 "81195b1d13a69086c0863f66a7b7fdb4"
4483 "8792227b1ac5e2489febdf087ab54864"
4484 "83033a6f001ca5d1ec1e27f5c30f4cec"
4485 "2642074a39ae68aee552e196627a8e3d"
4486 "867e67a8c01b11e75f13cca0a97ab668"
4487 "b50cda07a8ecb7cd8e3dd7009c963653"
4488 "4f6f239cffe1fc8daa466f78b676c711"
4489 "9efb96bce4e69ca2a25d0b34ed9c3ff9"
4490 "99b801597d5220e307eaa5bee507fb94"
4491 "d1fa69f9e519b2de315bac92c36f2ea1"
4492 "fa1df4478c0ddedeae8c70e0233cd098"
4493 "040c" // OCTET STRING length 0x0c (initializationVector)
4494 "d796b02c370f1fa4cc0124f1"
4495 "302e" // SEQUENCE length 0x2e (KeyDescription) {
4496 "020103" // INTEGER length 1 value 0x03 (keyFormat = RAW)
4497 "3029" // SEQUENCE length 0x29 (AuthorizationList) {
4498 "a108" // [1] context-specific constructed tag=1 length 0x08 { (purpose)
4499 "3106" // SET length 0x06
4500 "020100" // INTEGER length 1 value 0x00 (Encrypt)
4501 "020101" // INTEGER length 1 value 0x01 (Decrypt)
4502 // } end SET
4503 // } end [1]
4504 "a203" // [2] context-specific constructed tag=2 length 0x02 { (algorithm)
4505 "020120" // INTEGER length 1 value 0x20 (AES)
4506 // } end [2]
4507 "a304" // [3] context-specific constructed tag=3 length 0x04 { (keySize)
4508 "02020100" // INTEGER length 2 value 0x100
4509 // } end [3]
4510 "a405" // [4] context-specific constructed tag=4 length 0x05 { (blockMode)
4511 "3103" // SET length 0x03 {
4512 "020101" // INTEGER length 1 value 0x01 (ECB)
4513 // } end SET
4514 // } end [4]
4515 "a605" // [6] context-specific constructed tag=6 length 0x05 { (padding)
4516 "3103" // SET length 0x03 {
4517 "020140" // INTEGER length 1 value 0x40 (PKCS7)
4518 // } end SET
4519 // } end [5]
4520 "bf837702" // [503] context-specific constructed tag=503=0x1F7 length 0x02 {
4521 // (noAuthRequired)
4522 "0500" // NULL
4523 // } end [503]
4524 // } end SEQUENCE (AuthorizationList)
4525 // } end SEQUENCE (KeyDescription)
4526 "0420" // OCTET STRING length 0x20 (encryptedKey)
4527 "ccd540855f833a5e1480bfd2d36faf3a"
4528 "eee15df5beabe2691bc82dde2a7aa910"
4529 "0410" // OCTET STRING length 0x10 (tag)
4530 "64c9f689c60ff6223ab6e6999e0eb6e5"
4531 // } SEQUENCE (SecureKeyWrapper)
4532);
Selene Huang31ab4042020-04-29 04:22:39 -07004533
4534auto wrapped_key_masked = hex2str(
David Drysdaled2cc8c22021-04-15 13:29:45 +01004535 // IKeyMintDevice.aidl
4536 "30820179" // SEQUENCE length 0x179 (SecureKeyWrapper) {
4537 "020100" // INTEGER length 1 value 0x00 (version)
4538 "04820100" // OCTET STRING length 0x100 (encryptedTransportKey)
4539 "aad93ed5924f283b4bb5526fbe7a1412"
4540 "f9d9749ec30db9062b29e574a8546f33"
4541 "c88732452f5b8e6a391ee76c39ed1712"
4542 "c61d8df6213dec1cffbc17a8c6d04c7b"
4543 "30893d8daa9b2015213e219468215532"
4544 "07f8f9931c4caba23ed3bee28b36947e"
4545 "47f10e0a5c3dc51c988a628daad3e5e1"
4546 "f4005e79c2d5a96c284b4b8d7e4948f3"
4547 "31e5b85dd5a236f85579f3ea1d1b8484"
4548 "87470bdb0ab4f81a12bee42c99fe0df4"
4549 "bee3759453e69ad1d68a809ce06b949f"
4550 "7694a990429b2fe81e066ff43e56a216"
4551 "02db70757922a4bcc23ab89f1e35da77"
4552 "586775f423e519c2ea394caf48a28d0c"
4553 "8020f1dcf6b3a68ec246f615ae96dae9"
4554 "a079b1f6eb959033c1af5c125fd94168"
4555 "040c" // OCTET STRING length 0x0c (initializationVector)
4556 "6d9721d08589581ab49204a3"
4557 "302e" // SEQUENCE length 0x2e (KeyDescription) {
4558 "020103" // INTEGER length 1 value 0x03 (keyFormat = RAW)
4559 "3029" // SEQUENCE length 0x29 (AuthorizationList) {
4560 "a108" // [1] context-specific constructed tag=1 length 0x08 { (purpose)
4561 "3106" // SET length 0x06
4562 "020100" // INTEGER length 1 value 0x00 (Encrypt)
4563 "020101" // INTEGER length 1 value 0x01 (Decrypt)
4564 // } end SET
4565 // } end [1]
4566 "a203" // [2] context-specific constructed tag=2 length 0x02 { (algorithm)
4567 "020120" // INTEGER length 1 value 0x20 (AES)
4568 // } end [2]
4569 "a304" // [3] context-specific constructed tag=3 length 0x04 { (keySize)
4570 "02020100" // INTEGER length 2 value 0x100
4571 // } end [3]
4572 "a405" // [4] context-specific constructed tag=4 length 0x05 { (blockMode
4573 "3103" // SET length 0x03 {
4574 "020101" // INTEGER length 1 value 0x01 (ECB)
4575 // } end SET
4576 // } end [4]
4577 "a605" // [6] context-specific constructed tag=6 length 0x05 { (padding)
4578 "3103" // SET length 0x03 {
4579 "020140" // INTEGER length 1 value 0x40 (PKCS7)
4580 // } end SET
4581 // } end [5]
4582 "bf837702" // [503] context-specific constructed tag=503=0x1F7 length 0x02 {
4583 // (noAuthRequired)
4584 "0500" // NULL
4585 // } end [503]
4586 // } end SEQUENCE (AuthorizationList)
4587 // } end SEQUENCE (KeyDescription)
4588 "0420" // OCTET STRING length 0x20 (encryptedKey)
4589 "a61c6e247e25b3e6e69aa78eb03c2d4a"
4590 "c20d1f99a9a024a76f35c8e2cab9b68d"
4591 "0410" // OCTET STRING length 0x10 (tag)
4592 "2560c70109ae67c030f00b98b512a670"
4593 // } SEQUENCE (SecureKeyWrapper)
4594);
Selene Huang31ab4042020-04-29 04:22:39 -07004595
4596auto wrapping_key = hex2str(
David Drysdaled2cc8c22021-04-15 13:29:45 +01004597 // RFC 5208 s5
4598 "308204be" // SEQUENCE length 0x4be (PrivateKeyInfo) {
4599 "020100" // INTEGER length 1 value 0x00 (version)
4600 "300d" // SEQUENCE length 0x0d (AlgorithmIdentifier) {
4601 "0609" // OBJECT IDENTIFIER length 0x09 (algorithm)
4602 "2a864886f70d010101" // 1.2.840.113549.1.1.1 (RSAES-PKCS1-v1_5 encryption scheme)
4603 "0500" // NULL (parameters)
4604 // } SEQUENCE (AlgorithmIdentifier)
4605 "048204a8" // OCTET STRING len 0x4a8 (privateKey), which contains...
4606 // RFC 8017 A.1.2
4607 "308204a4" // SEQUENCE len 0x4a4 (RSAPrivateKey) {
4608 "020100" // INTEGER length 1 value 0x00 (version)
4609 "02820101" // INTEGER length 0x0101 (modulus) value...
4610 "00aec367931d8900ce56b0067f7d70e1" // 0x10
4611 "fc653f3f34d194c1fed50018fb43db93" // 0x20
4612 "7b06e673a837313d56b1c725150a3fef" // 0x30
4613 "86acbddc41bb759c2854eae32d35841e" // 0x40
4614 "fb5c18d82bc90a1cb5c1d55adf245b02" // 0x50
4615 "911f0b7cda88c421ff0ebafe7c0d23be" // 0x60
4616 "312d7bd5921ffaea1347c157406fef71" // 0x70
4617 "8f682643e4e5d33c6703d61c0cf7ac0b" // 0x80
4618 "f4645c11f5c1374c3886427411c44979" // 0x90
4619 "6792e0bef75dec858a2123c36753e02a" // 0xa0
4620 "95a96d7c454b504de385a642e0dfc3e6" // 0xb0
4621 "0ac3a7ee4991d0d48b0172a95f9536f0" // 0xc0
4622 "2ba13cecccb92b727db5c27e5b2f5cec" // 0xd0
4623 "09600b286af5cf14c42024c61ddfe71c" // 0xe0
4624 "2a8d7458f185234cb00e01d282f10f8f" // 0xf0
4625 "c6721d2aed3f4833cca2bd8fa62821dd" // 0x100
4626 "55" // 0x101
4627 "0203010001" // INTEGER length 3 value 0x10001 (publicExponent)
4628 "02820100" // INTEGER length 0x100 (privateExponent) value...
4629 "431447b6251908112b1ee76f99f3711a" // 0x10
4630 "52b6630960046c2de70de188d833f8b8" // 0x20
4631 "b91e4d785caeeeaf4f0f74414e2cda40" // 0x30
4632 "641f7fe24f14c67a88959bdb27766df9" // 0x40
4633 "e710b630a03adc683b5d2c43080e52be" // 0x50
4634 "e71e9eaeb6de297a5fea1072070d181c" // 0x60
4635 "822bccff087d63c940ba8a45f670feb2" // 0x70
4636 "9fb4484d1c95e6d2579ba02aae0a0090" // 0x80
4637 "0c3ebf490e3d2cd7ee8d0e20c536e4dc" // 0x90
4638 "5a5097272888cddd7e91f228b1c4d747" // 0xa0
4639 "4c55b8fcd618c4a957bbddd5ad7407cc" // 0xb0
4640 "312d8d98a5caf7e08f4a0d6b45bb41c6" // 0xc0
4641 "52659d5a5ba05b663737a8696281865b" // 0xd0
4642 "a20fbdd7f851e6c56e8cbe0ddbbf24dc" // 0xe0
4643 "03b2d2cb4c3d540fb0af52e034a2d066" // 0xf0
4644 "98b128e5f101e3b51a34f8d8b4f86181" // 0x100
4645 "028181" // INTEGER length 0x81 (prime1) value...
4646 "00de392e18d682c829266cc3454e1d61" // 0x10
4647 "66242f32d9a1d10577753e904ea7d08b" // 0x20
4648 "ff841be5bac82a164c5970007047b8c5" // 0x30
4649 "17db8f8f84e37bd5988561bdf503d4dc" // 0x40
4650 "2bdb38f885434ae42c355f725c9a60f9" // 0x50
4651 "1f0788e1f1a97223b524b5357fdf72e2" // 0x60
4652 "f696bab7d78e32bf92ba8e1864eab122" // 0x70
4653 "9e91346130748a6e3c124f9149d71c74" // 0x80
4654 "35"
4655 "028181" // INTEGER length 0x81 (prime2) value...
4656 "00c95387c0f9d35f137b57d0d65c397c" // 0x10
4657 "5e21cc251e47008ed62a542409c8b6b6" // 0x20
4658 "ac7f8967b3863ca645fcce49582a9aa1" // 0x30
4659 "7349db6c4a95affdae0dae612e1afac9" // 0x40
4660 "9ed39a2d934c880440aed8832f984316" // 0x50
4661 "3a47f27f392199dc1202f9a0f9bd0830" // 0x60
4662 "8007cb1e4e7f58309366a7de25f7c3c9" // 0x70
4663 "b880677c068e1be936e81288815252a8" // 0x80
4664 "a1"
4665 "028180" // INTEGER length 0x80 (exponent1) value...
4666 "57ff8ca1895080b2cae486ef0adfd791" // 0x10
4667 "fb0235c0b8b36cd6c136e52e4085f4ea" // 0x20
4668 "5a063212a4f105a3764743e53281988a" // 0x30
4669 "ba073f6e0027298e1c4378556e0efca0" // 0x40
4670 "e14ece1af76ad0b030f27af6f0ab35fb" // 0x50
4671 "73a060d8b1a0e142fa2647e93b32e36d" // 0x60
4672 "8282ae0a4de50ab7afe85500a16f43a6" // 0x70
4673 "4719d6e2b9439823719cd08bcd031781" // 0x80
4674 "028181" // INTEGER length 0x81 (exponent2) value...
4675 "00ba73b0bb28e3f81e9bd1c568713b10" // 0x10
4676 "1241acc607976c4ddccc90e65b6556ca" // 0x20
4677 "31516058f92b6e09f3b160ff0e374ec4" // 0x30
4678 "0d78ae4d4979fde6ac06a1a400c61dd3" // 0x40
4679 "1254186af30b22c10582a8a43e34fe94" // 0x50
4680 "9c5f3b9755bae7baa7b7b7a6bd03b38c" // 0x60
4681 "ef55c86885fc6c1978b9cee7ef33da50" // 0x70
4682 "7c9df6b9277cff1e6aaa5d57aca52846" // 0x80
4683 "61"
4684 "028181" // INTEGER length 0x81 (coefficient) value...
4685 "00c931617c77829dfb1270502be9195c" // 0x10
4686 "8f2830885f57dba869536811e6864236" // 0x20
4687 "d0c4736a0008a145af36b8357a7c3d13" // 0x30
4688 "9966d04c4e00934ea1aede3bb6b8ec84" // 0x40
4689 "1dc95e3f579751e2bfdfe27ae778983f" // 0x50
4690 "959356210723287b0affcc9f727044d4" // 0x60
4691 "8c373f1babde0724fa17a4fd4da0902c" // 0x70
4692 "7c9b9bf27ba61be6ad02dfddda8f4e68" // 0x80
4693 "22"
4694 // } SEQUENCE
4695 // } SEQUENCE ()
4696);
Selene Huang31ab4042020-04-29 04:22:39 -07004697
4698string zero_masking_key =
4699 hex2str("0000000000000000000000000000000000000000000000000000000000000000");
4700string masking_key = hex2str("D796B02C370F1FA4CC0124F14EC8CBEBE987E825246265050F399A51FD477DFC");
4701
4702class ImportWrappedKeyTest : public KeyMintAidlTestBase {};
4703
4704TEST_P(ImportWrappedKeyTest, Success) {
4705 auto wrapping_key_desc = AuthorizationSetBuilder()
4706 .RsaEncryptionKey(2048, 65537)
4707 .Digest(Digest::SHA_2_256)
4708 .Padding(PaddingMode::RSA_OAEP)
Janis Danisevskis164bb872021-02-09 11:30:25 -08004709 .Authorization(TAG_PURPOSE, KeyPurpose::WRAP_KEY)
4710 .SetDefaultValidity();
Selene Huang31ab4042020-04-29 04:22:39 -07004711
4712 ASSERT_EQ(ErrorCode::OK,
4713 ImportWrappedKey(wrapped_key, wrapping_key, wrapping_key_desc, zero_masking_key,
4714 AuthorizationSetBuilder()
4715 .Digest(Digest::SHA_2_256)
4716 .Padding(PaddingMode::RSA_OAEP)));
4717
4718 string message = "Hello World!";
4719 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7);
4720 string ciphertext = EncryptMessage(message, params);
4721 string plaintext = DecryptMessage(ciphertext, params);
4722 EXPECT_EQ(message, plaintext);
4723}
4724
David Drysdaled2cc8c22021-04-15 13:29:45 +01004725/*
4726 * ImportWrappedKeyTest.SuccessSidsIgnored
4727 *
4728 * Verifies that password_sid and biometric_sid are ignored on import if the authorizations don't
4729 * include Tag:USER_SECURE_ID.
4730 */
4731TEST_P(ImportWrappedKeyTest, SuccessSidsIgnored) {
4732 auto wrapping_key_desc = AuthorizationSetBuilder()
4733 .RsaEncryptionKey(2048, 65537)
4734 .Digest(Digest::SHA_2_256)
4735 .Padding(PaddingMode::RSA_OAEP)
4736 .Authorization(TAG_PURPOSE, KeyPurpose::WRAP_KEY)
4737 .SetDefaultValidity();
4738
4739 int64_t password_sid = 42;
4740 int64_t biometric_sid = 24;
4741 ASSERT_EQ(ErrorCode::OK,
4742 ImportWrappedKey(wrapped_key, wrapping_key, wrapping_key_desc, zero_masking_key,
4743 AuthorizationSetBuilder()
4744 .Digest(Digest::SHA_2_256)
4745 .Padding(PaddingMode::RSA_OAEP),
4746 password_sid, biometric_sid));
4747
4748 string message = "Hello World!";
4749 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7);
4750 string ciphertext = EncryptMessage(message, params);
4751 string plaintext = DecryptMessage(ciphertext, params);
4752 EXPECT_EQ(message, plaintext);
4753}
4754
Selene Huang31ab4042020-04-29 04:22:39 -07004755TEST_P(ImportWrappedKeyTest, SuccessMasked) {
4756 auto wrapping_key_desc = AuthorizationSetBuilder()
4757 .RsaEncryptionKey(2048, 65537)
4758 .Digest(Digest::SHA_2_256)
4759 .Padding(PaddingMode::RSA_OAEP)
Janis Danisevskis164bb872021-02-09 11:30:25 -08004760 .Authorization(TAG_PURPOSE, KeyPurpose::WRAP_KEY)
4761 .SetDefaultValidity();
Selene Huang31ab4042020-04-29 04:22:39 -07004762
4763 ASSERT_EQ(ErrorCode::OK,
4764 ImportWrappedKey(wrapped_key_masked, wrapping_key, wrapping_key_desc, masking_key,
4765 AuthorizationSetBuilder()
4766 .Digest(Digest::SHA_2_256)
4767 .Padding(PaddingMode::RSA_OAEP)));
4768}
4769
4770TEST_P(ImportWrappedKeyTest, WrongMask) {
4771 auto wrapping_key_desc = AuthorizationSetBuilder()
4772 .RsaEncryptionKey(2048, 65537)
4773 .Digest(Digest::SHA_2_256)
4774 .Padding(PaddingMode::RSA_OAEP)
Janis Danisevskis164bb872021-02-09 11:30:25 -08004775 .Authorization(TAG_PURPOSE, KeyPurpose::WRAP_KEY)
4776 .SetDefaultValidity();
Selene Huang31ab4042020-04-29 04:22:39 -07004777
4778 ASSERT_EQ(
4779 ErrorCode::VERIFICATION_FAILED,
4780 ImportWrappedKey(wrapped_key_masked, wrapping_key, wrapping_key_desc, zero_masking_key,
4781 AuthorizationSetBuilder()
4782 .Digest(Digest::SHA_2_256)
4783 .Padding(PaddingMode::RSA_OAEP)));
4784}
4785
4786TEST_P(ImportWrappedKeyTest, WrongPurpose) {
4787 auto wrapping_key_desc = AuthorizationSetBuilder()
4788 .RsaEncryptionKey(2048, 65537)
4789 .Digest(Digest::SHA_2_256)
Janis Danisevskis164bb872021-02-09 11:30:25 -08004790 .Padding(PaddingMode::RSA_OAEP)
4791 .SetDefaultValidity();
Selene Huang31ab4042020-04-29 04:22:39 -07004792
4793 ASSERT_EQ(
4794 ErrorCode::INCOMPATIBLE_PURPOSE,
4795 ImportWrappedKey(wrapped_key_masked, wrapping_key, wrapping_key_desc, zero_masking_key,
4796 AuthorizationSetBuilder()
4797 .Digest(Digest::SHA_2_256)
4798 .Padding(PaddingMode::RSA_OAEP)));
4799}
4800
David Drysdaled2cc8c22021-04-15 13:29:45 +01004801TEST_P(ImportWrappedKeyTest, WrongPaddingMode) {
4802 auto wrapping_key_desc = AuthorizationSetBuilder()
4803 .RsaEncryptionKey(2048, 65537)
4804 .Digest(Digest::SHA_2_256)
4805 .Padding(PaddingMode::RSA_PSS)
4806 .Authorization(TAG_PURPOSE, KeyPurpose::WRAP_KEY)
4807 .SetDefaultValidity();
4808
4809 ASSERT_EQ(ErrorCode::INCOMPATIBLE_PADDING_MODE,
4810 ImportWrappedKey(wrapped_key, wrapping_key, wrapping_key_desc, zero_masking_key,
4811 AuthorizationSetBuilder()
4812 .Digest(Digest::SHA_2_256)
4813 .Padding(PaddingMode::RSA_OAEP)));
4814}
4815
4816TEST_P(ImportWrappedKeyTest, WrongDigest) {
4817 auto wrapping_key_desc = AuthorizationSetBuilder()
4818 .RsaEncryptionKey(2048, 65537)
4819 .Digest(Digest::SHA_2_512)
4820 .Padding(PaddingMode::RSA_OAEP)
4821 .Authorization(TAG_PURPOSE, KeyPurpose::WRAP_KEY)
4822 .SetDefaultValidity();
4823
4824 ASSERT_EQ(ErrorCode::INCOMPATIBLE_DIGEST,
4825 ImportWrappedKey(wrapped_key, wrapping_key, wrapping_key_desc, zero_masking_key,
4826 AuthorizationSetBuilder()
4827 .Digest(Digest::SHA_2_256)
4828 .Padding(PaddingMode::RSA_OAEP)));
4829}
4830
Selene Huang31ab4042020-04-29 04:22:39 -07004831INSTANTIATE_KEYMINT_AIDL_TEST(ImportWrappedKeyTest);
4832
4833typedef KeyMintAidlTestBase EncryptionOperationsTest;
4834
4835/*
4836 * EncryptionOperationsTest.RsaNoPaddingSuccess
4837 *
David Drysdale59cae642021-05-12 13:52:03 +01004838 * Verifies that raw RSA decryption works.
Selene Huang31ab4042020-04-29 04:22:39 -07004839 */
4840TEST_P(EncryptionOperationsTest, RsaNoPaddingSuccess) {
subrahmanyaman05642492022-02-05 07:10:56 +00004841 for (uint64_t exponent : ValidExponents()) {
David Drysdaled2cc8c22021-04-15 13:29:45 +01004842 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
4843 .Authorization(TAG_NO_AUTH_REQUIRED)
4844 .RsaEncryptionKey(2048, exponent)
4845 .Padding(PaddingMode::NONE)
4846 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07004847
David Drysdaled2cc8c22021-04-15 13:29:45 +01004848 string message = string(2048 / 8, 'a');
4849 auto params = AuthorizationSetBuilder().Padding(PaddingMode::NONE);
David Drysdale59cae642021-05-12 13:52:03 +01004850 string ciphertext1 = LocalRsaEncryptMessage(message, params);
David Drysdaled2cc8c22021-04-15 13:29:45 +01004851 EXPECT_EQ(2048U / 8, ciphertext1.size());
Selene Huang31ab4042020-04-29 04:22:39 -07004852
David Drysdale59cae642021-05-12 13:52:03 +01004853 string ciphertext2 = LocalRsaEncryptMessage(message, params);
David Drysdaled2cc8c22021-04-15 13:29:45 +01004854 EXPECT_EQ(2048U / 8, ciphertext2.size());
Selene Huang31ab4042020-04-29 04:22:39 -07004855
David Drysdaled2cc8c22021-04-15 13:29:45 +01004856 // Unpadded RSA is deterministic
4857 EXPECT_EQ(ciphertext1, ciphertext2);
4858
4859 CheckedDeleteKey();
4860 }
Selene Huang31ab4042020-04-29 04:22:39 -07004861}
4862
4863/*
4864 * EncryptionOperationsTest.RsaNoPaddingShortMessage
4865 *
David Drysdale59cae642021-05-12 13:52:03 +01004866 * Verifies that raw RSA decryption of short messages works.
Selene Huang31ab4042020-04-29 04:22:39 -07004867 */
4868TEST_P(EncryptionOperationsTest, RsaNoPaddingShortMessage) {
4869 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
4870 .Authorization(TAG_NO_AUTH_REQUIRED)
4871 .RsaEncryptionKey(2048, 65537)
Janis Danisevskis164bb872021-02-09 11:30:25 -08004872 .Padding(PaddingMode::NONE)
4873 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07004874
4875 string message = "1";
4876 auto params = AuthorizationSetBuilder().Padding(PaddingMode::NONE);
4877
David Drysdale59cae642021-05-12 13:52:03 +01004878 string ciphertext = LocalRsaEncryptMessage(message, params);
Selene Huang31ab4042020-04-29 04:22:39 -07004879 EXPECT_EQ(2048U / 8, ciphertext.size());
4880
4881 string expected_plaintext = string(2048U / 8 - 1, 0) + message;
4882 string plaintext = DecryptMessage(ciphertext, params);
4883
4884 EXPECT_EQ(expected_plaintext, plaintext);
Selene Huang31ab4042020-04-29 04:22:39 -07004885}
4886
4887/*
Selene Huang31ab4042020-04-29 04:22:39 -07004888 * EncryptionOperationsTest.RsaOaepSuccess
4889 *
David Drysdale59cae642021-05-12 13:52:03 +01004890 * Verifies that RSA-OAEP decryption operations work, with all digests.
Selene Huang31ab4042020-04-29 04:22:39 -07004891 */
4892TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
4893 auto digests = ValidDigests(false /* withNone */, true /* withMD5 */);
4894
4895 size_t key_size = 2048; // Need largish key for SHA-512 test.
David Drysdale59cae642021-05-12 13:52:03 +01004896 ASSERT_EQ(ErrorCode::OK,
4897 GenerateKey(AuthorizationSetBuilder()
4898 .Authorization(TAG_NO_AUTH_REQUIRED)
4899 .RsaEncryptionKey(key_size, 65537)
4900 .Padding(PaddingMode::RSA_OAEP)
4901 .Digest(digests)
4902 .Authorization(TAG_RSA_OAEP_MGF_DIGEST, Digest::SHA1)
4903 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07004904
4905 string message = "Hello";
4906
4907 for (auto digest : digests) {
David Drysdale59cae642021-05-12 13:52:03 +01004908 SCOPED_TRACE(testing::Message() << "digest-" << digest);
4909
4910 auto params = AuthorizationSetBuilder()
4911 .Digest(digest)
4912 .Padding(PaddingMode::RSA_OAEP)
4913 .Authorization(TAG_RSA_OAEP_MGF_DIGEST, Digest::SHA1);
4914 string ciphertext1 = LocalRsaEncryptMessage(message, params);
Selene Huang31ab4042020-04-29 04:22:39 -07004915 if (HasNonfatalFailure()) std::cout << "-->" << digest << std::endl;
4916 EXPECT_EQ(key_size / 8, ciphertext1.size());
4917
David Drysdale59cae642021-05-12 13:52:03 +01004918 string ciphertext2 = LocalRsaEncryptMessage(message, params);
Selene Huang31ab4042020-04-29 04:22:39 -07004919 EXPECT_EQ(key_size / 8, ciphertext2.size());
4920
4921 // OAEP randomizes padding so every result should be different (with astronomically high
4922 // probability).
4923 EXPECT_NE(ciphertext1, ciphertext2);
4924
4925 string plaintext1 = DecryptMessage(ciphertext1, params);
4926 EXPECT_EQ(message, plaintext1) << "RSA-OAEP failed with digest " << digest;
4927 string plaintext2 = DecryptMessage(ciphertext2, params);
4928 EXPECT_EQ(message, plaintext2) << "RSA-OAEP failed with digest " << digest;
4929
4930 // Decrypting corrupted ciphertext should fail.
4931 size_t offset_to_corrupt = random() % ciphertext1.size();
4932 char corrupt_byte;
4933 do {
4934 corrupt_byte = static_cast<char>(random() % 256);
4935 } while (corrupt_byte == ciphertext1[offset_to_corrupt]);
4936 ciphertext1[offset_to_corrupt] = corrupt_byte;
4937
4938 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params));
4939 string result;
4940 EXPECT_EQ(ErrorCode::UNKNOWN_ERROR, Finish(ciphertext1, &result));
4941 EXPECT_EQ(0U, result.size());
4942 }
4943}
4944
4945/*
4946 * EncryptionOperationsTest.RsaOaepInvalidDigest
4947 *
David Drysdale59cae642021-05-12 13:52:03 +01004948 * Verifies that RSA-OAEP decryption operations fail in the correct way when asked to operate
Selene Huang31ab4042020-04-29 04:22:39 -07004949 * without a digest.
4950 */
4951TEST_P(EncryptionOperationsTest, RsaOaepInvalidDigest) {
4952 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
4953 .Authorization(TAG_NO_AUTH_REQUIRED)
4954 .RsaEncryptionKey(2048, 65537)
4955 .Padding(PaddingMode::RSA_OAEP)
Janis Danisevskis164bb872021-02-09 11:30:25 -08004956 .Digest(Digest::NONE)
4957 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07004958
4959 auto params = AuthorizationSetBuilder().Padding(PaddingMode::RSA_OAEP).Digest(Digest::NONE);
David Drysdale59cae642021-05-12 13:52:03 +01004960 EXPECT_EQ(ErrorCode::INCOMPATIBLE_DIGEST, Begin(KeyPurpose::DECRYPT, params));
Selene Huang31ab4042020-04-29 04:22:39 -07004961}
4962
4963/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01004964 * EncryptionOperationsTest.RsaOaepInvalidPadding
4965 *
David Drysdale59cae642021-05-12 13:52:03 +01004966 * Verifies that RSA-OAEP decryption operations fail in the correct way when asked to operate
David Drysdaled2cc8c22021-04-15 13:29:45 +01004967 * with a padding value that is only suitable for signing/verifying.
4968 */
4969TEST_P(EncryptionOperationsTest, RsaOaepInvalidPadding) {
4970 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
4971 .Authorization(TAG_NO_AUTH_REQUIRED)
4972 .RsaEncryptionKey(2048, 65537)
4973 .Padding(PaddingMode::RSA_PSS)
4974 .Digest(Digest::NONE)
4975 .SetDefaultValidity()));
4976
4977 auto params = AuthorizationSetBuilder().Padding(PaddingMode::RSA_PSS).Digest(Digest::NONE);
David Drysdale59cae642021-05-12 13:52:03 +01004978 EXPECT_EQ(ErrorCode::UNSUPPORTED_PADDING_MODE, Begin(KeyPurpose::DECRYPT, params));
David Drysdaled2cc8c22021-04-15 13:29:45 +01004979}
4980
4981/*
David Drysdale7de9feb2021-03-05 14:56:19 +00004982 * EncryptionOperationsTest.RsaOaepDecryptWithWrongDigest
Selene Huang31ab4042020-04-29 04:22:39 -07004983 *
David Drysdale59cae642021-05-12 13:52:03 +01004984 * Verifies that RSA-OAEP decryption operations fail in the correct way when asked to decrypt
Selene Huang31ab4042020-04-29 04:22:39 -07004985 * with a different digest than was used to encrypt.
4986 */
4987TEST_P(EncryptionOperationsTest, RsaOaepDecryptWithWrongDigest) {
David Drysdale513bf122021-10-06 11:53:13 +01004988 if (SecLevel() == SecurityLevel::STRONGBOX) {
4989 GTEST_SKIP() << "Test not applicable to StrongBox device";
4990 }
Selene Huang31ab4042020-04-29 04:22:39 -07004991
4992 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
4993 .Authorization(TAG_NO_AUTH_REQUIRED)
4994 .RsaEncryptionKey(1024, 65537)
4995 .Padding(PaddingMode::RSA_OAEP)
Janis Danisevskis164bb872021-02-09 11:30:25 -08004996 .Digest(Digest::SHA_2_224, Digest::SHA_2_256)
4997 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07004998 string message = "Hello World!";
David Drysdale59cae642021-05-12 13:52:03 +01004999 string ciphertext = LocalRsaEncryptMessage(
Selene Huang31ab4042020-04-29 04:22:39 -07005000 message,
5001 AuthorizationSetBuilder().Digest(Digest::SHA_2_224).Padding(PaddingMode::RSA_OAEP));
5002
5003 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, AuthorizationSetBuilder()
5004 .Digest(Digest::SHA_2_256)
5005 .Padding(PaddingMode::RSA_OAEP)));
5006 string result;
5007 EXPECT_EQ(ErrorCode::UNKNOWN_ERROR, Finish(ciphertext, &result));
5008 EXPECT_EQ(0U, result.size());
5009}
5010
5011/*
Chirag Pathak8b7455a2020-12-21 18:42:52 -05005012 * EncryptionOperationsTest.RsaOaepWithMGFDigestSuccess
5013 *
David Drysdale59cae642021-05-12 13:52:03 +01005014 * Verifies that RSA-OAEP decryption operations work, with all SHA 256 digests and all type of MGF1
Chirag Pathak8b7455a2020-12-21 18:42:52 -05005015 * digests.
5016 */
5017TEST_P(EncryptionOperationsTest, RsaOaepWithMGFDigestSuccess) {
5018 auto digests = ValidDigests(false /* withNone */, true /* withMD5 */);
5019
5020 size_t key_size = 2048; // Need largish key for SHA-512 test.
5021 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5022 .OaepMGFDigest(digests)
5023 .Authorization(TAG_NO_AUTH_REQUIRED)
5024 .RsaEncryptionKey(key_size, 65537)
5025 .Padding(PaddingMode::RSA_OAEP)
Janis Danisevskis164bb872021-02-09 11:30:25 -08005026 .Digest(Digest::SHA_2_256)
5027 .SetDefaultValidity()));
Chirag Pathak8b7455a2020-12-21 18:42:52 -05005028
5029 string message = "Hello";
5030
5031 for (auto digest : digests) {
5032 auto params = AuthorizationSetBuilder()
5033 .Authorization(TAG_RSA_OAEP_MGF_DIGEST, digest)
5034 .Digest(Digest::SHA_2_256)
5035 .Padding(PaddingMode::RSA_OAEP);
David Drysdale59cae642021-05-12 13:52:03 +01005036 string ciphertext1 = LocalRsaEncryptMessage(message, params);
Chirag Pathak8b7455a2020-12-21 18:42:52 -05005037 if (HasNonfatalFailure()) std::cout << "-->" << digest << std::endl;
5038 EXPECT_EQ(key_size / 8, ciphertext1.size());
5039
David Drysdale59cae642021-05-12 13:52:03 +01005040 string ciphertext2 = LocalRsaEncryptMessage(message, params);
Chirag Pathak8b7455a2020-12-21 18:42:52 -05005041 EXPECT_EQ(key_size / 8, ciphertext2.size());
5042
5043 // OAEP randomizes padding so every result should be different (with astronomically high
5044 // probability).
5045 EXPECT_NE(ciphertext1, ciphertext2);
5046
5047 string plaintext1 = DecryptMessage(ciphertext1, params);
5048 EXPECT_EQ(message, plaintext1) << "RSA-OAEP failed with digest " << digest;
5049 string plaintext2 = DecryptMessage(ciphertext2, params);
5050 EXPECT_EQ(message, plaintext2) << "RSA-OAEP failed with digest " << digest;
5051
5052 // Decrypting corrupted ciphertext should fail.
5053 size_t offset_to_corrupt = random() % ciphertext1.size();
5054 char corrupt_byte;
5055 do {
5056 corrupt_byte = static_cast<char>(random() % 256);
5057 } while (corrupt_byte == ciphertext1[offset_to_corrupt]);
5058 ciphertext1[offset_to_corrupt] = corrupt_byte;
5059
5060 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params));
5061 string result;
5062 EXPECT_EQ(ErrorCode::UNKNOWN_ERROR, Finish(ciphertext1, &result));
5063 EXPECT_EQ(0U, result.size());
5064 }
5065}
5066
5067/*
5068 * EncryptionOperationsTest.RsaOaepWithMGFIncompatibleDigest
5069 *
David Drysdale59cae642021-05-12 13:52:03 +01005070 * Verifies that RSA-OAEP decryption operations fail in the correct way when asked to operate
Chirag Pathak8b7455a2020-12-21 18:42:52 -05005071 * with incompatible MGF digest.
5072 */
5073TEST_P(EncryptionOperationsTest, RsaOaepWithMGFIncompatibleDigest) {
5074 ASSERT_EQ(ErrorCode::OK,
5075 GenerateKey(AuthorizationSetBuilder()
5076 .Authorization(TAG_RSA_OAEP_MGF_DIGEST, Digest::SHA_2_256)
5077 .Authorization(TAG_NO_AUTH_REQUIRED)
5078 .RsaEncryptionKey(2048, 65537)
5079 .Padding(PaddingMode::RSA_OAEP)
Janis Danisevskis164bb872021-02-09 11:30:25 -08005080 .Digest(Digest::SHA_2_256)
5081 .SetDefaultValidity()));
Chirag Pathak8b7455a2020-12-21 18:42:52 -05005082 string message = "Hello World!";
5083
5084 auto params = AuthorizationSetBuilder()
5085 .Padding(PaddingMode::RSA_OAEP)
5086 .Digest(Digest::SHA_2_256)
5087 .Authorization(TAG_RSA_OAEP_MGF_DIGEST, Digest::SHA_2_224);
David Drysdale59cae642021-05-12 13:52:03 +01005088 EXPECT_EQ(ErrorCode::INCOMPATIBLE_MGF_DIGEST, Begin(KeyPurpose::DECRYPT, params));
Chirag Pathak8b7455a2020-12-21 18:42:52 -05005089}
5090
5091/*
5092 * EncryptionOperationsTest.RsaOaepWithMGFUnsupportedDigest
5093 *
5094 * Verifies that RSA-OAEP encryption operations fail in the correct way when asked to operate
5095 * with unsupported MGF digest.
5096 */
5097TEST_P(EncryptionOperationsTest, RsaOaepWithMGFUnsupportedDigest) {
5098 ASSERT_EQ(ErrorCode::OK,
5099 GenerateKey(AuthorizationSetBuilder()
5100 .Authorization(TAG_RSA_OAEP_MGF_DIGEST, Digest::SHA_2_256)
5101 .Authorization(TAG_NO_AUTH_REQUIRED)
5102 .RsaEncryptionKey(2048, 65537)
5103 .Padding(PaddingMode::RSA_OAEP)
Janis Danisevskis164bb872021-02-09 11:30:25 -08005104 .Digest(Digest::SHA_2_256)
5105 .SetDefaultValidity()));
Chirag Pathak8b7455a2020-12-21 18:42:52 -05005106 string message = "Hello World!";
5107
5108 auto params = AuthorizationSetBuilder()
5109 .Padding(PaddingMode::RSA_OAEP)
5110 .Digest(Digest::SHA_2_256)
5111 .Authorization(TAG_RSA_OAEP_MGF_DIGEST, Digest::NONE);
David Drysdale59cae642021-05-12 13:52:03 +01005112 EXPECT_EQ(ErrorCode::UNSUPPORTED_MGF_DIGEST, Begin(KeyPurpose::DECRYPT, params));
Chirag Pathak8b7455a2020-12-21 18:42:52 -05005113}
5114
5115/*
Selene Huang31ab4042020-04-29 04:22:39 -07005116 * EncryptionOperationsTest.RsaPkcs1Success
5117 *
5118 * Verifies that RSA PKCS encryption/decrypts works.
5119 */
5120TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
5121 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5122 .Authorization(TAG_NO_AUTH_REQUIRED)
5123 .RsaEncryptionKey(2048, 65537)
Janis Danisevskis164bb872021-02-09 11:30:25 -08005124 .Padding(PaddingMode::RSA_PKCS1_1_5_ENCRYPT)
5125 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07005126
5127 string message = "Hello World!";
5128 auto params = AuthorizationSetBuilder().Padding(PaddingMode::RSA_PKCS1_1_5_ENCRYPT);
David Drysdale59cae642021-05-12 13:52:03 +01005129 string ciphertext1 = LocalRsaEncryptMessage(message, params);
Selene Huang31ab4042020-04-29 04:22:39 -07005130 EXPECT_EQ(2048U / 8, ciphertext1.size());
5131
David Drysdale59cae642021-05-12 13:52:03 +01005132 string ciphertext2 = LocalRsaEncryptMessage(message, params);
Selene Huang31ab4042020-04-29 04:22:39 -07005133 EXPECT_EQ(2048U / 8, ciphertext2.size());
5134
5135 // PKCS1 v1.5 randomizes padding so every result should be different.
5136 EXPECT_NE(ciphertext1, ciphertext2);
5137
5138 string plaintext = DecryptMessage(ciphertext1, params);
5139 EXPECT_EQ(message, plaintext);
5140
5141 // Decrypting corrupted ciphertext should fail.
5142 size_t offset_to_corrupt = random() % ciphertext1.size();
5143 char corrupt_byte;
5144 do {
5145 corrupt_byte = static_cast<char>(random() % 256);
5146 } while (corrupt_byte == ciphertext1[offset_to_corrupt]);
5147 ciphertext1[offset_to_corrupt] = corrupt_byte;
5148
5149 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params));
5150 string result;
5151 EXPECT_EQ(ErrorCode::UNKNOWN_ERROR, Finish(ciphertext1, &result));
5152 EXPECT_EQ(0U, result.size());
5153}
5154
5155/*
Selene Huang31ab4042020-04-29 04:22:39 -07005156 * EncryptionOperationsTest.EcdsaEncrypt
5157 *
5158 * Verifies that attempting to use ECDSA keys to encrypt fails in the correct way.
5159 */
5160TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
5161 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5162 .Authorization(TAG_NO_AUTH_REQUIRED)
David Drysdaledf09e542021-06-08 15:46:11 +01005163 .EcdsaSigningKey(EcCurve::P_256)
Janis Danisevskis164bb872021-02-09 11:30:25 -08005164 .Digest(Digest::NONE)
5165 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07005166 auto params = AuthorizationSetBuilder().Digest(Digest::NONE);
5167 ASSERT_EQ(ErrorCode::UNSUPPORTED_PURPOSE, Begin(KeyPurpose::ENCRYPT, params));
5168 ASSERT_EQ(ErrorCode::UNSUPPORTED_PURPOSE, Begin(KeyPurpose::DECRYPT, params));
5169}
5170
5171/*
5172 * EncryptionOperationsTest.HmacEncrypt
5173 *
5174 * Verifies that attempting to use HMAC keys to encrypt fails in the correct way.
5175 */
5176TEST_P(EncryptionOperationsTest, HmacEncrypt) {
5177 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5178 .Authorization(TAG_NO_AUTH_REQUIRED)
5179 .HmacKey(128)
5180 .Digest(Digest::SHA_2_256)
5181 .Padding(PaddingMode::NONE)
5182 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
5183 auto params = AuthorizationSetBuilder()
5184 .Digest(Digest::SHA_2_256)
5185 .Padding(PaddingMode::NONE)
5186 .Authorization(TAG_MAC_LENGTH, 128);
5187 ASSERT_EQ(ErrorCode::UNSUPPORTED_PURPOSE, Begin(KeyPurpose::ENCRYPT, params));
5188 ASSERT_EQ(ErrorCode::UNSUPPORTED_PURPOSE, Begin(KeyPurpose::DECRYPT, params));
5189}
5190
5191/*
5192 * EncryptionOperationsTest.AesEcbRoundTripSuccess
5193 *
5194 * Verifies that AES ECB mode works.
5195 */
5196TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
5197 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5198 .Authorization(TAG_NO_AUTH_REQUIRED)
5199 .AesEncryptionKey(128)
5200 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB)
5201 .Padding(PaddingMode::NONE)));
5202
5203 ASSERT_GT(key_blob_.size(), 0U);
5204 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::NONE);
5205
5206 // Two-block message.
5207 string message = "12345678901234567890123456789012";
5208 string ciphertext1 = EncryptMessage(message, params);
5209 EXPECT_EQ(message.size(), ciphertext1.size());
5210
5211 string ciphertext2 = EncryptMessage(string(message), params);
5212 EXPECT_EQ(message.size(), ciphertext2.size());
5213
5214 // ECB is deterministic.
5215 EXPECT_EQ(ciphertext1, ciphertext2);
5216
5217 string plaintext = DecryptMessage(ciphertext1, params);
5218 EXPECT_EQ(message, plaintext);
5219}
5220
5221/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01005222 * EncryptionOperationsTest.AesEcbUnknownTag
5223 *
5224 * Verifies that AES ECB operations ignore unknown tags.
5225 */
5226TEST_P(EncryptionOperationsTest, AesEcbUnknownTag) {
5227 int32_t unknown_tag_value = ((7 << 28) /* TagType:BOOL */ | 150);
5228 Tag unknown_tag = static_cast<Tag>(unknown_tag_value);
5229 KeyParameter unknown_param;
5230 unknown_param.tag = unknown_tag;
5231
5232 vector<KeyCharacteristics> key_characteristics;
5233 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5234 .Authorization(TAG_NO_AUTH_REQUIRED)
5235 .AesEncryptionKey(128)
5236 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB)
5237 .Padding(PaddingMode::NONE)
5238 .Authorization(unknown_param),
5239 &key_blob_, &key_characteristics));
5240 ASSERT_GT(key_blob_.size(), 0U);
5241
5242 // Unknown tags should not be returned in key characteristics.
5243 AuthorizationSet hw_enforced = HwEnforcedAuthorizations(key_characteristics);
5244 AuthorizationSet sw_enforced = SwEnforcedAuthorizations(key_characteristics);
5245 EXPECT_EQ(hw_enforced.find(unknown_tag), -1);
5246 EXPECT_EQ(sw_enforced.find(unknown_tag), -1);
5247
5248 // Encrypt without mentioning the unknown parameter.
5249 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::NONE);
5250 string message = "12345678901234567890123456789012";
5251 string ciphertext = EncryptMessage(message, params);
5252 EXPECT_EQ(message.size(), ciphertext.size());
5253
5254 // Decrypt including the unknown parameter.
5255 auto decrypt_params = AuthorizationSetBuilder()
5256 .BlockMode(BlockMode::ECB)
5257 .Padding(PaddingMode::NONE)
5258 .Authorization(unknown_param);
5259 string plaintext = DecryptMessage(ciphertext, decrypt_params);
5260 EXPECT_EQ(message, plaintext);
5261}
5262
5263/*
David Drysdale7de9feb2021-03-05 14:56:19 +00005264 * EncryptionOperationsTest.AesWrongMode
Selene Huang31ab4042020-04-29 04:22:39 -07005265 *
5266 * Verifies that AES encryption fails in the correct way when an unauthorized mode is specified.
5267 */
5268TEST_P(EncryptionOperationsTest, AesWrongMode) {
5269 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5270 .Authorization(TAG_NO_AUTH_REQUIRED)
5271 .AesEncryptionKey(128)
5272 .Authorization(TAG_BLOCK_MODE, BlockMode::CBC)
5273 .Padding(PaddingMode::NONE)));
Selene Huang31ab4042020-04-29 04:22:39 -07005274 ASSERT_GT(key_blob_.size(), 0U);
5275
Selene Huang31ab4042020-04-29 04:22:39 -07005276 EXPECT_EQ(
5277 ErrorCode::INCOMPATIBLE_BLOCK_MODE,
5278 Begin(KeyPurpose::ENCRYPT,
5279 AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::NONE)));
5280}
5281
5282/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01005283 * EncryptionOperationsTest.AesWrongPadding
5284 *
5285 * Verifies that AES encryption fails in the correct way when an unauthorized padding is specified.
5286 */
5287TEST_P(EncryptionOperationsTest, AesWrongPadding) {
5288 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5289 .Authorization(TAG_NO_AUTH_REQUIRED)
5290 .AesEncryptionKey(128)
5291 .Authorization(TAG_BLOCK_MODE, BlockMode::CBC)
5292 .Padding(PaddingMode::NONE)));
5293 ASSERT_GT(key_blob_.size(), 0U);
5294
5295 EXPECT_EQ(
5296 ErrorCode::INCOMPATIBLE_PADDING_MODE,
5297 Begin(KeyPurpose::ENCRYPT,
5298 AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::PKCS7)));
5299}
5300
5301/*
5302 * EncryptionOperationsTest.AesInvalidParams
5303 *
5304 * Verifies that AES encryption fails in the correct way when an duplicate parameters are specified.
5305 */
5306TEST_P(EncryptionOperationsTest, AesInvalidParams) {
5307 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5308 .Authorization(TAG_NO_AUTH_REQUIRED)
5309 .AesEncryptionKey(128)
5310 .Authorization(TAG_BLOCK_MODE, BlockMode::CBC)
5311 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB)
5312 .Padding(PaddingMode::NONE)
5313 .Padding(PaddingMode::PKCS7)));
5314 ASSERT_GT(key_blob_.size(), 0U);
5315
5316 auto result = Begin(KeyPurpose::ENCRYPT, AuthorizationSetBuilder()
5317 .BlockMode(BlockMode::CBC)
5318 .BlockMode(BlockMode::ECB)
5319 .Padding(PaddingMode::NONE));
5320 EXPECT_TRUE(result == ErrorCode::INCOMPATIBLE_BLOCK_MODE ||
5321 result == ErrorCode::UNSUPPORTED_BLOCK_MODE);
5322
5323 result = Begin(KeyPurpose::ENCRYPT, AuthorizationSetBuilder()
5324 .BlockMode(BlockMode::ECB)
5325 .Padding(PaddingMode::NONE)
5326 .Padding(PaddingMode::PKCS7));
5327 EXPECT_TRUE(result == ErrorCode::INCOMPATIBLE_PADDING_MODE ||
5328 result == ErrorCode::UNSUPPORTED_PADDING_MODE);
5329}
5330
5331/*
Selene Huang31ab4042020-04-29 04:22:39 -07005332 * EncryptionOperationsTest.AesWrongPurpose
5333 *
5334 * Verifies that AES encryption fails in the correct way when an unauthorized purpose is
5335 * specified.
5336 */
5337TEST_P(EncryptionOperationsTest, AesWrongPurpose) {
5338 auto err = GenerateKey(AuthorizationSetBuilder()
5339 .Authorization(TAG_NO_AUTH_REQUIRED)
5340 .AesKey(128)
5341 .Authorization(TAG_PURPOSE, KeyPurpose::ENCRYPT)
5342 .Authorization(TAG_BLOCK_MODE, BlockMode::GCM)
5343 .Authorization(TAG_MIN_MAC_LENGTH, 128)
5344 .Padding(PaddingMode::NONE));
5345 ASSERT_EQ(ErrorCode::OK, err) << "Got " << err;
5346 ASSERT_GT(key_blob_.size(), 0U);
5347
5348 err = Begin(KeyPurpose::DECRYPT, AuthorizationSetBuilder()
5349 .BlockMode(BlockMode::GCM)
5350 .Padding(PaddingMode::NONE)
5351 .Authorization(TAG_MAC_LENGTH, 128));
5352 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PURPOSE, err) << "Got " << err;
5353
5354 CheckedDeleteKey();
5355
5356 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5357 .Authorization(TAG_NO_AUTH_REQUIRED)
5358 .AesKey(128)
5359 .Authorization(TAG_PURPOSE, KeyPurpose::DECRYPT)
5360 .Authorization(TAG_BLOCK_MODE, BlockMode::GCM)
5361 .Authorization(TAG_MIN_MAC_LENGTH, 128)
5362 .Padding(PaddingMode::NONE)));
5363
5364 err = Begin(KeyPurpose::ENCRYPT, AuthorizationSetBuilder()
5365 .BlockMode(BlockMode::GCM)
5366 .Padding(PaddingMode::NONE)
5367 .Authorization(TAG_MAC_LENGTH, 128));
5368 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PURPOSE, err) << "Got " << err;
5369}
5370
5371/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01005372 * EncryptionOperationsTest.AesEcbCbcNoPaddingWrongInputSize
Selene Huang31ab4042020-04-29 04:22:39 -07005373 *
5374 * Verifies that AES encryption fails in the correct way when provided an input that is not a
5375 * multiple of the block size and no padding is specified.
5376 */
David Drysdaled2cc8c22021-04-15 13:29:45 +01005377TEST_P(EncryptionOperationsTest, AesEcbCbcNoPaddingWrongInputSize) {
5378 for (BlockMode blockMode : {BlockMode::ECB, BlockMode::CBC}) {
5379 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5380 .Authorization(TAG_NO_AUTH_REQUIRED)
5381 .AesEncryptionKey(128)
5382 .Authorization(TAG_BLOCK_MODE, blockMode)
5383 .Padding(PaddingMode::NONE)));
5384 // Message is slightly shorter than two blocks.
5385 string message(16 * 2 - 1, 'a');
Selene Huang31ab4042020-04-29 04:22:39 -07005386
David Drysdaled2cc8c22021-04-15 13:29:45 +01005387 auto params = AuthorizationSetBuilder().BlockMode(blockMode).Padding(PaddingMode::NONE);
5388 AuthorizationSet out_params;
5389 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params, &out_params));
5390 string ciphertext;
5391 EXPECT_EQ(ErrorCode::INVALID_INPUT_LENGTH, Finish(message, &ciphertext));
5392 EXPECT_EQ(0U, ciphertext.size());
5393
5394 CheckedDeleteKey();
5395 }
Selene Huang31ab4042020-04-29 04:22:39 -07005396}
5397
5398/*
5399 * EncryptionOperationsTest.AesEcbPkcs7Padding
5400 *
5401 * Verifies that AES PKCS7 padding works for any message length.
5402 */
5403TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
5404 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5405 .Authorization(TAG_NO_AUTH_REQUIRED)
5406 .AesEncryptionKey(128)
5407 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB)
5408 .Padding(PaddingMode::PKCS7)));
5409
5410 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7);
5411
5412 // Try various message lengths; all should work.
Brian J Murray734c8412022-01-13 14:55:30 -08005413 for (size_t i = 0; i <= 48; i++) {
5414 SCOPED_TRACE(testing::Message() << "i = " << i);
5415 // Edge case: '\t' (0x09) is also a valid PKCS7 padding character.
5416 string message(i, '\t');
Selene Huang31ab4042020-04-29 04:22:39 -07005417 string ciphertext = EncryptMessage(message, params);
5418 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
5419 string plaintext = DecryptMessage(ciphertext, params);
5420 EXPECT_EQ(message, plaintext);
5421 }
5422}
5423
5424/*
5425 * EncryptionOperationsTest.AesEcbWrongPadding
5426 *
5427 * Verifies that AES enryption fails in the correct way when an unauthorized padding mode is
5428 * specified.
5429 */
5430TEST_P(EncryptionOperationsTest, AesEcbWrongPadding) {
5431 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5432 .Authorization(TAG_NO_AUTH_REQUIRED)
5433 .AesEncryptionKey(128)
5434 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB)
5435 .Padding(PaddingMode::NONE)));
5436
5437 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7);
5438
5439 // Try various message lengths; all should fail
Brian J Murray734c8412022-01-13 14:55:30 -08005440 for (size_t i = 0; i <= 48; i++) {
Selene Huang31ab4042020-04-29 04:22:39 -07005441 string message(i, 'a');
5442 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PADDING_MODE, Begin(KeyPurpose::ENCRYPT, params));
5443 }
5444}
5445
5446/*
5447 * EncryptionOperationsTest.AesEcbPkcs7PaddingCorrupted
5448 *
5449 * Verifies that AES decryption fails in the correct way when the padding is corrupted.
5450 */
5451TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
5452 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5453 .Authorization(TAG_NO_AUTH_REQUIRED)
5454 .AesEncryptionKey(128)
5455 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB)
5456 .Padding(PaddingMode::PKCS7)));
5457
5458 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7);
5459
5460 string message = "a";
5461 string ciphertext = EncryptMessage(message, params);
5462 EXPECT_EQ(16U, ciphertext.size());
5463 EXPECT_NE(ciphertext, message);
Selene Huang31ab4042020-04-29 04:22:39 -07005464
Seth Moore7a55ae32021-06-23 14:28:11 -07005465 for (size_t i = 0; i < kMaxPaddingCorruptionRetries; ++i) {
5466 ++ciphertext[ciphertext.size() / 2];
5467
5468 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params));
5469 string plaintext;
5470 ErrorCode error = Finish(message, &plaintext);
5471 if (error == ErrorCode::INVALID_INPUT_LENGTH) {
5472 // This is the expected error, we can exit the test now.
5473 return;
5474 } else {
5475 // Very small chance we got valid decryption, so try again.
5476 ASSERT_EQ(error, ErrorCode::OK);
5477 }
5478 }
5479 FAIL() << "Corrupt ciphertext should have failed to decrypt by now.";
Selene Huang31ab4042020-04-29 04:22:39 -07005480}
5481
5482vector<uint8_t> CopyIv(const AuthorizationSet& set) {
5483 auto iv = set.GetTagValue(TAG_NONCE);
Janis Danisevskis5ba09332020-12-17 10:05:15 -08005484 EXPECT_TRUE(iv);
5485 return iv->get();
Selene Huang31ab4042020-04-29 04:22:39 -07005486}
5487
5488/*
5489 * EncryptionOperationsTest.AesCtrRoundTripSuccess
5490 *
5491 * Verifies that AES CTR mode works.
5492 */
5493TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
5494 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5495 .Authorization(TAG_NO_AUTH_REQUIRED)
5496 .AesEncryptionKey(128)
5497 .Authorization(TAG_BLOCK_MODE, BlockMode::CTR)
5498 .Padding(PaddingMode::NONE)));
5499
5500 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::CTR).Padding(PaddingMode::NONE);
5501
5502 string message = "123";
5503 AuthorizationSet out_params;
5504 string ciphertext1 = EncryptMessage(message, params, &out_params);
5505 vector<uint8_t> iv1 = CopyIv(out_params);
5506 EXPECT_EQ(16U, iv1.size());
5507
5508 EXPECT_EQ(message.size(), ciphertext1.size());
5509
5510 out_params.Clear();
5511 string ciphertext2 = EncryptMessage(message, params, &out_params);
5512 vector<uint8_t> iv2 = CopyIv(out_params);
5513 EXPECT_EQ(16U, iv2.size());
5514
5515 // IVs should be random, so ciphertexts should differ.
5516 EXPECT_NE(ciphertext1, ciphertext2);
5517
5518 auto params_iv1 =
5519 AuthorizationSetBuilder().Authorizations(params).Authorization(TAG_NONCE, iv1);
5520 auto params_iv2 =
5521 AuthorizationSetBuilder().Authorizations(params).Authorization(TAG_NONCE, iv2);
5522
5523 string plaintext = DecryptMessage(ciphertext1, params_iv1);
5524 EXPECT_EQ(message, plaintext);
5525 plaintext = DecryptMessage(ciphertext2, params_iv2);
5526 EXPECT_EQ(message, plaintext);
5527
5528 // Using the wrong IV will result in a "valid" decryption, but the data will be garbage.
5529 plaintext = DecryptMessage(ciphertext1, params_iv2);
5530 EXPECT_NE(message, plaintext);
5531 plaintext = DecryptMessage(ciphertext2, params_iv1);
5532 EXPECT_NE(message, plaintext);
5533}
5534
5535/*
anil.hiranniah19a4ca12022-03-03 17:39:30 +05305536 * EncryptionOperationsTest.AesEcbIncremental
Selene Huang31ab4042020-04-29 04:22:39 -07005537 *
anil.hiranniah19a4ca12022-03-03 17:39:30 +05305538 * Verifies that AES works for ECB block mode, when provided data in various size increments.
Selene Huang31ab4042020-04-29 04:22:39 -07005539 */
anil.hiranniah19a4ca12022-03-03 17:39:30 +05305540TEST_P(EncryptionOperationsTest, AesEcbIncremental) {
5541 CheckAesIncrementalEncryptOperation(BlockMode::ECB, 240);
5542}
Selene Huang31ab4042020-04-29 04:22:39 -07005543
anil.hiranniah19a4ca12022-03-03 17:39:30 +05305544/*
5545 * EncryptionOperationsTest.AesCbcIncremental
5546 *
5547 * Verifies that AES works for CBC block mode, when provided data in various size increments.
5548 */
5549TEST_P(EncryptionOperationsTest, AesCbcIncremental) {
5550 CheckAesIncrementalEncryptOperation(BlockMode::CBC, 240);
5551}
Selene Huang31ab4042020-04-29 04:22:39 -07005552
anil.hiranniah19a4ca12022-03-03 17:39:30 +05305553/*
5554 * EncryptionOperationsTest.AesCtrIncremental
5555 *
5556 * Verifies that AES works for CTR block mode, when provided data in various size increments.
5557 */
5558TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
5559 CheckAesIncrementalEncryptOperation(BlockMode::CTR, 240);
5560}
Selene Huang31ab4042020-04-29 04:22:39 -07005561
anil.hiranniah19a4ca12022-03-03 17:39:30 +05305562/*
5563 * EncryptionOperationsTest.AesGcmIncremental
5564 *
5565 * Verifies that AES works for GCM block mode, when provided data in various size increments.
5566 */
5567TEST_P(EncryptionOperationsTest, AesGcmIncremental) {
5568 CheckAesIncrementalEncryptOperation(BlockMode::GCM, 240);
Selene Huang31ab4042020-04-29 04:22:39 -07005569}
5570
5571struct AesCtrSp80038aTestVector {
5572 const char* key;
5573 const char* nonce;
5574 const char* plaintext;
5575 const char* ciphertext;
5576};
5577
5578// These test vectors are taken from
5579// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
5580static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
5581 // AES-128
5582 {
5583 "2b7e151628aed2a6abf7158809cf4f3c",
5584 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
5585 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
5586 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
5587 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
5588 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
5589 },
5590 // AES-192
5591 {
5592 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b",
5593 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
5594 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
5595 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
5596 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
5597 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
5598 },
5599 // AES-256
5600 {
5601 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
5602 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
5603 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
5604 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
5605 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
5606 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
5607 },
5608};
5609
5610/*
5611 * EncryptionOperationsTest.AesCtrSp80038aTestVector
5612 *
5613 * Verifies AES CTR implementation against SP800-38A test vectors.
5614 */
5615TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
5616 std::vector<uint32_t> InvalidSizes = InvalidKeySizes(Algorithm::AES);
5617 for (size_t i = 0; i < 3; i++) {
5618 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
5619 const string key = hex2str(test.key);
5620 if (std::find(InvalidSizes.begin(), InvalidSizes.end(), (key.size() * 8)) !=
5621 InvalidSizes.end())
5622 continue;
5623 const string nonce = hex2str(test.nonce);
5624 const string plaintext = hex2str(test.plaintext);
5625 const string ciphertext = hex2str(test.ciphertext);
5626 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
5627 }
5628}
5629
5630/*
5631 * EncryptionOperationsTest.AesCtrIncompatiblePaddingMode
5632 *
5633 * Verifies that keymint rejects use of CTR mode with PKCS7 padding in the correct way.
5634 */
5635TEST_P(EncryptionOperationsTest, AesCtrIncompatiblePaddingMode) {
5636 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5637 .Authorization(TAG_NO_AUTH_REQUIRED)
5638 .AesEncryptionKey(128)
5639 .Authorization(TAG_BLOCK_MODE, BlockMode::CTR)
5640 .Padding(PaddingMode::PKCS7)));
5641 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::CTR).Padding(PaddingMode::NONE);
5642 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PADDING_MODE, Begin(KeyPurpose::ENCRYPT, params));
5643}
5644
5645/*
5646 * EncryptionOperationsTest.AesCtrInvalidCallerNonce
5647 *
5648 * Verifies that keymint fails correctly when the user supplies an incorrect-size nonce.
5649 */
5650TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
5651 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5652 .Authorization(TAG_NO_AUTH_REQUIRED)
5653 .AesEncryptionKey(128)
5654 .Authorization(TAG_BLOCK_MODE, BlockMode::CTR)
5655 .Authorization(TAG_CALLER_NONCE)
5656 .Padding(PaddingMode::NONE)));
5657
5658 auto params = AuthorizationSetBuilder()
5659 .BlockMode(BlockMode::CTR)
5660 .Padding(PaddingMode::NONE)
5661 .Authorization(TAG_NONCE, AidlBuf(string(1, 'a')));
5662 EXPECT_EQ(ErrorCode::INVALID_NONCE, Begin(KeyPurpose::ENCRYPT, params));
5663
5664 params = AuthorizationSetBuilder()
5665 .BlockMode(BlockMode::CTR)
5666 .Padding(PaddingMode::NONE)
5667 .Authorization(TAG_NONCE, AidlBuf(string(15, 'a')));
5668 EXPECT_EQ(ErrorCode::INVALID_NONCE, Begin(KeyPurpose::ENCRYPT, params));
5669
5670 params = AuthorizationSetBuilder()
5671 .BlockMode(BlockMode::CTR)
5672 .Padding(PaddingMode::NONE)
5673 .Authorization(TAG_NONCE, AidlBuf(string(17, 'a')));
5674 EXPECT_EQ(ErrorCode::INVALID_NONCE, Begin(KeyPurpose::ENCRYPT, params));
5675}
5676
5677/*
David Drysdale7de9feb2021-03-05 14:56:19 +00005678 * EncryptionOperationsTest.AesCbcRoundTripSuccess
Selene Huang31ab4042020-04-29 04:22:39 -07005679 *
5680 * Verifies that keymint fails correctly when the user supplies an incorrect-size nonce.
5681 */
5682TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
5683 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5684 .Authorization(TAG_NO_AUTH_REQUIRED)
5685 .AesEncryptionKey(128)
5686 .Authorization(TAG_BLOCK_MODE, BlockMode::CBC)
5687 .Padding(PaddingMode::NONE)));
5688 // Two-block message.
5689 string message = "12345678901234567890123456789012";
5690 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::NONE);
5691 AuthorizationSet out_params;
5692 string ciphertext1 = EncryptMessage(message, params, &out_params);
5693 vector<uint8_t> iv1 = CopyIv(out_params);
5694 EXPECT_EQ(message.size(), ciphertext1.size());
5695
5696 out_params.Clear();
5697
5698 string ciphertext2 = EncryptMessage(message, params, &out_params);
5699 vector<uint8_t> iv2 = CopyIv(out_params);
5700 EXPECT_EQ(message.size(), ciphertext2.size());
5701
5702 // IVs should be random, so ciphertexts should differ.
5703 EXPECT_NE(ciphertext1, ciphertext2);
5704
5705 params.push_back(TAG_NONCE, iv1);
5706 string plaintext = DecryptMessage(ciphertext1, params);
5707 EXPECT_EQ(message, plaintext);
5708}
5709
5710/*
5711 * EncryptionOperationsTest.AesCallerNonce
5712 *
5713 * Verifies that AES caller-provided nonces work correctly.
5714 */
5715TEST_P(EncryptionOperationsTest, AesCallerNonce) {
5716 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5717 .Authorization(TAG_NO_AUTH_REQUIRED)
5718 .AesEncryptionKey(128)
5719 .Authorization(TAG_BLOCK_MODE, BlockMode::CBC)
5720 .Authorization(TAG_CALLER_NONCE)
5721 .Padding(PaddingMode::NONE)));
5722
5723 string message = "12345678901234567890123456789012";
5724
5725 // Don't specify nonce, should get a random one.
5726 AuthorizationSetBuilder params =
5727 AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::NONE);
5728 AuthorizationSet out_params;
5729 string ciphertext = EncryptMessage(message, params, &out_params);
5730 EXPECT_EQ(message.size(), ciphertext.size());
Janis Danisevskis5ba09332020-12-17 10:05:15 -08005731 EXPECT_EQ(16U, out_params.GetTagValue(TAG_NONCE)->get().size());
Selene Huang31ab4042020-04-29 04:22:39 -07005732
Janis Danisevskis5ba09332020-12-17 10:05:15 -08005733 params.push_back(TAG_NONCE, out_params.GetTagValue(TAG_NONCE)->get());
Selene Huang31ab4042020-04-29 04:22:39 -07005734 string plaintext = DecryptMessage(ciphertext, params);
5735 EXPECT_EQ(message, plaintext);
5736
5737 // Now specify a nonce, should also work.
5738 params = AuthorizationSetBuilder()
5739 .BlockMode(BlockMode::CBC)
5740 .Padding(PaddingMode::NONE)
5741 .Authorization(TAG_NONCE, AidlBuf("abcdefghijklmnop"));
5742 out_params.Clear();
5743 ciphertext = EncryptMessage(message, params, &out_params);
5744
5745 // Decrypt with correct nonce.
5746 plaintext = DecryptMessage(ciphertext, params);
5747 EXPECT_EQ(message, plaintext);
5748
5749 // Try with wrong nonce.
5750 params = AuthorizationSetBuilder()
5751 .BlockMode(BlockMode::CBC)
5752 .Padding(PaddingMode::NONE)
5753 .Authorization(TAG_NONCE, AidlBuf("aaaaaaaaaaaaaaaa"));
5754 plaintext = DecryptMessage(ciphertext, params);
5755 EXPECT_NE(message, plaintext);
5756}
5757
5758/*
5759 * EncryptionOperationsTest.AesCallerNonceProhibited
5760 *
5761 * Verifies that caller-provided nonces are not permitted when not specified in the key
5762 * authorizations.
5763 */
5764TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
5765 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5766 .Authorization(TAG_NO_AUTH_REQUIRED)
5767 .AesEncryptionKey(128)
5768 .Authorization(TAG_BLOCK_MODE, BlockMode::CBC)
5769 .Padding(PaddingMode::NONE)));
5770
5771 string message = "12345678901234567890123456789012";
5772
5773 // Don't specify nonce, should get a random one.
5774 AuthorizationSetBuilder params =
5775 AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::NONE);
5776 AuthorizationSet out_params;
5777 string ciphertext = EncryptMessage(message, params, &out_params);
5778 EXPECT_EQ(message.size(), ciphertext.size());
Janis Danisevskis5ba09332020-12-17 10:05:15 -08005779 EXPECT_EQ(16U, out_params.GetTagValue(TAG_NONCE)->get().size());
Selene Huang31ab4042020-04-29 04:22:39 -07005780
Janis Danisevskis5ba09332020-12-17 10:05:15 -08005781 params.push_back(TAG_NONCE, out_params.GetTagValue(TAG_NONCE)->get());
Selene Huang31ab4042020-04-29 04:22:39 -07005782 string plaintext = DecryptMessage(ciphertext, params);
5783 EXPECT_EQ(message, plaintext);
5784
5785 // Now specify a nonce, should fail
5786 params = AuthorizationSetBuilder()
5787 .BlockMode(BlockMode::CBC)
5788 .Padding(PaddingMode::NONE)
5789 .Authorization(TAG_NONCE, AidlBuf("abcdefghijklmnop"));
5790 out_params.Clear();
5791 EXPECT_EQ(ErrorCode::CALLER_NONCE_PROHIBITED, Begin(KeyPurpose::ENCRYPT, params, &out_params));
5792}
5793
5794/*
5795 * EncryptionOperationsTest.AesGcmRoundTripSuccess
5796 *
5797 * Verifies that AES GCM mode works.
5798 */
5799TEST_P(EncryptionOperationsTest, AesGcmRoundTripSuccess) {
5800 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5801 .Authorization(TAG_NO_AUTH_REQUIRED)
5802 .AesEncryptionKey(128)
5803 .Authorization(TAG_BLOCK_MODE, BlockMode::GCM)
5804 .Padding(PaddingMode::NONE)
5805 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
5806
5807 string aad = "foobar";
5808 string message = "123456789012345678901234567890123456";
5809
5810 auto begin_params = AuthorizationSetBuilder()
5811 .BlockMode(BlockMode::GCM)
5812 .Padding(PaddingMode::NONE)
5813 .Authorization(TAG_MAC_LENGTH, 128);
5814
Selene Huang31ab4042020-04-29 04:22:39 -07005815 // Encrypt
5816 AuthorizationSet begin_out_params;
5817 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params))
5818 << "Begin encrypt";
5819 string ciphertext;
Shawn Willden92d79c02021-02-19 07:31:55 -07005820 ASSERT_EQ(ErrorCode::OK, UpdateAad(aad));
5821 ASSERT_EQ(ErrorCode::OK, Finish(message, &ciphertext));
Selene Huang31ab4042020-04-29 04:22:39 -07005822 ASSERT_EQ(ciphertext.length(), message.length() + 16);
5823
5824 // Grab nonce
5825 begin_params.push_back(begin_out_params);
5826
5827 // Decrypt.
5828 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params)) << "Begin decrypt";
Shawn Willden92d79c02021-02-19 07:31:55 -07005829 ASSERT_EQ(ErrorCode::OK, UpdateAad(aad));
Selene Huang31ab4042020-04-29 04:22:39 -07005830 string plaintext;
Shawn Willden92d79c02021-02-19 07:31:55 -07005831 EXPECT_EQ(ErrorCode::OK, Finish(ciphertext, &plaintext));
Selene Huang31ab4042020-04-29 04:22:39 -07005832 EXPECT_EQ(message.length(), plaintext.length());
5833 EXPECT_EQ(message, plaintext);
5834}
5835
5836/*
5837 * EncryptionOperationsTest.AesGcmRoundTripWithDelaySuccess
5838 *
5839 * Verifies that AES GCM mode works, even when there's a long delay
5840 * between operations.
5841 */
5842TEST_P(EncryptionOperationsTest, AesGcmRoundTripWithDelaySuccess) {
5843 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5844 .Authorization(TAG_NO_AUTH_REQUIRED)
5845 .AesEncryptionKey(128)
5846 .Authorization(TAG_BLOCK_MODE, BlockMode::GCM)
5847 .Padding(PaddingMode::NONE)
5848 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
5849
5850 string aad = "foobar";
5851 string message = "123456789012345678901234567890123456";
5852
5853 auto begin_params = AuthorizationSetBuilder()
5854 .BlockMode(BlockMode::GCM)
5855 .Padding(PaddingMode::NONE)
5856 .Authorization(TAG_MAC_LENGTH, 128);
5857
Selene Huang31ab4042020-04-29 04:22:39 -07005858 // Encrypt
5859 AuthorizationSet begin_out_params;
5860 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params))
5861 << "Begin encrypt";
5862 string ciphertext;
5863 AuthorizationSet update_out_params;
Shawn Willden92d79c02021-02-19 07:31:55 -07005864 ASSERT_EQ(ErrorCode::OK, UpdateAad(aad));
Selene Huang31ab4042020-04-29 04:22:39 -07005865 sleep(5);
Shawn Willden92d79c02021-02-19 07:31:55 -07005866 ASSERT_EQ(ErrorCode::OK, Finish(message, &ciphertext));
Selene Huang31ab4042020-04-29 04:22:39 -07005867
5868 ASSERT_EQ(ciphertext.length(), message.length() + 16);
5869
5870 // Grab nonce
5871 begin_params.push_back(begin_out_params);
5872
5873 // Decrypt.
5874 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params)) << "Begin decrypt";
5875 string plaintext;
Shawn Willden92d79c02021-02-19 07:31:55 -07005876 ASSERT_EQ(ErrorCode::OK, UpdateAad(aad));
Selene Huang31ab4042020-04-29 04:22:39 -07005877 sleep(5);
Shawn Willden92d79c02021-02-19 07:31:55 -07005878 ASSERT_EQ(ErrorCode::OK, Update(ciphertext, &plaintext));
Selene Huang31ab4042020-04-29 04:22:39 -07005879 sleep(5);
5880 EXPECT_EQ(ErrorCode::OK, Finish("", &plaintext));
5881 EXPECT_EQ(message.length(), plaintext.length());
5882 EXPECT_EQ(message, plaintext);
5883}
5884
5885/*
5886 * EncryptionOperationsTest.AesGcmDifferentNonces
5887 *
5888 * Verifies that encrypting the same data with different nonces produces different outputs.
5889 */
5890TEST_P(EncryptionOperationsTest, AesGcmDifferentNonces) {
5891 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5892 .Authorization(TAG_NO_AUTH_REQUIRED)
5893 .AesEncryptionKey(128)
5894 .Authorization(TAG_BLOCK_MODE, BlockMode::GCM)
5895 .Padding(PaddingMode::NONE)
5896 .Authorization(TAG_MIN_MAC_LENGTH, 128)
5897 .Authorization(TAG_CALLER_NONCE)));
5898
5899 string aad = "foobar";
5900 string message = "123456789012345678901234567890123456";
5901 string nonce1 = "000000000000";
5902 string nonce2 = "111111111111";
5903 string nonce3 = "222222222222";
5904
5905 string ciphertext1 =
5906 EncryptMessage(message, BlockMode::GCM, PaddingMode::NONE, 128, AidlBuf(nonce1));
5907 string ciphertext2 =
5908 EncryptMessage(message, BlockMode::GCM, PaddingMode::NONE, 128, AidlBuf(nonce2));
5909 string ciphertext3 =
5910 EncryptMessage(message, BlockMode::GCM, PaddingMode::NONE, 128, AidlBuf(nonce3));
5911
5912 ASSERT_NE(ciphertext1, ciphertext2);
5913 ASSERT_NE(ciphertext1, ciphertext3);
5914 ASSERT_NE(ciphertext2, ciphertext3);
5915}
5916
5917/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01005918 * EncryptionOperationsTest.AesGcmDifferentAutoNonces
5919 *
5920 * Verifies that encrypting the same data with KeyMint generated nonces produces different outputs.
5921 */
5922TEST_P(EncryptionOperationsTest, AesGcmDifferentAutoNonces) {
5923 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5924 .Authorization(TAG_NO_AUTH_REQUIRED)
5925 .AesEncryptionKey(128)
5926 .Authorization(TAG_BLOCK_MODE, BlockMode::GCM)
5927 .Padding(PaddingMode::NONE)
5928 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
5929
5930 string aad = "foobar";
5931 string message = "123456789012345678901234567890123456";
5932
5933 string ciphertext1 = EncryptMessage(message, BlockMode::GCM, PaddingMode::NONE, 128);
5934 string ciphertext2 = EncryptMessage(message, BlockMode::GCM, PaddingMode::NONE, 128);
5935 string ciphertext3 = EncryptMessage(message, BlockMode::GCM, PaddingMode::NONE, 128);
5936
5937 ASSERT_NE(ciphertext1, ciphertext2);
5938 ASSERT_NE(ciphertext1, ciphertext3);
5939 ASSERT_NE(ciphertext2, ciphertext3);
5940}
5941
5942/*
Selene Huang31ab4042020-04-29 04:22:39 -07005943 * EncryptionOperationsTest.AesGcmTooShortTag
5944 *
5945 * Verifies that AES GCM mode fails correctly when a too-short tag length is specified.
5946 */
5947TEST_P(EncryptionOperationsTest, AesGcmTooShortTag) {
5948 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5949 .Authorization(TAG_NO_AUTH_REQUIRED)
5950 .AesEncryptionKey(128)
5951 .BlockMode(BlockMode::GCM)
5952 .Padding(PaddingMode::NONE)
5953 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
5954 string message = "123456789012345678901234567890123456";
5955 auto params = AuthorizationSetBuilder()
5956 .BlockMode(BlockMode::GCM)
5957 .Padding(PaddingMode::NONE)
5958 .Authorization(TAG_MAC_LENGTH, 96);
5959
5960 EXPECT_EQ(ErrorCode::INVALID_MAC_LENGTH, Begin(KeyPurpose::ENCRYPT, params));
5961}
5962
5963/*
5964 * EncryptionOperationsTest.AesGcmTooShortTagOnDecrypt
5965 *
5966 * Verifies that AES GCM mode fails correctly when a too-short tag is provided to decryption.
5967 */
5968TEST_P(EncryptionOperationsTest, AesGcmTooShortTagOnDecrypt) {
5969 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
5970 .Authorization(TAG_NO_AUTH_REQUIRED)
5971 .AesEncryptionKey(128)
5972 .BlockMode(BlockMode::GCM)
5973 .Padding(PaddingMode::NONE)
5974 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
5975 string aad = "foobar";
5976 string message = "123456789012345678901234567890123456";
5977 auto params = AuthorizationSetBuilder()
5978 .BlockMode(BlockMode::GCM)
5979 .Padding(PaddingMode::NONE)
5980 .Authorization(TAG_MAC_LENGTH, 128);
5981
Selene Huang31ab4042020-04-29 04:22:39 -07005982 // Encrypt
5983 AuthorizationSet begin_out_params;
5984 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params, &begin_out_params));
5985 EXPECT_EQ(1U, begin_out_params.size());
Janis Danisevskis5ba09332020-12-17 10:05:15 -08005986 ASSERT_TRUE(begin_out_params.GetTagValue(TAG_NONCE));
Selene Huang31ab4042020-04-29 04:22:39 -07005987
5988 AuthorizationSet finish_out_params;
5989 string ciphertext;
Shawn Willden92d79c02021-02-19 07:31:55 -07005990 ASSERT_EQ(ErrorCode::OK, UpdateAad(aad));
5991 EXPECT_EQ(ErrorCode::OK, Finish(message, &ciphertext));
Selene Huang31ab4042020-04-29 04:22:39 -07005992
5993 params = AuthorizationSetBuilder()
5994 .Authorizations(begin_out_params)
5995 .BlockMode(BlockMode::GCM)
5996 .Padding(PaddingMode::NONE)
5997 .Authorization(TAG_MAC_LENGTH, 96);
5998
5999 // Decrypt.
6000 EXPECT_EQ(ErrorCode::INVALID_MAC_LENGTH, Begin(KeyPurpose::DECRYPT, params));
6001}
6002
6003/*
6004 * EncryptionOperationsTest.AesGcmCorruptKey
6005 *
6006 * Verifies that AES GCM mode fails correctly when the decryption key is incorrect.
6007 */
6008TEST_P(EncryptionOperationsTest, AesGcmCorruptKey) {
6009 const uint8_t nonce_bytes[] = {
6010 0xb7, 0x94, 0x37, 0xae, 0x08, 0xff, 0x35, 0x5d, 0x7d, 0x8a, 0x4d, 0x0f,
6011 };
6012 string nonce = make_string(nonce_bytes);
6013 const uint8_t ciphertext_bytes[] = {
6014 0xb3, 0xf6, 0x79, 0x9e, 0x8f, 0x93, 0x26, 0xf2, 0xdf, 0x1e, 0x80, 0xfc,
6015 0xd2, 0xcb, 0x16, 0xd7, 0x8c, 0x9d, 0xc7, 0xcc, 0x14, 0xbb, 0x67, 0x78,
6016 0x62, 0xdc, 0x6c, 0x63, 0x9b, 0x3a, 0x63, 0x38, 0xd2, 0x4b, 0x31, 0x2d,
6017 0x39, 0x89, 0xe5, 0x92, 0x0b, 0x5d, 0xbf, 0xc9, 0x76, 0x76, 0x5e, 0xfb,
6018 0xfe, 0x57, 0xbb, 0x38, 0x59, 0x40, 0xa7, 0xa4, 0x3b, 0xdf, 0x05, 0xbd,
6019 0xda, 0xe3, 0xc9, 0xd6, 0xa2, 0xfb, 0xbd, 0xfc, 0xc0, 0xcb, 0xa0,
6020 };
6021 string ciphertext = make_string(ciphertext_bytes);
6022
6023 auto params = AuthorizationSetBuilder()
6024 .BlockMode(BlockMode::GCM)
6025 .Padding(PaddingMode::NONE)
6026 .Authorization(TAG_MAC_LENGTH, 128)
6027 .Authorization(TAG_NONCE, nonce.data(), nonce.size());
6028
6029 auto import_params = AuthorizationSetBuilder()
6030 .Authorization(TAG_NO_AUTH_REQUIRED)
6031 .AesEncryptionKey(128)
6032 .BlockMode(BlockMode::GCM)
6033 .Padding(PaddingMode::NONE)
6034 .Authorization(TAG_CALLER_NONCE)
6035 .Authorization(TAG_MIN_MAC_LENGTH, 128);
6036
6037 // Import correct key and decrypt
6038 const uint8_t key_bytes[] = {
6039 0xba, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d,
6040 0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb,
6041 };
6042 string key = make_string(key_bytes);
6043 ASSERT_EQ(ErrorCode::OK, ImportKey(import_params, KeyFormat::RAW, key));
6044 string plaintext = DecryptMessage(ciphertext, params);
6045 CheckedDeleteKey();
6046
6047 // Corrupt key and attempt to decrypt
6048 key[0] = 0;
6049 ASSERT_EQ(ErrorCode::OK, ImportKey(import_params, KeyFormat::RAW, key));
6050 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params));
6051 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(ciphertext, &plaintext));
6052 CheckedDeleteKey();
6053}
6054
6055/*
6056 * EncryptionOperationsTest.AesGcmAadNoData
6057 *
6058 * Verifies that AES GCM mode works when provided additional authenticated data, but no data to
6059 * encrypt.
6060 */
6061TEST_P(EncryptionOperationsTest, AesGcmAadNoData) {
6062 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6063 .Authorization(TAG_NO_AUTH_REQUIRED)
6064 .AesEncryptionKey(128)
6065 .BlockMode(BlockMode::GCM)
6066 .Padding(PaddingMode::NONE)
6067 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
6068
6069 string aad = "1234567890123456";
6070 auto params = AuthorizationSetBuilder()
6071 .BlockMode(BlockMode::GCM)
6072 .Padding(PaddingMode::NONE)
6073 .Authorization(TAG_MAC_LENGTH, 128);
6074
Selene Huang31ab4042020-04-29 04:22:39 -07006075 // Encrypt
6076 AuthorizationSet begin_out_params;
6077 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params, &begin_out_params));
6078 string ciphertext;
6079 AuthorizationSet finish_out_params;
Shawn Willden92d79c02021-02-19 07:31:55 -07006080 ASSERT_EQ(ErrorCode::OK, UpdateAad(aad));
6081 EXPECT_EQ(ErrorCode::OK, Finish(&ciphertext));
Selene Huang31ab4042020-04-29 04:22:39 -07006082 EXPECT_TRUE(finish_out_params.empty());
6083
6084 // Grab nonce
6085 params.push_back(begin_out_params);
6086
6087 // Decrypt.
6088 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params));
Shawn Willden92d79c02021-02-19 07:31:55 -07006089 ASSERT_EQ(ErrorCode::OK, UpdateAad(aad));
Selene Huang31ab4042020-04-29 04:22:39 -07006090 string plaintext;
Shawn Willden92d79c02021-02-19 07:31:55 -07006091 EXPECT_EQ(ErrorCode::OK, Finish(ciphertext, &plaintext));
Selene Huang31ab4042020-04-29 04:22:39 -07006092
6093 EXPECT_TRUE(finish_out_params.empty());
6094
6095 EXPECT_EQ("", plaintext);
6096}
6097
6098/*
6099 * EncryptionOperationsTest.AesGcmMultiPartAad
6100 *
6101 * Verifies that AES GCM mode works when provided additional authenticated data in multiple
6102 * chunks.
6103 */
6104TEST_P(EncryptionOperationsTest, AesGcmMultiPartAad) {
6105 const size_t tag_bits = 128;
6106 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6107 .Authorization(TAG_NO_AUTH_REQUIRED)
6108 .AesEncryptionKey(128)
6109 .BlockMode(BlockMode::GCM)
6110 .Padding(PaddingMode::NONE)
6111 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
6112
6113 string message = "123456789012345678901234567890123456";
6114 auto begin_params = AuthorizationSetBuilder()
6115 .BlockMode(BlockMode::GCM)
6116 .Padding(PaddingMode::NONE)
6117 .Authorization(TAG_MAC_LENGTH, tag_bits);
6118 AuthorizationSet begin_out_params;
6119
Selene Huang31ab4042020-04-29 04:22:39 -07006120 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params));
6121
6122 // No data, AAD only.
Shawn Willden92d79c02021-02-19 07:31:55 -07006123 EXPECT_EQ(ErrorCode::OK, UpdateAad("foo"));
6124 EXPECT_EQ(ErrorCode::OK, UpdateAad("foo"));
Selene Huang31ab4042020-04-29 04:22:39 -07006125 string ciphertext;
Shawn Willden92d79c02021-02-19 07:31:55 -07006126 EXPECT_EQ(ErrorCode::OK, Update(message, &ciphertext));
6127 EXPECT_EQ(ErrorCode::OK, Finish(&ciphertext));
Selene Huang31ab4042020-04-29 04:22:39 -07006128
Selene Huang31ab4042020-04-29 04:22:39 -07006129 // Expect 128-bit (16-byte) tag appended to ciphertext.
Shawn Willden92d79c02021-02-19 07:31:55 -07006130 EXPECT_EQ(message.size() + (tag_bits / 8), ciphertext.size());
Selene Huang31ab4042020-04-29 04:22:39 -07006131
6132 // Grab nonce.
6133 begin_params.push_back(begin_out_params);
6134
6135 // Decrypt
Selene Huang31ab4042020-04-29 04:22:39 -07006136 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params));
Shawn Willden92d79c02021-02-19 07:31:55 -07006137 EXPECT_EQ(ErrorCode::OK, UpdateAad("foofoo"));
Selene Huang31ab4042020-04-29 04:22:39 -07006138 string plaintext;
Shawn Willden92d79c02021-02-19 07:31:55 -07006139 EXPECT_EQ(ErrorCode::OK, Finish(ciphertext, &plaintext));
Selene Huang31ab4042020-04-29 04:22:39 -07006140 EXPECT_EQ(message, plaintext);
6141}
6142
6143/*
6144 * EncryptionOperationsTest.AesGcmAadOutOfOrder
6145 *
6146 * Verifies that AES GCM mode fails correctly when given AAD after data to encipher.
6147 */
6148TEST_P(EncryptionOperationsTest, AesGcmAadOutOfOrder) {
6149 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6150 .Authorization(TAG_NO_AUTH_REQUIRED)
6151 .AesEncryptionKey(128)
6152 .BlockMode(BlockMode::GCM)
6153 .Padding(PaddingMode::NONE)
6154 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
6155
6156 string message = "123456789012345678901234567890123456";
6157 auto begin_params = AuthorizationSetBuilder()
6158 .BlockMode(BlockMode::GCM)
6159 .Padding(PaddingMode::NONE)
6160 .Authorization(TAG_MAC_LENGTH, 128);
6161 AuthorizationSet begin_out_params;
6162
Selene Huang31ab4042020-04-29 04:22:39 -07006163 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params));
6164
Shawn Willden92d79c02021-02-19 07:31:55 -07006165 EXPECT_EQ(ErrorCode::OK, UpdateAad("foo"));
Selene Huang31ab4042020-04-29 04:22:39 -07006166 string ciphertext;
Shawn Willden92d79c02021-02-19 07:31:55 -07006167 EXPECT_EQ(ErrorCode::OK, Update(message, &ciphertext));
6168 EXPECT_EQ(ErrorCode::INVALID_TAG, UpdateAad("foo"));
Selene Huang31ab4042020-04-29 04:22:39 -07006169
David Drysdaled2cc8c22021-04-15 13:29:45 +01006170 // The failure should have already cancelled the operation.
6171 EXPECT_EQ(ErrorCode::INVALID_OPERATION_HANDLE, Abort());
6172
Shawn Willden92d79c02021-02-19 07:31:55 -07006173 op_ = {};
Selene Huang31ab4042020-04-29 04:22:39 -07006174}
6175
6176/*
6177 * EncryptionOperationsTest.AesGcmBadAad
6178 *
6179 * Verifies that AES GCM decryption fails correctly when additional authenticated date is wrong.
6180 */
6181TEST_P(EncryptionOperationsTest, AesGcmBadAad) {
6182 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6183 .Authorization(TAG_NO_AUTH_REQUIRED)
6184 .AesEncryptionKey(128)
6185 .BlockMode(BlockMode::GCM)
6186 .Padding(PaddingMode::NONE)
6187 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
6188
6189 string message = "12345678901234567890123456789012";
6190 auto begin_params = AuthorizationSetBuilder()
6191 .BlockMode(BlockMode::GCM)
6192 .Padding(PaddingMode::NONE)
6193 .Authorization(TAG_MAC_LENGTH, 128);
6194
Selene Huang31ab4042020-04-29 04:22:39 -07006195 // Encrypt
6196 AuthorizationSet begin_out_params;
6197 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params));
Shawn Willden92d79c02021-02-19 07:31:55 -07006198 EXPECT_EQ(ErrorCode::OK, UpdateAad("foobar"));
Selene Huang31ab4042020-04-29 04:22:39 -07006199 string ciphertext;
Shawn Willden92d79c02021-02-19 07:31:55 -07006200 EXPECT_EQ(ErrorCode::OK, Finish(message, &ciphertext));
Selene Huang31ab4042020-04-29 04:22:39 -07006201
6202 // Grab nonce
6203 begin_params.push_back(begin_out_params);
6204
Selene Huang31ab4042020-04-29 04:22:39 -07006205 // Decrypt.
6206 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params, &begin_out_params));
Shawn Willden92d79c02021-02-19 07:31:55 -07006207 EXPECT_EQ(ErrorCode::OK, UpdateAad("barfoo"));
Selene Huang31ab4042020-04-29 04:22:39 -07006208 string plaintext;
Shawn Willden92d79c02021-02-19 07:31:55 -07006209 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(ciphertext, &plaintext));
Selene Huang31ab4042020-04-29 04:22:39 -07006210}
6211
6212/*
6213 * EncryptionOperationsTest.AesGcmWrongNonce
6214 *
6215 * Verifies that AES GCM decryption fails correctly when the nonce is incorrect.
6216 */
6217TEST_P(EncryptionOperationsTest, AesGcmWrongNonce) {
6218 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6219 .Authorization(TAG_NO_AUTH_REQUIRED)
6220 .AesEncryptionKey(128)
6221 .BlockMode(BlockMode::GCM)
6222 .Padding(PaddingMode::NONE)
6223 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
6224
6225 string message = "12345678901234567890123456789012";
6226 auto begin_params = AuthorizationSetBuilder()
6227 .BlockMode(BlockMode::GCM)
6228 .Padding(PaddingMode::NONE)
6229 .Authorization(TAG_MAC_LENGTH, 128);
6230
Selene Huang31ab4042020-04-29 04:22:39 -07006231 // Encrypt
6232 AuthorizationSet begin_out_params;
6233 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params));
Shawn Willden92d79c02021-02-19 07:31:55 -07006234 EXPECT_EQ(ErrorCode::OK, UpdateAad("foobar"));
Selene Huang31ab4042020-04-29 04:22:39 -07006235 string ciphertext;
6236 AuthorizationSet finish_out_params;
Shawn Willden92d79c02021-02-19 07:31:55 -07006237 EXPECT_EQ(ErrorCode::OK, Finish(message, &ciphertext));
Selene Huang31ab4042020-04-29 04:22:39 -07006238
6239 // Wrong nonce
6240 begin_params.push_back(TAG_NONCE, AidlBuf("123456789012"));
6241
6242 // Decrypt.
6243 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params, &begin_out_params));
Shawn Willden92d79c02021-02-19 07:31:55 -07006244 EXPECT_EQ(ErrorCode::OK, UpdateAad("foobar"));
Selene Huang31ab4042020-04-29 04:22:39 -07006245 string plaintext;
Shawn Willden92d79c02021-02-19 07:31:55 -07006246 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(ciphertext, &plaintext));
Selene Huang31ab4042020-04-29 04:22:39 -07006247
6248 // With wrong nonce, should have gotten garbage plaintext (or none).
6249 EXPECT_NE(message, plaintext);
6250}
6251
6252/*
6253 * EncryptionOperationsTest.AesGcmCorruptTag
6254 *
6255 * Verifies that AES GCM decryption fails correctly when the tag is wrong.
6256 */
6257TEST_P(EncryptionOperationsTest, AesGcmCorruptTag) {
6258 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6259 .Authorization(TAG_NO_AUTH_REQUIRED)
6260 .AesEncryptionKey(128)
6261 .BlockMode(BlockMode::GCM)
6262 .Padding(PaddingMode::NONE)
6263 .Authorization(TAG_MIN_MAC_LENGTH, 128)));
6264
6265 string aad = "1234567890123456";
6266 string message = "123456789012345678901234567890123456";
6267
6268 auto params = AuthorizationSetBuilder()
6269 .BlockMode(BlockMode::GCM)
6270 .Padding(PaddingMode::NONE)
6271 .Authorization(TAG_MAC_LENGTH, 128);
6272
Selene Huang31ab4042020-04-29 04:22:39 -07006273 // Encrypt
6274 AuthorizationSet begin_out_params;
6275 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params, &begin_out_params));
Shawn Willden92d79c02021-02-19 07:31:55 -07006276 EXPECT_EQ(ErrorCode::OK, UpdateAad(aad));
Selene Huang31ab4042020-04-29 04:22:39 -07006277 string ciphertext;
Shawn Willden92d79c02021-02-19 07:31:55 -07006278 EXPECT_EQ(ErrorCode::OK, Finish(message, &ciphertext));
Selene Huang31ab4042020-04-29 04:22:39 -07006279
6280 // Corrupt tag
6281 ++(*ciphertext.rbegin());
6282
6283 // Grab nonce
6284 params.push_back(begin_out_params);
6285
6286 // Decrypt.
6287 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params));
Shawn Willden92d79c02021-02-19 07:31:55 -07006288 EXPECT_EQ(ErrorCode::OK, UpdateAad(aad));
Selene Huang31ab4042020-04-29 04:22:39 -07006289 string plaintext;
Shawn Willden92d79c02021-02-19 07:31:55 -07006290 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(ciphertext, &plaintext));
Selene Huang31ab4042020-04-29 04:22:39 -07006291}
6292
6293/*
6294 * EncryptionOperationsTest.TripleDesEcbRoundTripSuccess
6295 *
6296 * Verifies that 3DES is basically functional.
6297 */
6298TEST_P(EncryptionOperationsTest, TripleDesEcbRoundTripSuccess) {
6299 auto auths = AuthorizationSetBuilder()
6300 .TripleDesEncryptionKey(168)
6301 .BlockMode(BlockMode::ECB)
6302 .Authorization(TAG_NO_AUTH_REQUIRED)
6303 .Padding(PaddingMode::NONE);
6304
6305 ASSERT_EQ(ErrorCode::OK, GenerateKey(auths));
6306 // Two-block message.
6307 string message = "1234567890123456";
6308 auto inParams = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::NONE);
6309 string ciphertext1 = EncryptMessage(message, inParams);
6310 EXPECT_EQ(message.size(), ciphertext1.size());
6311
6312 string ciphertext2 = EncryptMessage(string(message), inParams);
6313 EXPECT_EQ(message.size(), ciphertext2.size());
6314
6315 // ECB is deterministic.
6316 EXPECT_EQ(ciphertext1, ciphertext2);
6317
6318 string plaintext = DecryptMessage(ciphertext1, inParams);
6319 EXPECT_EQ(message, plaintext);
6320}
6321
6322/*
6323 * EncryptionOperationsTest.TripleDesEcbNotAuthorized
6324 *
6325 * Verifies that CBC keys reject ECB usage.
6326 */
6327TEST_P(EncryptionOperationsTest, TripleDesEcbNotAuthorized) {
6328 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6329 .TripleDesEncryptionKey(168)
6330 .BlockMode(BlockMode::CBC)
6331 .Authorization(TAG_NO_AUTH_REQUIRED)
6332 .Padding(PaddingMode::NONE)));
6333
6334 auto inParams = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::NONE);
6335 EXPECT_EQ(ErrorCode::INCOMPATIBLE_BLOCK_MODE, Begin(KeyPurpose::ENCRYPT, inParams));
6336}
6337
6338/*
6339 * EncryptionOperationsTest.TripleDesEcbPkcs7Padding
6340 *
6341 * Tests ECB mode with PKCS#7 padding, various message sizes.
6342 */
6343TEST_P(EncryptionOperationsTest, TripleDesEcbPkcs7Padding) {
6344 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6345 .TripleDesEncryptionKey(168)
6346 .BlockMode(BlockMode::ECB)
6347 .Authorization(TAG_NO_AUTH_REQUIRED)
6348 .Padding(PaddingMode::PKCS7)));
6349
6350 for (size_t i = 0; i < 32; ++i) {
6351 string message(i, 'a');
6352 auto inParams =
6353 AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7);
6354 string ciphertext = EncryptMessage(message, inParams);
6355 EXPECT_EQ(i + 8 - (i % 8), ciphertext.size());
6356 string plaintext = DecryptMessage(ciphertext, inParams);
6357 EXPECT_EQ(message, plaintext);
6358 }
6359}
6360
6361/*
6362 * EncryptionOperationsTest.TripleDesEcbNoPaddingKeyWithPkcs7Padding
6363 *
6364 * Verifies that keys configured for no padding reject PKCS7 padding
6365 */
6366TEST_P(EncryptionOperationsTest, TripleDesEcbNoPaddingKeyWithPkcs7Padding) {
6367 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6368 .TripleDesEncryptionKey(168)
6369 .BlockMode(BlockMode::ECB)
6370 .Authorization(TAG_NO_AUTH_REQUIRED)
6371 .Padding(PaddingMode::NONE)));
David Drysdale7de9feb2021-03-05 14:56:19 +00006372 auto inParams = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7);
6373 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PADDING_MODE, Begin(KeyPurpose::ENCRYPT, inParams));
Selene Huang31ab4042020-04-29 04:22:39 -07006374}
6375
6376/*
6377 * EncryptionOperationsTest.TripleDesEcbPkcs7PaddingCorrupted
6378 *
6379 * Verifies that corrupted padding is detected.
6380 */
6381TEST_P(EncryptionOperationsTest, TripleDesEcbPkcs7PaddingCorrupted) {
6382 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6383 .TripleDesEncryptionKey(168)
6384 .BlockMode(BlockMode::ECB)
6385 .Authorization(TAG_NO_AUTH_REQUIRED)
6386 .Padding(PaddingMode::PKCS7)));
6387
6388 string message = "a";
6389 string ciphertext = EncryptMessage(message, BlockMode::ECB, PaddingMode::PKCS7);
6390 EXPECT_EQ(8U, ciphertext.size());
6391 EXPECT_NE(ciphertext, message);
Selene Huang31ab4042020-04-29 04:22:39 -07006392
6393 AuthorizationSetBuilder begin_params;
6394 begin_params.push_back(TAG_BLOCK_MODE, BlockMode::ECB);
6395 begin_params.push_back(TAG_PADDING, PaddingMode::PKCS7);
Seth Moore7a55ae32021-06-23 14:28:11 -07006396
6397 for (size_t i = 0; i < kMaxPaddingCorruptionRetries; ++i) {
6398 ++ciphertext[ciphertext.size() / 2];
6399
6400 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params));
6401 string plaintext;
6402 EXPECT_EQ(ErrorCode::OK, Update(ciphertext, &plaintext));
6403 ErrorCode error = Finish(&plaintext);
6404 if (error == ErrorCode::INVALID_ARGUMENT) {
6405 // This is the expected error, we can exit the test now.
6406 return;
6407 } else {
6408 // Very small chance we got valid decryption, so try again.
6409 ASSERT_EQ(error, ErrorCode::OK);
6410 }
6411 }
6412 FAIL() << "Corrupt ciphertext should have failed to decrypt by now.";
Selene Huang31ab4042020-04-29 04:22:39 -07006413}
6414
6415struct TripleDesTestVector {
6416 const char* name;
6417 const KeyPurpose purpose;
6418 const BlockMode block_mode;
6419 const PaddingMode padding_mode;
6420 const char* key;
6421 const char* iv;
6422 const char* input;
6423 const char* output;
6424};
6425
6426// These test vectors are from NIST CAVP, plus a few custom variants to test padding, since all
6427// of the NIST vectors are multiples of the block size.
6428static const TripleDesTestVector kTripleDesTestVectors[] = {
6429 {
6430 "TECBMMT3 Encrypt 0", KeyPurpose::ENCRYPT, BlockMode::ECB, PaddingMode::NONE,
6431 "a2b5bc67da13dc92cd9d344aa238544a0e1fa79ef76810cd", // key
6432 "", // IV
6433 "329d86bdf1bc5af4", // input
6434 "d946c2756d78633f", // output
6435 },
6436 {
6437 "TECBMMT3 Encrypt 1", KeyPurpose::ENCRYPT, BlockMode::ECB, PaddingMode::NONE,
6438 "49e692290d2a5e46bace79b9648a4c5d491004c262dc9d49", // key
6439 "", // IV
6440 "6b1540781b01ce1997adae102dbf3c5b", // input
6441 "4d0dc182d6e481ac4a3dc6ab6976ccae", // output
6442 },
6443 {
6444 "TECBMMT3 Decrypt 0", KeyPurpose::DECRYPT, BlockMode::ECB, PaddingMode::NONE,
6445 "52daec2ac7dc1958377392682f37860b2cc1ea2304bab0e9", // key
6446 "", // IV
6447 "6daad94ce08acfe7", // input
6448 "660e7d32dcc90e79", // output
6449 },
6450 {
6451 "TECBMMT3 Decrypt 1", KeyPurpose::DECRYPT, BlockMode::ECB, PaddingMode::NONE,
6452 "7f8fe3d3f4a48394fb682c2919926d6ddfce8932529229ce", // key
6453 "", // IV
6454 "e9653a0a1f05d31b9acd12d73aa9879d", // input
6455 "9b2ae9d998efe62f1b592e7e1df8ff38", // output
6456 },
6457 {
6458 "TCBCMMT3 Encrypt 0", KeyPurpose::ENCRYPT, BlockMode::CBC, PaddingMode::NONE,
6459 "b5cb1504802326c73df186e3e352a20de643b0d63ee30e37", // key
6460 "43f791134c5647ba", // IV
6461 "dcc153cef81d6f24", // input
6462 "92538bd8af18d3ba", // output
6463 },
6464 {
6465 "TCBCMMT3 Encrypt 1", KeyPurpose::ENCRYPT, BlockMode::CBC, PaddingMode::NONE,
6466 "a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f7358", // key
6467 "c2e999cb6249023c", // IV
6468 "c689aee38a301bb316da75db36f110b5", // input
6469 "e9afaba5ec75ea1bbe65506655bb4ecb", // output
6470 },
6471 {
6472 "TCBCMMT3 Encrypt 1 PKCS7 variant", KeyPurpose::ENCRYPT, BlockMode::CBC,
6473 PaddingMode::PKCS7,
6474 "a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f7358", // key
6475 "c2e999cb6249023c", // IV
6476 "c689aee38a301bb316da75db36f110b500", // input
6477 "e9afaba5ec75ea1bbe65506655bb4ecb825aa27ec0656156", // output
6478 },
6479 {
6480 "TCBCMMT3 Encrypt 1 PKCS7 decrypted", KeyPurpose::DECRYPT, BlockMode::CBC,
6481 PaddingMode::PKCS7,
6482 "a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f7358", // key
6483 "c2e999cb6249023c", // IV
6484 "e9afaba5ec75ea1bbe65506655bb4ecb825aa27ec0656156", // input
6485 "c689aee38a301bb316da75db36f110b500", // output
6486 },
6487 {
6488 "TCBCMMT3 Decrypt 0", KeyPurpose::DECRYPT, BlockMode::CBC, PaddingMode::NONE,
6489 "5eb6040d46082c7aa7d06dfd08dfeac8c18364c1548c3ba1", // key
6490 "41746c7e442d3681", // IV
6491 "c53a7b0ec40600fe", // input
6492 "d4f00eb455de1034", // output
6493 },
6494 {
6495 "TCBCMMT3 Decrypt 1", KeyPurpose::DECRYPT, BlockMode::CBC, PaddingMode::NONE,
6496 "5b1cce7c0dc1ec49130dfb4af45785ab9179e567f2c7d549", // key
6497 "3982bc02c3727d45", // IV
6498 "6006f10adef52991fcc777a1238bbb65", // input
6499 "edae09288e9e3bc05746d872b48e3b29", // output
6500 },
6501};
6502
6503/*
6504 * EncryptionOperationsTest.TripleDesTestVector
6505 *
6506 * Verifies that NIST (plus a few extra) test vectors produce the correct results.
6507 */
6508TEST_P(EncryptionOperationsTest, TripleDesTestVector) {
6509 constexpr size_t num_tests = sizeof(kTripleDesTestVectors) / sizeof(TripleDesTestVector);
6510 for (auto* test = kTripleDesTestVectors; test < kTripleDesTestVectors + num_tests; ++test) {
6511 SCOPED_TRACE(test->name);
6512 CheckTripleDesTestVector(test->purpose, test->block_mode, test->padding_mode,
6513 hex2str(test->key), hex2str(test->iv), hex2str(test->input),
6514 hex2str(test->output));
6515 }
6516}
6517
6518/*
6519 * EncryptionOperationsTest.TripleDesCbcRoundTripSuccess
6520 *
6521 * Validates CBC mode functionality.
6522 */
6523TEST_P(EncryptionOperationsTest, TripleDesCbcRoundTripSuccess) {
6524 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6525 .TripleDesEncryptionKey(168)
6526 .BlockMode(BlockMode::CBC)
6527 .Authorization(TAG_NO_AUTH_REQUIRED)
6528 .Padding(PaddingMode::NONE)));
6529
6530 ASSERT_GT(key_blob_.size(), 0U);
6531
Brian J Murray734c8412022-01-13 14:55:30 -08006532 // Four-block message.
6533 string message = "12345678901234561234567890123456";
Selene Huang31ab4042020-04-29 04:22:39 -07006534 vector<uint8_t> iv1;
6535 string ciphertext1 = EncryptMessage(message, BlockMode::CBC, PaddingMode::NONE, &iv1);
6536 EXPECT_EQ(message.size(), ciphertext1.size());
6537
6538 vector<uint8_t> iv2;
6539 string ciphertext2 = EncryptMessage(message, BlockMode::CBC, PaddingMode::NONE, &iv2);
6540 EXPECT_EQ(message.size(), ciphertext2.size());
6541
6542 // IVs should be random, so ciphertexts should differ.
6543 EXPECT_NE(iv1, iv2);
6544 EXPECT_NE(ciphertext1, ciphertext2);
6545
6546 string plaintext = DecryptMessage(ciphertext1, BlockMode::CBC, PaddingMode::NONE, iv1);
6547 EXPECT_EQ(message, plaintext);
6548}
6549
6550/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01006551 * EncryptionOperationsTest.TripleDesInvalidCallerIv
6552 *
6553 * Validates that keymint fails correctly when the user supplies an incorrect-size IV.
6554 */
6555TEST_P(EncryptionOperationsTest, TripleDesInvalidCallerIv) {
6556 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6557 .TripleDesEncryptionKey(168)
6558 .BlockMode(BlockMode::CBC)
6559 .Authorization(TAG_NO_AUTH_REQUIRED)
6560 .Authorization(TAG_CALLER_NONCE)
6561 .Padding(PaddingMode::NONE)));
6562 auto params = AuthorizationSetBuilder()
6563 .BlockMode(BlockMode::CBC)
6564 .Padding(PaddingMode::NONE)
6565 .Authorization(TAG_NONCE, AidlBuf("abcdefg"));
6566 EXPECT_EQ(ErrorCode::INVALID_NONCE, Begin(KeyPurpose::ENCRYPT, params));
6567}
6568
6569/*
Selene Huang31ab4042020-04-29 04:22:39 -07006570 * EncryptionOperationsTest.TripleDesCallerIv
6571 *
6572 * Validates that 3DES keys can allow caller-specified IVs, and use them correctly.
6573 */
6574TEST_P(EncryptionOperationsTest, TripleDesCallerIv) {
6575 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6576 .TripleDesEncryptionKey(168)
6577 .BlockMode(BlockMode::CBC)
6578 .Authorization(TAG_NO_AUTH_REQUIRED)
6579 .Authorization(TAG_CALLER_NONCE)
6580 .Padding(PaddingMode::NONE)));
6581 string message = "1234567890123456";
6582 vector<uint8_t> iv;
6583 // Don't specify IV, should get a random one.
6584 string ciphertext1 = EncryptMessage(message, BlockMode::CBC, PaddingMode::NONE, &iv);
6585 EXPECT_EQ(message.size(), ciphertext1.size());
6586 EXPECT_EQ(8U, iv.size());
6587
6588 string plaintext = DecryptMessage(ciphertext1, BlockMode::CBC, PaddingMode::NONE, iv);
6589 EXPECT_EQ(message, plaintext);
6590
6591 // Now specify an IV, should also work.
6592 iv = AidlBuf("abcdefgh");
6593 string ciphertext2 = EncryptMessage(message, BlockMode::CBC, PaddingMode::NONE, iv);
6594
6595 // Decrypt with correct IV.
6596 plaintext = DecryptMessage(ciphertext2, BlockMode::CBC, PaddingMode::NONE, iv);
6597 EXPECT_EQ(message, plaintext);
6598
6599 // Now try with wrong IV.
6600 plaintext = DecryptMessage(ciphertext2, BlockMode::CBC, PaddingMode::NONE, AidlBuf("aaaaaaaa"));
6601 EXPECT_NE(message, plaintext);
6602}
6603
6604/*
6605 * EncryptionOperationsTest, TripleDesCallerNonceProhibited.
6606 *
David Drysdaled2cc8c22021-04-15 13:29:45 +01006607 * Verifies that 3DES keys without TAG_CALLER_NONCE do not allow caller-specified IVs.
Selene Huang31ab4042020-04-29 04:22:39 -07006608 */
6609TEST_P(EncryptionOperationsTest, TripleDesCallerNonceProhibited) {
6610 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6611 .TripleDesEncryptionKey(168)
6612 .BlockMode(BlockMode::CBC)
6613 .Authorization(TAG_NO_AUTH_REQUIRED)
6614 .Padding(PaddingMode::NONE)));
6615
6616 string message = "12345678901234567890123456789012";
6617 vector<uint8_t> iv;
6618 // Don't specify nonce, should get a random one.
6619 string ciphertext1 = EncryptMessage(message, BlockMode::CBC, PaddingMode::NONE, &iv);
6620 EXPECT_EQ(message.size(), ciphertext1.size());
6621 EXPECT_EQ(8U, iv.size());
6622
6623 string plaintext = DecryptMessage(ciphertext1, BlockMode::CBC, PaddingMode::NONE, iv);
6624 EXPECT_EQ(message, plaintext);
6625
6626 // Now specify a nonce, should fail.
6627 auto input_params = AuthorizationSetBuilder()
6628 .Authorization(TAG_NONCE, AidlBuf("abcdefgh"))
6629 .BlockMode(BlockMode::CBC)
6630 .Padding(PaddingMode::NONE);
6631 AuthorizationSet output_params;
6632 EXPECT_EQ(ErrorCode::CALLER_NONCE_PROHIBITED,
6633 Begin(KeyPurpose::ENCRYPT, input_params, &output_params));
6634}
6635
6636/*
6637 * EncryptionOperationsTest.TripleDesCbcNotAuthorized
6638 *
6639 * Verifies that 3DES ECB-only keys do not allow CBC usage.
6640 */
6641TEST_P(EncryptionOperationsTest, TripleDesCbcNotAuthorized) {
6642 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6643 .TripleDesEncryptionKey(168)
6644 .BlockMode(BlockMode::ECB)
6645 .Authorization(TAG_NO_AUTH_REQUIRED)
6646 .Padding(PaddingMode::NONE)));
6647 // Two-block message.
6648 string message = "1234567890123456";
6649 auto begin_params =
6650 AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::NONE);
6651 EXPECT_EQ(ErrorCode::INCOMPATIBLE_BLOCK_MODE, Begin(KeyPurpose::ENCRYPT, begin_params));
6652}
6653
6654/*
David Drysdaled2cc8c22021-04-15 13:29:45 +01006655 * EncryptionOperationsTest.TripleDesEcbCbcNoPaddingWrongInputSize
Selene Huang31ab4042020-04-29 04:22:39 -07006656 *
6657 * Verifies that unpadded CBC operations reject inputs that are not a multiple of block size.
6658 */
David Drysdaled2cc8c22021-04-15 13:29:45 +01006659TEST_P(EncryptionOperationsTest, TripleDesEcbCbcNoPaddingWrongInputSize) {
6660 for (BlockMode blockMode : {BlockMode::ECB, BlockMode::CBC}) {
6661 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6662 .TripleDesEncryptionKey(168)
6663 .BlockMode(blockMode)
6664 .Authorization(TAG_NO_AUTH_REQUIRED)
6665 .Padding(PaddingMode::NONE)));
6666 // Message is slightly shorter than two blocks.
6667 string message = "123456789012345";
Selene Huang31ab4042020-04-29 04:22:39 -07006668
David Drysdaled2cc8c22021-04-15 13:29:45 +01006669 auto begin_params =
6670 AuthorizationSetBuilder().BlockMode(blockMode).Padding(PaddingMode::NONE);
6671 AuthorizationSet output_params;
6672 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &output_params));
6673 string ciphertext;
6674 EXPECT_EQ(ErrorCode::INVALID_INPUT_LENGTH, Finish(message, "", &ciphertext));
6675
6676 CheckedDeleteKey();
6677 }
Selene Huang31ab4042020-04-29 04:22:39 -07006678}
6679
6680/*
6681 * EncryptionOperationsTest, TripleDesCbcPkcs7Padding.
6682 *
6683 * Verifies that PKCS7 padding works correctly in CBC mode.
6684 */
6685TEST_P(EncryptionOperationsTest, TripleDesCbcPkcs7Padding) {
6686 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6687 .TripleDesEncryptionKey(168)
6688 .BlockMode(BlockMode::CBC)
6689 .Authorization(TAG_NO_AUTH_REQUIRED)
6690 .Padding(PaddingMode::PKCS7)));
6691
6692 // Try various message lengths; all should work.
Brian J Murray734c8412022-01-13 14:55:30 -08006693 for (size_t i = 0; i <= 32; i++) {
6694 SCOPED_TRACE(testing::Message() << "i = " << i);
6695 // Edge case: '\t' (0x09) is also a valid PKCS7 padding character, albeit not for 3DES.
6696 string message(i, '\t');
Selene Huang31ab4042020-04-29 04:22:39 -07006697 vector<uint8_t> iv;
6698 string ciphertext = EncryptMessage(message, BlockMode::CBC, PaddingMode::PKCS7, &iv);
6699 EXPECT_EQ(i + 8 - (i % 8), ciphertext.size());
6700 string plaintext = DecryptMessage(ciphertext, BlockMode::CBC, PaddingMode::PKCS7, iv);
6701 EXPECT_EQ(message, plaintext);
6702 }
6703}
6704
6705/*
6706 * EncryptionOperationsTest.TripleDesCbcNoPaddingKeyWithPkcs7Padding
6707 *
6708 * Verifies that a key that requires PKCS7 padding cannot be used in unpadded mode.
6709 */
6710TEST_P(EncryptionOperationsTest, TripleDesCbcNoPaddingKeyWithPkcs7Padding) {
6711 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6712 .TripleDesEncryptionKey(168)
6713 .BlockMode(BlockMode::CBC)
6714 .Authorization(TAG_NO_AUTH_REQUIRED)
6715 .Padding(PaddingMode::NONE)));
6716
6717 // Try various message lengths; all should fail.
Brian J Murray734c8412022-01-13 14:55:30 -08006718 for (size_t i = 0; i <= 32; i++) {
Selene Huang31ab4042020-04-29 04:22:39 -07006719 auto begin_params =
6720 AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::PKCS7);
6721 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PADDING_MODE, Begin(KeyPurpose::ENCRYPT, begin_params));
6722 }
6723}
6724
6725/*
6726 * EncryptionOperationsTest.TripleDesCbcPkcs7PaddingCorrupted
6727 *
6728 * Verifies that corrupted PKCS7 padding is rejected during decryption.
6729 */
6730TEST_P(EncryptionOperationsTest, TripleDesCbcPkcs7PaddingCorrupted) {
6731 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6732 .TripleDesEncryptionKey(168)
6733 .BlockMode(BlockMode::CBC)
6734 .Authorization(TAG_NO_AUTH_REQUIRED)
6735 .Padding(PaddingMode::PKCS7)));
6736
6737 string message = "a";
6738 vector<uint8_t> iv;
6739 string ciphertext = EncryptMessage(message, BlockMode::CBC, PaddingMode::PKCS7, &iv);
6740 EXPECT_EQ(8U, ciphertext.size());
6741 EXPECT_NE(ciphertext, message);
Selene Huang31ab4042020-04-29 04:22:39 -07006742
6743 auto begin_params = AuthorizationSetBuilder()
6744 .BlockMode(BlockMode::CBC)
6745 .Padding(PaddingMode::PKCS7)
6746 .Authorization(TAG_NONCE, iv);
Seth Moore7a55ae32021-06-23 14:28:11 -07006747
6748 for (size_t i = 0; i < kMaxPaddingCorruptionRetries; ++i) {
Brian J Murray734c8412022-01-13 14:55:30 -08006749 SCOPED_TRACE(testing::Message() << "i = " << i);
Seth Moore7a55ae32021-06-23 14:28:11 -07006750 ++ciphertext[ciphertext.size() / 2];
6751 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params));
6752 string plaintext;
6753 EXPECT_EQ(ErrorCode::OK, Update(ciphertext, &plaintext));
6754 ErrorCode error = Finish(&plaintext);
6755 if (error == ErrorCode::INVALID_ARGUMENT) {
6756 // This is the expected error, we can exit the test now.
6757 return;
6758 } else {
6759 // Very small chance we got valid decryption, so try again.
6760 ASSERT_EQ(error, ErrorCode::OK);
6761 }
6762 }
6763 FAIL() << "Corrupt ciphertext should have failed to decrypt by now.";
Selene Huang31ab4042020-04-29 04:22:39 -07006764}
6765
6766/*
6767 * EncryptionOperationsTest, TripleDesCbcIncrementalNoPadding.
6768 *
6769 * Verifies that 3DES CBC works with many different input sizes.
6770 */
6771TEST_P(EncryptionOperationsTest, TripleDesCbcIncrementalNoPadding) {
6772 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6773 .TripleDesEncryptionKey(168)
6774 .BlockMode(BlockMode::CBC)
6775 .Authorization(TAG_NO_AUTH_REQUIRED)
6776 .Padding(PaddingMode::NONE)));
6777
6778 int increment = 7;
6779 string message(240, 'a');
6780 AuthorizationSet input_params =
6781 AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::NONE);
6782 AuthorizationSet output_params;
6783 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, input_params, &output_params));
6784
6785 string ciphertext;
Selene Huang31ab4042020-04-29 04:22:39 -07006786 for (size_t i = 0; i < message.size(); i += increment)
Shawn Willden92d79c02021-02-19 07:31:55 -07006787 EXPECT_EQ(ErrorCode::OK, Update(message.substr(i, increment), &ciphertext));
Selene Huang31ab4042020-04-29 04:22:39 -07006788 EXPECT_EQ(ErrorCode::OK, Finish(&ciphertext));
6789 EXPECT_EQ(message.size(), ciphertext.size());
6790
6791 // Move TAG_NONCE into input_params
6792 input_params = output_params;
6793 input_params.push_back(TAG_BLOCK_MODE, BlockMode::CBC);
6794 input_params.push_back(TAG_PADDING, PaddingMode::NONE);
6795 output_params.Clear();
6796
6797 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, input_params, &output_params));
6798 string plaintext;
6799 for (size_t i = 0; i < ciphertext.size(); i += increment)
Shawn Willden92d79c02021-02-19 07:31:55 -07006800 EXPECT_EQ(ErrorCode::OK, Update(ciphertext.substr(i, increment), &plaintext));
Selene Huang31ab4042020-04-29 04:22:39 -07006801 EXPECT_EQ(ErrorCode::OK, Finish(&plaintext));
6802 EXPECT_EQ(ciphertext.size(), plaintext.size());
6803 EXPECT_EQ(message, plaintext);
6804}
6805
6806INSTANTIATE_KEYMINT_AIDL_TEST(EncryptionOperationsTest);
6807
6808typedef KeyMintAidlTestBase MaxOperationsTest;
6809
6810/*
6811 * MaxOperationsTest.TestLimitAes
6812 *
6813 * Verifies that the max uses per boot tag works correctly with AES keys.
6814 */
6815TEST_P(MaxOperationsTest, TestLimitAes) {
David Drysdale513bf122021-10-06 11:53:13 +01006816 if (SecLevel() == SecurityLevel::STRONGBOX) {
6817 GTEST_SKIP() << "Test not applicable to StrongBox device";
6818 }
Selene Huang31ab4042020-04-29 04:22:39 -07006819
6820 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6821 .Authorization(TAG_NO_AUTH_REQUIRED)
6822 .AesEncryptionKey(128)
6823 .EcbMode()
6824 .Padding(PaddingMode::NONE)
6825 .Authorization(TAG_MAX_USES_PER_BOOT, 3)));
6826
6827 string message = "1234567890123456";
6828
6829 auto params = AuthorizationSetBuilder().EcbMode().Padding(PaddingMode::NONE);
6830
6831 EncryptMessage(message, params);
6832 EncryptMessage(message, params);
6833 EncryptMessage(message, params);
6834
6835 // Fourth time should fail.
6836 EXPECT_EQ(ErrorCode::KEY_MAX_OPS_EXCEEDED, Begin(KeyPurpose::ENCRYPT, params));
6837}
6838
6839/*
Qi Wud22ec842020-11-26 13:27:53 +08006840 * MaxOperationsTest.TestLimitRsa
Selene Huang31ab4042020-04-29 04:22:39 -07006841 *
6842 * Verifies that the max uses per boot tag works correctly with RSA keys.
6843 */
6844TEST_P(MaxOperationsTest, TestLimitRsa) {
David Drysdale513bf122021-10-06 11:53:13 +01006845 if (SecLevel() == SecurityLevel::STRONGBOX) {
6846 GTEST_SKIP() << "Test not applicable to StrongBox device";
6847 }
Selene Huang31ab4042020-04-29 04:22:39 -07006848
6849 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6850 .Authorization(TAG_NO_AUTH_REQUIRED)
6851 .RsaSigningKey(1024, 65537)
6852 .NoDigestOrPadding()
Janis Danisevskis164bb872021-02-09 11:30:25 -08006853 .Authorization(TAG_MAX_USES_PER_BOOT, 3)
6854 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07006855
6856 string message = "1234567890123456";
6857
6858 auto params = AuthorizationSetBuilder().NoDigestOrPadding();
6859
6860 SignMessage(message, params);
6861 SignMessage(message, params);
6862 SignMessage(message, params);
6863
6864 // Fourth time should fail.
6865 EXPECT_EQ(ErrorCode::KEY_MAX_OPS_EXCEEDED, Begin(KeyPurpose::SIGN, params));
6866}
6867
6868INSTANTIATE_KEYMINT_AIDL_TEST(MaxOperationsTest);
6869
Qi Wud22ec842020-11-26 13:27:53 +08006870typedef KeyMintAidlTestBase UsageCountLimitTest;
6871
6872/*
Qi Wubeefae42021-01-28 23:16:37 +08006873 * UsageCountLimitTest.TestSingleUseAes
Qi Wud22ec842020-11-26 13:27:53 +08006874 *
Qi Wubeefae42021-01-28 23:16:37 +08006875 * Verifies that the usage count limit tag = 1 works correctly with AES keys.
Qi Wud22ec842020-11-26 13:27:53 +08006876 */
Qi Wubeefae42021-01-28 23:16:37 +08006877TEST_P(UsageCountLimitTest, TestSingleUseAes) {
David Drysdale513bf122021-10-06 11:53:13 +01006878 if (SecLevel() == SecurityLevel::STRONGBOX) {
6879 GTEST_SKIP() << "Test not applicable to StrongBox device";
6880 }
Qi Wud22ec842020-11-26 13:27:53 +08006881
6882 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6883 .Authorization(TAG_NO_AUTH_REQUIRED)
6884 .AesEncryptionKey(128)
6885 .EcbMode()
6886 .Padding(PaddingMode::NONE)
6887 .Authorization(TAG_USAGE_COUNT_LIMIT, 1)));
6888
6889 // Check the usage count limit tag appears in the authorizations.
6890 AuthorizationSet auths;
6891 for (auto& entry : key_characteristics_) {
6892 auths.push_back(AuthorizationSet(entry.authorizations));
6893 }
6894 EXPECT_TRUE(auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U))
6895 << "key usage count limit " << 1U << " missing";
6896
6897 string message = "1234567890123456";
6898 auto params = AuthorizationSetBuilder().EcbMode().Padding(PaddingMode::NONE);
6899
Qi Wubeefae42021-01-28 23:16:37 +08006900 AuthorizationSet hardware_auths = HwEnforcedAuthorizations(key_characteristics_);
6901 AuthorizationSet keystore_auths =
6902 SecLevelAuthorizations(key_characteristics_, SecurityLevel::KEYSTORE);
6903
Qi Wud22ec842020-11-26 13:27:53 +08006904 // First usage of AES key should work.
6905 EncryptMessage(message, params);
6906
Qi Wud22ec842020-11-26 13:27:53 +08006907 if (hardware_auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U)) {
6908 // Usage count limit tag is enforced by hardware. After using the key, the key blob
6909 // must be invalidated from secure storage (such as RPMB partition).
6910 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB, Begin(KeyPurpose::ENCRYPT, params));
6911 } else {
Qi Wubeefae42021-01-28 23:16:37 +08006912 // Usage count limit tag is enforced by keystore, keymint does nothing.
6913 EXPECT_TRUE(keystore_auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U));
Qi Wud22ec842020-11-26 13:27:53 +08006914 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params));
6915 }
6916}
6917
6918/*
Qi Wubeefae42021-01-28 23:16:37 +08006919 * UsageCountLimitTest.TestLimitedUseAes
Qi Wud22ec842020-11-26 13:27:53 +08006920 *
Qi Wubeefae42021-01-28 23:16:37 +08006921 * Verifies that the usage count limit tag > 1 works correctly with AES keys.
Qi Wud22ec842020-11-26 13:27:53 +08006922 */
Qi Wubeefae42021-01-28 23:16:37 +08006923TEST_P(UsageCountLimitTest, TestLimitedUseAes) {
David Drysdale513bf122021-10-06 11:53:13 +01006924 if (SecLevel() == SecurityLevel::STRONGBOX) {
6925 GTEST_SKIP() << "Test not applicable to StrongBox device";
6926 }
Qi Wubeefae42021-01-28 23:16:37 +08006927
6928 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6929 .Authorization(TAG_NO_AUTH_REQUIRED)
6930 .AesEncryptionKey(128)
6931 .EcbMode()
6932 .Padding(PaddingMode::NONE)
6933 .Authorization(TAG_USAGE_COUNT_LIMIT, 3)));
6934
6935 // Check the usage count limit tag appears in the authorizations.
6936 AuthorizationSet auths;
6937 for (auto& entry : key_characteristics_) {
6938 auths.push_back(AuthorizationSet(entry.authorizations));
6939 }
6940 EXPECT_TRUE(auths.Contains(TAG_USAGE_COUNT_LIMIT, 3U))
6941 << "key usage count limit " << 3U << " missing";
6942
6943 string message = "1234567890123456";
6944 auto params = AuthorizationSetBuilder().EcbMode().Padding(PaddingMode::NONE);
6945
6946 AuthorizationSet hardware_auths = HwEnforcedAuthorizations(key_characteristics_);
6947 AuthorizationSet keystore_auths =
6948 SecLevelAuthorizations(key_characteristics_, SecurityLevel::KEYSTORE);
6949
6950 EncryptMessage(message, params);
6951 EncryptMessage(message, params);
6952 EncryptMessage(message, params);
6953
6954 if (hardware_auths.Contains(TAG_USAGE_COUNT_LIMIT, 3U)) {
6955 // Usage count limit tag is enforced by hardware. After using the key, the key blob
6956 // must be invalidated from secure storage (such as RPMB partition).
6957 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB, Begin(KeyPurpose::ENCRYPT, params));
6958 } else {
6959 // Usage count limit tag is enforced by keystore, keymint does nothing.
6960 EXPECT_TRUE(keystore_auths.Contains(TAG_USAGE_COUNT_LIMIT, 3U));
6961 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params));
6962 }
6963}
6964
6965/*
6966 * UsageCountLimitTest.TestSingleUseRsa
6967 *
6968 * Verifies that the usage count limit tag = 1 works correctly with RSA keys.
6969 */
6970TEST_P(UsageCountLimitTest, TestSingleUseRsa) {
David Drysdale513bf122021-10-06 11:53:13 +01006971 if (SecLevel() == SecurityLevel::STRONGBOX) {
6972 GTEST_SKIP() << "Test not applicable to StrongBox device";
6973 }
Qi Wud22ec842020-11-26 13:27:53 +08006974
6975 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
6976 .Authorization(TAG_NO_AUTH_REQUIRED)
6977 .RsaSigningKey(1024, 65537)
6978 .NoDigestOrPadding()
Janis Danisevskis164bb872021-02-09 11:30:25 -08006979 .Authorization(TAG_USAGE_COUNT_LIMIT, 1)
6980 .SetDefaultValidity()));
Qi Wud22ec842020-11-26 13:27:53 +08006981
6982 // Check the usage count limit tag appears in the authorizations.
6983 AuthorizationSet auths;
6984 for (auto& entry : key_characteristics_) {
6985 auths.push_back(AuthorizationSet(entry.authorizations));
6986 }
6987 EXPECT_TRUE(auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U))
6988 << "key usage count limit " << 1U << " missing";
6989
6990 string message = "1234567890123456";
6991 auto params = AuthorizationSetBuilder().NoDigestOrPadding();
6992
Qi Wubeefae42021-01-28 23:16:37 +08006993 AuthorizationSet hardware_auths = HwEnforcedAuthorizations(key_characteristics_);
6994 AuthorizationSet keystore_auths =
6995 SecLevelAuthorizations(key_characteristics_, SecurityLevel::KEYSTORE);
6996
Qi Wud22ec842020-11-26 13:27:53 +08006997 // First usage of RSA key should work.
6998 SignMessage(message, params);
6999
Qi Wud22ec842020-11-26 13:27:53 +08007000 if (hardware_auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U)) {
7001 // Usage count limit tag is enforced by hardware. After using the key, the key blob
7002 // must be invalidated from secure storage (such as RPMB partition).
7003 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB, Begin(KeyPurpose::SIGN, params));
7004 } else {
Qi Wubeefae42021-01-28 23:16:37 +08007005 // Usage count limit tag is enforced by keystore, keymint does nothing.
7006 EXPECT_TRUE(keystore_auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U));
7007 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::SIGN, params));
7008 }
7009}
7010
7011/*
7012 * UsageCountLimitTest.TestLimitUseRsa
7013 *
7014 * Verifies that the usage count limit tag > 1 works correctly with RSA keys.
7015 */
7016TEST_P(UsageCountLimitTest, TestLimitUseRsa) {
David Drysdale513bf122021-10-06 11:53:13 +01007017 if (SecLevel() == SecurityLevel::STRONGBOX) {
7018 GTEST_SKIP() << "Test not applicable to StrongBox device";
7019 }
Qi Wubeefae42021-01-28 23:16:37 +08007020
7021 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
7022 .Authorization(TAG_NO_AUTH_REQUIRED)
7023 .RsaSigningKey(1024, 65537)
7024 .NoDigestOrPadding()
Janis Danisevskis164bb872021-02-09 11:30:25 -08007025 .Authorization(TAG_USAGE_COUNT_LIMIT, 3)
7026 .SetDefaultValidity()));
Qi Wubeefae42021-01-28 23:16:37 +08007027
7028 // Check the usage count limit tag appears in the authorizations.
7029 AuthorizationSet auths;
7030 for (auto& entry : key_characteristics_) {
7031 auths.push_back(AuthorizationSet(entry.authorizations));
7032 }
7033 EXPECT_TRUE(auths.Contains(TAG_USAGE_COUNT_LIMIT, 3U))
7034 << "key usage count limit " << 3U << " missing";
7035
7036 string message = "1234567890123456";
7037 auto params = AuthorizationSetBuilder().NoDigestOrPadding();
7038
7039 AuthorizationSet hardware_auths = HwEnforcedAuthorizations(key_characteristics_);
7040 AuthorizationSet keystore_auths =
7041 SecLevelAuthorizations(key_characteristics_, SecurityLevel::KEYSTORE);
7042
7043 SignMessage(message, params);
7044 SignMessage(message, params);
7045 SignMessage(message, params);
7046
7047 if (hardware_auths.Contains(TAG_USAGE_COUNT_LIMIT, 3U)) {
7048 // Usage count limit tag is enforced by hardware. After using the key, the key blob
7049 // must be invalidated from secure storage (such as RPMB partition).
7050 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB, Begin(KeyPurpose::SIGN, params));
7051 } else {
7052 // Usage count limit tag is enforced by keystore, keymint does nothing.
7053 EXPECT_TRUE(keystore_auths.Contains(TAG_USAGE_COUNT_LIMIT, 3U));
Qi Wud22ec842020-11-26 13:27:53 +08007054 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::SIGN, params));
7055 }
7056}
7057
Qi Wu8e727f72021-02-11 02:49:33 +08007058/*
7059 * UsageCountLimitTest.TestSingleUseKeyAndRollbackResistance
7060 *
7061 * Verifies that when rollback resistance is supported by the KeyMint implementation with
7062 * the secure hardware, the single use key with usage count limit tag = 1 must also be enforced
7063 * in hardware.
7064 */
7065TEST_P(UsageCountLimitTest, TestSingleUseKeyAndRollbackResistance) {
David Drysdale513bf122021-10-06 11:53:13 +01007066 if (SecLevel() == SecurityLevel::STRONGBOX) {
7067 GTEST_SKIP() << "Test not applicable to StrongBox device";
7068 }
Qi Wu8e727f72021-02-11 02:49:33 +08007069
7070 auto error = GenerateKey(AuthorizationSetBuilder()
7071 .RsaSigningKey(2048, 65537)
7072 .Digest(Digest::NONE)
7073 .Padding(PaddingMode::NONE)
7074 .Authorization(TAG_NO_AUTH_REQUIRED)
7075 .Authorization(TAG_ROLLBACK_RESISTANCE)
7076 .SetDefaultValidity());
David Drysdale513bf122021-10-06 11:53:13 +01007077 if (error == ErrorCode::ROLLBACK_RESISTANCE_UNAVAILABLE) {
7078 GTEST_SKIP() << "Rollback resistance not supported";
Qi Wu8e727f72021-02-11 02:49:33 +08007079 }
David Drysdale513bf122021-10-06 11:53:13 +01007080
7081 // Rollback resistance is supported by KeyMint, verify it is enforced in hardware.
7082 ASSERT_EQ(ErrorCode::OK, error);
7083 AuthorizationSet hardwareEnforced(SecLevelAuthorizations());
7084 ASSERT_TRUE(hardwareEnforced.Contains(TAG_ROLLBACK_RESISTANCE));
7085 ASSERT_EQ(ErrorCode::OK, DeleteKey());
7086
7087 // The KeyMint should also enforce single use key in hardware when it supports rollback
7088 // resistance.
7089 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
7090 .Authorization(TAG_NO_AUTH_REQUIRED)
7091 .RsaSigningKey(1024, 65537)
7092 .NoDigestOrPadding()
7093 .Authorization(TAG_USAGE_COUNT_LIMIT, 1)
7094 .SetDefaultValidity()));
7095
7096 // Check the usage count limit tag appears in the hardware authorizations.
7097 AuthorizationSet hardware_auths = HwEnforcedAuthorizations(key_characteristics_);
7098 EXPECT_TRUE(hardware_auths.Contains(TAG_USAGE_COUNT_LIMIT, 1U))
7099 << "key usage count limit " << 1U << " missing";
7100
7101 string message = "1234567890123456";
7102 auto params = AuthorizationSetBuilder().NoDigestOrPadding();
7103
7104 // First usage of RSA key should work.
7105 SignMessage(message, params);
7106
7107 // Usage count limit tag is enforced by hardware. After using the key, the key blob
7108 // must be invalidated from secure storage (such as RPMB partition).
7109 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB, Begin(KeyPurpose::SIGN, params));
Qi Wu8e727f72021-02-11 02:49:33 +08007110}
7111
Qi Wud22ec842020-11-26 13:27:53 +08007112INSTANTIATE_KEYMINT_AIDL_TEST(UsageCountLimitTest);
7113
David Drysdale7de9feb2021-03-05 14:56:19 +00007114typedef KeyMintAidlTestBase GetHardwareInfoTest;
7115
7116TEST_P(GetHardwareInfoTest, GetHardwareInfo) {
7117 // Retrieving hardware info should give the same result each time.
7118 KeyMintHardwareInfo info;
7119 ASSERT_TRUE(keyMint().getHardwareInfo(&info).isOk());
7120 KeyMintHardwareInfo info2;
7121 ASSERT_TRUE(keyMint().getHardwareInfo(&info2).isOk());
7122 EXPECT_EQ(info, info2);
7123}
7124
7125INSTANTIATE_KEYMINT_AIDL_TEST(GetHardwareInfoTest);
7126
Selene Huang31ab4042020-04-29 04:22:39 -07007127typedef KeyMintAidlTestBase AddEntropyTest;
7128
7129/*
7130 * AddEntropyTest.AddEntropy
7131 *
7132 * Verifies that the addRngEntropy method doesn't blow up. There's no way to test that entropy
7133 * is actually added.
7134 */
7135TEST_P(AddEntropyTest, AddEntropy) {
7136 string data = "foo";
7137 EXPECT_TRUE(keyMint().addRngEntropy(vector<uint8_t>(data.begin(), data.end())).isOk());
7138}
7139
7140/*
7141 * AddEntropyTest.AddEmptyEntropy
7142 *
7143 * Verifies that the addRngEntropy method doesn't blow up when given an empty buffer.
7144 */
7145TEST_P(AddEntropyTest, AddEmptyEntropy) {
7146 EXPECT_TRUE(keyMint().addRngEntropy(AidlBuf()).isOk());
7147}
7148
7149/*
7150 * AddEntropyTest.AddLargeEntropy
7151 *
7152 * Verifies that the addRngEntropy method doesn't blow up when given a largish amount of data.
7153 */
7154TEST_P(AddEntropyTest, AddLargeEntropy) {
7155 EXPECT_TRUE(keyMint().addRngEntropy(AidlBuf(string(2 * 1024, 'a'))).isOk());
7156}
7157
David Drysdalebb3d85e2021-04-13 11:15:51 +01007158/*
7159 * AddEntropyTest.AddTooLargeEntropy
7160 *
7161 * Verifies that the addRngEntropy method rejects more than 2KiB of data.
7162 */
7163TEST_P(AddEntropyTest, AddTooLargeEntropy) {
7164 ErrorCode rc = GetReturnErrorCode(keyMint().addRngEntropy(AidlBuf(string(2 * 1024 + 1, 'a'))));
7165 EXPECT_EQ(ErrorCode::INVALID_INPUT_LENGTH, rc);
7166}
7167
Selene Huang31ab4042020-04-29 04:22:39 -07007168INSTANTIATE_KEYMINT_AIDL_TEST(AddEntropyTest);
7169
Selene Huang31ab4042020-04-29 04:22:39 -07007170typedef KeyMintAidlTestBase KeyDeletionTest;
7171
7172/**
7173 * KeyDeletionTest.DeleteKey
7174 *
7175 * This test checks that if rollback protection is implemented, DeleteKey invalidates a formerly
7176 * valid key blob.
7177 */
7178TEST_P(KeyDeletionTest, DeleteKey) {
7179 auto error = GenerateKey(AuthorizationSetBuilder()
7180 .RsaSigningKey(2048, 65537)
7181 .Digest(Digest::NONE)
7182 .Padding(PaddingMode::NONE)
7183 .Authorization(TAG_NO_AUTH_REQUIRED)
Qi Wu8e727f72021-02-11 02:49:33 +08007184 .Authorization(TAG_ROLLBACK_RESISTANCE)
7185 .SetDefaultValidity());
David Drysdale513bf122021-10-06 11:53:13 +01007186 if (error == ErrorCode::ROLLBACK_RESISTANCE_UNAVAILABLE) {
7187 GTEST_SKIP() << "Rollback resistance not supported";
7188 }
Selene Huang31ab4042020-04-29 04:22:39 -07007189
7190 // Delete must work if rollback protection is implemented
David Drysdale513bf122021-10-06 11:53:13 +01007191 ASSERT_EQ(ErrorCode::OK, error);
7192 AuthorizationSet hardwareEnforced(SecLevelAuthorizations());
7193 ASSERT_TRUE(hardwareEnforced.Contains(TAG_ROLLBACK_RESISTANCE));
Selene Huang31ab4042020-04-29 04:22:39 -07007194
David Drysdale513bf122021-10-06 11:53:13 +01007195 ASSERT_EQ(ErrorCode::OK, DeleteKey(true /* keep key blob */));
Selene Huang31ab4042020-04-29 04:22:39 -07007196
David Drysdale513bf122021-10-06 11:53:13 +01007197 string message = "12345678901234567890123456789012";
7198 AuthorizationSet begin_out_params;
7199 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB,
7200 Begin(KeyPurpose::SIGN, key_blob_,
7201 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE),
7202 &begin_out_params));
7203 AbortIfNeeded();
7204 key_blob_ = AidlBuf();
Selene Huang31ab4042020-04-29 04:22:39 -07007205}
7206
7207/**
7208 * KeyDeletionTest.DeleteInvalidKey
7209 *
7210 * This test checks that the HAL excepts invalid key blobs..
7211 */
7212TEST_P(KeyDeletionTest, DeleteInvalidKey) {
7213 // Generate key just to check if rollback protection is implemented
7214 auto error = GenerateKey(AuthorizationSetBuilder()
7215 .RsaSigningKey(2048, 65537)
7216 .Digest(Digest::NONE)
7217 .Padding(PaddingMode::NONE)
7218 .Authorization(TAG_NO_AUTH_REQUIRED)
Qi Wu8e727f72021-02-11 02:49:33 +08007219 .Authorization(TAG_ROLLBACK_RESISTANCE)
7220 .SetDefaultValidity());
David Drysdale513bf122021-10-06 11:53:13 +01007221 if (error == ErrorCode::ROLLBACK_RESISTANCE_UNAVAILABLE) {
7222 GTEST_SKIP() << "Rollback resistance not supported";
7223 }
Selene Huang31ab4042020-04-29 04:22:39 -07007224
7225 // Delete must work if rollback protection is implemented
David Drysdale513bf122021-10-06 11:53:13 +01007226 ASSERT_EQ(ErrorCode::OK, error);
7227 AuthorizationSet enforced(SecLevelAuthorizations());
7228 ASSERT_TRUE(enforced.Contains(TAG_ROLLBACK_RESISTANCE));
Selene Huang31ab4042020-04-29 04:22:39 -07007229
David Drysdale513bf122021-10-06 11:53:13 +01007230 // Delete the key we don't care about the result at this point.
7231 DeleteKey();
Selene Huang31ab4042020-04-29 04:22:39 -07007232
David Drysdale513bf122021-10-06 11:53:13 +01007233 // Now create an invalid key blob and delete it.
7234 key_blob_ = AidlBuf("just some garbage data which is not a valid key blob");
Selene Huang31ab4042020-04-29 04:22:39 -07007235
David Drysdale513bf122021-10-06 11:53:13 +01007236 ASSERT_EQ(ErrorCode::OK, DeleteKey());
Selene Huang31ab4042020-04-29 04:22:39 -07007237}
7238
7239/**
7240 * KeyDeletionTest.DeleteAllKeys
7241 *
7242 * This test is disarmed by default. To arm it use --arm_deleteAllKeys.
7243 *
7244 * BEWARE: This test has serious side effects. All user keys will be lost! This includes
7245 * FBE/FDE encryption keys, which means that the device will not even boot until after the
7246 * device has been wiped manually (e.g., fastboot flashall -w), and new FBE/FDE keys have
7247 * been provisioned. Use this test only on dedicated testing devices that have no valuable
7248 * credentials stored in Keystore/Keymint.
7249 */
7250TEST_P(KeyDeletionTest, DeleteAllKeys) {
David Drysdale513bf122021-10-06 11:53:13 +01007251 if (!arm_deleteAllKeys) {
7252 GTEST_SKIP() << "Option --arm_deleteAllKeys not set";
7253 return;
7254 }
Selene Huang31ab4042020-04-29 04:22:39 -07007255 auto error = GenerateKey(AuthorizationSetBuilder()
7256 .RsaSigningKey(2048, 65537)
7257 .Digest(Digest::NONE)
7258 .Padding(PaddingMode::NONE)
7259 .Authorization(TAG_NO_AUTH_REQUIRED)
Shawn Willden9a7410e2021-08-02 12:28:42 -06007260 .Authorization(TAG_ROLLBACK_RESISTANCE)
7261 .SetDefaultValidity());
David Drysdale513bf122021-10-06 11:53:13 +01007262 if (error == ErrorCode::ROLLBACK_RESISTANCE_UNAVAILABLE) {
7263 GTEST_SKIP() << "Rollback resistance not supported";
7264 }
Selene Huang31ab4042020-04-29 04:22:39 -07007265
7266 // Delete must work if rollback protection is implemented
David Drysdale513bf122021-10-06 11:53:13 +01007267 ASSERT_EQ(ErrorCode::OK, error);
7268 AuthorizationSet hardwareEnforced(SecLevelAuthorizations());
7269 ASSERT_TRUE(hardwareEnforced.Contains(TAG_ROLLBACK_RESISTANCE));
Selene Huang31ab4042020-04-29 04:22:39 -07007270
David Drysdale513bf122021-10-06 11:53:13 +01007271 ASSERT_EQ(ErrorCode::OK, DeleteAllKeys());
Selene Huang31ab4042020-04-29 04:22:39 -07007272
David Drysdale513bf122021-10-06 11:53:13 +01007273 string message = "12345678901234567890123456789012";
7274 AuthorizationSet begin_out_params;
Selene Huang31ab4042020-04-29 04:22:39 -07007275
David Drysdale513bf122021-10-06 11:53:13 +01007276 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB,
7277 Begin(KeyPurpose::SIGN, key_blob_,
7278 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE),
7279 &begin_out_params));
7280 AbortIfNeeded();
7281 key_blob_ = AidlBuf();
Selene Huang31ab4042020-04-29 04:22:39 -07007282}
7283
7284INSTANTIATE_KEYMINT_AIDL_TEST(KeyDeletionTest);
7285
David Drysdaled2cc8c22021-04-15 13:29:45 +01007286typedef KeyMintAidlTestBase KeyUpgradeTest;
7287
7288/**
7289 * KeyUpgradeTest.UpgradeInvalidKey
7290 *
7291 * This test checks that the HAL excepts invalid key blobs..
7292 */
7293TEST_P(KeyUpgradeTest, UpgradeInvalidKey) {
7294 AidlBuf key_blob = AidlBuf("just some garbage data which is not a valid key blob");
7295
7296 std::vector<uint8_t> new_blob;
7297 Status result = keymint_->upgradeKey(key_blob,
7298 AuthorizationSetBuilder()
7299 .Authorization(TAG_APPLICATION_ID, "clientid")
7300 .Authorization(TAG_APPLICATION_DATA, "appdata")
7301 .vector_data(),
7302 &new_blob);
7303 ASSERT_EQ(ErrorCode::INVALID_KEY_BLOB, GetReturnErrorCode(result));
7304}
7305
7306INSTANTIATE_KEYMINT_AIDL_TEST(KeyUpgradeTest);
7307
Selene Huang31ab4042020-04-29 04:22:39 -07007308using UpgradeKeyTest = KeyMintAidlTestBase;
7309
7310/*
7311 * UpgradeKeyTest.UpgradeKey
7312 *
7313 * Verifies that calling upgrade key on an up-to-date key works (i.e. does nothing).
7314 */
7315TEST_P(UpgradeKeyTest, UpgradeKey) {
7316 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
7317 .AesEncryptionKey(128)
7318 .Padding(PaddingMode::NONE)
7319 .Authorization(TAG_NO_AUTH_REQUIRED)));
7320
7321 auto result = UpgradeKey(key_blob_);
7322
7323 // Key doesn't need upgrading. Should get okay, but no new key blob.
7324 EXPECT_EQ(result, std::make_pair(ErrorCode::OK, vector<uint8_t>()));
7325}
7326
7327INSTANTIATE_KEYMINT_AIDL_TEST(UpgradeKeyTest);
7328
7329using ClearOperationsTest = KeyMintAidlTestBase;
7330
7331/*
7332 * ClearSlotsTest.TooManyOperations
7333 *
7334 * Verifies that TOO_MANY_OPERATIONS is returned after the max number of
7335 * operations are started without being finished or aborted. Also verifies
7336 * that aborting the operations clears the operations.
7337 *
7338 */
7339TEST_P(ClearOperationsTest, TooManyOperations) {
7340 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
7341 .Authorization(TAG_NO_AUTH_REQUIRED)
7342 .RsaEncryptionKey(2048, 65537)
Janis Danisevskis164bb872021-02-09 11:30:25 -08007343 .Padding(PaddingMode::NONE)
7344 .SetDefaultValidity()));
Selene Huang31ab4042020-04-29 04:22:39 -07007345
7346 auto params = AuthorizationSetBuilder().Padding(PaddingMode::NONE);
7347 constexpr size_t max_operations = 100; // set to arbituary large number
Janis Danisevskis24c04702020-12-16 18:28:39 -08007348 std::shared_ptr<IKeyMintOperation> op_handles[max_operations];
Selene Huang31ab4042020-04-29 04:22:39 -07007349 AuthorizationSet out_params;
7350 ErrorCode result;
7351 size_t i;
7352
7353 for (i = 0; i < max_operations; i++) {
subrahmanyaman05642492022-02-05 07:10:56 +00007354 result = Begin(KeyPurpose::DECRYPT, key_blob_, params, &out_params, op_handles[i]);
Selene Huang31ab4042020-04-29 04:22:39 -07007355 if (ErrorCode::OK != result) {
7356 break;
7357 }
7358 }
7359 EXPECT_EQ(ErrorCode::TOO_MANY_OPERATIONS, result);
7360 // Try again just in case there's a weird overflow bug
7361 EXPECT_EQ(ErrorCode::TOO_MANY_OPERATIONS,
subrahmanyaman05642492022-02-05 07:10:56 +00007362 Begin(KeyPurpose::DECRYPT, key_blob_, params, &out_params));
Selene Huang31ab4042020-04-29 04:22:39 -07007363 for (size_t j = 0; j < i; j++) {
7364 EXPECT_EQ(ErrorCode::OK, Abort(op_handles[j]))
7365 << "Aboort failed for i = " << j << std::endl;
7366 }
subrahmanyaman05642492022-02-05 07:10:56 +00007367 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, key_blob_, params, &out_params));
Selene Huang31ab4042020-04-29 04:22:39 -07007368 AbortIfNeeded();
7369}
7370
7371INSTANTIATE_KEYMINT_AIDL_TEST(ClearOperationsTest);
7372
7373typedef KeyMintAidlTestBase TransportLimitTest;
7374
7375/*
David Drysdale7de9feb2021-03-05 14:56:19 +00007376 * TransportLimitTest.LargeFinishInput
Selene Huang31ab4042020-04-29 04:22:39 -07007377 *
7378 * Verifies that passing input data to finish succeeds as expected.
7379 */
7380TEST_P(TransportLimitTest, LargeFinishInput) {
7381 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
7382 .Authorization(TAG_NO_AUTH_REQUIRED)
7383 .AesEncryptionKey(128)
7384 .BlockMode(BlockMode::ECB)
7385 .Padding(PaddingMode::NONE)));
7386
7387 for (int msg_size = 8 /* 256 bytes */; msg_size <= 11 /* 2 KiB */; msg_size++) {
7388 auto cipher_params =
7389 AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::NONE);
7390
7391 AuthorizationSet out_params;
7392 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, cipher_params, &out_params));
7393
7394 string plain_message = std::string(1 << msg_size, 'x');
7395 string encrypted_message;
7396 auto rc = Finish(plain_message, &encrypted_message);
7397
7398 EXPECT_EQ(ErrorCode::OK, rc);
7399 EXPECT_EQ(plain_message.size(), encrypted_message.size())
7400 << "Encrypt finish returned OK, but did not consume all of the given input";
7401 cipher_params.push_back(out_params);
7402
7403 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, cipher_params));
7404
7405 string decrypted_message;
7406 rc = Finish(encrypted_message, &decrypted_message);
7407 EXPECT_EQ(ErrorCode::OK, rc);
7408 EXPECT_EQ(plain_message.size(), decrypted_message.size())
7409 << "Decrypt finish returned OK, did not consume all of the given input";
7410 }
7411}
7412
7413INSTANTIATE_KEYMINT_AIDL_TEST(TransportLimitTest);
7414
Seth Moored79a0ec2021-12-13 20:03:33 +00007415static int EcdhCurveToOpenSslCurveName(EcCurve curve) {
David Zeuthene0c40892021-01-08 12:54:11 -05007416 switch (curve) {
7417 case EcCurve::P_224:
7418 return NID_secp224r1;
7419 case EcCurve::P_256:
7420 return NID_X9_62_prime256v1;
7421 case EcCurve::P_384:
7422 return NID_secp384r1;
7423 case EcCurve::P_521:
7424 return NID_secp521r1;
Seth Moored79a0ec2021-12-13 20:03:33 +00007425 case EcCurve::CURVE_25519:
7426 return NID_X25519;
David Zeuthene0c40892021-01-08 12:54:11 -05007427 }
7428}
7429
David Drysdale42fe1892021-10-14 14:43:46 +01007430class KeyAgreementTest : public KeyMintAidlTestBase {
7431 protected:
7432 void GenerateLocalEcKey(EcCurve localCurve, EVP_PKEY_Ptr* localPrivKey,
7433 std::vector<uint8_t>* localPublicKey) {
7434 // Generate EC key locally (with access to private key material)
7435 if (localCurve == EcCurve::CURVE_25519) {
7436 uint8_t privKeyData[32];
7437 uint8_t pubKeyData[32];
7438 X25519_keypair(pubKeyData, privKeyData);
7439 *localPublicKey = vector<uint8_t>(pubKeyData, pubKeyData + 32);
7440 *localPrivKey = EVP_PKEY_Ptr(EVP_PKEY_new_raw_private_key(
7441 EVP_PKEY_X25519, nullptr, privKeyData, sizeof(privKeyData)));
7442 } else {
7443 auto ecKey = EC_KEY_Ptr(EC_KEY_new());
7444 int curveName = EcdhCurveToOpenSslCurveName(localCurve);
7445 auto group = EC_GROUP_Ptr(EC_GROUP_new_by_curve_name(curveName));
7446 ASSERT_NE(group, nullptr);
7447 ASSERT_EQ(EC_KEY_set_group(ecKey.get(), group.get()), 1);
7448 ASSERT_EQ(EC_KEY_generate_key(ecKey.get()), 1);
7449 *localPrivKey = EVP_PKEY_Ptr(EVP_PKEY_new());
7450 ASSERT_EQ(EVP_PKEY_set1_EC_KEY(localPrivKey->get(), ecKey.get()), 1);
7451
7452 // Get encoded form of the public part of the locally generated key...
7453 unsigned char* p = nullptr;
7454 int localPublicKeySize = i2d_PUBKEY(localPrivKey->get(), &p);
7455 ASSERT_GT(localPublicKeySize, 0);
7456 *localPublicKey =
7457 vector<uint8_t>(reinterpret_cast<const uint8_t*>(p),
7458 reinterpret_cast<const uint8_t*>(p + localPublicKeySize));
7459 OPENSSL_free(p);
7460 }
7461 }
7462
7463 void GenerateKeyMintEcKey(EcCurve curve, EVP_PKEY_Ptr* kmPubKey) {
7464 vector<uint8_t> challenge = {0x41, 0x42};
subrahmanyaman7d9bc462022-03-16 01:40:39 +00007465 auto builder = AuthorizationSetBuilder()
7466 .Authorization(TAG_NO_AUTH_REQUIRED)
7467 .Authorization(TAG_EC_CURVE, curve)
7468 .Authorization(TAG_PURPOSE, KeyPurpose::AGREE_KEY)
7469 .Authorization(TAG_ALGORITHM, Algorithm::EC)
7470 .Authorization(TAG_ATTESTATION_APPLICATION_ID, {0x61, 0x62})
7471 .Authorization(TAG_ATTESTATION_CHALLENGE, challenge)
7472 .SetDefaultValidity();
7473 ErrorCode result = GenerateKey(builder);
7474
7475 if (SecLevel() == SecurityLevel::STRONGBOX) {
7476 if (result == ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED) {
7477 result = GenerateKeyWithSelfSignedAttestKey(
7478 AuthorizationSetBuilder()
7479 .EcdsaKey(EcCurve::P_256)
7480 .AttestKey()
7481 .SetDefaultValidity(), /* attest key params */
7482 builder, &key_blob_, &key_characteristics_, &cert_chain_);
7483 }
7484 }
David Drysdale42fe1892021-10-14 14:43:46 +01007485 ASSERT_EQ(ErrorCode::OK, result) << "Failed to generate key";
7486 ASSERT_GT(cert_chain_.size(), 0);
7487 X509_Ptr kmKeyCert(parse_cert_blob(cert_chain_[0].encodedCertificate));
7488 ASSERT_NE(kmKeyCert, nullptr);
7489 // Check that keyAgreement (bit 4) is set in KeyUsage
7490 EXPECT_TRUE((X509_get_key_usage(kmKeyCert.get()) & X509v3_KU_KEY_AGREEMENT) != 0);
7491 *kmPubKey = EVP_PKEY_Ptr(X509_get_pubkey(kmKeyCert.get()));
7492 ASSERT_NE(*kmPubKey, nullptr);
7493 if (dump_Attestations) {
7494 for (size_t n = 0; n < cert_chain_.size(); n++) {
7495 std::cout << bin2hex(cert_chain_[n].encodedCertificate) << std::endl;
7496 }
7497 }
7498 }
7499
7500 void CheckAgreement(EVP_PKEY_Ptr kmPubKey, EVP_PKEY_Ptr localPrivKey,
7501 const std::vector<uint8_t>& localPublicKey) {
7502 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::AGREE_KEY, AuthorizationSetBuilder()));
7503 string ZabFromKeyMintStr;
7504 ASSERT_EQ(ErrorCode::OK,
7505 Finish(string(localPublicKey.begin(), localPublicKey.end()), &ZabFromKeyMintStr));
7506 vector<uint8_t> ZabFromKeyMint(ZabFromKeyMintStr.begin(), ZabFromKeyMintStr.end());
7507 vector<uint8_t> ZabFromTest;
7508
7509 if (EVP_PKEY_id(kmPubKey.get()) == EVP_PKEY_X25519) {
7510 size_t kmPubKeySize = 32;
7511 uint8_t kmPubKeyData[32];
7512 ASSERT_EQ(1, EVP_PKEY_get_raw_public_key(kmPubKey.get(), kmPubKeyData, &kmPubKeySize));
7513 ASSERT_EQ(kmPubKeySize, 32);
7514
7515 uint8_t localPrivKeyData[32];
7516 size_t localPrivKeySize = 32;
7517 ASSERT_EQ(1, EVP_PKEY_get_raw_private_key(localPrivKey.get(), localPrivKeyData,
7518 &localPrivKeySize));
7519 ASSERT_EQ(localPrivKeySize, 32);
7520
7521 uint8_t sharedKey[32];
7522 ASSERT_EQ(1, X25519(sharedKey, localPrivKeyData, kmPubKeyData));
7523 ZabFromTest = std::vector<uint8_t>(sharedKey, sharedKey + 32);
7524 } else {
7525 // Perform local ECDH between the two keys so we can check if we get the same Zab..
7526 auto ctx = EVP_PKEY_CTX_Ptr(EVP_PKEY_CTX_new(localPrivKey.get(), nullptr));
7527 ASSERT_NE(ctx, nullptr);
7528 ASSERT_EQ(EVP_PKEY_derive_init(ctx.get()), 1);
7529 ASSERT_EQ(EVP_PKEY_derive_set_peer(ctx.get(), kmPubKey.get()), 1);
7530 size_t ZabFromTestLen = 0;
7531 ASSERT_EQ(EVP_PKEY_derive(ctx.get(), nullptr, &ZabFromTestLen), 1);
7532 ZabFromTest.resize(ZabFromTestLen);
7533 ASSERT_EQ(EVP_PKEY_derive(ctx.get(), ZabFromTest.data(), &ZabFromTestLen), 1);
7534 }
7535 EXPECT_EQ(ZabFromKeyMint, ZabFromTest);
7536 }
7537};
7538
David Zeuthene0c40892021-01-08 12:54:11 -05007539/*
7540 * KeyAgreementTest.Ecdh
7541 *
David Drysdale42fe1892021-10-14 14:43:46 +01007542 * Verifies that ECDH works for all required curves
David Zeuthene0c40892021-01-08 12:54:11 -05007543 */
7544TEST_P(KeyAgreementTest, Ecdh) {
7545 // Because it's possible to use this API with keys on different curves, we
7546 // check all N^2 combinations where N is the number of supported
7547 // curves.
7548 //
7549 // This is not a big deal as N is 4 so we only do 16 runs. If we end up with a
7550 // lot more curves we can be smart about things and just pick |otherCurve| so
7551 // it's not |curve| and that way we end up with only 2*N runs
7552 //
7553 for (auto curve : ValidCurves()) {
7554 for (auto localCurve : ValidCurves()) {
7555 // Generate EC key locally (with access to private key material)
David Drysdale42fe1892021-10-14 14:43:46 +01007556 EVP_PKEY_Ptr localPrivKey;
7557 vector<uint8_t> localPublicKey;
7558 GenerateLocalEcKey(localCurve, &localPrivKey, &localPublicKey);
David Zeuthene0c40892021-01-08 12:54:11 -05007559
7560 // Generate EC key in KeyMint (only access to public key material)
David Drysdale42fe1892021-10-14 14:43:46 +01007561 EVP_PKEY_Ptr kmPubKey;
7562 GenerateKeyMintEcKey(curve, &kmPubKey);
David Zeuthene0c40892021-01-08 12:54:11 -05007563
7564 // Now that we have the two keys, we ask KeyMint to perform ECDH...
7565 if (curve != localCurve) {
7566 // If the keys are using different curves KeyMint should fail with
7567 // ErrorCode:INVALID_ARGUMENT. Check that.
7568 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::AGREE_KEY, AuthorizationSetBuilder()));
7569 string ZabFromKeyMintStr;
7570 EXPECT_EQ(ErrorCode::INVALID_ARGUMENT,
David Drysdale42fe1892021-10-14 14:43:46 +01007571 Finish(string(localPublicKey.begin(), localPublicKey.end()),
David Zeuthene0c40892021-01-08 12:54:11 -05007572 &ZabFromKeyMintStr));
7573
7574 } else {
7575 // Otherwise if the keys are using the same curve, it should work.
David Drysdale42fe1892021-10-14 14:43:46 +01007576 CheckAgreement(std::move(kmPubKey), std::move(localPrivKey), localPublicKey);
David Zeuthene0c40892021-01-08 12:54:11 -05007577 }
7578
7579 CheckedDeleteKey();
7580 }
7581 }
7582}
7583
David Drysdale42fe1892021-10-14 14:43:46 +01007584/*
7585 * KeyAgreementTest.EcdhCurve25519
7586 *
7587 * Verifies that ECDH works for curve25519. This is also covered by the general
7588 * KeyAgreementTest.Ecdh case, but is pulled out separately here because this curve was added after
7589 * KeyMint 1.0.
7590 */
7591TEST_P(KeyAgreementTest, EcdhCurve25519) {
7592 if (!Curve25519Supported()) {
7593 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
7594 }
7595
7596 // Generate EC key in KeyMint (only access to public key material)
7597 EcCurve curve = EcCurve::CURVE_25519;
7598 EVP_PKEY_Ptr kmPubKey = nullptr;
7599 GenerateKeyMintEcKey(curve, &kmPubKey);
7600
7601 // Generate EC key on same curve locally (with access to private key material).
7602 EVP_PKEY_Ptr privKey;
7603 vector<uint8_t> encodedPublicKey;
7604 GenerateLocalEcKey(curve, &privKey, &encodedPublicKey);
7605
7606 // Agree on a key between local and KeyMint and check it.
7607 CheckAgreement(std::move(kmPubKey), std::move(privKey), encodedPublicKey);
7608
7609 CheckedDeleteKey();
7610}
7611
7612/*
7613 * KeyAgreementTest.EcdhCurve25519Imported
7614 *
7615 * Verifies that ECDH works for an imported curve25519 key.
7616 */
7617TEST_P(KeyAgreementTest, EcdhCurve25519Imported) {
7618 if (!Curve25519Supported()) {
7619 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
7620 }
7621
7622 // Import x25519 key into KeyMint.
7623 EcCurve curve = EcCurve::CURVE_25519;
7624 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder()
7625 .Authorization(TAG_NO_AUTH_REQUIRED)
7626 .EcdsaKey(EcCurve::CURVE_25519)
7627 .Authorization(TAG_PURPOSE, KeyPurpose::AGREE_KEY)
7628 .SetDefaultValidity(),
7629 KeyFormat::PKCS8, x25519_pkcs8_key));
7630 ASSERT_GT(cert_chain_.size(), 0);
7631 X509_Ptr kmKeyCert(parse_cert_blob(cert_chain_[0].encodedCertificate));
7632 ASSERT_NE(kmKeyCert, nullptr);
7633 EVP_PKEY_Ptr kmPubKey(X509_get_pubkey(kmKeyCert.get()));
7634 ASSERT_NE(kmPubKey.get(), nullptr);
7635
7636 // Expect the import to emit corresponding public key data.
7637 size_t kmPubKeySize = 32;
7638 uint8_t kmPubKeyData[32];
7639 ASSERT_EQ(1, EVP_PKEY_get_raw_public_key(kmPubKey.get(), kmPubKeyData, &kmPubKeySize));
7640 ASSERT_EQ(kmPubKeySize, 32);
7641 EXPECT_EQ(bin2hex(std::vector<uint8_t>(kmPubKeyData, kmPubKeyData + 32)),
7642 bin2hex(std::vector<uint8_t>(x25519_pubkey.begin(), x25519_pubkey.end())));
7643
7644 // Generate EC key on same curve locally (with access to private key material).
7645 EVP_PKEY_Ptr privKey;
7646 vector<uint8_t> encodedPublicKey;
7647 GenerateLocalEcKey(curve, &privKey, &encodedPublicKey);
7648
7649 // Agree on a key between local and KeyMint and check it.
7650 CheckAgreement(std::move(kmPubKey), std::move(privKey), encodedPublicKey);
7651
7652 CheckedDeleteKey();
7653}
7654
7655/*
7656 * KeyAgreementTest.EcdhCurve25519InvalidSize
7657 *
7658 * Verifies that ECDH fails for curve25519 if the wrong size of public key is provided.
7659 */
7660TEST_P(KeyAgreementTest, EcdhCurve25519InvalidSize) {
7661 if (!Curve25519Supported()) {
7662 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
7663 }
7664
7665 // Generate EC key in KeyMint (only access to public key material)
7666 EcCurve curve = EcCurve::CURVE_25519;
7667 EVP_PKEY_Ptr kmPubKey = nullptr;
7668 GenerateKeyMintEcKey(curve, &kmPubKey);
7669
7670 // Generate EC key on same curve locally (with access to private key material).
7671 EVP_PKEY_Ptr privKey;
7672 vector<uint8_t> encodedPublicKey;
7673 GenerateLocalEcKey(curve, &privKey, &encodedPublicKey);
7674
7675 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::AGREE_KEY, AuthorizationSetBuilder()));
7676 string ZabFromKeyMintStr;
7677 // Send in an incomplete public key.
7678 ASSERT_NE(ErrorCode::OK, Finish(string(encodedPublicKey.begin(), encodedPublicKey.end() - 1),
7679 &ZabFromKeyMintStr));
7680
7681 CheckedDeleteKey();
7682}
7683
7684/*
7685 * KeyAgreementTest.EcdhCurve25519Mismatch
7686 *
7687 * Verifies that ECDH fails between curve25519 and other curves.
7688 */
7689TEST_P(KeyAgreementTest, EcdhCurve25519Mismatch) {
7690 if (!Curve25519Supported()) {
7691 GTEST_SKIP() << "Test not applicable to device that is not expected to support curve 25519";
7692 }
7693
7694 // Generate EC key in KeyMint (only access to public key material)
7695 EcCurve curve = EcCurve::CURVE_25519;
7696 EVP_PKEY_Ptr kmPubKey = nullptr;
7697 GenerateKeyMintEcKey(curve, &kmPubKey);
7698
7699 for (auto localCurve : ValidCurves()) {
7700 if (localCurve == curve) {
7701 continue;
7702 }
7703 // Generate EC key on a different curve locally (with access to private key material).
7704 EVP_PKEY_Ptr privKey;
7705 vector<uint8_t> encodedPublicKey;
7706 GenerateLocalEcKey(localCurve, &privKey, &encodedPublicKey);
7707
7708 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::AGREE_KEY, AuthorizationSetBuilder()));
7709 string ZabFromKeyMintStr;
7710 EXPECT_EQ(ErrorCode::INVALID_ARGUMENT,
7711 Finish(string(encodedPublicKey.begin(), encodedPublicKey.end()),
7712 &ZabFromKeyMintStr));
7713 }
7714
7715 CheckedDeleteKey();
7716}
7717
David Zeuthene0c40892021-01-08 12:54:11 -05007718INSTANTIATE_KEYMINT_AIDL_TEST(KeyAgreementTest);
7719
David Drysdaled2cc8c22021-04-15 13:29:45 +01007720using DestroyAttestationIdsTest = KeyMintAidlTestBase;
7721
7722// This is a problematic test, as it can render the device under test permanently unusable.
7723// Re-enable and run at your own risk.
7724TEST_P(DestroyAttestationIdsTest, DISABLED_DestroyTest) {
7725 auto result = DestroyAttestationIds();
7726 EXPECT_TRUE(result == ErrorCode::OK || result == ErrorCode::UNIMPLEMENTED);
7727}
7728
7729INSTANTIATE_KEYMINT_AIDL_TEST(DestroyAttestationIdsTest);
7730
Shawn Willdend659c7c2021-02-19 14:51:51 -07007731using EarlyBootKeyTest = KeyMintAidlTestBase;
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +00007732
David Drysdaledb0dcf52021-05-18 11:43:31 +01007733/*
7734 * EarlyBootKeyTest.CreateEarlyBootKeys
7735 *
7736 * Verifies that creating early boot keys succeeds, even at a later stage (after boot).
7737 */
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +00007738TEST_P(EarlyBootKeyTest, CreateEarlyBootKeys) {
David Drysdaledb0dcf52021-05-18 11:43:31 +01007739 // Early boot keys can be created after early boot.
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +00007740 auto [aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData] =
7741 CreateTestKeys(TAG_EARLY_BOOT_ONLY, ErrorCode::OK);
7742
David Drysdaleadfe6112021-05-27 12:00:53 +01007743 for (const auto& keyData : {aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData}) {
7744 ASSERT_GT(keyData.blob.size(), 0U);
7745 AuthorizationSet crypto_params = SecLevelAuthorizations(keyData.characteristics);
7746 EXPECT_TRUE(crypto_params.Contains(TAG_EARLY_BOOT_ONLY)) << crypto_params;
7747 }
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +00007748 CheckedDeleteKey(&aesKeyData.blob);
7749 CheckedDeleteKey(&hmacKeyData.blob);
7750 CheckedDeleteKey(&rsaKeyData.blob);
7751 CheckedDeleteKey(&ecdsaKeyData.blob);
7752}
7753
David Drysdaledb0dcf52021-05-18 11:43:31 +01007754/*
David Drysdaleadfe6112021-05-27 12:00:53 +01007755 * EarlyBootKeyTest.CreateAttestedEarlyBootKey
7756 *
7757 * Verifies that creating an early boot key with attestation succeeds.
7758 */
7759TEST_P(EarlyBootKeyTest, CreateAttestedEarlyBootKey) {
7760 auto [aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData] = CreateTestKeys(
7761 TAG_EARLY_BOOT_ONLY, ErrorCode::OK, [](AuthorizationSetBuilder* builder) {
7762 builder->AttestationChallenge("challenge");
7763 builder->AttestationApplicationId("app_id");
7764 });
7765
7766 for (const auto& keyData : {aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData}) {
subrahmanyaman05642492022-02-05 07:10:56 +00007767 // Strongbox may not support factory attestation. Key creation might fail with
7768 // ErrorCode::ATTESTATION_KEYS_NOT_PROVISIONED
7769 if (SecLevel() == SecurityLevel::STRONGBOX && keyData.blob.size() == 0U) {
7770 continue;
7771 }
David Drysdaleadfe6112021-05-27 12:00:53 +01007772 ASSERT_GT(keyData.blob.size(), 0U);
7773 AuthorizationSet crypto_params = SecLevelAuthorizations(keyData.characteristics);
7774 EXPECT_TRUE(crypto_params.Contains(TAG_EARLY_BOOT_ONLY)) << crypto_params;
7775 }
7776 CheckedDeleteKey(&aesKeyData.blob);
7777 CheckedDeleteKey(&hmacKeyData.blob);
subrahmanyaman05642492022-02-05 07:10:56 +00007778 if (rsaKeyData.blob.size() != 0U) {
7779 CheckedDeleteKey(&rsaKeyData.blob);
7780 }
7781 if (ecdsaKeyData.blob.size() != 0U) {
7782 CheckedDeleteKey(&ecdsaKeyData.blob);
7783 }
David Drysdaleadfe6112021-05-27 12:00:53 +01007784}
7785
7786/*
7787 * EarlyBootKeyTest.UseEarlyBootKeyFailure
David Drysdaledb0dcf52021-05-18 11:43:31 +01007788 *
7789 * Verifies that using early boot keys at a later stage fails.
7790 */
7791TEST_P(EarlyBootKeyTest, UseEarlyBootKeyFailure) {
7792 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder()
7793 .Authorization(TAG_NO_AUTH_REQUIRED)
7794 .Authorization(TAG_EARLY_BOOT_ONLY)
7795 .HmacKey(128)
7796 .Digest(Digest::SHA_2_256)
7797 .Authorization(TAG_MIN_MAC_LENGTH, 256)));
7798 AuthorizationSet output_params;
7799 EXPECT_EQ(ErrorCode::EARLY_BOOT_ENDED, Begin(KeyPurpose::SIGN, key_blob_,
7800 AuthorizationSetBuilder()
7801 .Digest(Digest::SHA_2_256)
7802 .Authorization(TAG_MAC_LENGTH, 256),
7803 &output_params));
7804}
7805
7806/*
7807 * EarlyBootKeyTest.ImportEarlyBootKeyFailure
7808 *
7809 * Verifies that importing early boot keys fails.
7810 */
7811TEST_P(EarlyBootKeyTest, ImportEarlyBootKeyFailure) {
7812 ASSERT_EQ(ErrorCode::EARLY_BOOT_ENDED, ImportKey(AuthorizationSetBuilder()
7813 .Authorization(TAG_NO_AUTH_REQUIRED)
7814 .Authorization(TAG_EARLY_BOOT_ONLY)
David Drysdaledf09e542021-06-08 15:46:11 +01007815 .EcdsaSigningKey(EcCurve::P_256)
David Drysdaledb0dcf52021-05-18 11:43:31 +01007816 .Digest(Digest::SHA_2_256)
7817 .SetDefaultValidity(),
7818 KeyFormat::PKCS8, ec_256_key));
7819}
7820
David Drysdaled2cc8c22021-04-15 13:29:45 +01007821// This is a more comprehensive test, but it can only be run on a machine which is still in early
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +00007822// boot stage, which no proper Android device is by the time we can run VTS. To use this,
7823// un-disable it and modify vold to remove the call to earlyBootEnded(). Running the test will end
7824// early boot, so you'll have to reboot between runs.
7825TEST_P(EarlyBootKeyTest, DISABLED_FullTest) {
7826 auto [aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData] =
7827 CreateTestKeys(TAG_EARLY_BOOT_ONLY, ErrorCode::OK);
7828 // TAG_EARLY_BOOT_ONLY should be in hw-enforced.
7829 EXPECT_TRUE(HwEnforcedAuthorizations(aesKeyData.characteristics).Contains(TAG_EARLY_BOOT_ONLY));
7830 EXPECT_TRUE(
7831 HwEnforcedAuthorizations(hmacKeyData.characteristics).Contains(TAG_EARLY_BOOT_ONLY));
7832 EXPECT_TRUE(HwEnforcedAuthorizations(rsaKeyData.characteristics).Contains(TAG_EARLY_BOOT_ONLY));
7833 EXPECT_TRUE(
7834 HwEnforcedAuthorizations(ecdsaKeyData.characteristics).Contains(TAG_EARLY_BOOT_ONLY));
7835
7836 // Should be able to use keys, since early boot has not ended
7837 EXPECT_EQ(ErrorCode::OK, UseAesKey(aesKeyData.blob));
7838 EXPECT_EQ(ErrorCode::OK, UseHmacKey(hmacKeyData.blob));
7839 EXPECT_EQ(ErrorCode::OK, UseRsaKey(rsaKeyData.blob));
7840 EXPECT_EQ(ErrorCode::OK, UseEcdsaKey(ecdsaKeyData.blob));
7841
7842 // End early boot
7843 ErrorCode earlyBootResult = GetReturnErrorCode(keyMint().earlyBootEnded());
7844 EXPECT_EQ(earlyBootResult, ErrorCode::OK);
7845
7846 // Should not be able to use already-created keys.
7847 EXPECT_EQ(ErrorCode::EARLY_BOOT_ENDED, UseAesKey(aesKeyData.blob));
7848 EXPECT_EQ(ErrorCode::EARLY_BOOT_ENDED, UseHmacKey(hmacKeyData.blob));
7849 EXPECT_EQ(ErrorCode::EARLY_BOOT_ENDED, UseRsaKey(rsaKeyData.blob));
7850 EXPECT_EQ(ErrorCode::EARLY_BOOT_ENDED, UseEcdsaKey(ecdsaKeyData.blob));
7851
7852 CheckedDeleteKey(&aesKeyData.blob);
7853 CheckedDeleteKey(&hmacKeyData.blob);
7854 CheckedDeleteKey(&rsaKeyData.blob);
7855 CheckedDeleteKey(&ecdsaKeyData.blob);
7856
7857 // Should not be able to create new keys
7858 std::tie(aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData) =
7859 CreateTestKeys(TAG_EARLY_BOOT_ONLY, ErrorCode::EARLY_BOOT_ENDED);
7860
7861 CheckedDeleteKey(&aesKeyData.blob);
7862 CheckedDeleteKey(&hmacKeyData.blob);
7863 CheckedDeleteKey(&rsaKeyData.blob);
7864 CheckedDeleteKey(&ecdsaKeyData.blob);
7865}
Shawn Willdend659c7c2021-02-19 14:51:51 -07007866
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +00007867INSTANTIATE_KEYMINT_AIDL_TEST(EarlyBootKeyTest);
7868
Shawn Willdend659c7c2021-02-19 14:51:51 -07007869using UnlockedDeviceRequiredTest = KeyMintAidlTestBase;
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +00007870
7871// This may be a problematic test. It can't be run repeatedly without unlocking the device in
7872// between runs... and on most test devices there are no enrolled credentials so it can't be
7873// unlocked at all, meaning the only way to get the test to pass again on a properly-functioning
7874// device is to reboot it. For that reason, this is disabled by default. It can be used as part of
7875// a manual test process, which includes unlocking between runs, which is why it's included here.
7876// Well, that and the fact that it's the only test we can do without also making calls into the
7877// Gatekeeper HAL. We haven't written any cross-HAL tests, and don't know what all of the
7878// implications might be, so that may or may not be a solution.
7879TEST_P(UnlockedDeviceRequiredTest, DISABLED_KeysBecomeUnusable) {
7880 auto [aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData] =
7881 CreateTestKeys(TAG_UNLOCKED_DEVICE_REQUIRED, ErrorCode::OK);
7882
7883 EXPECT_EQ(ErrorCode::OK, UseAesKey(aesKeyData.blob));
7884 EXPECT_EQ(ErrorCode::OK, UseHmacKey(hmacKeyData.blob));
7885 EXPECT_EQ(ErrorCode::OK, UseRsaKey(rsaKeyData.blob));
7886 EXPECT_EQ(ErrorCode::OK, UseEcdsaKey(ecdsaKeyData.blob));
7887
7888 ErrorCode rc = GetReturnErrorCode(
David Drysdaled2cc8c22021-04-15 13:29:45 +01007889 keyMint().deviceLocked(false /* passwordOnly */, {} /* timestampToken */));
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +00007890 ASSERT_EQ(ErrorCode::OK, rc);
7891 EXPECT_EQ(ErrorCode::DEVICE_LOCKED, UseAesKey(aesKeyData.blob));
7892 EXPECT_EQ(ErrorCode::DEVICE_LOCKED, UseHmacKey(hmacKeyData.blob));
7893 EXPECT_EQ(ErrorCode::DEVICE_LOCKED, UseRsaKey(rsaKeyData.blob));
7894 EXPECT_EQ(ErrorCode::DEVICE_LOCKED, UseEcdsaKey(ecdsaKeyData.blob));
7895
7896 CheckedDeleteKey(&aesKeyData.blob);
7897 CheckedDeleteKey(&hmacKeyData.blob);
7898 CheckedDeleteKey(&rsaKeyData.blob);
7899 CheckedDeleteKey(&ecdsaKeyData.blob);
7900}
Shawn Willdend659c7c2021-02-19 14:51:51 -07007901
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +00007902INSTANTIATE_KEYMINT_AIDL_TEST(UnlockedDeviceRequiredTest);
7903
Janis Danisevskis24c04702020-12-16 18:28:39 -08007904} // namespace aidl::android::hardware::security::keymint::test
Selene Huang31ab4042020-04-29 04:22:39 -07007905
7906int main(int argc, char** argv) {
Shawn Willden7c130392020-12-21 09:58:22 -07007907 std::cout << "Testing ";
7908 auto halInstances =
7909 aidl::android::hardware::security::keymint::test::KeyMintAidlTestBase::build_params();
7910 std::cout << "HAL instances:\n";
7911 for (auto& entry : halInstances) {
7912 std::cout << " " << entry << '\n';
7913 }
7914
Selene Huang31ab4042020-04-29 04:22:39 -07007915 ::testing::InitGoogleTest(&argc, argv);
7916 for (int i = 1; i < argc; ++i) {
7917 if (argv[i][0] == '-') {
7918 if (std::string(argv[i]) == "--arm_deleteAllKeys") {
Shawn Willden7c130392020-12-21 09:58:22 -07007919 aidl::android::hardware::security::keymint::test::KeyMintAidlTestBase::
7920 arm_deleteAllKeys = true;
Selene Huang31ab4042020-04-29 04:22:39 -07007921 }
7922 if (std::string(argv[i]) == "--dump_attestations") {
Shawn Willden7c130392020-12-21 09:58:22 -07007923 aidl::android::hardware::security::keymint::test::KeyMintAidlTestBase::
7924 dump_Attestations = true;
7925 } else {
7926 std::cout << "NOT dumping attestations" << std::endl;
Selene Huang31ab4042020-04-29 04:22:39 -07007927 }
David Drysdaledbbbe2e2021-12-02 07:44:23 +00007928 if (std::string(argv[i]) == "--skip_boot_pl_check") {
7929 // Allow checks of BOOT_PATCHLEVEL to be disabled, so that the tests can
7930 // be run in emulated environments that don't have the normal bootloader
7931 // interactions.
7932 aidl::android::hardware::security::keymint::test::check_boot_pl = false;
7933 }
Selene Huang31ab4042020-04-29 04:22:39 -07007934 }
7935 }
Shawn Willden08a7e432020-12-11 13:05:27 +00007936 return RUN_ALL_TESTS();
Selene Huang31ab4042020-04-29 04:22:39 -07007937}