blob: c6fddcf5b3a8f33a2b3c858afcfa10fb5bd6f357 [file] [log] [blame]
Shawn Willden128ffe02014-08-06 12:31:33 -06001/*
2 * Copyright (C) 2014 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 Willden437fbd12014-08-20 11:59:49 -060017#include <string>
18#include <fstream>
19
Shawn Willden128ffe02014-08-06 12:31:33 -060020#include <gtest/gtest.h>
Shawn Willden76364712014-08-11 17:48:04 -060021
Shawn Willden128ffe02014-08-06 12:31:33 -060022#include <openssl/engine.h>
23
Shawn Willden98d9b922014-08-26 08:14:10 -060024#include <keymaster/google_keymaster_utils.h>
25#include <keymaster/keymaster_tags.h>
26
Shawn Willden76364712014-08-11 17:48:04 -060027#include "google_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060028#include "google_softkeymaster.h"
29
Shawn Willden437fbd12014-08-20 11:59:49 -060030using std::string;
31using std::ifstream;
32using std::istreambuf_iterator;
33
Shawn Willden128ffe02014-08-06 12:31:33 -060034int main(int argc, char** argv) {
35 ::testing::InitGoogleTest(&argc, argv);
36 int result = RUN_ALL_TESTS();
37 // Clean up stuff OpenSSL leaves around, so Valgrind doesn't complain.
38 CRYPTO_cleanup_all_ex_data();
Shawn Willden7c0a82b2014-09-17 12:57:32 -060039 ERR_remove_thread_state(NULL);
Shawn Willden128ffe02014-08-06 12:31:33 -060040 ERR_free_strings();
41 return result;
42}
43
44namespace keymaster {
45namespace test {
46
Shawn Willden6bbe6782014-09-18 11:26:15 -060047// Note that these DSA generator, p and q values must match the values from dsa_privkey_pk8.der.
48const uint8_t dsa_g[] = {
49 0x19, 0x1C, 0x71, 0xFD, 0xE0, 0x03, 0x0C, 0x43, 0xD9, 0x0B, 0xF6, 0xCD, 0xD6, 0xA9, 0x70, 0xE7,
50 0x37, 0x86, 0x3A, 0x78, 0xE9, 0xA7, 0x47, 0xA7, 0x47, 0x06, 0x88, 0xB1, 0xAF, 0xD7, 0xF3, 0xF1,
51 0xA1, 0xD7, 0x00, 0x61, 0x28, 0x88, 0x31, 0x48, 0x60, 0xD8, 0x11, 0xEF, 0xA5, 0x24, 0x1A, 0x81,
52 0xC4, 0x2A, 0xE2, 0xEA, 0x0E, 0x36, 0xD2, 0xD2, 0x05, 0x84, 0x37, 0xCF, 0x32, 0x7D, 0x09, 0xE6,
53 0x0F, 0x8B, 0x0C, 0xC8, 0xC2, 0xA4, 0xB1, 0xDC, 0x80, 0xCA, 0x68, 0xDF, 0xAF, 0xD2, 0x90, 0xC0,
54 0x37, 0x58, 0x54, 0x36, 0x8F, 0x49, 0xB8, 0x62, 0x75, 0x8B, 0x48, 0x47, 0xC0, 0xBE, 0xF7, 0x9A,
55 0x92, 0xA6, 0x68, 0x05, 0xDA, 0x9D, 0xAF, 0x72, 0x9A, 0x67, 0xB3, 0xB4, 0x14, 0x03, 0xAE, 0x4F,
56 0x4C, 0x76, 0xB9, 0xD8, 0x64, 0x0A, 0xBA, 0x3B, 0xA8, 0x00, 0x60, 0x4D, 0xAE, 0x81, 0xC3, 0xC5,
57};
58const uint8_t dsa_p[] = {
59 0xA3, 0xF3, 0xE9, 0xB6, 0x7E, 0x7D, 0x88, 0xF6, 0xB7, 0xE5, 0xF5, 0x1F, 0x3B, 0xEE, 0xAC, 0xD7,
60 0xAD, 0xBC, 0xC9, 0xD1, 0x5A, 0xF8, 0x88, 0xC4, 0xEF, 0x6E, 0x3D, 0x74, 0x19, 0x74, 0xE7, 0xD8,
61 0xE0, 0x26, 0x44, 0x19, 0x86, 0xAF, 0x19, 0xDB, 0x05, 0xE9, 0x3B, 0x8B, 0x58, 0x58, 0xDE, 0xE5,
62 0x4F, 0x48, 0x15, 0x01, 0xEA, 0xE6, 0x83, 0x52, 0xD7, 0xC1, 0x21, 0xDF, 0xB9, 0xB8, 0x07, 0x66,
63 0x50, 0xFB, 0x3A, 0x0C, 0xB3, 0x85, 0xEE, 0xBB, 0x04, 0x5F, 0xC2, 0x6D, 0x6D, 0x95, 0xFA, 0x11,
64 0x93, 0x1E, 0x59, 0x5B, 0xB1, 0x45, 0x8D, 0xE0, 0x3D, 0x73, 0xAA, 0xF2, 0x41, 0x14, 0x51, 0x07,
65 0x72, 0x3D, 0xA2, 0xF7, 0x58, 0xCD, 0x11, 0xA1, 0x32, 0xCF, 0xDA, 0x42, 0xB7, 0xCC, 0x32, 0x80,
66 0xDB, 0x87, 0x82, 0xEC, 0x42, 0xDB, 0x5A, 0x55, 0x24, 0x24, 0xA2, 0xD1, 0x55, 0x29, 0xAD, 0xEB,
67};
68const uint8_t dsa_q[] = {
69 0xEB, 0xEA, 0x17, 0xD2, 0x09, 0xB3, 0xD7, 0x21, 0x9A, 0x21,
70 0x07, 0x82, 0x8F, 0xAB, 0xFE, 0x88, 0x71, 0x68, 0xF7, 0xE3,
71};
72
Shawn Willden128ffe02014-08-06 12:31:33 -060073class KeymasterTest : public testing::Test {
74 protected:
Shawn Willden2f3be362014-08-25 11:31:39 -060075 KeymasterTest() : device(5, new StdoutLogger) { RAND_seed("foobar", 6); }
Shawn Willdenda8485e2014-08-17 08:00:01 -060076 ~KeymasterTest() {}
Shawn Willden128ffe02014-08-06 12:31:33 -060077
78 GoogleSoftKeymaster device;
79};
80
Shawn Willden128ffe02014-08-06 12:31:33 -060081typedef KeymasterTest CheckSupported;
82TEST_F(CheckSupported, SupportedAlgorithms) {
83 // Shouldn't blow up on NULL.
84 device.SupportedAlgorithms(NULL);
85
86 SupportedResponse<keymaster_algorithm_t> response;
87 device.SupportedAlgorithms(&response);
88 EXPECT_EQ(KM_ERROR_OK, response.error);
Shawn Willdenc3864dd2014-08-18 15:20:01 -060089 EXPECT_EQ(3U, response.results_length);
Shawn Willden128ffe02014-08-06 12:31:33 -060090 EXPECT_EQ(KM_ALGORITHM_RSA, response.results[0]);
Shawn Willden28e41472014-08-18 13:35:22 -060091 EXPECT_EQ(KM_ALGORITHM_DSA, response.results[1]);
Shawn Willdenc3864dd2014-08-18 15:20:01 -060092 EXPECT_EQ(KM_ALGORITHM_ECDSA, response.results[2]);
Shawn Willden128ffe02014-08-06 12:31:33 -060093}
94
95TEST_F(CheckSupported, SupportedBlockModes) {
96 // Shouldn't blow up on NULL.
97 device.SupportedBlockModes(KM_ALGORITHM_RSA, NULL);
98
99 SupportedResponse<keymaster_block_mode_t> response;
100 device.SupportedBlockModes(KM_ALGORITHM_RSA, &response);
101 EXPECT_EQ(KM_ERROR_OK, response.error);
102 EXPECT_EQ(0U, response.results_length);
103
104 device.SupportedBlockModes(KM_ALGORITHM_DSA, &response);
Shawn Willden28e41472014-08-18 13:35:22 -0600105 EXPECT_EQ(KM_ERROR_OK, response.error);
106 EXPECT_EQ(0U, response.results_length);
107
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600108 device.SupportedBlockModes(KM_ALGORITHM_ECDSA, &response);
109 EXPECT_EQ(KM_ERROR_OK, response.error);
110 EXPECT_EQ(0U, response.results_length);
111
Shawn Willden28e41472014-08-18 13:35:22 -0600112 device.SupportedBlockModes(KM_ALGORITHM_AES, &response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600113 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, response.error);
114}
115
116TEST_F(CheckSupported, SupportedPaddingModes) {
117 // Shouldn't blow up on NULL.
118 device.SupportedPaddingModes(KM_ALGORITHM_RSA, NULL);
119
120 SupportedResponse<keymaster_padding_t> response;
121 device.SupportedPaddingModes(KM_ALGORITHM_RSA, &response);
122 EXPECT_EQ(KM_ERROR_OK, response.error);
123 EXPECT_EQ(1U, response.results_length);
124 EXPECT_EQ(KM_PAD_NONE, response.results[0]);
125
126 device.SupportedPaddingModes(KM_ALGORITHM_DSA, &response);
Shawn Willden28e41472014-08-18 13:35:22 -0600127 EXPECT_EQ(KM_ERROR_OK, response.error);
128 EXPECT_EQ(1U, response.results_length);
129 EXPECT_EQ(KM_PAD_NONE, response.results[0]);
130
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600131 device.SupportedPaddingModes(KM_ALGORITHM_ECDSA, &response);
132 EXPECT_EQ(KM_ERROR_OK, response.error);
133 EXPECT_EQ(1U, response.results_length);
134 EXPECT_EQ(KM_PAD_NONE, response.results[0]);
135
Shawn Willden28e41472014-08-18 13:35:22 -0600136 device.SupportedPaddingModes(KM_ALGORITHM_AES, &response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600137 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, response.error);
138}
139
140TEST_F(CheckSupported, SupportedDigests) {
141 // Shouldn't blow up on NULL.
142 device.SupportedDigests(KM_ALGORITHM_RSA, NULL);
143
144 SupportedResponse<keymaster_digest_t> response;
145 device.SupportedDigests(KM_ALGORITHM_RSA, &response);
146 EXPECT_EQ(KM_ERROR_OK, response.error);
147 EXPECT_EQ(1U, response.results_length);
148 EXPECT_EQ(KM_DIGEST_NONE, response.results[0]);
149
150 device.SupportedDigests(KM_ALGORITHM_DSA, &response);
Shawn Willden28e41472014-08-18 13:35:22 -0600151 EXPECT_EQ(KM_ERROR_OK, response.error);
152 EXPECT_EQ(1U, response.results_length);
153 EXPECT_EQ(KM_DIGEST_NONE, response.results[0]);
154
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600155 device.SupportedDigests(KM_ALGORITHM_ECDSA, &response);
156 EXPECT_EQ(KM_ERROR_OK, response.error);
157 EXPECT_EQ(1U, response.results_length);
158 EXPECT_EQ(KM_DIGEST_NONE, response.results[0]);
159
Shawn Willden28e41472014-08-18 13:35:22 -0600160 device.SupportedDigests(KM_ALGORITHM_AES, &response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600161 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, response.error);
162}
163
164TEST_F(CheckSupported, SupportedImportFormats) {
165 // Shouldn't blow up on NULL.
166 device.SupportedImportFormats(KM_ALGORITHM_RSA, NULL);
167
168 SupportedResponse<keymaster_key_format_t> response;
169 device.SupportedImportFormats(KM_ALGORITHM_RSA, &response);
170 EXPECT_EQ(KM_ERROR_OK, response.error);
171 EXPECT_EQ(1U, response.results_length);
172 EXPECT_EQ(KM_KEY_FORMAT_PKCS8, response.results[0]);
173
174 device.SupportedImportFormats(KM_ALGORITHM_DSA, &response);
Shawn Willden28e41472014-08-18 13:35:22 -0600175 EXPECT_EQ(KM_ERROR_OK, response.error);
176 EXPECT_EQ(1U, response.results_length);
177 EXPECT_EQ(KM_KEY_FORMAT_PKCS8, response.results[0]);
178
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600179 device.SupportedImportFormats(KM_ALGORITHM_ECDSA, &response);
180 EXPECT_EQ(KM_ERROR_OK, response.error);
181 EXPECT_EQ(1U, response.results_length);
182 EXPECT_EQ(KM_KEY_FORMAT_PKCS8, response.results[0]);
183
Shawn Willden28e41472014-08-18 13:35:22 -0600184 device.SupportedImportFormats(KM_ALGORITHM_AES, &response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600185 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, response.error);
186}
187
188TEST_F(CheckSupported, SupportedExportFormats) {
189 // Shouldn't blow up on NULL.
190 device.SupportedExportFormats(KM_ALGORITHM_RSA, NULL);
191
192 SupportedResponse<keymaster_key_format_t> response;
193 device.SupportedExportFormats(KM_ALGORITHM_RSA, &response);
194 EXPECT_EQ(KM_ERROR_OK, response.error);
195 EXPECT_EQ(1U, response.results_length);
196 EXPECT_EQ(KM_KEY_FORMAT_X509, response.results[0]);
197
198 device.SupportedExportFormats(KM_ALGORITHM_DSA, &response);
Shawn Willden28e41472014-08-18 13:35:22 -0600199 EXPECT_EQ(KM_ERROR_OK, response.error);
200 EXPECT_EQ(1U, response.results_length);
201 EXPECT_EQ(KM_KEY_FORMAT_X509, response.results[0]);
202
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600203 device.SupportedExportFormats(KM_ALGORITHM_ECDSA, &response);
204 EXPECT_EQ(KM_ERROR_OK, response.error);
205 EXPECT_EQ(1U, response.results_length);
206 EXPECT_EQ(KM_KEY_FORMAT_X509, response.results[0]);
207
Shawn Willden28e41472014-08-18 13:35:22 -0600208 device.SupportedExportFormats(KM_ALGORITHM_AES, &response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600209 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, response.error);
210}
211
212typedef KeymasterTest NewKeyGeneration;
213TEST_F(NewKeyGeneration, Rsa) {
214 keymaster_key_param_t params[] = {
215 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
216 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
217 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
Shawn Willden76364712014-08-11 17:48:04 -0600218 Authorization(TAG_KEY_SIZE, 256),
Shawn Willden128ffe02014-08-06 12:31:33 -0600219 Authorization(TAG_USER_ID, 7),
220 Authorization(TAG_USER_AUTH_ID, 8),
Shawn Willden76364712014-08-11 17:48:04 -0600221 Authorization(TAG_APPLICATION_ID, "app_id", 6),
222 Authorization(TAG_APPLICATION_DATA, "app_data", 8),
Shawn Willden128ffe02014-08-06 12:31:33 -0600223 Authorization(TAG_AUTH_TIMEOUT, 300),
224 };
225 GenerateKeyRequest req;
226 req.key_description.Reinitialize(params, array_length(params));
227 GenerateKeyResponse rsp;
228
229 device.GenerateKey(req, &rsp);
230
231 ASSERT_EQ(KM_ERROR_OK, rsp.error);
232 EXPECT_EQ(0U, rsp.enforced.size());
Shawn Willden8d336ae2014-08-09 15:47:05 -0600233 EXPECT_EQ(12U, rsp.enforced.SerializedSize());
234 EXPECT_GT(rsp.unenforced.SerializedSize(), 12U);
Shawn Willden128ffe02014-08-06 12:31:33 -0600235
236 // Check specified tags are all present in unenforced characteristics
237 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_SIGN));
238 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_VERIFY));
239
240 EXPECT_TRUE(contains(rsp.unenforced, TAG_ALGORITHM, KM_ALGORITHM_RSA));
241
242 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_ID, 7));
243 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_AUTH_ID, 8));
Shawn Willden76364712014-08-11 17:48:04 -0600244 EXPECT_TRUE(contains(rsp.unenforced, TAG_KEY_SIZE, 256));
Shawn Willden128ffe02014-08-06 12:31:33 -0600245 EXPECT_TRUE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 300));
246
Shawn Willden39b970b2014-08-11 09:11:21 -0600247 // Verify that App ID, App data and ROT are NOT included.
248 EXPECT_FALSE(contains(rsp.unenforced, TAG_ROOT_OF_TRUST));
249 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_ID));
250 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_DATA));
251
Shawn Willden128ffe02014-08-06 12:31:33 -0600252 // Just for giggles, check that some unexpected tags/values are NOT present.
253 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
254 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
255 EXPECT_FALSE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 301));
256 EXPECT_FALSE(contains(rsp.unenforced, TAG_RESCOPE_AUTH_TIMEOUT));
257
258 // Now check that unspecified, defaulted tags are correct.
259 EXPECT_TRUE(contains(rsp.unenforced, TAG_RSA_PUBLIC_EXPONENT, 65537));
260 EXPECT_TRUE(contains(rsp.unenforced, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
261 EXPECT_TRUE(contains(rsp.unenforced, KM_TAG_CREATION_DATETIME));
Shawn Willden128ffe02014-08-06 12:31:33 -0600262}
263
Shawn Willden6bbe6782014-09-18 11:26:15 -0600264TEST_F(NewKeyGeneration, RsaDefaultSize) {
265 keymaster_key_param_t params[] = {
266 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
267 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
268 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
269 Authorization(TAG_USER_ID, 7),
270 Authorization(TAG_USER_AUTH_ID, 8),
271 Authorization(TAG_APPLICATION_ID, "app_id", 6),
272 Authorization(TAG_APPLICATION_DATA, "app_data", 8),
273 Authorization(TAG_AUTH_TIMEOUT, 300),
274 };
275 GenerateKeyRequest req;
276 req.key_description.Reinitialize(params, array_length(params));
277 GenerateKeyResponse rsp;
278
279 device.GenerateKey(req, &rsp);
280
281 ASSERT_EQ(KM_ERROR_OK, rsp.error);
282 EXPECT_EQ(0U, rsp.enforced.size());
283 EXPECT_EQ(12U, rsp.enforced.SerializedSize());
284 EXPECT_GT(rsp.unenforced.SerializedSize(), 12U);
285
286 // Check specified tags are all present in unenforced characteristics
287 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_SIGN));
288 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_VERIFY));
289
290 EXPECT_TRUE(contains(rsp.unenforced, TAG_ALGORITHM, KM_ALGORITHM_RSA));
291
292 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_ID, 7));
293 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_AUTH_ID, 8));
294 EXPECT_TRUE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 300));
295
296 // Verify that App ID, App data and ROT are NOT included.
297 EXPECT_FALSE(contains(rsp.unenforced, TAG_ROOT_OF_TRUST));
298 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_ID));
299 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_DATA));
300
301 // Just for giggles, check that some unexpected tags/values are NOT present.
302 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
303 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
304 EXPECT_FALSE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 301));
305 EXPECT_FALSE(contains(rsp.unenforced, TAG_RESCOPE_AUTH_TIMEOUT));
306
307 // Now check that unspecified, defaulted tags are correct.
308 EXPECT_TRUE(contains(rsp.unenforced, TAG_RSA_PUBLIC_EXPONENT, 65537));
309 EXPECT_TRUE(contains(rsp.unenforced, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
310 EXPECT_TRUE(contains(rsp.unenforced, KM_TAG_CREATION_DATETIME));
311 EXPECT_TRUE(contains(rsp.unenforced, TAG_KEY_SIZE, 2048));
312}
313
Shawn Willden28e41472014-08-18 13:35:22 -0600314TEST_F(NewKeyGeneration, Dsa) {
315 keymaster_key_param_t params[] = {
316 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
317 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
318 Authorization(TAG_ALGORITHM, KM_ALGORITHM_DSA),
319 Authorization(TAG_KEY_SIZE, 256),
320 Authorization(TAG_USER_ID, 7),
321 Authorization(TAG_USER_AUTH_ID, 8),
322 Authorization(TAG_APPLICATION_ID, "app_id", 6),
323 Authorization(TAG_APPLICATION_DATA, "app_data", 8),
324 Authorization(TAG_AUTH_TIMEOUT, 300),
325 };
326 GenerateKeyRequest req;
327 req.key_description.Reinitialize(params, array_length(params));
328 GenerateKeyResponse rsp;
329
330 device.GenerateKey(req, &rsp);
331
332 ASSERT_EQ(KM_ERROR_OK, rsp.error);
333 EXPECT_EQ(0U, rsp.enforced.size());
334 EXPECT_EQ(12U, rsp.enforced.SerializedSize());
335 EXPECT_GT(rsp.unenforced.SerializedSize(), 12U);
336
337 // Check specified tags are all present in unenforced characteristics
338 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_SIGN));
339 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_VERIFY));
340
341 EXPECT_TRUE(contains(rsp.unenforced, TAG_ALGORITHM, KM_ALGORITHM_DSA));
342
343 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_ID, 7));
344 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_AUTH_ID, 8));
345 EXPECT_TRUE(contains(rsp.unenforced, TAG_KEY_SIZE, 256));
346 EXPECT_TRUE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 300));
347
348 // Verify that App ID, App data and ROT are NOT included.
349 EXPECT_FALSE(contains(rsp.unenforced, TAG_ROOT_OF_TRUST));
350 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_ID));
351 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_DATA));
352
353 // Just for giggles, check that some unexpected tags/values are NOT present.
354 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
355 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
356 EXPECT_FALSE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 301));
357 EXPECT_FALSE(contains(rsp.unenforced, TAG_RESCOPE_AUTH_TIMEOUT));
358
359 // Now check that unspecified, defaulted tags are correct.
360 EXPECT_TRUE(contains(rsp.unenforced, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
361 EXPECT_TRUE(contains(rsp.unenforced, KM_TAG_CREATION_DATETIME));
362
363 // Generator should have created DSA params.
364 keymaster_blob_t g, p, q;
365 EXPECT_TRUE(rsp.unenforced.GetTagValue(TAG_DSA_GENERATOR, &g));
366 EXPECT_TRUE(rsp.unenforced.GetTagValue(TAG_DSA_P, &p));
367 EXPECT_TRUE(rsp.unenforced.GetTagValue(TAG_DSA_Q, &q));
Shawn Willdend67afae2014-08-19 12:36:27 -0600368 EXPECT_TRUE(g.data_length >= 63 && g.data_length <= 64);
Shawn Willden28e41472014-08-18 13:35:22 -0600369 EXPECT_EQ(64U, p.data_length);
370 EXPECT_EQ(20U, q.data_length);
371}
372
Shawn Willden6bbe6782014-09-18 11:26:15 -0600373TEST_F(NewKeyGeneration, DsaDefaultSize) {
374 keymaster_key_param_t params[] = {
375 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
376 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
377 Authorization(TAG_ALGORITHM, KM_ALGORITHM_DSA),
378 Authorization(TAG_USER_ID, 7),
379 Authorization(TAG_USER_AUTH_ID, 8),
380 Authorization(TAG_APPLICATION_ID, "app_id", 6),
381 Authorization(TAG_APPLICATION_DATA, "app_data", 8),
382 Authorization(TAG_AUTH_TIMEOUT, 300),
383 };
384 GenerateKeyRequest req;
385 req.key_description.Reinitialize(params, array_length(params));
386 GenerateKeyResponse rsp;
387
388 device.GenerateKey(req, &rsp);
389
390 ASSERT_EQ(KM_ERROR_OK, rsp.error);
391 EXPECT_EQ(0U, rsp.enforced.size());
392 EXPECT_EQ(12U, rsp.enforced.SerializedSize());
393 EXPECT_GT(rsp.unenforced.SerializedSize(), 12U);
394
395 // Check specified tags are all present in unenforced characteristics
396 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_SIGN));
397 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_VERIFY));
398
399 EXPECT_TRUE(contains(rsp.unenforced, TAG_ALGORITHM, KM_ALGORITHM_DSA));
400
401 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_ID, 7));
402 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_AUTH_ID, 8));
403 EXPECT_TRUE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 300));
404
405 // Verify that App ID, App data and ROT are NOT included.
406 EXPECT_FALSE(contains(rsp.unenforced, TAG_ROOT_OF_TRUST));
407 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_ID));
408 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_DATA));
409
410 // Just for giggles, check that some unexpected tags/values are NOT present.
411 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
412 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
413 EXPECT_FALSE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 301));
414 EXPECT_FALSE(contains(rsp.unenforced, TAG_RESCOPE_AUTH_TIMEOUT));
415
416 // Now check that unspecified, defaulted tags are correct.
417 EXPECT_TRUE(contains(rsp.unenforced, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
418 EXPECT_TRUE(contains(rsp.unenforced, KM_TAG_CREATION_DATETIME));
419 EXPECT_TRUE(contains(rsp.unenforced, TAG_KEY_SIZE, 2048));
420
421 // Generator should have created DSA params.
422 keymaster_blob_t g, p, q;
423 EXPECT_TRUE(rsp.unenforced.GetTagValue(TAG_DSA_GENERATOR, &g));
424 EXPECT_TRUE(rsp.unenforced.GetTagValue(TAG_DSA_P, &p));
425 EXPECT_TRUE(rsp.unenforced.GetTagValue(TAG_DSA_Q, &q));
426 EXPECT_TRUE(g.data_length >= 255 && g.data_length <= 256);
427 EXPECT_EQ(256U, p.data_length);
428 EXPECT_EQ(32U, q.data_length);
429}
430
431TEST_F(NewKeyGeneration, Dsa_ParamsSpecified) {
432 keymaster_key_param_t params[] = {
433 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
434 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
435 Authorization(TAG_ALGORITHM, KM_ALGORITHM_DSA),
436 Authorization(TAG_KEY_SIZE, 256),
437 Authorization(TAG_USER_ID, 7),
438 Authorization(TAG_USER_AUTH_ID, 8),
439 Authorization(TAG_APPLICATION_ID, "app_id", 6),
440 Authorization(TAG_APPLICATION_DATA, "app_data", 8),
441 Authorization(TAG_AUTH_TIMEOUT, 300),
442 Authorization(TAG_DSA_GENERATOR, dsa_g, array_size(dsa_g)),
443 Authorization(TAG_DSA_P, dsa_p, array_size(dsa_p)),
444 Authorization(TAG_DSA_Q, dsa_q, array_size(dsa_q)),
445 };
446 GenerateKeyRequest req;
447 req.key_description.Reinitialize(params, array_length(params));
448 GenerateKeyResponse rsp;
449
450 device.GenerateKey(req, &rsp);
451
452 ASSERT_EQ(KM_ERROR_OK, rsp.error);
453 EXPECT_EQ(0U, rsp.enforced.size());
454 EXPECT_EQ(12U, rsp.enforced.SerializedSize());
455 EXPECT_GT(rsp.unenforced.SerializedSize(), 12U);
456
457 // Check specified tags are all present in unenforced characteristics
458 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_SIGN));
459 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_VERIFY));
460
461 EXPECT_TRUE(contains(rsp.unenforced, TAG_ALGORITHM, KM_ALGORITHM_DSA));
462
463 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_ID, 7));
464 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_AUTH_ID, 8));
465 EXPECT_TRUE(contains(rsp.unenforced, TAG_KEY_SIZE, 256));
466 EXPECT_TRUE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 300));
467
468 // Verify that App ID, App data and ROT are NOT included.
469 EXPECT_FALSE(contains(rsp.unenforced, TAG_ROOT_OF_TRUST));
470 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_ID));
471 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_DATA));
472
473 // Just for giggles, check that some unexpected tags/values are NOT present.
474 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
475 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
476 EXPECT_FALSE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 301));
477 EXPECT_FALSE(contains(rsp.unenforced, TAG_RESCOPE_AUTH_TIMEOUT));
478
479 // Now check that unspecified, defaulted tags are correct.
480 EXPECT_TRUE(contains(rsp.unenforced, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
481 EXPECT_TRUE(contains(rsp.unenforced, KM_TAG_CREATION_DATETIME));
482}
483
484TEST_F(NewKeyGeneration, Dsa_SomeParamsSpecified) {
485 keymaster_key_param_t params[] = {
486 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
487 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
488 Authorization(TAG_ALGORITHM, KM_ALGORITHM_DSA),
489 Authorization(TAG_KEY_SIZE, 256),
490 Authorization(TAG_USER_ID, 7),
491 Authorization(TAG_USER_AUTH_ID, 8),
492 Authorization(TAG_APPLICATION_ID, "app_id", 6),
493 Authorization(TAG_APPLICATION_DATA, "app_data", 8),
494 Authorization(TAG_AUTH_TIMEOUT, 300),
495 Authorization(TAG_DSA_P, dsa_p, array_size(dsa_p)),
496 Authorization(TAG_DSA_Q, dsa_q, array_size(dsa_q)),
497 };
498 GenerateKeyRequest req;
499 req.key_description.Reinitialize(params, array_length(params));
500 GenerateKeyResponse rsp;
501
502 device.GenerateKey(req, &rsp);
503 ASSERT_EQ(KM_ERROR_INVALID_DSA_PARAMS, rsp.error);
504}
505
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600506TEST_F(NewKeyGeneration, Ecdsa) {
507 keymaster_key_param_t params[] = {
508 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
509 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
510 Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA),
Shawn Willden6bbe6782014-09-18 11:26:15 -0600511 Authorization(TAG_KEY_SIZE, 192),
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600512 Authorization(TAG_USER_ID, 7),
513 Authorization(TAG_USER_AUTH_ID, 8),
514 Authorization(TAG_APPLICATION_ID, "app_id", 6),
515 Authorization(TAG_APPLICATION_DATA, "app_data", 8),
516 Authorization(TAG_AUTH_TIMEOUT, 300),
517 };
518 GenerateKeyRequest req;
519 req.key_description.Reinitialize(params, array_length(params));
520 GenerateKeyResponse rsp;
521
522 device.GenerateKey(req, &rsp);
523
524 ASSERT_EQ(KM_ERROR_OK, rsp.error);
525 EXPECT_EQ(0U, rsp.enforced.size());
526 EXPECT_EQ(12U, rsp.enforced.SerializedSize());
527 EXPECT_GT(rsp.unenforced.SerializedSize(), 12U);
528
529 // Check specified tags are all present in unenforced characteristics
530 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_SIGN));
531 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_VERIFY));
532
533 EXPECT_TRUE(contains(rsp.unenforced, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
534
535 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_ID, 7));
536 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_AUTH_ID, 8));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600537 EXPECT_TRUE(contains(rsp.unenforced, TAG_KEY_SIZE, 192));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600538 EXPECT_TRUE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 300));
539
540 // Verify that App ID, App data and ROT are NOT included.
541 EXPECT_FALSE(contains(rsp.unenforced, TAG_ROOT_OF_TRUST));
542 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_ID));
543 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_DATA));
544
545 // Just for giggles, check that some unexpected tags/values are NOT present.
546 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
547 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
548 EXPECT_FALSE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 301));
549 EXPECT_FALSE(contains(rsp.unenforced, TAG_RESCOPE_AUTH_TIMEOUT));
550
551 // Now check that unspecified, defaulted tags are correct.
552 EXPECT_TRUE(contains(rsp.unenforced, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
553 EXPECT_TRUE(contains(rsp.unenforced, KM_TAG_CREATION_DATETIME));
554}
555
Shawn Willden6bbe6782014-09-18 11:26:15 -0600556TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
557 keymaster_key_param_t params[] = {
558 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
559 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
560 Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA),
561 Authorization(TAG_USER_ID, 7),
562 Authorization(TAG_USER_AUTH_ID, 8),
563 Authorization(TAG_APPLICATION_ID, "app_id", 6),
564 Authorization(TAG_APPLICATION_DATA, "app_data", 8),
565 Authorization(TAG_AUTH_TIMEOUT, 300),
566 };
567 GenerateKeyRequest req;
568 req.key_description.Reinitialize(params, array_length(params));
569 GenerateKeyResponse rsp;
570
571 device.GenerateKey(req, &rsp);
572
573 ASSERT_EQ(KM_ERROR_OK, rsp.error);
574 EXPECT_EQ(0U, rsp.enforced.size());
575 EXPECT_EQ(12U, rsp.enforced.SerializedSize());
576 EXPECT_GT(rsp.unenforced.SerializedSize(), 12U);
577
578 // Check specified tags are all present in unenforced characteristics
579 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_SIGN));
580 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_VERIFY));
581
582 EXPECT_TRUE(contains(rsp.unenforced, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
583
584 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_ID, 7));
585 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_AUTH_ID, 8));
586 EXPECT_TRUE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 300));
587
588 // Verify that App ID, App data and ROT are NOT included.
589 EXPECT_FALSE(contains(rsp.unenforced, TAG_ROOT_OF_TRUST));
590 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_ID));
591 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_DATA));
592
593 // Just for giggles, check that some unexpected tags/values are NOT present.
594 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
595 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
596 EXPECT_FALSE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 301));
597 EXPECT_FALSE(contains(rsp.unenforced, TAG_RESCOPE_AUTH_TIMEOUT));
598
599 // Now check that unspecified, defaulted tags are correct.
600 EXPECT_TRUE(contains(rsp.unenforced, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
601 EXPECT_TRUE(contains(rsp.unenforced, KM_TAG_CREATION_DATETIME));
602 EXPECT_TRUE(contains(rsp.unenforced, TAG_KEY_SIZE, 224));
603}
604
605TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
606 keymaster_key_param_t params[] = {
607 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
608 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
609 Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA),
610 Authorization(TAG_USER_ID, 7),
611 Authorization(TAG_USER_AUTH_ID, 8),
612 Authorization(TAG_APPLICATION_ID, "app_id", 6),
613 Authorization(TAG_APPLICATION_DATA, "app_data", 8),
614 Authorization(TAG_AUTH_TIMEOUT, 300),
615 Authorization(TAG_KEY_SIZE, 190),
616 };
617 GenerateKeyRequest req;
618 req.key_description.Reinitialize(params, array_length(params));
619 GenerateKeyResponse rsp;
620
621 device.GenerateKey(req, &rsp);
622
623 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE, rsp.error);
624}
625
626TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
627 keymaster_key_param_t params[] = {
628 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
629 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
630 Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA),
631 Authorization(TAG_USER_ID, 7),
632 Authorization(TAG_USER_AUTH_ID, 8),
633 Authorization(TAG_APPLICATION_ID, "app_id", 6),
634 Authorization(TAG_APPLICATION_DATA, "app_data", 8),
635 Authorization(TAG_AUTH_TIMEOUT, 300),
636 };
637
638 size_t valid_sizes[] = {192, 224, 256, 384, 521};
639
640 GenerateKeyRequest req;
641 for (size_t size : valid_sizes) {
642 req.key_description.Reinitialize(params, array_length(params));
643 req.key_description.push_back(Authorization(TAG_KEY_SIZE, size));
644 GenerateKeyResponse rsp;
645 device.GenerateKey(req, &rsp);
646 EXPECT_EQ(KM_ERROR_OK, rsp.error) << "Failed to generate size: " << size;
647 }
648}
649
Shawn Willden76364712014-08-11 17:48:04 -0600650typedef KeymasterTest GetKeyCharacteristics;
651TEST_F(GetKeyCharacteristics, SimpleRsa) {
652 keymaster_key_param_t params[] = {
653 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
654 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
655 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
656 Authorization(TAG_KEY_SIZE, 256),
657 Authorization(TAG_USER_ID, 7),
658 Authorization(TAG_USER_AUTH_ID, 8),
Shawn Willden1615f2e2014-08-13 10:37:40 -0600659 Authorization(TAG_APPLICATION_ID, "app_id", 6),
Shawn Willden76364712014-08-11 17:48:04 -0600660 Authorization(TAG_AUTH_TIMEOUT, 300),
661 };
662
663 GenerateKeyRequest gen_req;
664 gen_req.key_description.Reinitialize(params, array_length(params));
665 GenerateKeyResponse gen_rsp;
666
667 device.GenerateKey(gen_req, &gen_rsp);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600668 ASSERT_EQ(KM_ERROR_OK, gen_rsp.error);
Shawn Willden76364712014-08-11 17:48:04 -0600669
670 GetKeyCharacteristicsRequest req;
Shawn Willdenda8485e2014-08-17 08:00:01 -0600671 req.SetKeyMaterial(gen_rsp.key_blob);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600672 req.additional_params.push_back(TAG_APPLICATION_ID, "app_id", 6);
Shawn Willden76364712014-08-11 17:48:04 -0600673
674 GetKeyCharacteristicsResponse rsp;
675 device.GetKeyCharacteristics(req, &rsp);
676 ASSERT_EQ(KM_ERROR_OK, rsp.error);
677
678 EXPECT_EQ(gen_rsp.enforced, rsp.enforced);
679 EXPECT_EQ(gen_rsp.unenforced, rsp.unenforced);
680}
681
Shawn Willden61644f32014-08-18 13:43:14 -0600682/**
683 * Test class that provides some infrastructure for generating keys and signing messages.
684 */
Shawn Willden1615f2e2014-08-13 10:37:40 -0600685class SigningOperationsTest : public KeymasterTest {
686 protected:
Shawn Willden61644f32014-08-18 13:43:14 -0600687 void GenerateKey(keymaster_algorithm_t algorithm, keymaster_digest_t digest,
688 keymaster_padding_t padding, uint32_t key_size) {
Shawn Willden1615f2e2014-08-13 10:37:40 -0600689 keymaster_key_param_t params[] = {
690 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
691 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
Shawn Willden61644f32014-08-18 13:43:14 -0600692 Authorization(TAG_ALGORITHM, algorithm),
Shawn Willden1615f2e2014-08-13 10:37:40 -0600693 Authorization(TAG_KEY_SIZE, key_size),
694 Authorization(TAG_USER_ID, 7),
695 Authorization(TAG_USER_AUTH_ID, 8),
696 Authorization(TAG_APPLICATION_ID, "app_id", 6),
697 Authorization(TAG_AUTH_TIMEOUT, 300),
698 };
699 GenerateKeyRequest generate_request;
700 generate_request.key_description.Reinitialize(params, array_length(params));
Shawn Willden43e999e2014-08-13 13:29:50 -0600701 if (static_cast<int>(digest) != -1)
Shawn Willden1615f2e2014-08-13 10:37:40 -0600702 generate_request.key_description.push_back(TAG_DIGEST, digest);
Shawn Willden43e999e2014-08-13 13:29:50 -0600703 if (static_cast<int>(padding) != -1)
Shawn Willden1615f2e2014-08-13 10:37:40 -0600704 generate_request.key_description.push_back(TAG_PADDING, padding);
705 device.GenerateKey(generate_request, &generate_response_);
706 EXPECT_EQ(KM_ERROR_OK, generate_response_.error);
Shawn Willden61644f32014-08-18 13:43:14 -0600707 }
Shawn Willden1615f2e2014-08-13 10:37:40 -0600708
Shawn Willden61644f32014-08-18 13:43:14 -0600709 void SignMessage(const void* message, size_t size) {
Shawn Willden437fbd12014-08-20 11:59:49 -0600710 SignMessage(generate_response_.key_blob, message, size);
711 }
712
713 void SignMessage(const keymaster_key_blob_t& key_blob, const void* message, size_t size) {
Shawn Willden61644f32014-08-18 13:43:14 -0600714 BeginOperationRequest begin_request;
715 BeginOperationResponse begin_response;
Shawn Willden437fbd12014-08-20 11:59:49 -0600716 begin_request.SetKeyMaterial(key_blob);
Shawn Willden61644f32014-08-18 13:43:14 -0600717 begin_request.purpose = KM_PURPOSE_SIGN;
718 AddClientParams(&begin_request.additional_params);
719
720 device.BeginOperation(begin_request, &begin_response);
721 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
722
723 UpdateOperationRequest update_request;
724 UpdateOperationResponse update_response;
725 update_request.op_handle = begin_response.op_handle;
726 update_request.input.Reinitialize(message, size);
727 EXPECT_EQ(size, update_request.input.available_read());
728
729 device.UpdateOperation(update_request, &update_response);
730 ASSERT_EQ(KM_ERROR_OK, update_response.error);
731 EXPECT_EQ(0U, update_response.output.available_read());
732
733 FinishOperationRequest finish_request;
734 finish_request.op_handle = begin_response.op_handle;
735 device.FinishOperation(finish_request, &finish_response_);
736 ASSERT_EQ(KM_ERROR_OK, finish_response_.error);
737 EXPECT_GT(finish_response_.output.available_read(), 0U);
738 }
739
740 void AddClientParams(AuthorizationSet* set) { set->push_back(TAG_APPLICATION_ID, "app_id", 6); }
741
742 const keymaster_key_blob_t& key_blob() { return generate_response_.key_blob; }
Shawn Willdenf268d742014-08-19 15:36:26 -0600743
744 const keymaster_key_blob_t& corrupt_key_blob() {
Shawn Willden2241bf02014-08-28 09:59:53 -0600745 uint8_t* tmp = const_cast<uint8_t*>(generate_response_.key_blob.key_material);
746 ++tmp[generate_response_.key_blob.key_material_size / 2];
Shawn Willdenf268d742014-08-19 15:36:26 -0600747 return generate_response_.key_blob;
748 }
749
Shawn Willden61644f32014-08-18 13:43:14 -0600750 Buffer* signature() {
751 if (finish_response_.error == KM_ERROR_OK)
752 return &finish_response_.output;
753 return NULL;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600754 }
755
756 private:
757 GenerateKeyResponse generate_response_;
Shawn Willden61644f32014-08-18 13:43:14 -0600758 FinishOperationResponse finish_response_;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600759};
760
761TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willden61644f32014-08-18 13:43:14 -0600762 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willdenffd790c2014-08-18 21:20:06 -0600763 const char message[] = "12345678901234567890123456789012";
Shawn Willden1615f2e2014-08-13 10:37:40 -0600764
765 BeginOperationRequest begin_request;
766 BeginOperationResponse begin_response;
Shawn Willden61644f32014-08-18 13:43:14 -0600767 begin_request.SetKeyMaterial(key_blob());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600768 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600769 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600770
771 device.BeginOperation(begin_request, &begin_response);
772 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
773
774 UpdateOperationRequest update_request;
775 UpdateOperationResponse update_response;
776 update_request.op_handle = begin_response.op_handle;
Shawn Willdenffd790c2014-08-18 21:20:06 -0600777 update_request.input.Reinitialize(message, array_size(message) - 1);
778 EXPECT_EQ(array_size(message) - 1, update_request.input.available_read());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600779
780 device.UpdateOperation(update_request, &update_response);
781 ASSERT_EQ(KM_ERROR_OK, update_response.error);
782 EXPECT_EQ(0U, update_response.output.available_read());
783
Shawn Willden43e999e2014-08-13 13:29:50 -0600784 FinishOperationRequest finish_request;
785 finish_request.op_handle = begin_response.op_handle;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600786 FinishOperationResponse finish_response;
Shawn Willden43e999e2014-08-13 13:29:50 -0600787 device.FinishOperation(finish_request, &finish_response);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600788 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
Shawn Willden43e999e2014-08-13 13:29:50 -0600789 EXPECT_GT(finish_response.output.available_read(), 0U);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600790
791 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
792}
793
Shawn Willden5b41ca22014-08-18 14:29:14 -0600794TEST_F(SigningOperationsTest, DsaSuccess) {
795 GenerateKey(KM_ALGORITHM_DSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
796
797 BeginOperationRequest begin_request;
798 BeginOperationResponse begin_response;
799 begin_request.SetKeyMaterial(key_blob());
800 begin_request.purpose = KM_PURPOSE_SIGN;
801 AddClientParams(&begin_request.additional_params);
802
803 device.BeginOperation(begin_request, &begin_response);
804 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
805
806 UpdateOperationRequest update_request;
807 UpdateOperationResponse update_response;
808 update_request.op_handle = begin_response.op_handle;
809 update_request.input.Reinitialize("123456789012345678901234567890123456789012345678", 48);
810 EXPECT_EQ(48U, update_request.input.available_read());
811
812 device.UpdateOperation(update_request, &update_response);
813 ASSERT_EQ(KM_ERROR_OK, update_response.error);
814 EXPECT_EQ(0U, update_response.output.available_read());
815
816 FinishOperationRequest finish_request;
817 finish_request.op_handle = begin_response.op_handle;
818 FinishOperationResponse finish_response;
819 device.FinishOperation(finish_request, &finish_response);
820 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
821 EXPECT_GT(finish_response.output.available_read(), 0U);
822
823 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
824}
825
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600826TEST_F(SigningOperationsTest, EcdsaSuccess) {
827 GenerateKey(KM_ALGORITHM_ECDSA, KM_DIGEST_NONE, KM_PAD_NONE, 192 /* key size */);
828
829 BeginOperationRequest begin_request;
830 BeginOperationResponse begin_response;
831 begin_request.SetKeyMaterial(key_blob());
832 begin_request.purpose = KM_PURPOSE_SIGN;
833 AddClientParams(&begin_request.additional_params);
834
835 device.BeginOperation(begin_request, &begin_response);
836 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
837
838 UpdateOperationRequest update_request;
839 UpdateOperationResponse update_response;
840 update_request.op_handle = begin_response.op_handle;
841 update_request.input.Reinitialize("123456789012345678901234567890123456789012345678", 48);
842 EXPECT_EQ(48U, update_request.input.available_read());
843
844 device.UpdateOperation(update_request, &update_response);
845 ASSERT_EQ(KM_ERROR_OK, update_response.error);
846 EXPECT_EQ(0U, update_response.output.available_read());
847
848 FinishOperationRequest finish_request;
849 finish_request.op_handle = begin_response.op_handle;
850 FinishOperationResponse finish_response;
851 device.FinishOperation(finish_request, &finish_response);
852 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
853 EXPECT_GT(finish_response.output.available_read(), 0U);
854
855 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
856}
857
Shawn Willden1615f2e2014-08-13 10:37:40 -0600858TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willden61644f32014-08-18 13:43:14 -0600859 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600860
861 BeginOperationRequest begin_request;
862 BeginOperationResponse begin_response;
Shawn Willden61644f32014-08-18 13:43:14 -0600863 begin_request.SetKeyMaterial(key_blob());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600864 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600865 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600866
867 device.BeginOperation(begin_request, &begin_response);
868 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
869
870 EXPECT_EQ(KM_ERROR_OK, device.AbortOperation(begin_response.op_handle));
871
872 // Another abort should fail
873 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
874}
875
876TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willden61644f32014-08-18 13:43:14 -0600877 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_SHA_2_256, KM_PAD_NONE, 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600878
879 BeginOperationRequest begin_request;
880 BeginOperationResponse begin_response;
881 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600882 begin_request.SetKeyMaterial(key_blob());
883 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600884
885 device.BeginOperation(begin_request, &begin_response);
886 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, begin_response.error);
887
888 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
889}
890
891TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willden61644f32014-08-18 13:43:14 -0600892 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_RSA_OAEP, 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600893
894 BeginOperationRequest begin_request;
895 BeginOperationResponse begin_response;
896 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600897 begin_request.SetKeyMaterial(key_blob());
898 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600899
900 device.BeginOperation(begin_request, &begin_response);
901 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, begin_response.error);
902
903 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
904}
905
906TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willden61644f32014-08-18 13:43:14 -0600907 GenerateKey(KM_ALGORITHM_RSA, static_cast<keymaster_digest_t>(-1), KM_PAD_NONE,
908 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600909
910 BeginOperationRequest begin_request;
911 BeginOperationResponse begin_response;
912 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600913 begin_request.SetKeyMaterial(key_blob());
914 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600915
916 device.BeginOperation(begin_request, &begin_response);
917 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, begin_response.error);
918
919 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
920}
921
922TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willden61644f32014-08-18 13:43:14 -0600923 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, static_cast<keymaster_padding_t>(-1),
924 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600925
926 BeginOperationRequest begin_request;
927 BeginOperationResponse begin_response;
928 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600929 begin_request.SetKeyMaterial(key_blob());
930 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600931
932 device.BeginOperation(begin_request, &begin_response);
933 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, begin_response.error);
934
935 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
936}
937
938TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willden61644f32014-08-18 13:43:14 -0600939 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600940
941 BeginOperationRequest begin_request;
942 BeginOperationResponse begin_response;
Shawn Willden61644f32014-08-18 13:43:14 -0600943 begin_request.SetKeyMaterial(key_blob());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600944 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600945 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600946
947 device.BeginOperation(begin_request, &begin_response);
948 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
949
950 UpdateOperationRequest update_request;
951 UpdateOperationResponse update_response;
952 update_request.op_handle = begin_response.op_handle;
953 update_request.input.Reinitialize("01234567890123456789012345678901", 31);
954 EXPECT_EQ(31U, update_request.input.available_read());
955
956 device.UpdateOperation(update_request, &update_response);
957 ASSERT_EQ(KM_ERROR_OK, update_response.error);
958 EXPECT_EQ(0U, update_response.output.available_read());
959
Shawn Willden43e999e2014-08-13 13:29:50 -0600960 FinishOperationRequest finish_request;
961 finish_request.op_handle = begin_response.op_handle;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600962 FinishOperationResponse finish_response;
Shawn Willden43e999e2014-08-13 13:29:50 -0600963 device.FinishOperation(finish_request, &finish_response);
Shawn Willden00aa7942014-09-10 07:57:43 -0600964 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, finish_response.error);
Shawn Willden43e999e2014-08-13 13:29:50 -0600965 EXPECT_EQ(0U, finish_response.output.available_read());
966
967 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
968}
969
Shawn Willden61644f32014-08-18 13:43:14 -0600970typedef SigningOperationsTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600971TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willden61644f32014-08-18 13:43:14 -0600972 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
973 const char message[] = "12345678901234567890123456789012";
974 SignMessage(message, array_size(message) - 1);
Shawn Willden43e999e2014-08-13 13:29:50 -0600975 ASSERT_TRUE(signature() != NULL);
976
977 BeginOperationRequest begin_request;
978 BeginOperationResponse begin_response;
Shawn Willden61644f32014-08-18 13:43:14 -0600979 begin_request.SetKeyMaterial(key_blob());
Shawn Willden43e999e2014-08-13 13:29:50 -0600980 begin_request.purpose = KM_PURPOSE_VERIFY;
Shawn Willden61644f32014-08-18 13:43:14 -0600981 AddClientParams(&begin_request.additional_params);
Shawn Willden43e999e2014-08-13 13:29:50 -0600982
983 device.BeginOperation(begin_request, &begin_response);
984 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
985
986 UpdateOperationRequest update_request;
987 UpdateOperationResponse update_response;
988 update_request.op_handle = begin_response.op_handle;
Shawn Willden61644f32014-08-18 13:43:14 -0600989 update_request.input.Reinitialize(message, array_size(message) - 1);
990 EXPECT_EQ(array_size(message) - 1, update_request.input.available_read());
Shawn Willden43e999e2014-08-13 13:29:50 -0600991
992 device.UpdateOperation(update_request, &update_response);
993 ASSERT_EQ(KM_ERROR_OK, update_response.error);
994 EXPECT_EQ(0U, update_response.output.available_read());
995
996 FinishOperationRequest finish_request;
997 finish_request.op_handle = begin_response.op_handle;
998 finish_request.signature.Reinitialize(*signature());
999 FinishOperationResponse finish_response;
1000 device.FinishOperation(finish_request, &finish_response);
1001 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
Shawn Willden1615f2e2014-08-13 10:37:40 -06001002 EXPECT_EQ(0U, finish_response.output.available_read());
1003
1004 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
1005}
1006
Shawn Willden5b41ca22014-08-18 14:29:14 -06001007TEST_F(VerificationOperationsTest, DsaSuccess) {
1008 GenerateKey(KM_ALGORITHM_DSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
1009 const char message[] = "123456789012345678901234567890123456789012345678";
1010 SignMessage(message, array_size(message) - 1);
1011 ASSERT_TRUE(signature() != NULL);
1012
1013 BeginOperationRequest begin_request;
1014 BeginOperationResponse begin_response;
1015 begin_request.SetKeyMaterial(key_blob());
1016 begin_request.purpose = KM_PURPOSE_VERIFY;
1017 AddClientParams(&begin_request.additional_params);
1018
1019 device.BeginOperation(begin_request, &begin_response);
1020 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
1021
1022 UpdateOperationRequest update_request;
1023 UpdateOperationResponse update_response;
1024 update_request.op_handle = begin_response.op_handle;
1025 update_request.input.Reinitialize(message, array_size(message) - 1);
1026 EXPECT_EQ(array_size(message) - 1, update_request.input.available_read());
1027
1028 device.UpdateOperation(update_request, &update_response);
1029 ASSERT_EQ(KM_ERROR_OK, update_response.error);
1030 EXPECT_EQ(0U, update_response.output.available_read());
1031
1032 FinishOperationRequest finish_request;
1033 finish_request.op_handle = begin_response.op_handle;
1034 finish_request.signature.Reinitialize(*signature());
1035 FinishOperationResponse finish_response;
1036 device.FinishOperation(finish_request, &finish_response);
1037 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
1038 EXPECT_EQ(0U, finish_response.output.available_read());
1039
1040 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
1041}
1042
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001043TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001044 GenerateKey(KM_ALGORITHM_ECDSA, KM_DIGEST_NONE, KM_PAD_NONE, 192 /* key size */);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001045 const char message[] = "123456789012345678901234567890123456789012345678";
1046 SignMessage(message, array_size(message) - 1);
1047 ASSERT_TRUE(signature() != NULL);
1048
1049 BeginOperationRequest begin_request;
1050 BeginOperationResponse begin_response;
1051 begin_request.SetKeyMaterial(key_blob());
1052 begin_request.purpose = KM_PURPOSE_VERIFY;
1053 AddClientParams(&begin_request.additional_params);
1054
1055 device.BeginOperation(begin_request, &begin_response);
1056 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
1057
1058 UpdateOperationRequest update_request;
1059 UpdateOperationResponse update_response;
1060 update_request.op_handle = begin_response.op_handle;
1061 update_request.input.Reinitialize(message, array_size(message) - 1);
1062 EXPECT_EQ(array_size(message) - 1, update_request.input.available_read());
1063
1064 device.UpdateOperation(update_request, &update_response);
1065 ASSERT_EQ(KM_ERROR_OK, update_response.error);
1066 EXPECT_EQ(0U, update_response.output.available_read());
1067
1068 FinishOperationRequest finish_request;
1069 finish_request.op_handle = begin_response.op_handle;
1070 finish_request.signature.Reinitialize(*signature());
1071 FinishOperationResponse finish_response;
1072 device.FinishOperation(finish_request, &finish_response);
1073 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
1074 EXPECT_EQ(0U, finish_response.output.available_read());
1075
1076 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
1077}
1078
Shawn Willdenffd790c2014-08-18 21:20:06 -06001079typedef SigningOperationsTest ExportKeyTest;
1080TEST_F(ExportKeyTest, RsaSuccess) {
1081 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willdenffd790c2014-08-18 21:20:06 -06001082
1083 ExportKeyRequest request;
1084 ExportKeyResponse response;
1085 AddClientParams(&request.additional_params);
1086 request.key_format = KM_KEY_FORMAT_X509;
1087 request.SetKeyMaterial(key_blob());
1088
1089 device.ExportKey(request, &response);
1090 ASSERT_EQ(KM_ERROR_OK, response.error);
1091 EXPECT_TRUE(response.key_data != NULL);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001092
1093 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001094}
1095
Shawn Willdenf268d742014-08-19 15:36:26 -06001096TEST_F(ExportKeyTest, DsaSuccess) {
1097 GenerateKey(KM_ALGORITHM_DSA, KM_DIGEST_NONE, KM_PAD_NONE, 1024 /* key size */);
1098
1099 ExportKeyRequest request;
1100 ExportKeyResponse response;
1101 AddClientParams(&request.additional_params);
1102 request.key_format = KM_KEY_FORMAT_X509;
1103 request.SetKeyMaterial(key_blob());
1104
1105 device.ExportKey(request, &response);
1106 ASSERT_EQ(KM_ERROR_OK, response.error);
1107 EXPECT_TRUE(response.key_data != NULL);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001108
1109 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001110}
1111
1112TEST_F(ExportKeyTest, EcdsaSuccess) {
1113 GenerateKey(KM_ALGORITHM_ECDSA, KM_DIGEST_NONE, KM_PAD_NONE, 192 /* key size */);
1114
1115 ExportKeyRequest request;
1116 ExportKeyResponse response;
1117 AddClientParams(&request.additional_params);
1118 request.key_format = KM_KEY_FORMAT_X509;
1119 request.SetKeyMaterial(key_blob());
1120
1121 device.ExportKey(request, &response);
1122 ASSERT_EQ(KM_ERROR_OK, response.error);
1123 EXPECT_TRUE(response.key_data != NULL);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001124
1125 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001126}
1127
1128TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
1129 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256);
1130
1131 ExportKeyRequest request;
1132 ExportKeyResponse response;
1133 AddClientParams(&request.additional_params);
1134
1135 /* We have no other defined export formats defined. */
1136 request.key_format = KM_KEY_FORMAT_PKCS8;
1137 request.SetKeyMaterial(key_blob());
1138
1139 device.ExportKey(request, &response);
1140 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, response.error);
1141 EXPECT_TRUE(response.key_data == NULL);
1142}
1143
1144TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
1145 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256);
1146
1147 ExportKeyRequest request;
1148 ExportKeyResponse response;
1149 AddClientParams(&request.additional_params);
1150 request.key_format = KM_KEY_FORMAT_X509;
1151 request.SetKeyMaterial(corrupt_key_blob());
1152
1153 device.ExportKey(request, &response);
1154 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, response.error);
1155 ASSERT_TRUE(response.key_data == NULL);
1156}
1157
Shawn Willden437fbd12014-08-20 11:59:49 -06001158static string read_file(const string& file_name) {
1159 ifstream file_stream(file_name, std::ios::binary);
1160 istreambuf_iterator<char> file_begin(file_stream);
1161 istreambuf_iterator<char> file_end;
1162 return string(file_begin, file_end);
1163}
1164
1165typedef SigningOperationsTest ImportKeyTest;
1166TEST_F(ImportKeyTest, RsaSuccess) {
1167 keymaster_key_param_t params[] = {
1168 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
1169 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1170 Authorization(TAG_DIGEST, KM_DIGEST_NONE),
1171 Authorization(TAG_PADDING, KM_PAD_NONE),
1172 Authorization(TAG_USER_ID, 7),
1173 Authorization(TAG_USER_AUTH_ID, 8),
1174 Authorization(TAG_APPLICATION_ID, "app_id", 6),
1175 Authorization(TAG_AUTH_TIMEOUT, 300),
1176 };
1177
Shawn Willden81effc62014-08-27 10:08:46 -06001178 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001179 ASSERT_EQ(633U, pk8_key.size());
1180
1181 ImportKeyRequest import_request;
1182 import_request.key_description.Reinitialize(params, array_length(params));
1183 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1184 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1185
1186 ImportKeyResponse import_response;
1187 device.ImportKey(import_request, &import_response);
1188 ASSERT_EQ(KM_ERROR_OK, import_response.error);
1189 EXPECT_EQ(0U, import_response.enforced.size());
1190 EXPECT_GT(import_response.unenforced.size(), 0U);
1191
1192 // Check values derived from the key.
1193 EXPECT_TRUE(contains(import_response.unenforced, TAG_ALGORITHM, KM_ALGORITHM_RSA));
1194 EXPECT_TRUE(contains(import_response.unenforced, TAG_KEY_SIZE, 1024));
1195 EXPECT_TRUE(contains(import_response.unenforced, TAG_RSA_PUBLIC_EXPONENT, 65537U));
1196
1197 // And values provided by GoogleKeymaster
1198 EXPECT_TRUE(contains(import_response.unenforced, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1199 EXPECT_TRUE(contains(import_response.unenforced, KM_TAG_CREATION_DATETIME));
1200
1201 size_t message_len = 1024 / 8;
1202 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
1203 std::fill(message.get(), message.get() + message_len, 'a');
1204 SignMessage(import_response.key_blob, message.get(), message_len);
1205 ASSERT_TRUE(signature() != NULL);
1206
1207 BeginOperationRequest begin_request;
1208 BeginOperationResponse begin_response;
1209 begin_request.SetKeyMaterial(import_response.key_blob);
1210 begin_request.purpose = KM_PURPOSE_VERIFY;
1211 AddClientParams(&begin_request.additional_params);
1212
1213 device.BeginOperation(begin_request, &begin_response);
1214 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
1215
1216 UpdateOperationRequest update_request;
1217 UpdateOperationResponse update_response;
1218 update_request.op_handle = begin_response.op_handle;
1219 update_request.input.Reinitialize(message.get(), message_len);
1220 EXPECT_EQ(message_len, update_request.input.available_read());
1221
1222 device.UpdateOperation(update_request, &update_response);
1223 ASSERT_EQ(KM_ERROR_OK, update_response.error);
1224 EXPECT_EQ(0U, update_response.output.available_read());
1225
1226 FinishOperationRequest finish_request;
1227 finish_request.op_handle = begin_response.op_handle;
1228 finish_request.signature.Reinitialize(*signature());
1229 FinishOperationResponse finish_response;
1230 device.FinishOperation(finish_request, &finish_response);
1231 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
1232 EXPECT_EQ(0U, finish_response.output.available_read());
1233
1234 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
1235}
1236
Shawn Willden6bbe6782014-09-18 11:26:15 -06001237TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
1238 keymaster_key_param_t params[] = {
1239 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
1240 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1241 Authorization(TAG_DIGEST, KM_DIGEST_NONE),
1242 Authorization(TAG_PADDING, KM_PAD_NONE),
1243 Authorization(TAG_KEY_SIZE, 2048), // Doesn't match key
1244 Authorization(TAG_USER_ID, 7),
1245 Authorization(TAG_USER_AUTH_ID, 8),
1246 Authorization(TAG_APPLICATION_ID, "app_id", 6),
1247 Authorization(TAG_AUTH_TIMEOUT, 300),
1248 };
1249
1250 string pk8_key = read_file("rsa_privkey_pk8.der");
1251 ASSERT_EQ(633U, pk8_key.size());
1252
1253 ImportKeyRequest import_request;
1254 import_request.key_description.Reinitialize(params, array_length(params));
1255 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1256 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1257
1258 ImportKeyResponse import_response;
1259 device.ImportKey(import_request, &import_response);
1260 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, import_response.error);
1261}
1262
1263TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
1264 keymaster_key_param_t params[] = {
1265 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1266 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
1267 Authorization(TAG_RSA_PUBLIC_EXPONENT, 3), Authorization(TAG_USER_ID, 7),
1268 Authorization(TAG_USER_AUTH_ID, 8), Authorization(TAG_APPLICATION_ID, "app_id", 6),
1269 Authorization(TAG_AUTH_TIMEOUT, 300),
1270 };
1271
1272 string pk8_key = read_file("rsa_privkey_pk8.der");
1273 ASSERT_EQ(633U, pk8_key.size());
1274
1275 ImportKeyRequest import_request;
1276 import_request.key_description.Reinitialize(params, array_length(params));
1277 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1278 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1279
1280 ImportKeyResponse import_response;
1281 device.ImportKey(import_request, &import_response);
1282 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, import_response.error);
1283}
1284
Shawn Willden81effc62014-08-27 10:08:46 -06001285TEST_F(ImportKeyTest, DsaSuccess) {
1286 keymaster_key_param_t params[] = {
1287 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
1288 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1289 Authorization(TAG_DIGEST, KM_DIGEST_NONE),
1290 Authorization(TAG_PADDING, KM_PAD_NONE),
1291 Authorization(TAG_USER_ID, 7),
1292 Authorization(TAG_USER_AUTH_ID, 8),
1293 Authorization(TAG_APPLICATION_ID, "app_id", 6),
1294 Authorization(TAG_AUTH_TIMEOUT, 300),
1295 };
1296
1297 string pk8_key = read_file("dsa_privkey_pk8.der");
1298 ASSERT_EQ(335U, pk8_key.size());
1299
1300 ImportKeyRequest import_request;
1301 import_request.key_description.Reinitialize(params, array_length(params));
1302 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1303 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1304
1305 ImportKeyResponse import_response;
1306 device.ImportKey(import_request, &import_response);
1307 ASSERT_EQ(KM_ERROR_OK, import_response.error);
1308 EXPECT_EQ(0U, import_response.enforced.size());
1309 EXPECT_GT(import_response.unenforced.size(), 0U);
1310
1311 // Check values derived from the key.
1312 EXPECT_TRUE(contains(import_response.unenforced, TAG_ALGORITHM, KM_ALGORITHM_DSA));
1313 EXPECT_TRUE(contains(import_response.unenforced, TAG_KEY_SIZE, 1024));
1314
1315 // And values provided by GoogleKeymaster
1316 EXPECT_TRUE(contains(import_response.unenforced, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1317 EXPECT_TRUE(contains(import_response.unenforced, KM_TAG_CREATION_DATETIME));
1318
1319 size_t message_len = 48;
1320 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
1321 std::fill(message.get(), message.get() + message_len, 'a');
1322 SignMessage(import_response.key_blob, message.get(), message_len);
1323 ASSERT_TRUE(signature() != NULL);
1324
1325 BeginOperationRequest begin_request;
1326 BeginOperationResponse begin_response;
1327 begin_request.SetKeyMaterial(import_response.key_blob);
1328 begin_request.purpose = KM_PURPOSE_VERIFY;
1329 AddClientParams(&begin_request.additional_params);
1330
1331 device.BeginOperation(begin_request, &begin_response);
1332 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
1333
1334 UpdateOperationRequest update_request;
1335 UpdateOperationResponse update_response;
1336 update_request.op_handle = begin_response.op_handle;
1337 update_request.input.Reinitialize(message.get(), message_len);
1338 EXPECT_EQ(message_len, update_request.input.available_read());
1339
1340 device.UpdateOperation(update_request, &update_response);
1341 ASSERT_EQ(KM_ERROR_OK, update_response.error);
1342 EXPECT_EQ(0U, update_response.output.available_read());
1343
1344 FinishOperationRequest finish_request;
1345 finish_request.op_handle = begin_response.op_handle;
1346 finish_request.signature.Reinitialize(*signature());
1347 FinishOperationResponse finish_response;
1348 device.FinishOperation(finish_request, &finish_response);
1349 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
1350 EXPECT_EQ(0U, finish_response.output.available_read());
1351
1352 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
1353}
1354
Shawn Willden6bbe6782014-09-18 11:26:15 -06001355TEST_F(ImportKeyTest, DsaParametersMatch) {
1356 keymaster_key_param_t params[] = {
1357 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
1358 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1359 Authorization(TAG_DIGEST, KM_DIGEST_NONE),
1360 Authorization(TAG_PADDING, KM_PAD_NONE),
1361 Authorization(TAG_USER_ID, 7),
1362 Authorization(TAG_USER_AUTH_ID, 8),
1363 Authorization(TAG_APPLICATION_ID, "app_id", 6),
1364 Authorization(TAG_AUTH_TIMEOUT, 300),
1365 Authorization(TAG_KEY_SIZE, 1024),
1366 Authorization(TAG_DSA_GENERATOR, dsa_g, array_size(dsa_g)),
1367 Authorization(TAG_DSA_P, dsa_p, array_size(dsa_p)),
1368 Authorization(TAG_DSA_Q, dsa_q, array_size(dsa_q)),
1369 };
1370
1371 string pk8_key = read_file("dsa_privkey_pk8.der");
1372 ASSERT_EQ(335U, pk8_key.size());
1373
1374 ImportKeyRequest import_request;
1375 import_request.key_description.Reinitialize(params, array_length(params));
1376 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1377 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1378
1379 ImportKeyResponse import_response;
1380 device.ImportKey(import_request, &import_response);
1381 ASSERT_EQ(KM_ERROR_OK, import_response.error);
1382 EXPECT_EQ(0U, import_response.enforced.size());
1383 EXPECT_GT(import_response.unenforced.size(), 0U);
1384
1385 // Check values derived from the key.
1386 EXPECT_TRUE(contains(import_response.unenforced, TAG_ALGORITHM, KM_ALGORITHM_DSA));
1387 EXPECT_TRUE(contains(import_response.unenforced, TAG_KEY_SIZE, 1024));
1388
1389 // And values provided by GoogleKeymaster
1390 EXPECT_TRUE(contains(import_response.unenforced, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1391 EXPECT_TRUE(contains(import_response.unenforced, KM_TAG_CREATION_DATETIME));
1392
1393 size_t message_len = 48;
1394 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
1395 std::fill(message.get(), message.get() + message_len, 'a');
1396 SignMessage(import_response.key_blob, message.get(), message_len);
1397 ASSERT_TRUE(signature() != NULL);
1398
1399 BeginOperationRequest begin_request;
1400 BeginOperationResponse begin_response;
1401 begin_request.SetKeyMaterial(import_response.key_blob);
1402 begin_request.purpose = KM_PURPOSE_VERIFY;
1403 AddClientParams(&begin_request.additional_params);
1404
1405 device.BeginOperation(begin_request, &begin_response);
1406 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
1407
1408 UpdateOperationRequest update_request;
1409 UpdateOperationResponse update_response;
1410 update_request.op_handle = begin_response.op_handle;
1411 update_request.input.Reinitialize(message.get(), message_len);
1412 EXPECT_EQ(message_len, update_request.input.available_read());
1413
1414 device.UpdateOperation(update_request, &update_response);
1415 ASSERT_EQ(KM_ERROR_OK, update_response.error);
1416 EXPECT_EQ(0U, update_response.output.available_read());
1417
1418 FinishOperationRequest finish_request;
1419 finish_request.op_handle = begin_response.op_handle;
1420 finish_request.signature.Reinitialize(*signature());
1421 FinishOperationResponse finish_response;
1422 device.FinishOperation(finish_request, &finish_response);
1423 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
1424 EXPECT_EQ(0U, finish_response.output.available_read());
1425
1426 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
1427}
1428
1429uint8_t dsa_wrong_q[] = {
1430 0xC0, 0x66, 0x64, 0xF9, 0x05, 0x38, 0x64, 0x38, 0x4A, 0x17,
1431 0x66, 0x79, 0xDD, 0x7F, 0x6E, 0x55, 0x22, 0x2A, 0xDF, 0xC5,
1432};
1433
1434TEST_F(ImportKeyTest, DsaParameterMismatch) {
1435 keymaster_key_param_t params[] = {
1436 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
1437 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1438 Authorization(TAG_DIGEST, KM_DIGEST_NONE),
1439 Authorization(TAG_PADDING, KM_PAD_NONE),
1440 Authorization(TAG_USER_ID, 7),
1441 Authorization(TAG_USER_AUTH_ID, 8),
1442 Authorization(TAG_APPLICATION_ID, "app_id", 6),
1443 Authorization(TAG_AUTH_TIMEOUT, 300),
1444 Authorization(TAG_KEY_SIZE, 1024),
1445 Authorization(TAG_DSA_Q, dsa_wrong_q, array_size(dsa_wrong_q)),
1446 };
1447
1448 string pk8_key = read_file("dsa_privkey_pk8.der");
1449 ASSERT_EQ(335U, pk8_key.size());
1450
1451 ImportKeyRequest import_request;
1452 import_request.key_description.Reinitialize(params, array_length(params));
1453 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1454 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1455
1456 ImportKeyResponse import_response;
1457 device.ImportKey(import_request, &import_response);
1458 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, import_response.error);
1459}
1460
1461TEST_F(ImportKeyTest, DsaKeySizeMismatch) {
1462 keymaster_key_param_t params[] = {
1463 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
1464 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1465 Authorization(TAG_DIGEST, KM_DIGEST_NONE),
1466 Authorization(TAG_PADDING, KM_PAD_NONE),
1467 Authorization(TAG_USER_ID, 7),
1468 Authorization(TAG_USER_AUTH_ID, 8),
1469 Authorization(TAG_APPLICATION_ID, "app_id", 6),
1470 Authorization(TAG_AUTH_TIMEOUT, 300),
1471 Authorization(TAG_KEY_SIZE, 2048),
1472 };
1473
1474 string pk8_key = read_file("dsa_privkey_pk8.der");
1475 ASSERT_EQ(335U, pk8_key.size());
1476
1477 ImportKeyRequest import_request;
1478 import_request.key_description.Reinitialize(params, array_length(params));
1479 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1480 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1481
1482 ImportKeyResponse import_response;
1483 device.ImportKey(import_request, &import_response);
1484 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, import_response.error);
1485}
1486
Shawn Willden81effc62014-08-27 10:08:46 -06001487TEST_F(ImportKeyTest, EcdsaSuccess) {
1488 keymaster_key_param_t params[] = {
1489 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
1490 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1491 Authorization(TAG_DIGEST, KM_DIGEST_NONE),
1492 Authorization(TAG_PADDING, KM_PAD_NONE),
1493 Authorization(TAG_USER_ID, 7),
1494 Authorization(TAG_USER_AUTH_ID, 8),
1495 Authorization(TAG_APPLICATION_ID, "app_id", 6),
1496 Authorization(TAG_AUTH_TIMEOUT, 300),
1497 };
1498
1499 string pk8_key = read_file("ec_privkey_pk8.der");
1500 ASSERT_EQ(138U, pk8_key.size());
1501
1502 ImportKeyRequest import_request;
1503 import_request.key_description.Reinitialize(params, array_length(params));
1504 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1505 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1506
1507 ImportKeyResponse import_response;
1508 device.ImportKey(import_request, &import_response);
1509 ASSERT_EQ(KM_ERROR_OK, import_response.error);
1510 EXPECT_EQ(0U, import_response.enforced.size());
1511 EXPECT_GT(import_response.unenforced.size(), 0U);
1512
1513 // Check values derived from the key.
1514 EXPECT_TRUE(contains(import_response.unenforced, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1515 EXPECT_TRUE(contains(import_response.unenforced, TAG_KEY_SIZE, 256));
1516
1517 // And values provided by GoogleKeymaster
1518 EXPECT_TRUE(contains(import_response.unenforced, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1519 EXPECT_TRUE(contains(import_response.unenforced, KM_TAG_CREATION_DATETIME));
1520
1521 size_t message_len = 1024 / 8;
1522 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
1523 std::fill(message.get(), message.get() + message_len, 'a');
1524 SignMessage(import_response.key_blob, message.get(), message_len);
1525 ASSERT_TRUE(signature() != NULL);
1526
1527 BeginOperationRequest begin_request;
1528 BeginOperationResponse begin_response;
1529 begin_request.SetKeyMaterial(import_response.key_blob);
1530 begin_request.purpose = KM_PURPOSE_VERIFY;
1531 AddClientParams(&begin_request.additional_params);
1532
1533 device.BeginOperation(begin_request, &begin_response);
1534 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
1535
1536 UpdateOperationRequest update_request;
1537 UpdateOperationResponse update_response;
1538 update_request.op_handle = begin_response.op_handle;
1539 update_request.input.Reinitialize(message.get(), message_len);
1540 EXPECT_EQ(message_len, update_request.input.available_read());
1541
1542 device.UpdateOperation(update_request, &update_response);
1543 ASSERT_EQ(KM_ERROR_OK, update_response.error);
1544 EXPECT_EQ(0U, update_response.output.available_read());
1545
1546 FinishOperationRequest finish_request;
1547 finish_request.op_handle = begin_response.op_handle;
1548 finish_request.signature.Reinitialize(*signature());
1549 FinishOperationResponse finish_response;
1550 device.FinishOperation(finish_request, &finish_response);
1551 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
1552 EXPECT_EQ(0U, finish_response.output.available_read());
1553
1554 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
1555}
1556
Shawn Willden6bbe6782014-09-18 11:26:15 -06001557TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1558 keymaster_key_param_t params[] = {
1559 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
1560 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1561 Authorization(TAG_DIGEST, KM_DIGEST_NONE),
1562 Authorization(TAG_PADDING, KM_PAD_NONE),
1563 Authorization(TAG_USER_ID, 7),
1564 Authorization(TAG_USER_AUTH_ID, 8),
1565 Authorization(TAG_APPLICATION_ID, "app_id", 6),
1566 Authorization(TAG_AUTH_TIMEOUT, 300),
1567 Authorization(TAG_KEY_SIZE, 256),
1568 };
1569
1570 string pk8_key = read_file("ec_privkey_pk8.der");
1571 ASSERT_EQ(138U, pk8_key.size());
1572
1573 ImportKeyRequest import_request;
1574 import_request.key_description.Reinitialize(params, array_length(params));
1575 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1576 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1577
1578 ImportKeyResponse import_response;
1579 device.ImportKey(import_request, &import_response);
1580 ASSERT_EQ(KM_ERROR_OK, import_response.error);
1581 EXPECT_EQ(0U, import_response.enforced.size());
1582 EXPECT_GT(import_response.unenforced.size(), 0U);
1583
1584 // Check values derived from the key.
1585 EXPECT_TRUE(contains(import_response.unenforced, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1586 EXPECT_TRUE(contains(import_response.unenforced, TAG_KEY_SIZE, 256));
1587
1588 // And values provided by GoogleKeymaster
1589 EXPECT_TRUE(contains(import_response.unenforced, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1590 EXPECT_TRUE(contains(import_response.unenforced, KM_TAG_CREATION_DATETIME));
1591
1592 size_t message_len = 1024 / 8;
1593 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
1594 std::fill(message.get(), message.get() + message_len, 'a');
1595 SignMessage(import_response.key_blob, message.get(), message_len);
1596 ASSERT_TRUE(signature() != NULL);
1597
1598 BeginOperationRequest begin_request;
1599 BeginOperationResponse begin_response;
1600 begin_request.SetKeyMaterial(import_response.key_blob);
1601 begin_request.purpose = KM_PURPOSE_VERIFY;
1602 AddClientParams(&begin_request.additional_params);
1603
1604 device.BeginOperation(begin_request, &begin_response);
1605 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
1606
1607 UpdateOperationRequest update_request;
1608 UpdateOperationResponse update_response;
1609 update_request.op_handle = begin_response.op_handle;
1610 update_request.input.Reinitialize(message.get(), message_len);
1611 EXPECT_EQ(message_len, update_request.input.available_read());
1612
1613 device.UpdateOperation(update_request, &update_response);
1614 ASSERT_EQ(KM_ERROR_OK, update_response.error);
1615 EXPECT_EQ(0U, update_response.output.available_read());
1616
1617 FinishOperationRequest finish_request;
1618 finish_request.op_handle = begin_response.op_handle;
1619 finish_request.signature.Reinitialize(*signature());
1620 FinishOperationResponse finish_response;
1621 device.FinishOperation(finish_request, &finish_response);
1622 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
1623 EXPECT_EQ(0U, finish_response.output.available_read());
1624
1625 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
1626}
1627
1628TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1629 keymaster_key_param_t params[] = {
1630 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
1631 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1632 Authorization(TAG_DIGEST, KM_DIGEST_NONE),
1633 Authorization(TAG_PADDING, KM_PAD_NONE),
1634 Authorization(TAG_USER_ID, 7),
1635 Authorization(TAG_USER_AUTH_ID, 8),
1636 Authorization(TAG_APPLICATION_ID, "app_id", 6),
1637 Authorization(TAG_AUTH_TIMEOUT, 300),
1638 Authorization(TAG_KEY_SIZE, 192),
1639 };
1640
1641 string pk8_key = read_file("ec_privkey_pk8.der");
1642 ASSERT_EQ(138U, pk8_key.size());
1643
1644 ImportKeyRequest import_request;
1645 import_request.key_description.Reinitialize(params, array_length(params));
1646 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1647 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1648
1649 ImportKeyResponse import_response;
1650 device.ImportKey(import_request, &import_response);
1651 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, import_response.error);
1652}
1653
Shawn Willden128ffe02014-08-06 12:31:33 -06001654} // namespace test
1655} // namespace keymaster