blob: 1ee9c02f30ffe58039cd404acd515ac3a4779e31 [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 Willden5b53c992015-02-02 08:05:25 -070028#include "soft_keymaster_device.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060029
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 Willdend6cd7e32014-12-17 08:01:26 -070073const uint64_t OP_HANDLE_SENTINEL = 0xFFFFFFFFFFFFFFFF;
Shawn Willden128ffe02014-08-06 12:31:33 -060074class KeymasterTest : public testing::Test {
75 protected:
Shawn Willdend6cd7e32014-12-17 08:01:26 -070076 KeymasterTest()
77 : device_(new StdoutLogger), out_params_(NULL), signature_(NULL), characteristics_(NULL) {
Shawn Willden5b53c992015-02-02 08:05:25 -070078 blob_.key_material = NULL;
79 RAND_seed("foobar", 6);
80 }
81 ~KeymasterTest() {
82 FreeCharacteristics();
83 FreeKeyBlob();
Shawn Willdend0772312014-09-18 12:27:57 -060084 }
85
Shawn Willden5b53c992015-02-02 08:05:25 -070086 keymaster_device* device() { return reinterpret_cast<keymaster_device*>(device_.hw_device()); }
87
Shawn Willden0d560bf2014-12-15 17:44:02 -070088 void GenerateKey(AuthorizationSet* params) {
89 FreeKeyBlob();
90 FreeCharacteristics();
91 AddClientParams(params);
92 EXPECT_EQ(KM_ERROR_OK, device()->generate_key(device(), params->data(), params->size(),
93 &blob_, &characteristics_));
94 }
95
Shawn Willdend6cd7e32014-12-17 08:01:26 -070096 keymaster_error_t BeginOperation(keymaster_purpose_t purpose,
97 const keymaster_key_blob_t& key_blob) {
98 return device()->begin(device(), purpose, &key_blob, client_params_,
99 array_length(client_params_), &out_params_, &out_params_count_,
100 &op_handle_);
101 }
102
103 keymaster_error_t UpdateOperation(const void* message, size_t size, string* output,
104 size_t* input_consumed) {
105 uint8_t* out_tmp = NULL;
106 size_t out_length;
107 keymaster_error_t error =
108 device()->update(device(), op_handle_, reinterpret_cast<const uint8_t*>(message), size,
109 input_consumed, &out_tmp, &out_length);
110 if (out_tmp)
111 output->append(reinterpret_cast<char*>(out_tmp), out_length);
112 free(out_tmp);
113 return error;
114 }
115
116 keymaster_error_t FinishOperation(string* output) {
117 uint8_t* out_tmp = NULL;
118 size_t out_length;
119 keymaster_error_t error =
120 device()->finish(device(), op_handle_, reinterpret_cast<const uint8_t*>(signature_),
121 signature_length_, &out_tmp, &out_length);
122 if (out_tmp)
123 output->append(reinterpret_cast<char*>(out_tmp), out_length);
124 free(out_tmp);
125 return error;
126 }
127
Shawn Willden5b53c992015-02-02 08:05:25 -0700128 template <typename T> void ExpectContains(T val, T* vals, size_t len) {
129 EXPECT_EQ(1U, len);
130 EXPECT_EQ(val, vals[0]);
Shawn Willdend0772312014-09-18 12:27:57 -0600131 }
132
Shawn Willden5b53c992015-02-02 08:05:25 -0700133 void FreeCharacteristics() {
134 keymaster_free_characteristics(characteristics_);
135 free(characteristics_);
136 characteristics_ = NULL;
137 }
138
139 void FreeKeyBlob() {
140 free(const_cast<uint8_t*>(blob_.key_material));
141 blob_.key_material = NULL;
142 }
143
Shawn Willden0d560bf2014-12-15 17:44:02 -0700144 void AddClientParams(AuthorizationSet* set) { set->push_back(TAG_APPLICATION_ID, "app_id", 6); }
145
Shawn Willden6dde87c2014-12-11 14:08:48 -0700146 const keymaster_key_blob_t& key_blob() { return blob_; }
147
Shawn Willden5b53c992015-02-02 08:05:25 -0700148 SoftKeymasterDevice device_;
149
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700150 keymaster_blob_t client_id_ = {.data = reinterpret_cast<const uint8_t*>("app_id"),
151 .data_length = 6};
152 keymaster_key_param_t client_params_[1] = {
153 Authorization(TAG_APPLICATION_ID, client_id_.data, client_id_.data_length)};
154
155 keymaster_key_param_t* out_params_;
156 size_t out_params_count_;
157 uint64_t op_handle_;
158 size_t input_consumed_;
159 uint8_t* signature_;
160 size_t signature_length_;
161
Shawn Willden5b53c992015-02-02 08:05:25 -0700162 AuthorizationSet params_;
163 keymaster_key_blob_t blob_;
164 keymaster_key_characteristics_t* characteristics_;
Shawn Willden128ffe02014-08-06 12:31:33 -0600165};
166
Shawn Willden128ffe02014-08-06 12:31:33 -0600167typedef KeymasterTest CheckSupported;
168TEST_F(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700169 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
170 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600171
Shawn Willden5b53c992015-02-02 08:05:25 -0700172 size_t len;
173 keymaster_algorithm_t* algorithms;
174 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
175 ASSERT_EQ(4U, len);
176 EXPECT_EQ(KM_ALGORITHM_RSA, algorithms[0]);
177 EXPECT_EQ(KM_ALGORITHM_DSA, algorithms[1]);
178 EXPECT_EQ(KM_ALGORITHM_ECDSA, algorithms[2]);
179 EXPECT_EQ(KM_ALGORITHM_AES, algorithms[3]);
180
181 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -0600182}
183
184TEST_F(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700185 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
186 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
187 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600188
Shawn Willden5b53c992015-02-02 08:05:25 -0700189 size_t len;
190 keymaster_block_mode_t* modes;
191 EXPECT_EQ(KM_ERROR_UNSUPPORTED_BLOCK_MODE,
192 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
193 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600194
Shawn Willden5b53c992015-02-02 08:05:25 -0700195 EXPECT_EQ(KM_ERROR_UNSUPPORTED_BLOCK_MODE,
196 device()->get_supported_block_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_ENCRYPT,
197 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600198
Shawn Willden5b53c992015-02-02 08:05:25 -0700199 EXPECT_EQ(KM_ERROR_UNSUPPORTED_BLOCK_MODE,
200 device()->get_supported_block_modes(device(), KM_ALGORITHM_ECDSA, KM_PURPOSE_ENCRYPT,
201 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600202
Shawn Willden5b53c992015-02-02 08:05:25 -0700203 EXPECT_EQ(KM_ERROR_UNSUPPORTED_BLOCK_MODE,
204 device()->get_supported_block_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_ENCRYPT,
205 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600206}
207
208TEST_F(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700209 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
210 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
211 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600212
Shawn Willden5b53c992015-02-02 08:05:25 -0700213 size_t len;
214 keymaster_padding_t* modes;
215 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
216 KM_PURPOSE_SIGN, &modes, &len));
217 ExpectContains(KM_PAD_NONE, modes, len);
218 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600219
Shawn Willden5b53c992015-02-02 08:05:25 -0700220 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_DSA,
221 KM_PURPOSE_SIGN, &modes, &len));
222 ExpectContains(KM_PAD_NONE, modes, len);
223 free(modes);
Shawn Willden28e41472014-08-18 13:35:22 -0600224
Shawn Willden5b53c992015-02-02 08:05:25 -0700225 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_ECDSA,
226 KM_PURPOSE_SIGN, &modes, &len));
227 ExpectContains(KM_PAD_NONE, modes, len);
228 free(modes);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600229
Shawn Willden5b53c992015-02-02 08:05:25 -0700230 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES,
231 KM_PURPOSE_SIGN, &modes, &len));
232 EXPECT_EQ(0, len);
233 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600234}
235
236TEST_F(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700237 EXPECT_EQ(
238 KM_ERROR_OUTPUT_PARAMETER_NULL,
239 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600240
Shawn Willden5b53c992015-02-02 08:05:25 -0700241 size_t len;
242 keymaster_digest_t* digests;
243 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
244 KM_PURPOSE_SIGN, &digests, &len));
245 ExpectContains(KM_DIGEST_NONE, digests, len);
246 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600247
Shawn Willden5b53c992015-02-02 08:05:25 -0700248 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_DSA,
249 KM_PURPOSE_SIGN, &digests, &len));
250 ExpectContains(KM_DIGEST_NONE, digests, len);
251 free(digests);
Shawn Willden28e41472014-08-18 13:35:22 -0600252
Shawn Willden5b53c992015-02-02 08:05:25 -0700253 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_ECDSA,
254 KM_PURPOSE_SIGN, &digests, &len));
255 ExpectContains(KM_DIGEST_NONE, digests, len);
256 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600257
Shawn Willden5b53c992015-02-02 08:05:25 -0700258 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_AES,
259 KM_PURPOSE_SIGN, &digests, &len));
260 EXPECT_EQ(0, len);
261 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600262}
263
264TEST_F(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700265 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
266 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600267
Shawn Willden5b53c992015-02-02 08:05:25 -0700268 size_t len;
269 keymaster_key_format_t* formats;
270 EXPECT_EQ(KM_ERROR_OK,
271 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
272 ExpectContains(KM_KEY_FORMAT_PKCS8, formats, len);
273 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600274
Shawn Willden5b53c992015-02-02 08:05:25 -0700275 EXPECT_EQ(KM_ERROR_OK,
276 device()->get_supported_import_formats(device(), KM_ALGORITHM_DSA, &formats, &len));
277 ExpectContains(KM_KEY_FORMAT_PKCS8, formats, len);
278 free(formats);
Shawn Willden28e41472014-08-18 13:35:22 -0600279
Shawn Willden5b53c992015-02-02 08:05:25 -0700280 EXPECT_EQ(KM_ERROR_OK,
281 device()->get_supported_import_formats(device(), KM_ALGORITHM_ECDSA, &formats, &len));
282 ExpectContains(KM_KEY_FORMAT_PKCS8, formats, len);
283 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600284
Shawn Willden5b53c992015-02-02 08:05:25 -0700285 EXPECT_EQ(KM_ERROR_OK,
286 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
287 EXPECT_EQ(0, len);
288 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600289}
290
291TEST_F(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700292 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
293 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600294
Shawn Willden5b53c992015-02-02 08:05:25 -0700295 size_t len;
296 keymaster_key_format_t* formats;
297 EXPECT_EQ(KM_ERROR_OK,
298 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
299 ExpectContains(KM_KEY_FORMAT_X509, formats, len);
300 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600301
Shawn Willden5b53c992015-02-02 08:05:25 -0700302 EXPECT_EQ(KM_ERROR_OK,
303 device()->get_supported_export_formats(device(), KM_ALGORITHM_DSA, &formats, &len));
304 ExpectContains(KM_KEY_FORMAT_X509, formats, len);
305 free(formats);
Shawn Willden28e41472014-08-18 13:35:22 -0600306
Shawn Willden5b53c992015-02-02 08:05:25 -0700307 EXPECT_EQ(KM_ERROR_OK,
308 device()->get_supported_export_formats(device(), KM_ALGORITHM_ECDSA, &formats, &len));
309 ExpectContains(KM_KEY_FORMAT_X509, formats, len);
310 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600311
Shawn Willden5b53c992015-02-02 08:05:25 -0700312 EXPECT_EQ(KM_ERROR_OK,
313 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
314 EXPECT_EQ(0, len);
315 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600316}
317
Shawn Willdend0772312014-09-18 12:27:57 -0600318keymaster_key_param_t key_generation_base_params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700319 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
320 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
Shawn Willdend0772312014-09-18 12:27:57 -0600321 Authorization(TAG_APPLICATION_ID, "app_id", 6),
Shawn Willden3809b932014-12-02 06:59:46 -0700322 Authorization(TAG_APPLICATION_DATA, "app_data", 8), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willdend0772312014-09-18 12:27:57 -0600323};
324
Shawn Willden5b53c992015-02-02 08:05:25 -0700325TEST_F(KeymasterTest, TestFlags) {
326 EXPECT_TRUE(device()->flags & KEYMASTER_SOFTWARE_ONLY);
327 EXPECT_TRUE(device()->flags & KEYMASTER_BLOBS_ARE_STANDALONE);
328 EXPECT_FALSE(device()->flags & KEYMASTER_SUPPORTS_DSA);
329 EXPECT_TRUE(device()->flags & KEYMASTER_SUPPORTS_EC);
330}
331
332typedef KeymasterTest OldKeyGeneration;
333
334TEST_F(OldKeyGeneration, Rsa) {
335 keymaster_rsa_keygen_params_t params = {.modulus_size = 256, .public_exponent = 3};
336 uint8_t* key_blob;
337 size_t key_blob_length;
338 EXPECT_EQ(0,
339 device()->generate_keypair(device(), TYPE_RSA, &params, &key_blob, &key_blob_length));
340 EXPECT_GT(key_blob_length, 0);
341
342 free(key_blob);
343}
344
345TEST_F(OldKeyGeneration, Ecdsa) {
346
347 keymaster_ec_keygen_params_t params = {.field_size = 256};
348 uint8_t* key_blob;
349 size_t key_blob_length;
350 EXPECT_EQ(0,
351 device()->generate_keypair(device(), TYPE_EC, &params, &key_blob, &key_blob_length));
352 EXPECT_GT(key_blob_length, 0);
353
354 free(key_blob);
355}
356
Shawn Willdend0772312014-09-18 12:27:57 -0600357class NewKeyGeneration : public KeymasterTest {
358 protected:
359 NewKeyGeneration() {
Shawn Willden5b53c992015-02-02 08:05:25 -0700360 params_.Reinitialize(key_generation_base_params, array_length(key_generation_base_params));
Shawn Willdend0772312014-09-18 12:27:57 -0600361 }
362
Shawn Willden5b53c992015-02-02 08:05:25 -0700363 void CheckBaseParams(const AuthorizationSet& auths) {
364 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
365 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
366 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
367 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_ID, 8));
368 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600369
370 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700371 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
372 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
373 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600374
375 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700376 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
377 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
378 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600379
380 // Now check that unspecified, defaulted tags are correct.
Shawn Willden5b53c992015-02-02 08:05:25 -0700381 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
382 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600383 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700384};
385
Shawn Willden5b53c992015-02-02 08:05:25 -0700386struct ParamListDelete {
387 void operator()(keymaster_key_param_set_t* p) { keymaster_free_param_set(p); }
388};
389
390typedef UniquePtr<keymaster_key_param_set_t, ParamListDelete> UniqueParamSetPtr;
391
Shawn Willden128ffe02014-08-06 12:31:33 -0600392TEST_F(NewKeyGeneration, Rsa) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700393 params_.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA));
394 params_.push_back(Authorization(TAG_KEY_SIZE, 256));
395 params_.push_back(Authorization(TAG_RSA_PUBLIC_EXPONENT, 3));
396 ASSERT_EQ(KM_ERROR_OK, device()->generate_key(device(), params_.data(), params_.size(), &blob_,
397 &characteristics_));
398 EXPECT_EQ(0U, characteristics_->hw_enforced.length);
399 AuthorizationSet auths(characteristics_->sw_enforced);
400 CheckBaseParams(auths);
Shawn Willden128ffe02014-08-06 12:31:33 -0600401
Shawn Willden5b53c992015-02-02 08:05:25 -0700402 // Check specified tags are all present in auths
403 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
404 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
405 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600406}
407
Shawn Willden6bbe6782014-09-18 11:26:15 -0600408TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700409 params_.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA));
410 ASSERT_EQ(KM_ERROR_OK, device()->generate_key(device(), params_.data(), params_.size(), &blob_,
411 &characteristics_));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600412
Shawn Willden5b53c992015-02-02 08:05:25 -0700413 EXPECT_EQ(0U, characteristics_->hw_enforced.length);
414 AuthorizationSet auths(characteristics_->sw_enforced);
415 CheckBaseParams(auths);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600416
Shawn Willden5b53c992015-02-02 08:05:25 -0700417 // Check specified tags are all present in auths
418 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600419
420 // Now check that unspecified, defaulted tags are correct.
Shawn Willden5b53c992015-02-02 08:05:25 -0700421 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 65537));
422 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 2048));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600423}
424
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600425TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700426 params_.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
427 params_.push_back(Authorization(TAG_KEY_SIZE, 224));
428 EXPECT_EQ(KM_ERROR_OK, device()->generate_key(device(), params_.data(), params_.size(), &blob_,
429 &characteristics_));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600430
Shawn Willden5b53c992015-02-02 08:05:25 -0700431 EXPECT_EQ(0U, characteristics_->hw_enforced.length);
432 AuthorizationSet auths(characteristics_->sw_enforced);
433 CheckBaseParams(auths);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600434
Shawn Willden5b53c992015-02-02 08:05:25 -0700435 // Check specified tags are all present in auths characteristics
436 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
437 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600438}
439
Shawn Willden6bbe6782014-09-18 11:26:15 -0600440TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700441 params_.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
442 EXPECT_EQ(KM_ERROR_OK, device()->generate_key(device(), params_.data(), params_.size(), &blob_,
443 &characteristics_));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600444
Shawn Willden5b53c992015-02-02 08:05:25 -0700445 EXPECT_EQ(0U, characteristics_->hw_enforced.length);
446 AuthorizationSet auths(characteristics_->sw_enforced);
447 CheckBaseParams(auths);
Shawn Willden6bbe6782014-09-18 11:26:15 -0600448
Shawn Willden5b53c992015-02-02 08:05:25 -0700449 // Check specified tags are all present in auths
450 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600451
452 // Now check that unspecified, defaulted tags are correct.
Shawn Willden5b53c992015-02-02 08:05:25 -0700453 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600454}
455
456TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700457 params_.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
458 params_.push_back(Authorization(TAG_KEY_SIZE, 190));
459 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
460 device()->generate_key(device(), params_.data(), params_.size(), &blob_,
461 &characteristics_));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600462}
463
464TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600465 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600466 for (size_t size : valid_sizes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700467 params_.Reinitialize(key_generation_base_params, array_length(key_generation_base_params));
468 params_.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
469 params_.push_back(Authorization(TAG_KEY_SIZE, size));
470 EXPECT_EQ(KM_ERROR_OK, device()->generate_key(device(), params_.data(), params_.size(),
471 &blob_, &characteristics_))
472 << "Failed to generate size: " << size;
473
474 FreeCharacteristics();
475 FreeKeyBlob();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600476 }
477}
478
Shawn Willden19fca882015-01-22 16:35:30 -0700479TEST_F(NewKeyGeneration, AesOcb) {
480 keymaster_key_param_t params[] = {
481 Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT),
482 Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT),
483 Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES), Authorization(TAG_KEY_SIZE, 128),
484 Authorization(TAG_BLOCK_MODE, KM_MODE_OCB), Authorization(TAG_CHUNK_LENGTH, 4096),
Shawn Willden7efb8782014-12-11 14:07:44 -0700485 Authorization(TAG_MAC_LENGTH, 16), Authorization(TAG_PADDING, KM_PAD_NONE),
Shawn Willden19fca882015-01-22 16:35:30 -0700486 };
Shawn Willden5b53c992015-02-02 08:05:25 -0700487 params_.Reinitialize(params, array_length(params));
488 EXPECT_EQ(KM_ERROR_OK, device()->generate_key(device(), params_.data(), params_.size(), &blob_,
489 &characteristics_));
Shawn Willden19fca882015-01-22 16:35:30 -0700490}
491
492TEST_F(NewKeyGeneration, AesOcbInvalidKeySize) {
493 keymaster_key_param_t params[] = {
494 Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT),
495 Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT),
Shawn Willden95e13822014-12-15 16:12:16 -0700496 Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES), Authorization(TAG_KEY_SIZE, 136),
Shawn Willden19fca882015-01-22 16:35:30 -0700497 Authorization(TAG_BLOCK_MODE, KM_MODE_OCB), Authorization(TAG_CHUNK_LENGTH, 4096),
Shawn Willden7efb8782014-12-11 14:07:44 -0700498 Authorization(TAG_MAC_LENGTH, 16), Authorization(TAG_PADDING, KM_PAD_NONE),
Shawn Willden19fca882015-01-22 16:35:30 -0700499 };
Shawn Willden5b53c992015-02-02 08:05:25 -0700500 params_.Reinitialize(params, array_length(params));
Shawn Willden95e13822014-12-15 16:12:16 -0700501 EXPECT_EQ(KM_ERROR_OK, device()->generate_key(device(), params_.data(), params_.size(), &blob_,
502 &characteristics_));
503
504 keymaster_key_param_t* out_params;
505 size_t out_params_count;
506 uint64_t op_handle;
Shawn Willden5b53c992015-02-02 08:05:25 -0700507 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden95e13822014-12-15 16:12:16 -0700508 device()->begin(device(), KM_PURPOSE_ENCRYPT, &blob_, NULL, 0, &out_params,
509 &out_params_count, &op_handle));
510 free(out_params);
Shawn Willden19fca882015-01-22 16:35:30 -0700511}
512
513TEST_F(NewKeyGeneration, AesOcbAllValidSizes) {
514 keymaster_key_param_t params[] = {
515 Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT),
516 Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT),
Shawn Willden7efb8782014-12-11 14:07:44 -0700517 Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES), Authorization(TAG_BLOCK_MODE, KM_MODE_OCB),
518 Authorization(TAG_MAC_LENGTH, 16), Authorization(TAG_CHUNK_LENGTH, 4096),
Shawn Willden19fca882015-01-22 16:35:30 -0700519 Authorization(TAG_PADDING, KM_PAD_NONE),
520 };
521
522 size_t valid_sizes[] = {128, 192, 256};
523 for (size_t size : valid_sizes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700524 params_.Reinitialize(params, array_length(params));
525 params_.push_back(Authorization(TAG_KEY_SIZE, size));
Shawn Willden95e13822014-12-15 16:12:16 -0700526 FreeCharacteristics();
527 FreeKeyBlob();
528
Shawn Willden5b53c992015-02-02 08:05:25 -0700529 EXPECT_EQ(KM_ERROR_OK, device()->generate_key(device(), params_.data(), params_.size(),
530 &blob_, &characteristics_))
531 << "Failed to generate size: " << size;
532
Shawn Willden95e13822014-12-15 16:12:16 -0700533 keymaster_key_param_t* out_params;
534 size_t out_params_count;
535 uint64_t op_handle;
536 EXPECT_EQ(KM_ERROR_OK, device()->begin(device(), KM_PURPOSE_ENCRYPT, &blob_, NULL, 0,
537 &out_params, &out_params_count, &op_handle))
538 << "Unsupported key size: " << size;
539 free(out_params);
Shawn Willden19fca882015-01-22 16:35:30 -0700540 }
541}
542
Shawn Willden0d560bf2014-12-15 17:44:02 -0700543TEST_F(NewKeyGeneration, HmacSha256) {
544 keymaster_key_param_t params[] = {
545 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
546 Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC), Authorization(TAG_KEY_SIZE, 128),
547 Authorization(TAG_MAC_LENGTH, 16), Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256),
548 };
549 EXPECT_EQ(KM_ERROR_OK, device()->generate_key(device(), params, array_length(params), &blob_,
550 &characteristics_));
551}
552
Shawn Willden76364712014-08-11 17:48:04 -0600553typedef KeymasterTest GetKeyCharacteristics;
554TEST_F(GetKeyCharacteristics, SimpleRsa) {
555 keymaster_key_param_t params[] = {
Shawn Willden3809b932014-12-02 06:59:46 -0700556 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
557 Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_KEY_SIZE, 256),
558 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
559 Authorization(TAG_APPLICATION_ID, "app_id", 6), Authorization(TAG_AUTH_TIMEOUT, 300),
Shawn Willden76364712014-08-11 17:48:04 -0600560 };
561
Shawn Willden5b53c992015-02-02 08:05:25 -0700562 ASSERT_EQ(KM_ERROR_OK, device()->generate_key(device(), params, array_length(params), &blob_,
563 &characteristics_));
564 AuthorizationSet original(characteristics_->sw_enforced);
565 FreeCharacteristics();
Shawn Willden76364712014-08-11 17:48:04 -0600566
Shawn Willden5b53c992015-02-02 08:05:25 -0700567 keymaster_blob_t client_id = {.data = reinterpret_cast<const uint8_t*>("app_id"),
568 .data_length = 6};
569 ASSERT_EQ(KM_ERROR_OK,
570 device()->get_key_characteristics(device(), &blob_, &client_id, NULL /* app_data */,
571 &characteristics_));
572 EXPECT_EQ(original, AuthorizationSet(characteristics_->sw_enforced));
Shawn Willden76364712014-08-11 17:48:04 -0600573}
574
Shawn Willden61644f32014-08-18 13:43:14 -0600575/**
576 * Test class that provides some infrastructure for generating keys and signing messages.
577 */
Shawn Willden1615f2e2014-08-13 10:37:40 -0600578class SigningOperationsTest : public KeymasterTest {
579 protected:
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700580 SigningOperationsTest() {}
Shawn Willden5b53c992015-02-02 08:05:25 -0700581 ~SigningOperationsTest() {
582 // Clean up so (most) tests won't have to.
Shawn Willden5b53c992015-02-02 08:05:25 -0700583 FreeSignature();
584 }
585
Shawn Willden0d560bf2014-12-15 17:44:02 -0700586 // TODO(swillden): Refactor and move common test utils to KeymasterTest
587 using KeymasterTest::GenerateKey;
588
Shawn Willden61644f32014-08-18 13:43:14 -0600589 void GenerateKey(keymaster_algorithm_t algorithm, keymaster_digest_t digest,
590 keymaster_padding_t padding, uint32_t key_size) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700591 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
592 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY));
593 params_.push_back(Authorization(TAG_ALGORITHM, algorithm));
594 params_.push_back(Authorization(TAG_KEY_SIZE, key_size));
595 params_.push_back(Authorization(TAG_USER_ID, 7));
596 params_.push_back(Authorization(TAG_USER_AUTH_ID, 8));
597 params_.push_back(Authorization(TAG_APPLICATION_ID, "app_id", 6));
598 params_.push_back(Authorization(TAG_AUTH_TIMEOUT, 300));
Shawn Willden43e999e2014-08-13 13:29:50 -0600599 if (static_cast<int>(digest) != -1)
Shawn Willden5b53c992015-02-02 08:05:25 -0700600 params_.push_back(TAG_DIGEST, digest);
Shawn Willden43e999e2014-08-13 13:29:50 -0600601 if (static_cast<int>(padding) != -1)
Shawn Willden5b53c992015-02-02 08:05:25 -0700602 params_.push_back(TAG_PADDING, padding);
603
604 EXPECT_EQ(KM_ERROR_OK, device()->generate_key(device(), params_.data(), params_.size(),
605 &blob_, &characteristics_));
Shawn Willden61644f32014-08-18 13:43:14 -0600606 }
Shawn Willden1615f2e2014-08-13 10:37:40 -0600607
Shawn Willden61644f32014-08-18 13:43:14 -0600608 void SignMessage(const void* message, size_t size) {
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700609 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, blob_));
610 string result;
611 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, size, &result, &input_consumed_));
612 EXPECT_EQ(0, result.length());
Shawn Willden5b53c992015-02-02 08:05:25 -0700613 EXPECT_EQ(size, input_consumed_);
614
615 EXPECT_EQ(KM_ERROR_OK,
616 device()->finish(device(), op_handle_, NULL /* signature to verify */,
617 0 /* signature to verify length */, &signature_,
618 &signature_length_));
619 EXPECT_GT(signature_length_, 0);
Shawn Willden437fbd12014-08-20 11:59:49 -0600620 }
621
Shawn Willden5b53c992015-02-02 08:05:25 -0700622 void FreeSignature() {
623 free(signature_);
624 signature_ = NULL;
Shawn Willdenf268d742014-08-19 15:36:26 -0600625 }
626
Shawn Willden0d560bf2014-12-15 17:44:02 -0700627 const keymaster_key_blob_t& key_blob() { return blob_; }
628
Shawn Willden5b53c992015-02-02 08:05:25 -0700629 void corrupt_key_blob() {
630 uint8_t* tmp = const_cast<uint8_t*>(blob_.key_material);
631 ++tmp[blob_.key_material_size / 2];
Shawn Willden1615f2e2014-08-13 10:37:40 -0600632 }
Shawn Willden1615f2e2014-08-13 10:37:40 -0600633};
634
635TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willden61644f32014-08-18 13:43:14 -0600636 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willdenffd790c2014-08-18 21:20:06 -0600637 const char message[] = "12345678901234567890123456789012";
Shawn Willdend05cba52014-09-26 09:58:12 -0600638 SignMessage(message, array_size(message) - 1);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600639}
640
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600641TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600642 GenerateKey(KM_ALGORITHM_ECDSA, KM_DIGEST_NONE, KM_PAD_NONE, 224 /* key size */);
Shawn Willdend05cba52014-09-26 09:58:12 -0600643 const char message[] = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700644 string signature;
Shawn Willdend05cba52014-09-26 09:58:12 -0600645 SignMessage(message, array_size(message) - 1);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600646}
647
Shawn Willden1615f2e2014-08-13 10:37:40 -0600648TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willden61644f32014-08-18 13:43:14 -0600649 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willden5b53c992015-02-02 08:05:25 -0700650 ASSERT_EQ(KM_ERROR_OK, device()->begin(device(), KM_PURPOSE_SIGN, &blob_, client_params_,
651 array_length(client_params_), &out_params_,
652 &out_params_count_, &op_handle_));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600653
Shawn Willden5b53c992015-02-02 08:05:25 -0700654 EXPECT_EQ(KM_ERROR_OK, device()->abort(device(), op_handle_));
655 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device()->abort(device(), op_handle_));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600656}
657
658TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willden61644f32014-08-18 13:43:14 -0600659 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_SHA_2_256, KM_PAD_NONE, 256 /* key size */);
Shawn Willden5b53c992015-02-02 08:05:25 -0700660 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST,
661 device()->begin(device(), KM_PURPOSE_SIGN, &blob_, client_params_,
662 array_length(client_params_), &out_params_, &out_params_count_,
663 &op_handle_));
664 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device()->abort(device(), op_handle_));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600665}
666
667TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willden61644f32014-08-18 13:43:14 -0600668 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_RSA_OAEP, 256 /* key size */);
Shawn Willden5b53c992015-02-02 08:05:25 -0700669 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE,
670 device()->begin(device(), KM_PURPOSE_SIGN, &blob_, client_params_,
671 array_length(client_params_), &out_params_, &out_params_count_,
672 &op_handle_));
673 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device()->abort(device(), op_handle_));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600674}
675
676TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willden61644f32014-08-18 13:43:14 -0600677 GenerateKey(KM_ALGORITHM_RSA, static_cast<keymaster_digest_t>(-1), KM_PAD_NONE,
678 256 /* key size */);
Shawn Willden5b53c992015-02-02 08:05:25 -0700679 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST,
680 device()->begin(device(), KM_PURPOSE_SIGN, &blob_, client_params_,
681 array_length(client_params_), &out_params_, &out_params_count_,
682 &op_handle_));
683 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device()->abort(device(), op_handle_));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600684}
685
686TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willden61644f32014-08-18 13:43:14 -0600687 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, static_cast<keymaster_padding_t>(-1),
688 256 /* key size */);
Shawn Willden5b53c992015-02-02 08:05:25 -0700689 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE,
690 device()->begin(device(), KM_PURPOSE_SIGN, &blob_, client_params_,
691 array_length(client_params_), &out_params_, &out_params_count_,
692 &op_handle_));
693 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device()->abort(device(), op_handle_));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600694}
695
Shawn Willden0d560bf2014-12-15 17:44:02 -0700696TEST_F(SigningOperationsTest, HmacSha256Success) {
697 keymaster_key_param_t params[] = {
698 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
699 Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC), Authorization(TAG_KEY_SIZE, 128),
700 Authorization(TAG_MAC_LENGTH, 32), Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256),
701 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
702 Authorization(TAG_AUTH_TIMEOUT, 300),
703 };
704 params_.Reinitialize(params, array_length(params));
705 GenerateKey(&params_);
706 const char message[] = "12345678901234567890123456789012";
707 string signature;
708 SignMessage(message, array_size(message) - 1);
709 ASSERT_EQ(32, signature_length_);
710}
711
712// TODO(swillden): Add an HMACSHA256 test that validates against the test vectors from RFC4231.
713// Doing that requires being able to import keys, rather than just generate them
714// randomly.
715
716TEST_F(SigningOperationsTest, HmacSha256NoTag) {
717 keymaster_key_param_t params[] = {
718 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
719 Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC), Authorization(TAG_KEY_SIZE, 128),
720 Authorization(TAG_MAC_LENGTH, 16), Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256),
721 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
722 Authorization(TAG_AUTH_TIMEOUT, 300),
723 };
724 params_.Reinitialize(params, array_length(params));
725 GenerateKey(&params_);
726 const char message[] = "12345678901234567890123456789012";
727 string signature;
728 SignMessage(message, array_size(message) - 1);
729}
730
731TEST_F(SigningOperationsTest, HmacSha256TooLargeTag) {
732 keymaster_key_param_t params[] = {
733 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
734 Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC), Authorization(TAG_KEY_SIZE, 128),
735 Authorization(TAG_MAC_LENGTH, 33), Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256),
736 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
737 Authorization(TAG_AUTH_TIMEOUT, 300),
738 };
739 params_.Reinitialize(params, array_length(params));
740 GenerateKey(&params_);
741 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN, key_blob()));
742}
743
Shawn Willden1615f2e2014-08-13 10:37:40 -0600744TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willden61644f32014-08-18 13:43:14 -0600745 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700746 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, key_blob()));
747
748 const char message[] = "012345678901234567890123456789";
749 string result;
750 size_t input_consumed;
Shawn Willden5b53c992015-02-02 08:05:25 -0700751 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700752 UpdateOperation(message, array_length(message), &result, &input_consumed));
753 EXPECT_EQ(0U, result.size());
754 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600755
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700756 string signature;
757 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
758 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -0600759}
760
Shawn Willdend05cba52014-09-26 09:58:12 -0600761class VerificationOperationsTest : public SigningOperationsTest {
762 protected:
763 void VerifyMessage(const void* message, size_t message_len) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700764 EXPECT_TRUE(signature_ != NULL);
Shawn Willdend05cba52014-09-26 09:58:12 -0600765
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700766 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, blob_));
767 string output;
768 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, message_len, &output, &input_consumed_));
769 EXPECT_EQ(0U, output.size());
Shawn Willden5b53c992015-02-02 08:05:25 -0700770 EXPECT_EQ(message_len, input_consumed_);
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700771 output.clear();
772 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&output));
773 EXPECT_EQ(0U, output.size());
Shawn Willdend05cba52014-09-26 09:58:12 -0600774
Shawn Willden5b53c992015-02-02 08:05:25 -0700775 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device()->abort(device(), op_handle_));
Shawn Willdend05cba52014-09-26 09:58:12 -0600776 }
777};
778
Shawn Willden43e999e2014-08-13 13:29:50 -0600779TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willden61644f32014-08-18 13:43:14 -0600780 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
781 const char message[] = "12345678901234567890123456789012";
782 SignMessage(message, array_size(message) - 1);
Shawn Willdend05cba52014-09-26 09:58:12 -0600783 VerifyMessage(message, array_size(message) - 1);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600784}
785
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600786TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600787 GenerateKey(KM_ALGORITHM_ECDSA, KM_DIGEST_NONE, KM_PAD_NONE, 224 /* key size */);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600788 const char message[] = "123456789012345678901234567890123456789012345678";
789 SignMessage(message, array_size(message) - 1);
Shawn Willdend05cba52014-09-26 09:58:12 -0600790 VerifyMessage(message, array_size(message) - 1);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600791}
792
Shawn Willden0d560bf2014-12-15 17:44:02 -0700793TEST_F(VerificationOperationsTest, HmacSha256Success) {
794 keymaster_key_param_t params[] = {
795 Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
796 Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC), Authorization(TAG_KEY_SIZE, 128),
797 Authorization(TAG_MAC_LENGTH, 16), Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256),
798 Authorization(TAG_USER_ID, 7), Authorization(TAG_USER_AUTH_ID, 8),
799 Authorization(TAG_AUTH_TIMEOUT, 300),
800 };
801 params_.Reinitialize(params, array_length(params));
802 GenerateKey(&params_);
803 const char message[] = "123456789012345678901234567890123456789012345678";
804 string signature;
805 SignMessage(message, array_size(message) - 1);
806 VerifyMessage(message, array_size(message) - 1);
807}
808
Shawn Willden5b53c992015-02-02 08:05:25 -0700809typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -0600810TEST_F(ExportKeyTest, RsaSuccess) {
811 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256 /* key size */);
Shawn Willdenffd790c2014-08-18 21:20:06 -0600812
Shawn Willden5b53c992015-02-02 08:05:25 -0700813 uint8_t* export_data;
814 size_t export_data_length;
815 ASSERT_EQ(KM_ERROR_OK,
816 device()->export_key(device(), KM_KEY_FORMAT_X509, &blob_, &client_id_,
817 NULL /* app_data */, &export_data, &export_data_length));
818 EXPECT_TRUE(export_data != NULL);
819 EXPECT_GT(export_data_length, 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -0600820
821 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden5b53c992015-02-02 08:05:25 -0700822 free(export_data);
Shawn Willdenffd790c2014-08-18 21:20:06 -0600823}
824
Shawn Willdenf268d742014-08-19 15:36:26 -0600825TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600826 GenerateKey(KM_ALGORITHM_ECDSA, KM_DIGEST_NONE, KM_PAD_NONE, 224 /* key size */);
Shawn Willdenf268d742014-08-19 15:36:26 -0600827
Shawn Willden5b53c992015-02-02 08:05:25 -0700828 uint8_t* export_data;
829 size_t export_data_length;
830 ASSERT_EQ(KM_ERROR_OK,
831 device()->export_key(device(), KM_KEY_FORMAT_X509, &blob_, &client_id_,
832 NULL /* app_data */, &export_data, &export_data_length));
833 EXPECT_TRUE(export_data != NULL);
834 EXPECT_GT(export_data_length, 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -0600835
836 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden5b53c992015-02-02 08:05:25 -0700837 free(export_data);
Shawn Willdenf268d742014-08-19 15:36:26 -0600838}
839
840TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
841 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256);
842
Shawn Willden5b53c992015-02-02 08:05:25 -0700843 uint8_t dummy[] = {1};
844 uint8_t* export_data = dummy; // So it's not NULL;
845 size_t export_data_length;
846 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT,
847 device()->export_key(device(), KM_KEY_FORMAT_PKCS8, &blob_, &client_id_,
848 NULL /* app_data */, &export_data, &export_data_length));
849 ASSERT_TRUE(export_data == NULL);
Shawn Willdenf268d742014-08-19 15:36:26 -0600850}
851
852TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
853 GenerateKey(KM_ALGORITHM_RSA, KM_DIGEST_NONE, KM_PAD_NONE, 256);
Shawn Willden5b53c992015-02-02 08:05:25 -0700854 corrupt_key_blob();
Shawn Willdenf268d742014-08-19 15:36:26 -0600855
Shawn Willden5b53c992015-02-02 08:05:25 -0700856 uint8_t dummy[] = {1};
857 uint8_t* export_data = dummy; // So it's not NULL
858 size_t export_data_length;
859 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB,
860 device()->export_key(device(), KM_KEY_FORMAT_X509, &blob_, &client_id_,
861 NULL /* app_data */, &export_data, &export_data_length));
862 ASSERT_TRUE(export_data == NULL);
Shawn Willdenf268d742014-08-19 15:36:26 -0600863}
864
Shawn Willden437fbd12014-08-20 11:59:49 -0600865static string read_file(const string& file_name) {
866 ifstream file_stream(file_name, std::ios::binary);
867 istreambuf_iterator<char> file_begin(file_stream);
868 istreambuf_iterator<char> file_end;
869 return string(file_begin, file_end);
870}
871
Shawn Willden5b53c992015-02-02 08:05:25 -0700872class ImportKeyTest : public VerificationOperationsTest {
873 protected:
874 ImportKeyTest() {
875 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
876 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY));
877 params_.push_back(Authorization(TAG_DIGEST, KM_DIGEST_NONE));
878 params_.push_back(Authorization(TAG_PADDING, KM_PAD_NONE));
879 params_.push_back(Authorization(TAG_USER_ID, 7));
880 params_.push_back(Authorization(TAG_USER_AUTH_ID, 8));
881 params_.push_back(Authorization(TAG_APPLICATION_ID, "app_id", 6));
882 params_.push_back(Authorization(TAG_AUTH_TIMEOUT, 300));
883 }
884};
Brian Carlstromecf2ae92015-01-29 09:56:10 -0800885
Shawn Willden5b53c992015-02-02 08:05:25 -0700886TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -0600887 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -0600888 ASSERT_EQ(633U, pk8_key.size());
889
Shawn Willden5b53c992015-02-02 08:05:25 -0700890 ASSERT_EQ(KM_ERROR_OK,
891 device()->import_key(device(), params_.data(), params_.size(), KM_KEY_FORMAT_PKCS8,
892 reinterpret_cast<const uint8_t*>(pk8_key.data()), pk8_key.size(),
893 &blob_, &characteristics_));
894 EXPECT_EQ(0U, characteristics_->hw_enforced.length);
895 AuthorizationSet auths(characteristics_->sw_enforced);
Shawn Willden437fbd12014-08-20 11:59:49 -0600896
897 // Check values derived from the key.
Shawn Willden5b53c992015-02-02 08:05:25 -0700898 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
899 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 1024));
900 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -0600901
902 // And values provided by GoogleKeymaster
Shawn Willden5b53c992015-02-02 08:05:25 -0700903 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
904 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -0600905
906 size_t message_len = 1024 / 8;
907 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
908 std::fill(message.get(), message.get() + message_len, 'a');
Shawn Willden5b53c992015-02-02 08:05:25 -0700909 SignMessage(message.get(), message_len);
910 VerifyMessage(message.get(), message_len);
Shawn Willden437fbd12014-08-20 11:59:49 -0600911}
912
Shawn Willden6bbe6782014-09-18 11:26:15 -0600913TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700914 params_.push_back(Authorization(TAG_KEY_SIZE, 2048)); // Doesn't match key
Shawn Willden6bbe6782014-09-18 11:26:15 -0600915
916 string pk8_key = read_file("rsa_privkey_pk8.der");
917 ASSERT_EQ(633U, pk8_key.size());
918
Shawn Willden5b53c992015-02-02 08:05:25 -0700919 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
920 device()->import_key(device(), params_.data(), params_.size(), KM_KEY_FORMAT_PKCS8,
921 reinterpret_cast<const uint8_t*>(pk8_key.data()), pk8_key.size(),
922 &blob_, &characteristics_));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600923}
924
925TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700926 params_.push_back(Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)); // Doesn't match key
Shawn Willden6bbe6782014-09-18 11:26:15 -0600927
928 string pk8_key = read_file("rsa_privkey_pk8.der");
929 ASSERT_EQ(633U, pk8_key.size());
930
Shawn Willden5b53c992015-02-02 08:05:25 -0700931 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
932 device()->import_key(device(), params_.data(), params_.size(), KM_KEY_FORMAT_PKCS8,
933 reinterpret_cast<const uint8_t*>(pk8_key.data()), pk8_key.size(),
934 &blob_, &characteristics_));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600935}
936
Shawn Willden81effc62014-08-27 10:08:46 -0600937TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -0600938 string pk8_key = read_file("ec_privkey_pk8.der");
939 ASSERT_EQ(138U, pk8_key.size());
940
Shawn Willden5b53c992015-02-02 08:05:25 -0700941 ASSERT_EQ(KM_ERROR_OK,
942 device()->import_key(device(), params_.data(), params_.size(), KM_KEY_FORMAT_PKCS8,
943 reinterpret_cast<const uint8_t*>(pk8_key.data()), pk8_key.size(),
944 &blob_, &characteristics_));
945 EXPECT_EQ(0U, characteristics_->hw_enforced.length);
946 AuthorizationSet auths(characteristics_->sw_enforced);
Shawn Willden81effc62014-08-27 10:08:46 -0600947
948 // Check values derived from the key.
Shawn Willden5b53c992015-02-02 08:05:25 -0700949 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
950 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -0600951
952 // And values provided by GoogleKeymaster
Shawn Willden5b53c992015-02-02 08:05:25 -0700953 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_IMPORTED));
954 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -0600955
Shawn Willden5b53c992015-02-02 08:05:25 -0700956 size_t message_len = 1024;
Shawn Willden81effc62014-08-27 10:08:46 -0600957 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
958 std::fill(message.get(), message.get() + message_len, 'a');
Shawn Willden5b53c992015-02-02 08:05:25 -0700959 SignMessage(message.get(), message_len);
960 VerifyMessage(message.get(), message_len);
Shawn Willden81effc62014-08-27 10:08:46 -0600961}
962
Shawn Willden5b53c992015-02-02 08:05:25 -0700963TEST_F(ImportKeyTest, EcdsaKeySizeMismatch) {
964 params_.push_back(Authorization(TAG_KEY_SIZE, 224)); // Doesn't match key
Shawn Willden6bbe6782014-09-18 11:26:15 -0600965
Shawn Willden5b53c992015-02-02 08:05:25 -0700966 string pk8_key = read_file("rsa_privkey_pk8.der");
967 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600968
Shawn Willden5b53c992015-02-02 08:05:25 -0700969 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
970 device()->import_key(device(), params_.data(), params_.size(), KM_KEY_FORMAT_PKCS8,
971 reinterpret_cast<const uint8_t*>(pk8_key.data()), pk8_key.size(),
972 &blob_, &characteristics_));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600973}
974
Shawn Willden2665e862014-11-24 14:46:21 -0700975typedef KeymasterTest VersionTest;
976TEST_F(VersionTest, GetVersion) {
977 GetVersionRequest req;
978 GetVersionResponse rsp;
Shawn Willden5b53c992015-02-02 08:05:25 -0700979 device_.GetVersion(req, &rsp);
Shawn Willden2665e862014-11-24 14:46:21 -0700980 EXPECT_EQ(KM_ERROR_OK, rsp.error);
981 EXPECT_EQ(1, rsp.major_ver);
982 EXPECT_EQ(0, rsp.minor_ver);
983 EXPECT_EQ(0, rsp.subminor_ver);
984}
985
Shawn Willden4200f212014-12-02 07:01:21 -0700986/**
987 * Test class that provides some infrastructure for generating keys and encrypting messages.
988 */
989class EncryptionOperationsTest : public KeymasterTest {
990 protected:
Shawn Willden0d560bf2014-12-15 17:44:02 -0700991 // TODO(swillden): Refactor and move common test utils to KeymasterTest
992 using KeymasterTest::GenerateKey;
Shawn Willdenbe4a2a32014-12-15 14:51:10 -0700993
Shawn Willden4200f212014-12-02 07:01:21 -0700994 void GenerateKey(keymaster_algorithm_t algorithm, keymaster_padding_t padding,
995 uint32_t key_size) {
Shawn Willden6dde87c2014-12-11 14:08:48 -0700996 params_.Clear();
Shawn Willden5b53c992015-02-02 08:05:25 -0700997 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
998 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT));
999 params_.push_back(Authorization(TAG_ALGORITHM, algorithm));
1000 params_.push_back(Authorization(TAG_KEY_SIZE, key_size));
1001 params_.push_back(Authorization(TAG_USER_ID, 7));
1002 params_.push_back(Authorization(TAG_USER_AUTH_ID, 8));
Shawn Willden5b53c992015-02-02 08:05:25 -07001003 params_.push_back(Authorization(TAG_AUTH_TIMEOUT, 300));
Shawn Willden4200f212014-12-02 07:01:21 -07001004 if (static_cast<int>(padding) != -1)
Shawn Willden5b53c992015-02-02 08:05:25 -07001005 params_.push_back(TAG_PADDING, padding);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001006
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001007 GenerateKey(&params_);
Shawn Willden4200f212014-12-02 07:01:21 -07001008 }
1009
Shawn Willden907c3012014-12-08 15:51:55 -07001010 void GenerateSymmetricKey(keymaster_algorithm_t algorithm, uint32_t key_size,
1011 keymaster_block_mode_t block_mode, uint32_t chunk_length) {
Shawn Willden6dde87c2014-12-11 14:08:48 -07001012 params_.Clear();
Shawn Willden5b53c992015-02-02 08:05:25 -07001013 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1014 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1015 params_.push_back(Authorization(TAG_ALGORITHM, algorithm));
1016 params_.push_back(Authorization(TAG_BLOCK_MODE, block_mode));
1017 params_.push_back(Authorization(TAG_CHUNK_LENGTH, chunk_length));
1018 params_.push_back(Authorization(TAG_KEY_SIZE, key_size));
1019 params_.push_back(Authorization(TAG_MAC_LENGTH, 16));
1020 params_.push_back(Authorization(TAG_USER_ID, 7));
1021 params_.push_back(Authorization(TAG_USER_AUTH_ID, 8));
Shawn Willden5b53c992015-02-02 08:05:25 -07001022 params_.push_back(Authorization(TAG_AUTH_TIMEOUT, 300));
1023
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001024 GenerateKey(&params_);
Shawn Willden907c3012014-12-08 15:51:55 -07001025 }
1026
Shawn Willden4200f212014-12-02 07:01:21 -07001027 string ProcessMessage(keymaster_purpose_t purpose, const keymaster_key_blob_t& key_blob,
1028 const void* message, size_t size) {
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001029 EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, key_blob));
Shawn Willden4200f212014-12-02 07:01:21 -07001030
1031 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001032 size_t input_consumed;
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001033 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, size, &result, &input_consumed));
Shawn Willdenb7361132014-12-08 08:15:14 -07001034 EXPECT_EQ(size, input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001035 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&result));
1036 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, device()->abort(device(), op_handle_));
Shawn Willden4200f212014-12-02 07:01:21 -07001037 return result;
1038 }
1039
Shawn Willden6dde87c2014-12-11 14:08:48 -07001040 string EncryptMessage(const string& message) {
1041 return ProcessMessage(KM_PURPOSE_ENCRYPT, blob_, message.c_str(), message.length());
Shawn Willden4200f212014-12-02 07:01:21 -07001042 }
1043
Shawn Willden6dde87c2014-12-11 14:08:48 -07001044 string DecryptMessage(const string& ciphertext) {
1045 return ProcessMessage(KM_PURPOSE_DECRYPT, blob_, ciphertext.c_str(), ciphertext.length());
Shawn Willden4200f212014-12-02 07:01:21 -07001046 }
1047
Shawn Willden5b53c992015-02-02 08:05:25 -07001048 const void corrupt_key_blob() {
1049 uint8_t* tmp = const_cast<uint8_t*>(blob_.key_material);
1050 ++tmp[blob_.key_material_size / 2];
Shawn Willden4200f212014-12-02 07:01:21 -07001051 }
1052
Shawn Willden5b53c992015-02-02 08:05:25 -07001053 keymaster_blob_t client_id_ = {.data = reinterpret_cast<const uint8_t*>("app_id"),
1054 .data_length = 6};
1055 keymaster_key_param_t client_params_[1] = {
1056 Authorization(TAG_APPLICATION_ID, client_id_.data, client_id_.data_length)};
1057
1058 keymaster_key_param_t* out_params_;
1059 size_t out_params_count_;
Shawn Willden4200f212014-12-02 07:01:21 -07001060};
1061
1062TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
1063 GenerateKey(KM_ALGORITHM_RSA, KM_PAD_RSA_OAEP, 512);
1064 const char message[] = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001065 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001066 EXPECT_EQ(512 / 8, ciphertext1.size());
1067
Shawn Willden6dde87c2014-12-11 14:08:48 -07001068 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001069 EXPECT_EQ(512 / 8, ciphertext2.size());
1070
1071 // OAEP randomizes padding so every result should be different.
1072 EXPECT_NE(ciphertext1, ciphertext2);
1073}
1074
1075TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
1076 GenerateKey(KM_ALGORITHM_RSA, KM_PAD_RSA_OAEP, 512);
1077 const char message[] = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001078 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001079 EXPECT_EQ(512 / 8, ciphertext.size());
1080
Shawn Willden6dde87c2014-12-11 14:08:48 -07001081 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001082 EXPECT_EQ(message, plaintext);
1083}
1084
1085TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
1086 GenerateKey(KM_ALGORITHM_RSA, KM_PAD_RSA_OAEP, 512);
1087 const char message[] = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001088 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001089 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001090
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001091 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, blob_));
1092 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, array_size(message), &result, &input_consumed));
1093 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001094 EXPECT_EQ(0, result.size());
1095}
1096
1097TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
1098 GenerateKey(KM_ALGORITHM_RSA, KM_PAD_RSA_OAEP, 512);
1099 const char message[] = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001100 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001101 EXPECT_EQ(512 / 8, ciphertext.size());
1102
1103 // Corrupt the ciphertext
1104 ciphertext[512 / 8 / 2]++;
1105
Shawn Willden4200f212014-12-02 07:01:21 -07001106 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001107 size_t input_consumed;
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001108 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, blob_));
1109 EXPECT_EQ(KM_ERROR_OK,
1110 UpdateOperation(ciphertext.data(), ciphertext.size(), &result, &input_consumed));
1111 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001112 EXPECT_EQ(0, result.size());
1113}
1114
1115TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
1116 GenerateKey(KM_ALGORITHM_RSA, KM_PAD_RSA_PKCS1_1_5_ENCRYPT, 512);
1117 const char message[] = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001118 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001119 EXPECT_EQ(512 / 8, ciphertext1.size());
1120
Shawn Willden6dde87c2014-12-11 14:08:48 -07001121 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001122 EXPECT_EQ(512 / 8, ciphertext2.size());
1123
1124 // PKCS1 v1.5 randomizes padding so every result should be different.
1125 EXPECT_NE(ciphertext1, ciphertext2);
1126}
1127
1128TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
1129 GenerateKey(KM_ALGORITHM_RSA, KM_PAD_RSA_PKCS1_1_5_ENCRYPT, 512);
1130 const char message[] = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001131 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001132 EXPECT_EQ(512 / 8, ciphertext.size());
1133
Shawn Willden6dde87c2014-12-11 14:08:48 -07001134 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001135 EXPECT_EQ(message, plaintext);
1136}
1137
1138TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
1139 GenerateKey(KM_ALGORITHM_RSA, KM_PAD_RSA_PKCS1_1_5_ENCRYPT, 512);
1140 const char message[] = "1234567890123456789012345678901234567890123456789012";
Shawn Willden4200f212014-12-02 07:01:21 -07001141 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001142 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001143
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001144 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, blob_));
1145 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, array_size(message), &result, &input_consumed));
1146 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001147 EXPECT_EQ(0, result.size());
1148}
1149
1150TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
1151 GenerateKey(KM_ALGORITHM_RSA, KM_PAD_RSA_PKCS1_1_5_ENCRYPT, 512);
1152 const char message[] = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001153 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001154 EXPECT_EQ(512 / 8, ciphertext.size());
1155
1156 // Corrupt the ciphertext
1157 ciphertext[512 / 8 / 2]++;
1158
Shawn Willden4200f212014-12-02 07:01:21 -07001159 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001160 size_t input_consumed;
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001161 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, blob_));
1162 EXPECT_EQ(KM_ERROR_OK,
1163 UpdateOperation(ciphertext.data(), ciphertext.size(), &result, &input_consumed));
1164 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001165 EXPECT_EQ(0, result.size());
1166}
1167
Shawn Willden907c3012014-12-08 15:51:55 -07001168TEST_F(EncryptionOperationsTest, AesOcbSuccess) {
1169 GenerateSymmetricKey(KM_ALGORITHM_AES, 128, KM_MODE_OCB, 4096);
1170 const char message[] = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001171 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden907c3012014-12-08 15:51:55 -07001172 EXPECT_EQ(12 /* nonce */ + strlen(message) + 16 /* tag */, ciphertext1.size());
1173
Shawn Willden6dde87c2014-12-11 14:08:48 -07001174 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden907c3012014-12-08 15:51:55 -07001175 EXPECT_EQ(12 /* nonce */ + strlen(message) + 16 /* tag */, ciphertext2.size());
1176
1177 // OCB uses a random nonce, so every output should be different
1178 EXPECT_NE(ciphertext1, ciphertext2);
1179}
1180
Shawn Willden6dde87c2014-12-11 14:08:48 -07001181TEST_F(EncryptionOperationsTest, AesOcbRoundTripSuccess) {
1182 GenerateSymmetricKey(KM_ALGORITHM_AES, 128, KM_MODE_OCB, 4096);
1183 string message = "Hello World!";
1184 string ciphertext = EncryptMessage(message);
1185 EXPECT_EQ(12 /* nonce */ + message.length() + 16 /* tag */, ciphertext.size());
1186
1187 string plaintext = DecryptMessage(ciphertext);
1188 EXPECT_EQ(message, plaintext);
1189}
1190
1191TEST_F(EncryptionOperationsTest, AesOcbRoundTripCorrupted) {
1192 GenerateSymmetricKey(KM_ALGORITHM_AES, 128, KM_MODE_OCB, 4096);
1193 const char message[] = "Hello World!";
1194 string ciphertext = EncryptMessage(string(message));
1195 EXPECT_EQ(12 /* nonce */ + strlen(message) + 16 /* tag */, ciphertext.size());
1196
1197 ciphertext[ciphertext.size() / 2]++;
1198
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001199 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, key_blob()));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001200
1201 string result;
1202 size_t input_consumed;
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001203 EXPECT_EQ(KM_ERROR_OK,
1204 UpdateOperation(ciphertext.c_str(), ciphertext.length(), &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001205 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001206 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001207}
1208
1209TEST_F(EncryptionOperationsTest, AesDecryptGarbage) {
1210 GenerateSymmetricKey(KM_ALGORITHM_AES, 128, KM_MODE_OCB, 4096);
1211 string ciphertext(128, 'a');
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001212 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, key_blob()));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001213
1214 string result;
1215 size_t input_consumed;
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001216 EXPECT_EQ(KM_ERROR_OK,
1217 UpdateOperation(ciphertext.c_str(), ciphertext.length(), &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001218 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001219 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001220}
1221
1222TEST_F(EncryptionOperationsTest, AesDecryptTooShort) {
1223 // Try decrypting garbage ciphertext that is too short to be valid (< nonce + tag).
1224 GenerateSymmetricKey(KM_ALGORITHM_AES, 128, KM_MODE_OCB, 4096);
1225 string ciphertext(12 + 15, 'a');
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001226 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, key_blob()));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001227
1228 string result;
1229 size_t input_consumed;
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001230 EXPECT_EQ(KM_ERROR_OK,
1231 UpdateOperation(ciphertext.c_str(), ciphertext.length(), &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001232 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001233 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001234}
1235
1236TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptySuccess) {
1237 // Empty messages should work fine.
1238 GenerateSymmetricKey(KM_ALGORITHM_AES, 128, KM_MODE_OCB, 4096);
1239 const char message[] = "";
1240 string ciphertext = EncryptMessage(string(message));
1241 EXPECT_EQ(12 /* nonce */ + strlen(message) + 16 /* tag */, ciphertext.size());
1242
1243 string plaintext = DecryptMessage(ciphertext);
1244 EXPECT_EQ(message, plaintext);
1245}
1246
1247TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptyCorrupted) {
1248 // Should even detect corruption of empty messages.
1249 GenerateSymmetricKey(KM_ALGORITHM_AES, 128, KM_MODE_OCB, 4096);
1250 const char message[] = "";
1251 string ciphertext = EncryptMessage(string(message));
1252 EXPECT_EQ(12 /* nonce */ + strlen(message) + 16 /* tag */, ciphertext.size());
1253
1254 ciphertext[ciphertext.size() / 2]++;
1255
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001256 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, key_blob()));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001257
1258 string result;
1259 size_t input_consumed;
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001260 EXPECT_EQ(KM_ERROR_OK,
1261 UpdateOperation(ciphertext.c_str(), ciphertext.length(), &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001262 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001263 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001264}
1265
1266TEST_F(EncryptionOperationsTest, AesOcbFullChunk) {
1267 GenerateSymmetricKey(KM_ALGORITHM_AES, 128, KM_MODE_OCB, 4096);
1268 string message(4096, 'a');
1269 string ciphertext = EncryptMessage(message);
1270 EXPECT_EQ(12 /* nonce */ + message.length() + 16 /* tag */, ciphertext.size());
1271
1272 string plaintext = DecryptMessage(ciphertext);
1273 EXPECT_EQ(message, plaintext);
1274}
1275
1276TEST_F(EncryptionOperationsTest, AesOcbVariousChunkLengths) {
1277 for (unsigned chunk_length = 1; chunk_length <= 128; ++chunk_length) {
1278 GenerateSymmetricKey(KM_ALGORITHM_AES, 128, KM_MODE_OCB, chunk_length);
1279 string message(128, 'a');
1280 string ciphertext = EncryptMessage(message);
1281 int expected_tag_count = (message.length() + chunk_length - 1) / chunk_length;
1282 EXPECT_EQ(12 /* nonce */ + message.length() + 16 * expected_tag_count, ciphertext.size())
1283 << "Unexpected ciphertext size for chunk length " << chunk_length
1284 << " expected tag count was " << expected_tag_count
1285 << " but actual tag count was probably "
1286 << (ciphertext.size() - message.length() - 12) / 16;
1287
1288 string plaintext = DecryptMessage(ciphertext);
1289 EXPECT_EQ(message, plaintext);
1290 }
1291}
1292
1293TEST_F(EncryptionOperationsTest, AesOcbAbort) {
1294 GenerateSymmetricKey(KM_ALGORITHM_AES, 128, KM_MODE_OCB, 4096);
1295 const char message[] = "Hello";
1296
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001297 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, key_blob()));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001298
1299 string result;
1300 size_t input_consumed;
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001301 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, strlen(message), &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001302 EXPECT_EQ(strlen(message), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001303 EXPECT_EQ(KM_ERROR_OK, device()->abort(device(), op_handle_));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001304}
1305
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001306TEST_F(EncryptionOperationsTest, AesOcbNoChunkLength) {
1307 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1308 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1309 params_.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES));
1310 params_.push_back(Authorization(TAG_KEY_SIZE, 128));
1311 params_.push_back(Authorization(TAG_MAC_LENGTH, 16));
1312 params_.push_back(Authorization(TAG_BLOCK_MODE, KM_MODE_OCB));
1313 params_.push_back(Authorization(TAG_PADDING, KM_PAD_NONE));
1314
1315 GenerateKey(&params_);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001316 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT, key_blob()));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001317}
1318
1319TEST_F(EncryptionOperationsTest, AesEcbUnsupported) {
1320 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1321 params_.push_back(Authorization(TAG_MAC_LENGTH, 16));
1322 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1323 params_.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES));
1324 params_.push_back(Authorization(TAG_KEY_SIZE, 128));
1325 params_.push_back(Authorization(TAG_BLOCK_MODE, KM_MODE_ECB));
1326 params_.push_back(Authorization(TAG_PADDING, KM_PAD_NONE));
1327
1328 GenerateKey(&params_);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001329 EXPECT_EQ(KM_ERROR_UNSUPPORTED_BLOCK_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, key_blob()));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001330}
1331
1332TEST_F(EncryptionOperationsTest, AesOcbPaddingUnsupported) {
1333 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1334 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1335 params_.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES));
1336 params_.push_back(Authorization(TAG_KEY_SIZE, 128));
1337 params_.push_back(Authorization(TAG_MAC_LENGTH, 16));
1338 params_.push_back(Authorization(TAG_BLOCK_MODE, KM_MODE_OCB));
1339 params_.push_back(Authorization(TAG_CHUNK_LENGTH, 4096));
1340 params_.push_back(Authorization(TAG_PADDING, KM_PAD_ZERO));
1341
1342 GenerateKey(&params_);
1343 uint64_t op_handle;
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001344 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, key_blob()));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001345}
1346
1347TEST_F(EncryptionOperationsTest, AesOcbInvalidMacLength) {
1348 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1349 params_.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1350 params_.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES));
1351 params_.push_back(Authorization(TAG_KEY_SIZE, 128));
1352 params_.push_back(Authorization(TAG_MAC_LENGTH, 17));
1353 params_.push_back(Authorization(TAG_BLOCK_MODE, KM_MODE_OCB));
1354 params_.push_back(Authorization(TAG_CHUNK_LENGTH, 4096));
1355
1356 GenerateKey(&params_);
1357 uint64_t op_handle;
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001358 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, BeginOperation(KM_PURPOSE_ENCRYPT, key_blob()));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001359}
1360
Shawn Willden128ffe02014-08-06 12:31:33 -06001361} // namespace test
1362} // namespace keymaster