blob: 9924a5668c9a08ad0080c6ee1476d5d07a70b1f0 [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
Shawn Willdend0772312014-09-18 12:27:57 -060078 template <typename T> void ExpectEmptyResponse(const SupportedResponse<T>& response) {
79 EXPECT_EQ(KM_ERROR_OK, response.error);
80 EXPECT_EQ(0U, response.results_length);
81 }
82
83 template <typename T> void ExpectResponseContains(T val, const SupportedResponse<T>& response) {
84 EXPECT_EQ(KM_ERROR_OK, response.error);
85 EXPECT_EQ(1U, response.results_length);
86 EXPECT_EQ(val, response.results[0]);
87 }
88
Shawn Willden128ffe02014-08-06 12:31:33 -060089 GoogleSoftKeymaster device;
90};
91
Shawn Willden128ffe02014-08-06 12:31:33 -060092typedef KeymasterTest CheckSupported;
93TEST_F(CheckSupported, SupportedAlgorithms) {
94 // Shouldn't blow up on NULL.
95 device.SupportedAlgorithms(NULL);
96
97 SupportedResponse<keymaster_algorithm_t> response;
98 device.SupportedAlgorithms(&response);
99 EXPECT_EQ(KM_ERROR_OK, response.error);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600100 EXPECT_EQ(3U, response.results_length);
Shawn Willden128ffe02014-08-06 12:31:33 -0600101 EXPECT_EQ(KM_ALGORITHM_RSA, response.results[0]);
Shawn Willden28e41472014-08-18 13:35:22 -0600102 EXPECT_EQ(KM_ALGORITHM_DSA, response.results[1]);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600103 EXPECT_EQ(KM_ALGORITHM_ECDSA, response.results[2]);
Shawn Willden128ffe02014-08-06 12:31:33 -0600104}
105
106TEST_F(CheckSupported, SupportedBlockModes) {
107 // Shouldn't blow up on NULL.
Shawn Willden3809b932014-12-02 06:59:46 -0700108 device.SupportedBlockModes(KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT, NULL);
Shawn Willden128ffe02014-08-06 12:31:33 -0600109
110 SupportedResponse<keymaster_block_mode_t> response;
Shawn Willden3809b932014-12-02 06:59:46 -0700111 device.SupportedBlockModes(KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT, &response);
112 EXPECT_EQ(KM_ERROR_UNSUPPORTED_BLOCK_MODE, response.error);
Shawn Willden128ffe02014-08-06 12:31:33 -0600113
Shawn Willden3809b932014-12-02 06:59:46 -0700114 device.SupportedBlockModes(KM_ALGORITHM_DSA, KM_PURPOSE_ENCRYPT, &response);
115 EXPECT_EQ(KM_ERROR_UNSUPPORTED_BLOCK_MODE, response.error);
Shawn Willden28e41472014-08-18 13:35:22 -0600116
Shawn Willden3809b932014-12-02 06:59:46 -0700117 device.SupportedBlockModes(KM_ALGORITHM_ECDSA, KM_PURPOSE_ENCRYPT, &response);
118 EXPECT_EQ(KM_ERROR_UNSUPPORTED_BLOCK_MODE, response.error);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600119
Shawn Willden3809b932014-12-02 06:59:46 -0700120 device.SupportedBlockModes(KM_ALGORITHM_AES, KM_PURPOSE_ENCRYPT, &response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600121 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, response.error);
122}
123
124TEST_F(CheckSupported, SupportedPaddingModes) {
125 // Shouldn't blow up on NULL.
Shawn Willden3809b932014-12-02 06:59:46 -0700126 device.SupportedPaddingModes(KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT, NULL);
Shawn Willden128ffe02014-08-06 12:31:33 -0600127
128 SupportedResponse<keymaster_padding_t> response;
Shawn Willden3809b932014-12-02 06:59:46 -0700129 device.SupportedPaddingModes(KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600130 ExpectResponseContains(KM_PAD_NONE, response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600131
Shawn Willden3809b932014-12-02 06:59:46 -0700132 device.SupportedPaddingModes(KM_ALGORITHM_DSA, KM_PURPOSE_SIGN, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600133 ExpectResponseContains(KM_PAD_NONE, response);
Shawn Willden28e41472014-08-18 13:35:22 -0600134
Shawn Willden3809b932014-12-02 06:59:46 -0700135 device.SupportedPaddingModes(KM_ALGORITHM_ECDSA, KM_PURPOSE_SIGN, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600136 ExpectResponseContains(KM_PAD_NONE, response);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600137
Shawn Willden3809b932014-12-02 06:59:46 -0700138 device.SupportedPaddingModes(KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600139 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, response.error);
140}
141
142TEST_F(CheckSupported, SupportedDigests) {
143 // Shouldn't blow up on NULL.
Shawn Willden3809b932014-12-02 06:59:46 -0700144 device.SupportedDigests(KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL);
Shawn Willden128ffe02014-08-06 12:31:33 -0600145
146 SupportedResponse<keymaster_digest_t> response;
Shawn Willden3809b932014-12-02 06:59:46 -0700147 device.SupportedDigests(KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600148 ExpectResponseContains(KM_DIGEST_NONE, response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600149
Shawn Willden3809b932014-12-02 06:59:46 -0700150 device.SupportedDigests(KM_ALGORITHM_DSA, KM_PURPOSE_SIGN, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600151 ExpectResponseContains(KM_DIGEST_NONE, response);
Shawn Willden28e41472014-08-18 13:35:22 -0600152
Shawn Willden3809b932014-12-02 06:59:46 -0700153 device.SupportedDigests(KM_ALGORITHM_ECDSA, KM_PURPOSE_SIGN, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600154 ExpectResponseContains(KM_DIGEST_NONE, response);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600155
Shawn Willden3809b932014-12-02 06:59:46 -0700156 device.SupportedDigests(KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600157 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, response.error);
158}
159
160TEST_F(CheckSupported, SupportedImportFormats) {
161 // Shouldn't blow up on NULL.
162 device.SupportedImportFormats(KM_ALGORITHM_RSA, NULL);
163
164 SupportedResponse<keymaster_key_format_t> response;
165 device.SupportedImportFormats(KM_ALGORITHM_RSA, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600166 ExpectResponseContains(KM_KEY_FORMAT_PKCS8, response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600167
168 device.SupportedImportFormats(KM_ALGORITHM_DSA, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600169 ExpectResponseContains(KM_KEY_FORMAT_PKCS8, response);
Shawn Willden28e41472014-08-18 13:35:22 -0600170
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600171 device.SupportedImportFormats(KM_ALGORITHM_ECDSA, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600172 ExpectResponseContains(KM_KEY_FORMAT_PKCS8, response);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600173
Shawn Willden28e41472014-08-18 13:35:22 -0600174 device.SupportedImportFormats(KM_ALGORITHM_AES, &response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600175 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, response.error);
176}
177
178TEST_F(CheckSupported, SupportedExportFormats) {
179 // Shouldn't blow up on NULL.
180 device.SupportedExportFormats(KM_ALGORITHM_RSA, NULL);
181
182 SupportedResponse<keymaster_key_format_t> response;
183 device.SupportedExportFormats(KM_ALGORITHM_RSA, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600184 ExpectResponseContains(KM_KEY_FORMAT_X509, response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600185
186 device.SupportedExportFormats(KM_ALGORITHM_DSA, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600187 ExpectResponseContains(KM_KEY_FORMAT_X509, response);
Shawn Willden28e41472014-08-18 13:35:22 -0600188
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600189 device.SupportedExportFormats(KM_ALGORITHM_ECDSA, &response);
Shawn Willdend0772312014-09-18 12:27:57 -0600190 ExpectResponseContains(KM_KEY_FORMAT_X509, response);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600191
Shawn Willden28e41472014-08-18 13:35:22 -0600192 device.SupportedExportFormats(KM_ALGORITHM_AES, &response);
Shawn Willden128ffe02014-08-06 12:31:33 -0600193 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM, response.error);
194}
195
Shawn Willdend0772312014-09-18 12:27:57 -0600196keymaster_key_param_t key_generation_base_params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700197 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
198 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
Shawn Willdend0772312014-09-18 12:27:57 -0600199 Authorization(TAG_APPLICATION_ID, "app_id", 6),
Shawn Willden3809b932014-12-02 06:59:46 -0700200 Authorization(TAG_APPLICATION_DATA, "app_data", 8), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willdend0772312014-09-18 12:27:57 -0600201};
202
203class NewKeyGeneration : public KeymasterTest {
204 protected:
205 NewKeyGeneration() {
206 req_.key_description.Reinitialize(key_generation_base_params,
207 array_length(key_generation_base_params));
208 }
209
210 void CheckBaseParams(const GenerateKeyResponse& rsp) {
211 ASSERT_EQ(KM_ERROR_OK, rsp.error);
212 EXPECT_EQ(0U, rsp.enforced.size());
213 EXPECT_EQ(12U, rsp.enforced.SerializedSize());
214 EXPECT_GT(rsp.unenforced.SerializedSize(), 12U);
215
216 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_SIGN));
217 EXPECT_TRUE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_VERIFY));
218 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_ID, 7));
219 EXPECT_TRUE(contains(rsp.unenforced, TAG_USER_AUTH_ID, 8));
220 EXPECT_TRUE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 300));
221
222 // Verify that App ID, App data and ROT are NOT included.
223 EXPECT_FALSE(contains(rsp.unenforced, TAG_ROOT_OF_TRUST));
224 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_ID));
225 EXPECT_FALSE(contains(rsp.unenforced, TAG_APPLICATION_DATA));
226
227 // Just for giggles, check that some unexpected tags/values are NOT present.
228 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
229 EXPECT_FALSE(contains(rsp.unenforced, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
230 EXPECT_FALSE(contains(rsp.unenforced, TAG_AUTH_TIMEOUT, 301));
231 EXPECT_FALSE(contains(rsp.unenforced, TAG_RESCOPE_AUTH_TIMEOUT));
232
233 // Now check that unspecified, defaulted tags are correct.
234 EXPECT_TRUE(contains(rsp.unenforced, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
235 EXPECT_TRUE(contains(rsp.unenforced, KM_TAG_CREATION_DATETIME));
236 }
237
238 GenerateKeyRequest req_;
239 GenerateKeyResponse rsp_;
240};
241
Shawn Willden128ffe02014-08-06 12:31:33 -0600242TEST_F(NewKeyGeneration, Rsa) {
Shawn Willdend0772312014-09-18 12:27:57 -0600243 req_.key_description.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA));
244 req_.key_description.push_back(Authorization(TAG_KEY_SIZE, 256));
245 req_.key_description.push_back(Authorization(TAG_RSA_PUBLIC_EXPONENT, 3));
246 device.GenerateKey(req_, &rsp_);
Shawn Willden128ffe02014-08-06 12:31:33 -0600247
Shawn Willdend0772312014-09-18 12:27:57 -0600248 CheckBaseParams(rsp_);
Shawn Willden128ffe02014-08-06 12:31:33 -0600249
250 // Check specified tags are all present in unenforced characteristics
Shawn Willdend0772312014-09-18 12:27:57 -0600251 EXPECT_TRUE(contains(rsp_.unenforced, TAG_ALGORITHM, KM_ALGORITHM_RSA));
252 EXPECT_TRUE(contains(rsp_.unenforced, TAG_KEY_SIZE, 256));
253 EXPECT_TRUE(contains(rsp_.unenforced, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600254}
255
Shawn Willden6bbe6782014-09-18 11:26:15 -0600256TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willdend0772312014-09-18 12:27:57 -0600257 req_.key_description.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA));
258 device.GenerateKey(req_, &rsp_);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600259
Shawn Willdend0772312014-09-18 12:27:57 -0600260 CheckBaseParams(rsp_);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600261
262 // Check specified tags are all present in unenforced characteristics
Shawn Willdend0772312014-09-18 12:27:57 -0600263 EXPECT_TRUE(contains(rsp_.unenforced, TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600264
265 // Now check that unspecified, defaulted tags are correct.
Shawn Willdend0772312014-09-18 12:27:57 -0600266 EXPECT_TRUE(contains(rsp_.unenforced, TAG_RSA_PUBLIC_EXPONENT, 65537));
267 EXPECT_TRUE(contains(rsp_.unenforced, TAG_KEY_SIZE, 2048));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600268}
269
Shawn Willden28e41472014-08-18 13:35:22 -0600270TEST_F(NewKeyGeneration, Dsa) {
Shawn Willdend0772312014-09-18 12:27:57 -0600271 req_.key_description.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_DSA));
272 req_.key_description.push_back(Authorization(TAG_KEY_SIZE, 256));
273 device.GenerateKey(req_, &rsp_);
Shawn Willden28e41472014-08-18 13:35:22 -0600274
Shawn Willdend0772312014-09-18 12:27:57 -0600275 CheckBaseParams(rsp_);
Shawn Willden28e41472014-08-18 13:35:22 -0600276
277 // Check specified tags are all present in unenforced characteristics
Shawn Willdend0772312014-09-18 12:27:57 -0600278 EXPECT_TRUE(contains(rsp_.unenforced, TAG_ALGORITHM, KM_ALGORITHM_DSA));
279 EXPECT_TRUE(contains(rsp_.unenforced, TAG_KEY_SIZE, 256));
Shawn Willden28e41472014-08-18 13:35:22 -0600280
281 // Generator should have created DSA params.
282 keymaster_blob_t g, p, q;
Shawn Willdend0772312014-09-18 12:27:57 -0600283 EXPECT_TRUE(rsp_.unenforced.GetTagValue(TAG_DSA_GENERATOR, &g));
284 EXPECT_TRUE(rsp_.unenforced.GetTagValue(TAG_DSA_P, &p));
285 EXPECT_TRUE(rsp_.unenforced.GetTagValue(TAG_DSA_Q, &q));
Shawn Willdend67afae2014-08-19 12:36:27 -0600286 EXPECT_TRUE(g.data_length >= 63 && g.data_length <= 64);
Shawn Willden28e41472014-08-18 13:35:22 -0600287 EXPECT_EQ(64U, p.data_length);
288 EXPECT_EQ(20U, q.data_length);
289}
290
Shawn Willden6bbe6782014-09-18 11:26:15 -0600291TEST_F(NewKeyGeneration, DsaDefaultSize) {
Shawn Willdend0772312014-09-18 12:27:57 -0600292 req_.key_description.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_DSA));
293 device.GenerateKey(req_, &rsp_);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600294
Shawn Willdend0772312014-09-18 12:27:57 -0600295 CheckBaseParams(rsp_);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600296
297 // Check specified tags are all present in unenforced characteristics
Shawn Willdend0772312014-09-18 12:27:57 -0600298 EXPECT_TRUE(contains(rsp_.unenforced, TAG_ALGORITHM, KM_ALGORITHM_DSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600299
300 // Now check that unspecified, defaulted tags are correct.
Shawn Willdend0772312014-09-18 12:27:57 -0600301 EXPECT_TRUE(contains(rsp_.unenforced, TAG_KEY_SIZE, 2048));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600302 keymaster_blob_t g, p, q;
Shawn Willdend0772312014-09-18 12:27:57 -0600303 EXPECT_TRUE(rsp_.unenforced.GetTagValue(TAG_DSA_GENERATOR, &g));
304 EXPECT_TRUE(rsp_.unenforced.GetTagValue(TAG_DSA_P, &p));
305 EXPECT_TRUE(rsp_.unenforced.GetTagValue(TAG_DSA_Q, &q));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600306 EXPECT_TRUE(g.data_length >= 255 && g.data_length <= 256);
307 EXPECT_EQ(256U, p.data_length);
308 EXPECT_EQ(32U, q.data_length);
309}
310
311TEST_F(NewKeyGeneration, Dsa_ParamsSpecified) {
Shawn Willdend0772312014-09-18 12:27:57 -0600312 req_.key_description.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_DSA));
313 req_.key_description.push_back(Authorization(TAG_KEY_SIZE, 256));
314 req_.key_description.push_back(Authorization(TAG_DSA_GENERATOR, dsa_g, array_size(dsa_g)));
315 req_.key_description.push_back(Authorization(TAG_DSA_P, dsa_p, array_size(dsa_p)));
316 req_.key_description.push_back(Authorization(TAG_DSA_Q, dsa_q, array_size(dsa_q)));
317 device.GenerateKey(req_, &rsp_);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600318
Shawn Willdend0772312014-09-18 12:27:57 -0600319 CheckBaseParams(rsp_);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600320
321 // Check specified tags are all present in unenforced characteristics
Shawn Willdend0772312014-09-18 12:27:57 -0600322 EXPECT_TRUE(contains(rsp_.unenforced, TAG_ALGORITHM, KM_ALGORITHM_DSA));
323 EXPECT_TRUE(contains(rsp_.unenforced, TAG_KEY_SIZE, 256));
324 EXPECT_TRUE(contains(rsp_.unenforced, TAG_DSA_GENERATOR,
325 std::string(reinterpret_cast<const char*>(dsa_g), array_size(dsa_g))));
326 EXPECT_TRUE(contains(rsp_.unenforced, TAG_DSA_P,
327 std::string(reinterpret_cast<const char*>(dsa_p), array_size(dsa_p))));
328 EXPECT_TRUE(contains(rsp_.unenforced, TAG_DSA_Q,
329 std::string(reinterpret_cast<const char*>(dsa_q), array_size(dsa_q))));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600330}
331
332TEST_F(NewKeyGeneration, Dsa_SomeParamsSpecified) {
Shawn Willdend0772312014-09-18 12:27:57 -0600333 req_.key_description.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_DSA));
334 req_.key_description.push_back(Authorization(TAG_KEY_SIZE, 256));
335 req_.key_description.push_back(Authorization(TAG_DSA_P, dsa_p, array_size(dsa_p)));
336 req_.key_description.push_back(Authorization(TAG_DSA_Q, dsa_q, array_size(dsa_q)));
337 device.GenerateKey(req_, &rsp_);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600338
Shawn Willdend0772312014-09-18 12:27:57 -0600339 ASSERT_EQ(KM_ERROR_INVALID_DSA_PARAMS, rsp_.error);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600340}
341
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600342TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willdend0772312014-09-18 12:27:57 -0600343 req_.key_description.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden8c856c82014-09-26 09:34:36 -0600344 req_.key_description.push_back(Authorization(TAG_KEY_SIZE, 224));
Shawn Willdend0772312014-09-18 12:27:57 -0600345 device.GenerateKey(req_, &rsp_);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600346
Shawn Willdend0772312014-09-18 12:27:57 -0600347 CheckBaseParams(rsp_);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600348
349 // Check specified tags are all present in unenforced characteristics
Shawn Willdend0772312014-09-18 12:27:57 -0600350 EXPECT_TRUE(contains(rsp_.unenforced, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden8c856c82014-09-26 09:34:36 -0600351 EXPECT_TRUE(contains(rsp_.unenforced, TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600352}
353
Shawn Willden6bbe6782014-09-18 11:26:15 -0600354TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willdend0772312014-09-18 12:27:57 -0600355 req_.key_description.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
356 device.GenerateKey(req_, &rsp_);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600357
Shawn Willdend0772312014-09-18 12:27:57 -0600358 CheckBaseParams(rsp_);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600359
360 // Check specified tags are all present in unenforced characteristics
Shawn Willdend0772312014-09-18 12:27:57 -0600361 EXPECT_TRUE(contains(rsp_.unenforced, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600362
363 // Now check that unspecified, defaulted tags are correct.
Shawn Willdend0772312014-09-18 12:27:57 -0600364 EXPECT_TRUE(contains(rsp_.unenforced, TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600365}
366
367TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willdend0772312014-09-18 12:27:57 -0600368 req_.key_description.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
369 req_.key_description.push_back(Authorization(TAG_KEY_SIZE, 190));
370 device.GenerateKey(req_, &rsp_);
371 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE, rsp_.error);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600372}
373
374TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600375 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600376 for (size_t size : valid_sizes) {
Shawn Willdend0772312014-09-18 12:27:57 -0600377 req_.key_description.Reinitialize(key_generation_base_params,
378 array_length(key_generation_base_params));
379 req_.key_description.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
380 req_.key_description.push_back(Authorization(TAG_KEY_SIZE, size));
381 device.GenerateKey(req_, &rsp_);
382 EXPECT_EQ(KM_ERROR_OK, rsp_.error) << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600383 }
384}
385
Shawn Willden76364712014-08-11 17:48:04 -0600386typedef KeymasterTest GetKeyCharacteristics;
387TEST_F(GetKeyCharacteristics, SimpleRsa) {
388 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700389 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
390 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_KEY_SIZE, 256),
391 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
392 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden76364712014-08-11 17:48:04 -0600393 };
394
395 GenerateKeyRequest gen_req;
396 gen_req.key_description.Reinitialize(params, array_length(params));
397 GenerateKeyResponse gen_rsp;
398
399 device.GenerateKey(gen_req, &gen_rsp);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600400 ASSERT_EQ(KM_ERROR_OK, gen_rsp.error);
Shawn Willden76364712014-08-11 17:48:04 -0600401
402 GetKeyCharacteristicsRequest req;
Shawn Willdenda8485e2014-08-17 08:00:01 -0600403 req.SetKeyMaterial(gen_rsp.key_blob);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600404 req.additional_params.push_back(TAG_APPLICATION_ID, "app_id", 6);
Shawn Willden76364712014-08-11 17:48:04 -0600405
406 GetKeyCharacteristicsResponse rsp;
407 device.GetKeyCharacteristics(req, &rsp);
408 ASSERT_EQ(KM_ERROR_OK, rsp.error);
409
410 EXPECT_EQ(gen_rsp.enforced, rsp.enforced);
411 EXPECT_EQ(gen_rsp.unenforced, rsp.unenforced);
412}
413
Shawn Willden61644f32014-08-18 13:43:14 -0600414/**
415 * Test class that provides some infrastructure for generating keys and signing messages.
416 */
Shawn Willden1615f2e2014-08-13 10:37:40 -0600417class SigningOperationsTest : public KeymasterTest {
418 protected:
Shawn Willden61644f32014-08-18 13:43:14 -0600419 void GenerateKey(keymaster_algorithm_t algorithm, keymaster_digest_t digest,
420 keymaster_padding_t padding, uint32_t key_size) {
Shawn Willden1615f2e2014-08-13 10:37:40 -0600421 keymaster_key_param_t params[] = {
422 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
Shawn Willden3809b932014-12-02 06:59:46 -0700423 Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), Authorization(TAG_ALGORITHM, algorithm),
424 Authorization(TAG_KEY_SIZE, key_size), Authorization(TAG_USER_ID, 7),
425 Authorization(TAG_USER_AUTH_ID, 8), Authorization(TAG_APPLICATION_ID, "app_id", 6),
Shawn Willden1615f2e2014-08-13 10:37:40 -0600426 Authorization(TAG_AUTH_TIMEOUT, 300),
427 };
428 GenerateKeyRequest generate_request;
429 generate_request.key_description.Reinitialize(params, array_length(params));
Shawn Willden43e999e2014-08-13 13:29:50 -0600430 if (static_cast<int>(digest) != -1)
Shawn Willden1615f2e2014-08-13 10:37:40 -0600431 generate_request.key_description.push_back(TAG_DIGEST, digest);
Shawn Willden43e999e2014-08-13 13:29:50 -0600432 if (static_cast<int>(padding) != -1)
Shawn Willden1615f2e2014-08-13 10:37:40 -0600433 generate_request.key_description.push_back(TAG_PADDING, padding);
434 device.GenerateKey(generate_request, &generate_response_);
435 EXPECT_EQ(KM_ERROR_OK, generate_response_.error);
Shawn Willden61644f32014-08-18 13:43:14 -0600436 }
Shawn Willden1615f2e2014-08-13 10:37:40 -0600437
Shawn Willden61644f32014-08-18 13:43:14 -0600438 void SignMessage(const void* message, size_t size) {
Shawn Willden437fbd12014-08-20 11:59:49 -0600439 SignMessage(generate_response_.key_blob, message, size);
440 }
441
442 void SignMessage(const keymaster_key_blob_t& key_blob, const void* message, size_t size) {
Shawn Willden61644f32014-08-18 13:43:14 -0600443 BeginOperationRequest begin_request;
444 BeginOperationResponse begin_response;
Shawn Willden437fbd12014-08-20 11:59:49 -0600445 begin_request.SetKeyMaterial(key_blob);
Shawn Willden61644f32014-08-18 13:43:14 -0600446 begin_request.purpose = KM_PURPOSE_SIGN;
447 AddClientParams(&begin_request.additional_params);
448
449 device.BeginOperation(begin_request, &begin_response);
450 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
451
452 UpdateOperationRequest update_request;
453 UpdateOperationResponse update_response;
454 update_request.op_handle = begin_response.op_handle;
455 update_request.input.Reinitialize(message, size);
456 EXPECT_EQ(size, update_request.input.available_read());
457
458 device.UpdateOperation(update_request, &update_response);
459 ASSERT_EQ(KM_ERROR_OK, update_response.error);
460 EXPECT_EQ(0U, update_response.output.available_read());
461
462 FinishOperationRequest finish_request;
463 finish_request.op_handle = begin_response.op_handle;
464 device.FinishOperation(finish_request, &finish_response_);
465 ASSERT_EQ(KM_ERROR_OK, finish_response_.error);
466 EXPECT_GT(finish_response_.output.available_read(), 0U);
467 }
468
469 void AddClientParams(AuthorizationSet* set) { set->push_back(TAG_APPLICATION_ID, "app_id", 6); }
470
471 const keymaster_key_blob_t& key_blob() { return generate_response_.key_blob; }
Shawn Willdenf268d742014-08-19 15:36:26 -0600472
473 const keymaster_key_blob_t& corrupt_key_blob() {
Shawn Willden2241bf02014-08-28 09:59:53 -0600474 uint8_t* tmp = const_cast<uint8_t*>(generate_response_.key_blob.key_material);
475 ++tmp[generate_response_.key_blob.key_material_size / 2];
Shawn Willdenf268d742014-08-19 15:36:26 -0600476 return generate_response_.key_blob;
477 }
478
Shawn Willden61644f32014-08-18 13:43:14 -0600479 Buffer* signature() {
480 if (finish_response_.error == KM_ERROR_OK)
481 return &finish_response_.output;
482 return NULL;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600483 }
484
Shawn Willden1615f2e2014-08-13 10:37:40 -0600485 GenerateKeyResponse generate_response_;
Shawn Willden61644f32014-08-18 13:43:14 -0600486 FinishOperationResponse finish_response_;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600487};
488
489TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willden61644f32014-08-18 13:43:14 -0600490 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willdenffd790c2014-08-18 21:20:06 -0600491 const char message[] = "12345678901234567890123456789012";
Shawn Willdend05cba52014-09-26 09:58:12 -0600492 SignMessage(message, array_size(message) - 1);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600493}
494
Shawn Willden5b41ca22014-08-18 14:29:14 -0600495TEST_F(SigningOperationsTest, DsaSuccess) {
496 GenerateKey(KM_ALGORITHM_DSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willdend05cba52014-09-26 09:58:12 -0600497 const char message[] = "123456789012345678901234567890123456789012345678";
498 SignMessage(message, array_size(message) - 1);
Shawn Willden5b41ca22014-08-18 14:29:14 -0600499}
500
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600501TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600502 GenerateKey(KM_ALGORITHM_ECDSA, KM_DIGEST_NONE, KM_PAD_NONE, 224 /* key size */);
Shawn Willdend05cba52014-09-26 09:58:12 -0600503 const char message[] = "123456789012345678901234567890123456789012345678";
504 SignMessage(message, array_size(message) - 1);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600505}
506
Shawn Willden1615f2e2014-08-13 10:37:40 -0600507TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willden61644f32014-08-18 13:43:14 -0600508 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600509
510 BeginOperationRequest begin_request;
511 BeginOperationResponse begin_response;
Shawn Willden61644f32014-08-18 13:43:14 -0600512 begin_request.SetKeyMaterial(key_blob());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600513 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600514 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600515
516 device.BeginOperation(begin_request, &begin_response);
517 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
518
519 EXPECT_EQ(KM_ERROR_OK, device.AbortOperation(begin_response.op_handle));
520
521 // Another abort should fail
522 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
523}
524
525TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willden61644f32014-08-18 13:43:14 -0600526 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_SHA_2_256, KM_PAD_NONE, 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600527
528 BeginOperationRequest begin_request;
529 BeginOperationResponse begin_response;
530 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600531 begin_request.SetKeyMaterial(key_blob());
532 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600533
534 device.BeginOperation(begin_request, &begin_response);
535 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, begin_response.error);
536
537 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
538}
539
540TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willden61644f32014-08-18 13:43:14 -0600541 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_RSA_OAEP, 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600542
543 BeginOperationRequest begin_request;
544 BeginOperationResponse begin_response;
545 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600546 begin_request.SetKeyMaterial(key_blob());
547 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600548
549 device.BeginOperation(begin_request, &begin_response);
550 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, begin_response.error);
551
552 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
553}
554
555TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willden61644f32014-08-18 13:43:14 -0600556 GenerateKey(KM_ALGORITHM_RSA, static_cast<keymaster_digest_t>(-1), KM_PAD_NONE,
557 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600558
559 BeginOperationRequest begin_request;
560 BeginOperationResponse begin_response;
561 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600562 begin_request.SetKeyMaterial(key_blob());
563 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600564
565 device.BeginOperation(begin_request, &begin_response);
566 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, begin_response.error);
567
568 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
569}
570
571TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willden61644f32014-08-18 13:43:14 -0600572 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, static_cast<keymaster_padding_t>(-1),
573 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600574
575 BeginOperationRequest begin_request;
576 BeginOperationResponse begin_response;
577 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600578 begin_request.SetKeyMaterial(key_blob());
579 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600580
581 device.BeginOperation(begin_request, &begin_response);
582 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, begin_response.error);
583
584 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
585}
586
587TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willden61644f32014-08-18 13:43:14 -0600588 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600589
590 BeginOperationRequest begin_request;
591 BeginOperationResponse begin_response;
Shawn Willden61644f32014-08-18 13:43:14 -0600592 begin_request.SetKeyMaterial(key_blob());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600593 begin_request.purpose = KM_PURPOSE_SIGN;
Shawn Willden61644f32014-08-18 13:43:14 -0600594 AddClientParams(&begin_request.additional_params);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600595
596 device.BeginOperation(begin_request, &begin_response);
597 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
598
599 UpdateOperationRequest update_request;
600 UpdateOperationResponse update_response;
601 update_request.op_handle = begin_response.op_handle;
602 update_request.input.Reinitialize("01234567890123456789012345678901", 31);
603 EXPECT_EQ(31U, update_request.input.available_read());
604
605 device.UpdateOperation(update_request, &update_response);
606 ASSERT_EQ(KM_ERROR_OK, update_response.error);
607 EXPECT_EQ(0U, update_response.output.available_read());
608
Shawn Willden43e999e2014-08-13 13:29:50 -0600609 FinishOperationRequest finish_request;
610 finish_request.op_handle = begin_response.op_handle;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600611 FinishOperationResponse finish_response;
Shawn Willden43e999e2014-08-13 13:29:50 -0600612 device.FinishOperation(finish_request, &finish_response);
Shawn Willden00aa7942014-09-10 07:57:43 -0600613 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, finish_response.error);
Shawn Willden43e999e2014-08-13 13:29:50 -0600614 EXPECT_EQ(0U, finish_response.output.available_read());
615
616 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device.AbortOperation(begin_response.op_handle));
617}
618
Shawn Willdend05cba52014-09-26 09:58:12 -0600619class VerificationOperationsTest : public SigningOperationsTest {
620 protected:
621 void VerifyMessage(const void* message, size_t message_len) {
622 VerifyMessage(generate_response_.key_blob, message, message_len);
623 }
624
625 void VerifyMessage(const keymaster_key_blob_t& key_blob, const void* message,
626 size_t message_len) {
627 ASSERT_TRUE(signature() != NULL);
628
629 BeginOperationRequest begin_request;
630 BeginOperationResponse begin_response;
631 begin_request.SetKeyMaterial(key_blob);
632 begin_request.purpose = KM_PURPOSE_VERIFY;
633 AddClientParams(&begin_request.additional_params);
634
635 device.BeginOperation(begin_request, &begin_response);
636 ASSERT_EQ(KM_ERROR_OK, begin_response.error);
637
638 UpdateOperationRequest update_request;
639 UpdateOperationResponse update_response;
640 update_request.op_handle = begin_response.op_handle;
641 update_request.input.Reinitialize(message, message_len);
642 EXPECT_EQ(message_len, update_request.input.available_read());
643
644 device.UpdateOperation(update_request, &update_response);
645 ASSERT_EQ(KM_ERROR_OK, update_response.error);
646 EXPECT_EQ(0U, update_response.output.available_read());
647
648 FinishOperationRequest finish_request;
649 finish_request.op_handle = begin_response.op_handle;
650 finish_request.signature.Reinitialize(*signature());
651 FinishOperationResponse finish_response;
652 device.FinishOperation(finish_request, &finish_response);
653 ASSERT_EQ(KM_ERROR_OK, finish_response.error);
654 EXPECT_EQ(0U, finish_response.output.available_read());
655
656 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE,
657 device.AbortOperation(begin_response.op_handle));
658 }
659};
660
Shawn Willden43e999e2014-08-13 13:29:50 -0600661TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willden61644f32014-08-18 13:43:14 -0600662 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
663 const char message[] = "12345678901234567890123456789012";
664 SignMessage(message, array_size(message) - 1);
Shawn Willdend05cba52014-09-26 09:58:12 -0600665 VerifyMessage(message, array_size(message) - 1);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600666}
667
Shawn Willden5b41ca22014-08-18 14:29:14 -0600668TEST_F(VerificationOperationsTest, DsaSuccess) {
669 GenerateKey(KM_ALGORITHM_DSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
670 const char message[] = "123456789012345678901234567890123456789012345678";
671 SignMessage(message, array_size(message) - 1);
Shawn Willdend05cba52014-09-26 09:58:12 -0600672 VerifyMessage(message, array_size(message) - 1);
Shawn Willden5b41ca22014-08-18 14:29:14 -0600673}
674
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600675TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600676 GenerateKey(KM_ALGORITHM_ECDSA, KM_DIGEST_NONE, KM_PAD_NONE, 224 /* key size */);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600677 const char message[] = "123456789012345678901234567890123456789012345678";
678 SignMessage(message, array_size(message) - 1);
Shawn Willdend05cba52014-09-26 09:58:12 -0600679 VerifyMessage(message, array_size(message) - 1);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600680}
681
Shawn Willdenffd790c2014-08-18 21:20:06 -0600682typedef SigningOperationsTest ExportKeyTest;
683TEST_F(ExportKeyTest, RsaSuccess) {
684 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willdenffd790c2014-08-18 21:20:06 -0600685
686 ExportKeyRequest request;
687 ExportKeyResponse response;
688 AddClientParams(&request.additional_params);
689 request.key_format = KM_KEY_FORMAT_X509;
690 request.SetKeyMaterial(key_blob());
691
692 device.ExportKey(request, &response);
693 ASSERT_EQ(KM_ERROR_OK, response.error);
694 EXPECT_TRUE(response.key_data != NULL);
Shawn Willdene46a43f2014-08-27 10:35:36 -0600695
696 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -0600697}
698
Shawn Willdenf268d742014-08-19 15:36:26 -0600699TEST_F(ExportKeyTest, DsaSuccess) {
700 GenerateKey(KM_ALGORITHM_DSA, KM_DIGEST_NONE, KM_PAD_NONE, 1024 /* key size */);
701
702 ExportKeyRequest request;
703 ExportKeyResponse response;
704 AddClientParams(&request.additional_params);
705 request.key_format = KM_KEY_FORMAT_X509;
706 request.SetKeyMaterial(key_blob());
707
708 device.ExportKey(request, &response);
709 ASSERT_EQ(KM_ERROR_OK, response.error);
710 EXPECT_TRUE(response.key_data != NULL);
Shawn Willdene46a43f2014-08-27 10:35:36 -0600711
712 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -0600713}
714
715TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600716 GenerateKey(KM_ALGORITHM_ECDSA, KM_DIGEST_NONE, KM_PAD_NONE, 224 /* key size */);
Shawn Willdenf268d742014-08-19 15:36:26 -0600717
718 ExportKeyRequest request;
719 ExportKeyResponse response;
720 AddClientParams(&request.additional_params);
721 request.key_format = KM_KEY_FORMAT_X509;
722 request.SetKeyMaterial(key_blob());
723
724 device.ExportKey(request, &response);
725 ASSERT_EQ(KM_ERROR_OK, response.error);
726 EXPECT_TRUE(response.key_data != NULL);
Shawn Willdene46a43f2014-08-27 10:35:36 -0600727
728 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -0600729}
730
731TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
732 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256);
733
734 ExportKeyRequest request;
735 ExportKeyResponse response;
736 AddClientParams(&request.additional_params);
737
738 /* We have no other defined export formats defined. */
739 request.key_format = KM_KEY_FORMAT_PKCS8;
740 request.SetKeyMaterial(key_blob());
741
742 device.ExportKey(request, &response);
743 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, response.error);
744 EXPECT_TRUE(response.key_data == NULL);
745}
746
747TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
748 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256);
749
750 ExportKeyRequest request;
751 ExportKeyResponse response;
752 AddClientParams(&request.additional_params);
753 request.key_format = KM_KEY_FORMAT_X509;
754 request.SetKeyMaterial(corrupt_key_blob());
755
756 device.ExportKey(request, &response);
757 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, response.error);
758 ASSERT_TRUE(response.key_data == NULL);
759}
760
Shawn Willden437fbd12014-08-20 11:59:49 -0600761static string read_file(const string& file_name) {
762 ifstream file_stream(file_name, std::ios::binary);
763 istreambuf_iterator<char> file_begin(file_stream);
764 istreambuf_iterator<char> file_end;
765 return string(file_begin, file_end);
766}
767
Shawn Willdend05cba52014-09-26 09:58:12 -0600768typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden437fbd12014-08-20 11:59:49 -0600769TEST_F(ImportKeyTest, RsaSuccess) {
770 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700771 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
772 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
773 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
774 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden437fbd12014-08-20 11:59:49 -0600775 };
776
Shawn Willden81effc62014-08-27 10:08:46 -0600777 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -0600778 ASSERT_EQ(633U, pk8_key.size());
779
780 ImportKeyRequest import_request;
781 import_request.key_description.Reinitialize(params, array_length(params));
782 import_request.key_format = KM_KEY_FORMAT_PKCS8;
783 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
784
785 ImportKeyResponse import_response;
786 device.ImportKey(import_request, &import_response);
787 ASSERT_EQ(KM_ERROR_OK, import_response.error);
788 EXPECT_EQ(0U, import_response.enforced.size());
789 EXPECT_GT(import_response.unenforced.size(), 0U);
790
791 // Check values derived from the key.
792 EXPECT_TRUE(contains(import_response.unenforced, TAG_ALGORITHM, KM_ALGORITHM_RSA));
793 EXPECT_TRUE(contains(import_response.unenforced, TAG_KEY_SIZE, 1024));
794 EXPECT_TRUE(contains(import_response.unenforced, TAG_RSA_PUBLIC_EXPONENT, 65537U));
795
796 // And values provided by GoogleKeymaster
797 EXPECT_TRUE(contains(import_response.unenforced, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
798 EXPECT_TRUE(contains(import_response.unenforced, KM_TAG_CREATION_DATETIME));
799
800 size_t message_len = 1024 / 8;
801 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
802 std::fill(message.get(), message.get() + message_len, 'a');
803 SignMessage(import_response.key_blob, message.get(), message_len);
804 ASSERT_TRUE(signature() != NULL);
Shawn Willdend05cba52014-09-26 09:58:12 -0600805 VerifyMessage(import_response.key_blob, message.get(), message_len);
Shawn Willden437fbd12014-08-20 11:59:49 -0600806}
807
Shawn Willden6bbe6782014-09-18 11:26:15 -0600808TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
809 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700810 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
811 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
Shawn Willden6bbe6782014-09-18 11:26:15 -0600812 Authorization(TAG_KEY_SIZE, 2048), // Doesn't match key
Shawn Willden3809b932014-12-02 06:59:46 -0700813 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
814 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden6bbe6782014-09-18 11:26:15 -0600815 };
816
817 string pk8_key = read_file("rsa_privkey_pk8.der");
818 ASSERT_EQ(633U, pk8_key.size());
819
820 ImportKeyRequest import_request;
821 import_request.key_description.Reinitialize(params, array_length(params));
822 import_request.key_format = KM_KEY_FORMAT_PKCS8;
823 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
824
825 ImportKeyResponse import_response;
826 device.ImportKey(import_request, &import_response);
827 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, import_response.error);
828}
829
830TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
831 keymaster_key_param_t params[] = {
832 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
Shawn Willden3809b932014-12-02 06:59:46 -0700833 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
834 Authorization(TAG_RSA_PUBLIC_EXPONENT, 3), Authorization(TAG_USER_ID, 7),
835 Authorization(TAG_USER_AUTH_ID, 8), Authorization(TAG_APPLICATION_ID, "app_id", 6),
Shawn Willden6bbe6782014-09-18 11:26:15 -0600836 Authorization(TAG_AUTH_TIMEOUT, 300),
837 };
838
839 string pk8_key = read_file("rsa_privkey_pk8.der");
840 ASSERT_EQ(633U, pk8_key.size());
841
842 ImportKeyRequest import_request;
843 import_request.key_description.Reinitialize(params, array_length(params));
844 import_request.key_format = KM_KEY_FORMAT_PKCS8;
845 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
846
847 ImportKeyResponse import_response;
848 device.ImportKey(import_request, &import_response);
849 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, import_response.error);
850}
851
Shawn Willden81effc62014-08-27 10:08:46 -0600852TEST_F(ImportKeyTest, DsaSuccess) {
853 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700854 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
855 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
856 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
857 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden81effc62014-08-27 10:08:46 -0600858 };
859
860 string pk8_key = read_file("dsa_privkey_pk8.der");
861 ASSERT_EQ(335U, pk8_key.size());
862
863 ImportKeyRequest import_request;
864 import_request.key_description.Reinitialize(params, array_length(params));
865 import_request.key_format = KM_KEY_FORMAT_PKCS8;
866 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
867
868 ImportKeyResponse import_response;
869 device.ImportKey(import_request, &import_response);
870 ASSERT_EQ(KM_ERROR_OK, import_response.error);
871 EXPECT_EQ(0U, import_response.enforced.size());
872 EXPECT_GT(import_response.unenforced.size(), 0U);
873
874 // Check values derived from the key.
875 EXPECT_TRUE(contains(import_response.unenforced, TAG_ALGORITHM, KM_ALGORITHM_DSA));
876 EXPECT_TRUE(contains(import_response.unenforced, TAG_KEY_SIZE, 1024));
877
878 // And values provided by GoogleKeymaster
879 EXPECT_TRUE(contains(import_response.unenforced, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
880 EXPECT_TRUE(contains(import_response.unenforced, KM_TAG_CREATION_DATETIME));
881
882 size_t message_len = 48;
883 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
884 std::fill(message.get(), message.get() + message_len, 'a');
885 SignMessage(import_response.key_blob, message.get(), message_len);
886 ASSERT_TRUE(signature() != NULL);
Shawn Willdend05cba52014-09-26 09:58:12 -0600887 VerifyMessage(import_response.key_blob, message.get(), message_len);
Shawn Willden81effc62014-08-27 10:08:46 -0600888}
889
Shawn Willden6bbe6782014-09-18 11:26:15 -0600890TEST_F(ImportKeyTest, DsaParametersMatch) {
891 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700892 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
893 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
894 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
895 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden6bbe6782014-09-18 11:26:15 -0600896 Authorization(TAG_KEY_SIZE, 1024),
897 Authorization(TAG_DSA_GENERATOR, dsa_g, array_size(dsa_g)),
898 Authorization(TAG_DSA_P, dsa_p, array_size(dsa_p)),
899 Authorization(TAG_DSA_Q, dsa_q, array_size(dsa_q)),
900 };
901
902 string pk8_key = read_file("dsa_privkey_pk8.der");
903 ASSERT_EQ(335U, pk8_key.size());
904
905 ImportKeyRequest import_request;
906 import_request.key_description.Reinitialize(params, array_length(params));
907 import_request.key_format = KM_KEY_FORMAT_PKCS8;
908 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
909
910 ImportKeyResponse import_response;
911 device.ImportKey(import_request, &import_response);
912 ASSERT_EQ(KM_ERROR_OK, import_response.error);
913 EXPECT_EQ(0U, import_response.enforced.size());
914 EXPECT_GT(import_response.unenforced.size(), 0U);
915
916 // Check values derived from the key.
917 EXPECT_TRUE(contains(import_response.unenforced, TAG_ALGORITHM, KM_ALGORITHM_DSA));
918 EXPECT_TRUE(contains(import_response.unenforced, TAG_KEY_SIZE, 1024));
919
920 // And values provided by GoogleKeymaster
921 EXPECT_TRUE(contains(import_response.unenforced, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
922 EXPECT_TRUE(contains(import_response.unenforced, KM_TAG_CREATION_DATETIME));
923
924 size_t message_len = 48;
925 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
926 std::fill(message.get(), message.get() + message_len, 'a');
927 SignMessage(import_response.key_blob, message.get(), message_len);
928 ASSERT_TRUE(signature() != NULL);
Shawn Willdend05cba52014-09-26 09:58:12 -0600929 VerifyMessage(import_response.key_blob, message.get(), message_len);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600930}
931
932uint8_t dsa_wrong_q[] = {
933 0xC0, 0x66, 0x64, 0xF9, 0x05, 0x38, 0x64, 0x38, 0x4A, 0x17,
934 0x66, 0x79, 0xDD, 0x7F, 0x6E, 0x55, 0x22, 0x2A, 0xDF, 0xC5,
935};
936
937TEST_F(ImportKeyTest, DsaParameterMismatch) {
938 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700939 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
940 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
941 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
942 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden6bbe6782014-09-18 11:26:15 -0600943 Authorization(TAG_KEY_SIZE, 1024),
944 Authorization(TAG_DSA_Q, dsa_wrong_q, array_size(dsa_wrong_q)),
945 };
946
947 string pk8_key = read_file("dsa_privkey_pk8.der");
948 ASSERT_EQ(335U, pk8_key.size());
949
950 ImportKeyRequest import_request;
951 import_request.key_description.Reinitialize(params, array_length(params));
952 import_request.key_format = KM_KEY_FORMAT_PKCS8;
953 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
954
955 ImportKeyResponse import_response;
956 device.ImportKey(import_request, &import_response);
957 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, import_response.error);
958}
959
960TEST_F(ImportKeyTest, DsaKeySizeMismatch) {
961 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700962 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
963 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
964 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
965 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden6bbe6782014-09-18 11:26:15 -0600966 Authorization(TAG_KEY_SIZE, 2048),
967 };
968
969 string pk8_key = read_file("dsa_privkey_pk8.der");
970 ASSERT_EQ(335U, pk8_key.size());
971
972 ImportKeyRequest import_request;
973 import_request.key_description.Reinitialize(params, array_length(params));
974 import_request.key_format = KM_KEY_FORMAT_PKCS8;
975 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
976
977 ImportKeyResponse import_response;
978 device.ImportKey(import_request, &import_response);
979 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, import_response.error);
980}
981
Shawn Willden81effc62014-08-27 10:08:46 -0600982TEST_F(ImportKeyTest, EcdsaSuccess) {
983 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700984 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
985 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
986 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
987 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden81effc62014-08-27 10:08:46 -0600988 };
989
990 string pk8_key = read_file("ec_privkey_pk8.der");
991 ASSERT_EQ(138U, pk8_key.size());
992
993 ImportKeyRequest import_request;
994 import_request.key_description.Reinitialize(params, array_length(params));
995 import_request.key_format = KM_KEY_FORMAT_PKCS8;
996 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
997
998 ImportKeyResponse import_response;
999 device.ImportKey(import_request, &import_response);
1000 ASSERT_EQ(KM_ERROR_OK, import_response.error);
1001 EXPECT_EQ(0U, import_response.enforced.size());
1002 EXPECT_GT(import_response.unenforced.size(), 0U);
1003
1004 // Check values derived from the key.
1005 EXPECT_TRUE(contains(import_response.unenforced, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1006 EXPECT_TRUE(contains(import_response.unenforced, TAG_KEY_SIZE, 256));
1007
1008 // And values provided by GoogleKeymaster
1009 EXPECT_TRUE(contains(import_response.unenforced, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1010 EXPECT_TRUE(contains(import_response.unenforced, KM_TAG_CREATION_DATETIME));
1011
1012 size_t message_len = 1024 / 8;
1013 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
1014 std::fill(message.get(), message.get() + message_len, 'a');
1015 SignMessage(import_response.key_blob, message.get(), message_len);
1016 ASSERT_TRUE(signature() != NULL);
Shawn Willdend05cba52014-09-26 09:58:12 -06001017 VerifyMessage(import_response.key_blob, message.get(), message_len);
Shawn Willden81effc62014-08-27 10:08:46 -06001018}
1019
Shawn Willden6bbe6782014-09-18 11:26:15 -06001020TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1021 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -07001022 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1023 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
1024 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
1025 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden6bbe6782014-09-18 11:26:15 -06001026 Authorization(TAG_KEY_SIZE, 256),
1027 };
1028
1029 string pk8_key = read_file("ec_privkey_pk8.der");
1030 ASSERT_EQ(138U, pk8_key.size());
1031
1032 ImportKeyRequest import_request;
1033 import_request.key_description.Reinitialize(params, array_length(params));
1034 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1035 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1036
1037 ImportKeyResponse import_response;
1038 device.ImportKey(import_request, &import_response);
1039 ASSERT_EQ(KM_ERROR_OK, import_response.error);
1040 EXPECT_EQ(0U, import_response.enforced.size());
1041 EXPECT_GT(import_response.unenforced.size(), 0U);
1042
1043 // Check values derived from the key.
1044 EXPECT_TRUE(contains(import_response.unenforced, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1045 EXPECT_TRUE(contains(import_response.unenforced, TAG_KEY_SIZE, 256));
1046
1047 // And values provided by GoogleKeymaster
1048 EXPECT_TRUE(contains(import_response.unenforced, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1049 EXPECT_TRUE(contains(import_response.unenforced, KM_TAG_CREATION_DATETIME));
1050
1051 size_t message_len = 1024 / 8;
1052 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
1053 std::fill(message.get(), message.get() + message_len, 'a');
1054 SignMessage(import_response.key_blob, message.get(), message_len);
1055 ASSERT_TRUE(signature() != NULL);
Shawn Willdend05cba52014-09-26 09:58:12 -06001056 VerifyMessage(import_response.key_blob, message.get(), message_len);
Shawn Willden6bbe6782014-09-18 11:26:15 -06001057}
1058
1059TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1060 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -07001061 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
1062 Authorization(TAG_DIGEST, KM_DIGEST_NONE), Authorization(TAG_PADDING, KM_PAD_NONE),
1063 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
1064 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden8c856c82014-09-26 09:34:36 -06001065 Authorization(TAG_KEY_SIZE, 224),
Shawn Willden6bbe6782014-09-18 11:26:15 -06001066 };
1067
1068 string pk8_key = read_file("ec_privkey_pk8.der");
1069 ASSERT_EQ(138U, pk8_key.size());
1070
1071 ImportKeyRequest import_request;
1072 import_request.key_description.Reinitialize(params, array_length(params));
1073 import_request.key_format = KM_KEY_FORMAT_PKCS8;
1074 import_request.SetKeyMaterial(pk8_key.data(), pk8_key.size());
1075
1076 ImportKeyResponse import_response;
1077 device.ImportKey(import_request, &import_response);
1078 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, import_response.error);
1079}
1080
Shawn Willden128ffe02014-08-06 12:31:33 -06001081} // namespace test
1082} // namespace keymaster