blob: 2b94ed9fc1a0a3971d1f258799a6f8974dfb3bee [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 Willden76076ab2014-12-18 08:36:35 -070017#include <algorithm>
Shawn Willden437fbd12014-08-20 11:59:49 -060018#include <fstream>
Shawn Willden76076ab2014-12-18 08:36:35 -070019#include <string>
20#include <vector>
Shawn Willden437fbd12014-08-20 11:59:49 -060021
Shawn Willden128ffe02014-08-06 12:31:33 -060022#include <gtest/gtest.h>
Shawn Willden76364712014-08-11 17:48:04 -060023
Shawn Willden128ffe02014-08-06 12:31:33 -060024#include <openssl/engine.h>
25
Shawn Willden98d9b922014-08-26 08:14:10 -060026#include <keymaster/google_keymaster_utils.h>
27#include <keymaster/keymaster_tags.h>
Shawn Willdenb7510332015-02-06 19:58:29 -070028#include <keymaster/soft_keymaster_device.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060029
Shawn Willden76364712014-08-11 17:48:04 -060030#include "google_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060031
Shawn Willden437fbd12014-08-20 11:59:49 -060032using std::ifstream;
33using std::istreambuf_iterator;
Shawn Willden76076ab2014-12-18 08:36:35 -070034using std::string;
35using std::vector;
Shawn Willden437fbd12014-08-20 11:59:49 -060036
Shawn Willden128ffe02014-08-06 12:31:33 -060037int main(int argc, char** argv) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -070038 ERR_load_crypto_strings();
Shawn Willden128ffe02014-08-06 12:31:33 -060039 ::testing::InitGoogleTest(&argc, argv);
40 int result = RUN_ALL_TESTS();
41 // Clean up stuff OpenSSL leaves around, so Valgrind doesn't complain.
42 CRYPTO_cleanup_all_ex_data();
Shawn Willden7c0a82b2014-09-17 12:57:32 -060043 ERR_remove_thread_state(NULL);
Shawn Willden128ffe02014-08-06 12:31:33 -060044 ERR_free_strings();
45 return result;
46}
47
Shawn Willden63ac0432014-12-29 14:07:08 -070048template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
49 os << "{ ";
50 bool first = true;
51 for (T t : vec) {
52 os << (first ? "" : ", ") << t;
53 if (first)
54 first = false;
55 }
56 os << " }";
57 return os;
58}
59
Shawn Willden128ffe02014-08-06 12:31:33 -060060namespace keymaster {
61namespace test {
62
Shawn Willdenb15d77e2014-12-17 16:44:29 -070063/**
64 * Utility class to make construction of AuthorizationSets easy, and readable. Use like:
65 *
66 * ParamBuilder()
67 * .Option(TAG_ALGORITHM, KM_ALGORITHM_RSA)
68 * .Option(TAG_KEY_SIZE, 512)
69 * .Option(TAG_DIGEST, KM_DIGEST_NONE)
70 * .Option(TAG_PADDING, KM_PAD_NONE)
71 * .Option(TAG_SINGLE_USE_PER_BOOT, true)
72 * .build();
73 *
74 * In addition there are methods that add common sets of parameters, like RsaSigningKey().
75 */
76class ParamBuilder {
77 public:
78 template <typename TagType, typename ValueType>
79 ParamBuilder& Option(TagType tag, ValueType value) {
80 set.push_back(tag, value);
81 return *this;
82 }
83
Shawn Willdendfa1c032015-02-07 00:39:01 -070084 template <keymaster_tag_t Tag> ParamBuilder& Option(TypedTag<KM_BOOL, Tag> tag) {
85 set.push_back(tag);
86 return *this;
87 }
88
Shawn Willdenb15d77e2014-12-17 16:44:29 -070089 ParamBuilder& RsaKey(uint32_t key_size = 0, uint64_t public_exponent = 0) {
90 Option(TAG_ALGORITHM, KM_ALGORITHM_RSA);
91 if (key_size != 0)
92 Option(TAG_KEY_SIZE, key_size);
93 if (public_exponent != 0)
94 Option(TAG_RSA_PUBLIC_EXPONENT, public_exponent);
95 return *this;
96 }
97
98 ParamBuilder& EcdsaKey(uint32_t key_size = 0) {
99 Option(TAG_ALGORITHM, KM_ALGORITHM_ECDSA);
100 if (key_size != 0)
101 Option(TAG_KEY_SIZE, key_size);
102 return *this;
103 }
104
105 ParamBuilder& AesKey(uint32_t key_size) {
106 Option(TAG_ALGORITHM, KM_ALGORITHM_AES);
107 return Option(TAG_KEY_SIZE, key_size);
108 }
109
110 ParamBuilder& HmacKey(uint32_t key_size, keymaster_digest_t digest, uint32_t mac_length) {
111 Option(TAG_ALGORITHM, KM_ALGORITHM_HMAC);
112 Option(TAG_KEY_SIZE, key_size);
113 SigningKey();
114 Option(TAG_DIGEST, digest);
115 return Option(TAG_MAC_LENGTH, mac_length);
116 }
117
118 ParamBuilder& RsaSigningKey(uint32_t key_size = 0, keymaster_digest_t digest = KM_DIGEST_NONE,
119 keymaster_padding_t padding = KM_PAD_NONE,
120 uint64_t public_exponent = 0) {
121 RsaKey(key_size, public_exponent);
122 SigningKey();
123 Option(TAG_DIGEST, digest);
124 return Option(TAG_PADDING, padding);
125 }
126
127 ParamBuilder& RsaEncryptionKey(uint32_t key_size = 0,
128 keymaster_padding_t padding = KM_PAD_RSA_OAEP,
129 uint64_t public_exponent = 0) {
130 RsaKey(key_size, public_exponent);
131 EncryptionKey();
132 return Option(TAG_PADDING, padding);
133 }
134
135 ParamBuilder& EcdsaSigningKey(uint32_t key_size = 0) {
136 EcdsaKey(key_size);
137 return SigningKey();
138 }
139
Shawn Willden3b702e22015-02-05 10:26:47 -0700140 ParamBuilder& AesEncryptionKey(uint32_t key_size = 128) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700141 AesKey(key_size);
142 return EncryptionKey();
143 }
144
145 ParamBuilder& SigningKey() {
146 Option(TAG_PURPOSE, KM_PURPOSE_SIGN);
147 return Option(TAG_PURPOSE, KM_PURPOSE_VERIFY);
148 }
149
150 ParamBuilder& EncryptionKey() {
151 Option(TAG_PURPOSE, KM_PURPOSE_ENCRYPT);
152 return Option(TAG_PURPOSE, KM_PURPOSE_DECRYPT);
153 }
154
155 ParamBuilder& NoDigestOrPadding() {
156 Option(TAG_DIGEST, KM_DIGEST_NONE);
157 return Option(TAG_PADDING, KM_PAD_NONE);
158 }
159
160 ParamBuilder& OcbMode(uint32_t chunk_length, uint32_t mac_length) {
161 Option(TAG_BLOCK_MODE, KM_MODE_OCB);
162 Option(TAG_CHUNK_LENGTH, chunk_length);
163 return Option(TAG_MAC_LENGTH, mac_length);
164 }
165
166 AuthorizationSet build() const { return set; }
167
168 private:
169 AuthorizationSet set;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600170};
171
Shawn Willdendfa1c032015-02-07 00:39:01 -0700172inline string make_string(const uint8_t* data, size_t length) {
173 return string(reinterpret_cast<const char*>(data), length);
174}
175
176template <size_t N> string make_string(const uint8_t(&a)[N]) {
177 return make_string(a, N);
178}
179
180static string make_string(const uint8_t(&)[0]) {
181 return string();
182}
183
Shawn Willden567a4a02014-12-31 12:14:46 -0700184StdoutLogger logger;
185
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700186const uint64_t OP_HANDLE_SENTINEL = 0xFFFFFFFFFFFFFFFF;
Shawn Willden128ffe02014-08-06 12:31:33 -0600187class KeymasterTest : public testing::Test {
188 protected:
Shawn Willdendfa1c032015-02-07 00:39:01 -0700189 KeymasterTest() : op_handle_(OP_HANDLE_SENTINEL), characteristics_(NULL) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700190 blob_.key_material = NULL;
191 RAND_seed("foobar", 6);
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700192 blob_.key_material = 0;
Shawn Willden5b53c992015-02-02 08:05:25 -0700193 }
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700194
Shawn Willden5b53c992015-02-02 08:05:25 -0700195 ~KeymasterTest() {
196 FreeCharacteristics();
197 FreeKeyBlob();
Shawn Willdend0772312014-09-18 12:27:57 -0600198 }
199
Shawn Willden30255022015-02-24 14:00:21 -0700200 keymaster1_device_t* device() {
201 return reinterpret_cast<keymaster1_device_t*>(device_.hw_device());
202 }
Shawn Willden5b53c992015-02-02 08:05:25 -0700203
Shawn Willdenc24c1102014-12-22 15:30:09 -0700204 keymaster_error_t GenerateKey(const ParamBuilder& builder) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700205 AuthorizationSet params(builder.build());
206 params.push_back(UserAuthParams());
207 params.push_back(ClientParams());
208
Shawn Willden0d560bf2014-12-15 17:44:02 -0700209 FreeKeyBlob();
210 FreeCharacteristics();
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700211 return device()->generate_key(device(), params.data(), params.size(), &blob_,
212 &characteristics_);
Shawn Willden0d560bf2014-12-15 17:44:02 -0700213 }
214
Shawn Willdenc24c1102014-12-22 15:30:09 -0700215 keymaster_error_t ImportKey(const ParamBuilder& builder, keymaster_key_format_t format,
216 const string& key_material) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700217 AuthorizationSet params(builder.build());
218 params.push_back(UserAuthParams());
219 params.push_back(ClientParams());
220
221 FreeKeyBlob();
222 FreeCharacteristics();
223 return device()->import_key(device(), params.data(), params.size(), format,
224 reinterpret_cast<const uint8_t*>(key_material.c_str()),
225 key_material.length(), &blob_, &characteristics_);
226 }
227
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700228 AuthorizationSet UserAuthParams() {
229 AuthorizationSet set;
230 set.push_back(TAG_USER_ID, 7);
231 set.push_back(TAG_USER_AUTH_ID, 8);
232 set.push_back(TAG_AUTH_TIMEOUT, 300);
233 return set;
234 }
235
236 AuthorizationSet ClientParams() {
237 AuthorizationSet set;
238 set.push_back(TAG_APPLICATION_ID, "app_id", 6);
239 return set;
240 }
241
242 keymaster_error_t BeginOperation(keymaster_purpose_t purpose) {
Shawn Willdendfa1c032015-02-07 00:39:01 -0700243 keymaster_key_param_t* out_params = NULL;
244 size_t out_params_count = 0;
245 keymaster_error_t error =
246 device()->begin(device(), purpose, &blob_, client_params_, array_length(client_params_),
247 &out_params, &out_params_count, &op_handle_);
248 EXPECT_EQ(0, out_params_count);
249 EXPECT_TRUE(out_params == NULL);
250 return error;
251 }
252
253 keymaster_error_t BeginOperation(keymaster_purpose_t purpose, const AuthorizationSet& input_set,
254 AuthorizationSet* output_set = NULL) {
255 AuthorizationSet additional_params(client_params_, array_length(client_params_));
256 additional_params.push_back(input_set);
257
258 keymaster_key_param_t* out_params;
259 size_t out_params_count;
260 keymaster_error_t error =
261 device()->begin(device(), purpose, &blob_, additional_params.data(),
262 additional_params.size(), &out_params, &out_params_count, &op_handle_);
263 if (output_set) {
264 output_set->Reinitialize(out_params, out_params_count);
265 } else {
266 EXPECT_EQ(0, out_params_count);
267 EXPECT_TRUE(out_params == NULL);
268 }
269 keymaster_free_param_values(out_params, out_params_count);
270 free(out_params);
271 return error;
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700272 }
273
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700274 keymaster_error_t UpdateOperation(const string& message, string* output,
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700275 size_t* input_consumed) {
276 uint8_t* out_tmp = NULL;
277 size_t out_length;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700278 EXPECT_NE(op_handle_, OP_HANDLE_SENTINEL);
Shawn Willdendfa1c032015-02-07 00:39:01 -0700279 keymaster_error_t error =
280 device()->update(device(), op_handle_, NULL /* params */, 0 /* params_count */,
281 reinterpret_cast<const uint8_t*>(message.c_str()), message.length(),
282 input_consumed, &out_tmp, &out_length);
283 if (out_tmp)
284 output->append(reinterpret_cast<char*>(out_tmp), out_length);
285 free(out_tmp);
286 return error;
287 }
288
289 keymaster_error_t UpdateOperation(const AuthorizationSet& additional_params,
290 const string& message, string* output,
291 size_t* input_consumed) {
292 uint8_t* out_tmp = NULL;
293 size_t out_length;
294 EXPECT_NE(op_handle_, OP_HANDLE_SENTINEL);
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700295 keymaster_error_t error = device()->update(
Shawn Willdendfa1c032015-02-07 00:39:01 -0700296 device(), op_handle_, additional_params.data(), additional_params.size(),
Shawn Willden6bfbff02015-02-06 19:48:24 -0700297 reinterpret_cast<const uint8_t*>(message.c_str()), message.length(), input_consumed,
298 &out_tmp, &out_length);
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700299 if (out_tmp)
300 output->append(reinterpret_cast<char*>(out_tmp), out_length);
301 free(out_tmp);
302 return error;
303 }
304
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700305 keymaster_error_t FinishOperation(string* output) { return FinishOperation("", output); }
306
307 keymaster_error_t FinishOperation(const string& signature, string* output) {
Shawn Willdendfa1c032015-02-07 00:39:01 -0700308 AuthorizationSet additional_params;
309 return FinishOperation(additional_params, signature, output);
310 }
311
312 keymaster_error_t FinishOperation(const AuthorizationSet& additional_params,
313 const string& signature, string* output) {
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700314 uint8_t* out_tmp = NULL;
315 size_t out_length;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700316 keymaster_error_t error = device()->finish(
Shawn Willdendfa1c032015-02-07 00:39:01 -0700317 device(), op_handle_, additional_params.data(), additional_params.size(),
Shawn Willden6bfbff02015-02-06 19:48:24 -0700318 reinterpret_cast<const uint8_t*>(signature.c_str()), signature.length(), &out_tmp,
319 &out_length);
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700320 if (out_tmp)
321 output->append(reinterpret_cast<char*>(out_tmp), out_length);
322 free(out_tmp);
323 return error;
324 }
325
Shawn Willden76076ab2014-12-18 08:36:35 -0700326 template <typename T>
327 bool ResponseContains(const vector<T>& expected, const T* values, size_t len) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700328 return expected.size() == len &&
329 std::is_permutation(values, values + len, expected.begin());
Shawn Willden76076ab2014-12-18 08:36:35 -0700330 }
331
332 template <typename T> bool ResponseContains(T expected, const T* values, size_t len) {
333 return (len == 1 && *values == expected);
Shawn Willdend0772312014-09-18 12:27:57 -0600334 }
335
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700336 keymaster_error_t AbortOperation() { return device()->abort(device(), op_handle_); }
337
338 string ProcessMessage(keymaster_purpose_t purpose, const string& message) {
Shawn Willdendfa1c032015-02-07 00:39:01 -0700339 AuthorizationSet input_params;
340 EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, input_params, NULL /* output_params */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700341
342 string result;
343 size_t input_consumed;
344 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
345 EXPECT_EQ(message.size(), input_consumed);
346 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&result));
347 return result;
348 }
349
350 string ProcessMessage(keymaster_purpose_t purpose, const string& message,
Shawn Willdendfa1c032015-02-07 00:39:01 -0700351 const AuthorizationSet& begin_params,
352 const AuthorizationSet& update_params,
353 AuthorizationSet* output_params = NULL) {
354 EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, begin_params, output_params));
355
356 string result;
357 size_t input_consumed;
358 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &result, &input_consumed));
359 EXPECT_EQ(message.size(), input_consumed);
360 EXPECT_EQ(KM_ERROR_OK, FinishOperation(update_params, "", &result));
361 return result;
362 }
363
364 string ProcessMessage(keymaster_purpose_t purpose, const string& message,
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700365 const string& signature) {
Shawn Willdendfa1c032015-02-07 00:39:01 -0700366 AuthorizationSet input_params;
367 EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, input_params, NULL /* output_params */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700368
369 string result;
370 size_t input_consumed;
371 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
372 EXPECT_EQ(message.size(), input_consumed);
373 EXPECT_EQ(KM_ERROR_OK, FinishOperation(signature, &result));
374 return result;
375 }
376
377 void SignMessage(const string& message, string* signature) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700378 SCOPED_TRACE("SignMessage");
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700379 *signature = ProcessMessage(KM_PURPOSE_SIGN, message);
380 EXPECT_GT(signature->size(), 0);
381 }
382
383 void VerifyMessage(const string& message, const string& signature) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700384 SCOPED_TRACE("VerifyMessage");
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700385 ProcessMessage(KM_PURPOSE_VERIFY, message, signature);
386 }
387
Shawn Willdendfa1c032015-02-07 00:39:01 -0700388 string EncryptMessage(const string& message, string* generated_nonce = NULL) {
389 AuthorizationSet update_params;
390 return EncryptMessage(update_params, message, generated_nonce);
391 }
392
393 string EncryptMessage(const AuthorizationSet& update_params, const string& message,
394 string* generated_nonce = NULL) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700395 SCOPED_TRACE("EncryptMessage");
Shawn Willdendfa1c032015-02-07 00:39:01 -0700396 AuthorizationSet begin_params, output_params;
397 string ciphertext = ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params,
398 &output_params);
399 if (generated_nonce) {
400 keymaster_blob_t nonce_blob;
401 EXPECT_TRUE(output_params.GetTagValue(TAG_NONCE, &nonce_blob));
402 *generated_nonce = make_string(nonce_blob.data, nonce_blob.data_length);
403 } else {
404 EXPECT_EQ(-1, output_params.find(TAG_NONCE));
405 }
406 return ciphertext;
407 }
408
409 string EncryptMessageWithParams(const string& message, const AuthorizationSet& begin_params,
410 const AuthorizationSet& update_params,
411 AuthorizationSet* output_params) {
412 SCOPED_TRACE("EncryptMessageWithParams");
413 return ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params,
414 output_params);
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700415 }
416
417 string DecryptMessage(const string& ciphertext) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700418 SCOPED_TRACE("DecryptMessage");
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700419 return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext);
420 }
421
Shawn Willdendfa1c032015-02-07 00:39:01 -0700422 string DecryptMessage(const string& ciphertext, const string& nonce) {
423 SCOPED_TRACE("DecryptMessage");
424 AuthorizationSet update_params;
425 return DecryptMessage(update_params, ciphertext, nonce);
426 }
427
428 string DecryptMessage(const AuthorizationSet& update_params, const string& ciphertext,
429 const string& nonce) {
430 SCOPED_TRACE("DecryptMessage");
431 AuthorizationSet begin_params;
432 begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
433 return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
434 }
435
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700436 keymaster_error_t GetCharacteristics() {
437 FreeCharacteristics();
438 return device()->get_key_characteristics(device(), &blob_, &client_id_, NULL /* app_data */,
439 &characteristics_);
440 }
441
442 keymaster_error_t ExportKey(keymaster_key_format_t format, string* export_data) {
443 uint8_t* export_data_tmp;
444 size_t export_data_length;
445
446 keymaster_error_t error =
447 device()->export_key(device(), format, &blob_, &client_id_, NULL /* app_data */,
448 &export_data_tmp, &export_data_length);
449
450 if (error != KM_ERROR_OK)
451 return error;
452
453 *export_data = string(reinterpret_cast<char*>(export_data_tmp), export_data_length);
454 free(export_data_tmp);
455 return error;
456 }
457
458 keymaster_error_t GetVersion(uint8_t* major, uint8_t* minor, uint8_t* subminor) {
459 GetVersionRequest request;
460 GetVersionResponse response;
461 device_.GetVersion(request, &response);
462 if (response.error != KM_ERROR_OK)
463 return response.error;
464 *major = response.major_ver;
465 *minor = response.minor_ver;
466 *subminor = response.subminor_ver;
467 return response.error;
468 }
469
Shawn Willden5fad7852015-01-26 16:10:56 -0700470 keymaster_error_t Rescope(const AuthorizationSet& new_params,
471 keymaster_key_blob_t* rescoped_blob,
472 keymaster_key_characteristics_t** rescoped_characteristics) {
473 return device()->rescope(device(), new_params.data(), new_params.size(), &blob_,
474 &client_id_, NULL /* app data */, rescoped_blob,
475 rescoped_characteristics);
476 }
477
Shawn Willden3b702e22015-02-05 10:26:47 -0700478 void CheckHmacTestVector(string key, string message, keymaster_digest_t digest,
479 string expected_mac) {
480 ASSERT_EQ(KM_ERROR_OK,
481 ImportKey(ParamBuilder().HmacKey(key.size() * 8, digest, expected_mac.size()),
482 KM_KEY_FORMAT_RAW, key));
483 string signature;
484 SignMessage(message, &signature);
485 EXPECT_EQ(expected_mac, signature) << "Test vector didn't match for digest " << digest;
486 }
487
Shawn Willdendfa1c032015-02-07 00:39:01 -0700488 void CheckAesOcbTestVector(const string& key, const string& nonce,
489 const string& associated_data, const string& message,
490 const string& expected_ciphertext) {
491 ASSERT_EQ(KM_ERROR_OK, ImportKey(ParamBuilder()
492 .AesEncryptionKey(key.size() * 8)
493 .OcbMode(4096 /* chunk length */, 16 /* tag length */)
494 .Option(TAG_CALLER_NONCE),
495 KM_KEY_FORMAT_RAW, key));
496
497 AuthorizationSet begin_params, update_params, output_params;
498 begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
499 update_params.push_back(TAG_ASSOCIATED_DATA, associated_data.data(),
500 associated_data.size());
501 string ciphertext =
502 EncryptMessageWithParams(message, begin_params, update_params, &output_params);
503 EXPECT_EQ(expected_ciphertext, ciphertext);
504 }
505
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700506 AuthorizationSet hw_enforced() {
507 EXPECT_TRUE(characteristics_ != NULL);
508 return AuthorizationSet(characteristics_->hw_enforced);
509 }
510
511 AuthorizationSet sw_enforced() {
512 EXPECT_TRUE(characteristics_ != NULL);
513 return AuthorizationSet(characteristics_->sw_enforced);
514 }
515
Shawn Willden5b53c992015-02-02 08:05:25 -0700516 void FreeCharacteristics() {
517 keymaster_free_characteristics(characteristics_);
518 free(characteristics_);
519 characteristics_ = NULL;
520 }
521
522 void FreeKeyBlob() {
523 free(const_cast<uint8_t*>(blob_.key_material));
524 blob_.key_material = NULL;
525 }
526
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700527 void corrupt_key_blob() {
528 assert(blob_.key_material);
529 uint8_t* tmp = const_cast<uint8_t*>(blob_.key_material);
530 ++tmp[blob_.key_material_size / 2];
531 }
Shawn Willden5b53c992015-02-02 08:05:25 -0700532
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700533 private:
534 SoftKeymasterDevice device_;
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700535 keymaster_blob_t client_id_ = {.data = reinterpret_cast<const uint8_t*>("app_id"),
536 .data_length = 6};
537 keymaster_key_param_t client_params_[1] = {
538 Authorization(TAG_APPLICATION_ID, client_id_.data, client_id_.data_length)};
539
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700540 uint64_t op_handle_;
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700541
Shawn Willden5b53c992015-02-02 08:05:25 -0700542 keymaster_key_blob_t blob_;
543 keymaster_key_characteristics_t* characteristics_;
Shawn Willden128ffe02014-08-06 12:31:33 -0600544};
545
Shawn Willden128ffe02014-08-06 12:31:33 -0600546typedef KeymasterTest CheckSupported;
547TEST_F(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700548 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
549 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600550
Shawn Willden5b53c992015-02-02 08:05:25 -0700551 size_t len;
552 keymaster_algorithm_t* algorithms;
553 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -0700554 EXPECT_TRUE(ResponseContains(
555 {KM_ALGORITHM_RSA, KM_ALGORITHM_ECDSA, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms,
556 len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700557 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -0600558}
559
560TEST_F(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700561 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
562 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
563 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600564
Shawn Willden5b53c992015-02-02 08:05:25 -0700565 size_t len;
566 keymaster_block_mode_t* modes;
Shawn Willden63ac0432014-12-29 14:07:08 -0700567 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
568 KM_PURPOSE_ENCRYPT, &modes, &len));
569 EXPECT_EQ(0, len);
570 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600571
Shawn Willden76076ab2014-12-18 08:36:35 -0700572 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
Shawn Willden5b53c992015-02-02 08:05:25 -0700573 device()->get_supported_block_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_ENCRYPT,
574 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600575
Shawn Willden63ac0432014-12-29 14:07:08 -0700576 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden5b53c992015-02-02 08:05:25 -0700577 device()->get_supported_block_modes(device(), KM_ALGORITHM_ECDSA, KM_PURPOSE_ENCRYPT,
578 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600579
Shawn Willden63ac0432014-12-29 14:07:08 -0700580 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
581 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willden498e0aa2015-03-04 15:35:45 -0700582 EXPECT_TRUE(ResponseContains({KM_MODE_OCB, KM_MODE_ECB, KM_MODE_CBC}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700583 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600584}
585
586TEST_F(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700587 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
588 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
589 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600590
Shawn Willden5b53c992015-02-02 08:05:25 -0700591 size_t len;
592 keymaster_padding_t* modes;
593 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
594 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700595 EXPECT_TRUE(
596 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700597 free(modes);
598
599 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
600 KM_PURPOSE_ENCRYPT, &modes, &len));
601 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700602 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600603
Shawn Willden76076ab2014-12-18 08:36:35 -0700604 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
605 device()->get_supported_padding_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_SIGN,
606 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600607
Shawn Willden5b53c992015-02-02 08:05:25 -0700608 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_ECDSA,
609 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700610 EXPECT_EQ(0, len);
611 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700612
613 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
614 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
615 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600616}
617
618TEST_F(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700619 EXPECT_EQ(
620 KM_ERROR_OUTPUT_PARAMETER_NULL,
621 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600622
Shawn Willden5b53c992015-02-02 08:05:25 -0700623 size_t len;
624 keymaster_digest_t* digests;
625 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
626 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700627 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700628 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600629
Shawn Willden76076ab2014-12-18 08:36:35 -0700630 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
631 device()->get_supported_digests(device(), KM_ALGORITHM_DSA, KM_PURPOSE_SIGN, &digests,
632 &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600633
Shawn Willden5b53c992015-02-02 08:05:25 -0700634 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_ECDSA,
635 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700636 EXPECT_EQ(0, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700637 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600638
Shawn Willden63ac0432014-12-29 14:07:08 -0700639 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
640 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
641 &len));
642
643 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700644 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700645 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
646 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
647 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700648 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600649}
650
651TEST_F(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700652 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
653 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600654
Shawn Willden5b53c992015-02-02 08:05:25 -0700655 size_t len;
656 keymaster_key_format_t* formats;
657 EXPECT_EQ(KM_ERROR_OK,
658 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700659 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700660 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700661
662 EXPECT_EQ(KM_ERROR_OK,
663 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
664 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
665 free(formats);
666
667 EXPECT_EQ(KM_ERROR_OK,
668 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
669 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
670 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600671}
672
673TEST_F(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700674 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
675 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600676
Shawn Willden5b53c992015-02-02 08:05:25 -0700677 size_t len;
678 keymaster_key_format_t* formats;
679 EXPECT_EQ(KM_ERROR_OK,
680 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700681 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700682 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600683
Shawn Willden76076ab2014-12-18 08:36:35 -0700684 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
Shawn Willden5b53c992015-02-02 08:05:25 -0700685 device()->get_supported_export_formats(device(), KM_ALGORITHM_DSA, &formats, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600686
Shawn Willden5b53c992015-02-02 08:05:25 -0700687 EXPECT_EQ(KM_ERROR_OK,
688 device()->get_supported_export_formats(device(), KM_ALGORITHM_ECDSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700689 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700690 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600691
Shawn Willden5b53c992015-02-02 08:05:25 -0700692 EXPECT_EQ(KM_ERROR_OK,
693 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
694 EXPECT_EQ(0, len);
695 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700696
697 EXPECT_EQ(KM_ERROR_OK,
698 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
699 EXPECT_EQ(0, len);
700 free(formats);
701
702 EXPECT_EQ(KM_ERROR_OK,
703 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
704 EXPECT_EQ(0, len);
705 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600706}
707
Shawn Willdend0772312014-09-18 12:27:57 -0600708class NewKeyGeneration : public KeymasterTest {
709 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700710 void CheckBaseParams() {
711 EXPECT_EQ(0U, hw_enforced().size());
712 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600713
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700714 AuthorizationSet auths = sw_enforced();
715 EXPECT_GT(auths.SerializedSize(), 12U);
716
Shawn Willden5b53c992015-02-02 08:05:25 -0700717 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
718 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
719 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
720 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_ID, 8));
721 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600722
723 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700724 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
725 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
726 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600727
728 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700729 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
730 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
731 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600732
733 // Now check that unspecified, defaulted tags are correct.
Shawn Willden5b53c992015-02-02 08:05:25 -0700734 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
735 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600736 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700737};
738
Shawn Willden128ffe02014-08-06 12:31:33 -0600739TEST_F(NewKeyGeneration, Rsa) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700740 ASSERT_EQ(KM_ERROR_OK,
741 GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_NONE, KM_PAD_NONE, 3)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700742 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600743
Shawn Willden5b53c992015-02-02 08:05:25 -0700744 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700745 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700746 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
747 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
748 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600749}
750
Shawn Willden6bbe6782014-09-18 11:26:15 -0600751TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700752 // TODO(swillden): Remove support for defaulting RSA parameter size and pub exponent.
Shawn Willdenc24c1102014-12-22 15:30:09 -0700753 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700754 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600755
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700756 // Check specified tags are all present in unenforced characteristics
757 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600758
759 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700760 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537));
761 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 2048));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600762}
763
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600764TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700765 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey(224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700766 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600767
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700768 // Check specified tags are all present in unenforced characteristics
769 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
770 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600771}
772
Shawn Willden6bbe6782014-09-18 11:26:15 -0600773TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700774 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700775 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600776
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700777 // Check specified tags are all present in unenforced characteristics
778 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600779
780 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700781 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600782}
783
784TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700785 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE, GenerateKey(ParamBuilder().EcdsaSigningKey(190)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600786}
787
788TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600789 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600790 for (size_t size : valid_sizes) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700791 EXPECT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey(size)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700792 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600793 }
794}
795
Shawn Willden19fca882015-01-22 16:35:30 -0700796TEST_F(NewKeyGeneration, AesOcb) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700797 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700798}
799
800TEST_F(NewKeyGeneration, AesOcbInvalidKeySize) {
Shawn Willden7dad93b2015-02-05 10:20:47 -0700801 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
802 GenerateKey(ParamBuilder().AesEncryptionKey(136).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700803}
804
805TEST_F(NewKeyGeneration, AesOcbAllValidSizes) {
Shawn Willden19fca882015-01-22 16:35:30 -0700806 size_t valid_sizes[] = {128, 192, 256};
807 for (size_t size : valid_sizes) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700808 EXPECT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(size)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700809 << "Failed to generate size: " << size;
Shawn Willden19fca882015-01-22 16:35:30 -0700810 }
811}
812
Shawn Willden0d560bf2014-12-15 17:44:02 -0700813TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700814 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700815}
816
Shawn Willden76364712014-08-11 17:48:04 -0600817typedef KeymasterTest GetKeyCharacteristics;
818TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700819 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700820 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600821
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700822 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
823 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600824}
825
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700826typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600827TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700828 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700829 string message = "12345678901234567890123456789012";
830 string signature;
831 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600832}
833
Shawn Willden61902362014-12-18 10:33:24 -0700834TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
835 // Note that without padding, key size must exactly match digest size.
Shawn Willdenf90f2352014-12-18 23:01:15 -0700836 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_SHA_2_256)));
837 string message(1024, 'a');
838 string signature;
839 SignMessage(message, &signature);
840}
841
842TEST_F(SigningOperationsTest, RsaPssSha256Success) {
843 ASSERT_EQ(KM_ERROR_OK,
844 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700845 // Use large message, which won't work without digesting.
846 string message(1024, 'a');
847 string signature;
848 SignMessage(message, &signature);
849}
850
Shawn Willdenf90f2352014-12-18 23:01:15 -0700851TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
852 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256,
853 KM_PAD_RSA_PKCS1_1_5_SIGN)));
854 string message(1024, 'a');
855 string signature;
856 SignMessage(message, &signature);
857}
858
859TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
860 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
861 // that 9 bytes larger than hash won't work.
862 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(
863 256 + 9 * 8, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
864 string message(1024, 'a');
865 string signature;
866
867 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
868
869 string result;
870 size_t input_consumed;
871 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
872 EXPECT_EQ(message.size(), input_consumed);
873 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
874}
875
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600876TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700877 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey(224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700878 string message = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700879 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700880 SignMessage(message, &signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600881}
882
Shawn Willden1615f2e2014-08-13 10:37:40 -0600883TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700884 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdendfa1c032015-02-07 00:39:01 -0700885 AuthorizationSet input_params, output_params;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700886 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
887 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
888 // Another abort should fail
889 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600890}
891
892TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700893 GenerateKey(
894 ParamBuilder().RsaSigningKey(256, KM_DIGEST_MD5, KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700895 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600896}
897
898TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700899 GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_SHA_2_256 /* supported digest */,
900 KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700901 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600902}
903
904TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700905 // Digest must be specified.
Shawn Willdenc24c1102014-12-22 15:30:09 -0700906 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaKey(256).SigningKey().Option(
907 TAG_PADDING, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700908 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700909 // PSS requires a digest.
910 GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_NONE, KM_PAD_RSA_PSS));
911 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600912}
913
914TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700915 // Padding must be specified
Shawn Willdenc24c1102014-12-22 15:30:09 -0700916 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaKey(256).SigningKey().Option(
917 TAG_DIGEST, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700918 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600919}
920
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700921TEST_F(SigningOperationsTest, HmacSha1Success) {
922 GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA1, 20));
923 string message = "12345678901234567890123456789012";
924 string signature;
925 SignMessage(message, &signature);
926 ASSERT_EQ(20, signature.size());
927}
928
Shawn Willden62c22862014-12-17 08:36:20 -0700929TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700930 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 28)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700931 string message = "12345678901234567890123456789012";
932 string signature;
933 SignMessage(message, &signature);
934 ASSERT_EQ(28, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700935}
936
Shawn Willden0d560bf2014-12-15 17:44:02 -0700937TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700938 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700939 string message = "12345678901234567890123456789012";
940 string signature;
941 SignMessage(message, &signature);
942 ASSERT_EQ(32, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700943}
944
Shawn Willden62c22862014-12-17 08:36:20 -0700945TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700946 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 48)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700947 string message = "12345678901234567890123456789012";
948 string signature;
949 SignMessage(message, &signature);
950 ASSERT_EQ(48, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700951}
952
953TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700954 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 64)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700955 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700956 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700957 SignMessage(message, &signature);
958 ASSERT_EQ(64, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700959}
960
Shawn Willden3b702e22015-02-05 10:26:47 -0700961TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
962 uint8_t key_data[] = {
963 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
964 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
965 };
966 string message = "Hi There";
967 uint8_t sha_224_expected[] = {
968 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
969 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
970 };
971 uint8_t sha_256_expected[] = {
972 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
973 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
974 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
975 };
976 uint8_t sha_384_expected[] = {
977 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
978 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
979 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
980 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
981 };
982 uint8_t sha_512_expected[] = {
983 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
984 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
985 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
986 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
987 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
988 };
989
990 string key = make_string(key_data);
991
992 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
993 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
994 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
995 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
996}
997
998TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
999 string key = "Jefe";
1000 string message = "what do ya want for nothing?";
1001 uint8_t sha_224_expected[] = {
1002 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
1003 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
1004 };
1005 uint8_t sha_256_expected[] = {
1006 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
1007 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
1008 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
1009 };
1010 uint8_t sha_384_expected[] = {
1011 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
1012 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
1013 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
1014 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
1015 };
1016 uint8_t sha_512_expected[] = {
1017 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
1018 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
1019 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
1020 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
1021 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
1022 };
1023
1024 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1025 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1026 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1027 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1028}
1029
1030TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
1031 string key(20, 0xaa);
1032 string message(50, 0xdd);
1033 uint8_t sha_224_expected[] = {
1034 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
1035 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
1036 };
1037 uint8_t sha_256_expected[] = {
1038 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
1039 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
1040 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
1041 };
1042 uint8_t sha_384_expected[] = {
1043 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
1044 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
1045 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
1046 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
1047 };
1048 uint8_t sha_512_expected[] = {
1049 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
1050 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
1051 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
1052 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
1053 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
1054 };
1055
1056 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1057 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1058 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1059 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1060}
1061
1062TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
1063 uint8_t key_data[25] = {
1064 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
1065 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
1066 };
1067 string key = make_string(key_data);
1068 string message(50, 0xcd);
1069 uint8_t sha_224_expected[] = {
1070 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
1071 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
1072 };
1073 uint8_t sha_256_expected[] = {
1074 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
1075 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
1076 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
1077 };
1078 uint8_t sha_384_expected[] = {
1079 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
1080 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
1081 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
1082 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
1083 };
1084 uint8_t sha_512_expected[] = {
1085 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
1086 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
1087 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
1088 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
1089 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
1090 };
1091
1092 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1093 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1094 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1095 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1096}
1097
1098TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
1099 string key(20, 0x0c);
1100 string message = "Test With Truncation";
1101
1102 uint8_t sha_224_expected[] = {
1103 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
1104 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
1105 };
1106 uint8_t sha_256_expected[] = {
1107 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
1108 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
1109 };
1110 uint8_t sha_384_expected[] = {
1111 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
1112 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
1113 };
1114 uint8_t sha_512_expected[] = {
1115 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
1116 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
1117 };
1118
1119 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1120 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1121 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1122 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1123}
1124
1125TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
1126 string key(131, 0xaa);
1127 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
1128
1129 uint8_t sha_224_expected[] = {
1130 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
1131 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
1132 };
1133 uint8_t sha_256_expected[] = {
1134 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
1135 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
1136 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
1137 };
1138 uint8_t sha_384_expected[] = {
1139 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
1140 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
1141 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
1142 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
1143 };
1144 uint8_t sha_512_expected[] = {
1145 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
1146 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
1147 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
1148 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
1149 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
1150 };
1151
1152 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1153 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1154 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1155 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1156}
1157
1158TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
1159 string key(131, 0xaa);
1160 string message = "This is a test using a larger than block-size key and a larger than "
1161 "block-size data. The key needs to be hashed before being used by the HMAC "
1162 "algorithm.";
1163
1164 uint8_t sha_224_expected[] = {
1165 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
1166 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
1167 };
1168 uint8_t sha_256_expected[] = {
1169 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
1170 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
1171 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
1172 };
1173 uint8_t sha_384_expected[] = {
1174 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
1175 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
1176 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
1177 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
1178 };
1179 uint8_t sha_512_expected[] = {
1180 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
1181 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
1182 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
1183 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
1184 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
1185 };
1186
1187 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1188 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1189 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1190 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1191}
Shawn Willden0d560bf2014-12-15 17:44:02 -07001192
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001193TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001194 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
1195 .Option(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
1196 .Option(TAG_KEY_SIZE, 128)
1197 .SigningKey()
1198 .Option(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001199 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -07001200}
1201
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001202TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001203 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 33)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001204 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -07001205}
1206
Shawn Willden1615f2e2014-08-13 10:37:40 -06001207TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001208 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001209 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001210
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001211 string message = "1234567890123456789012345678901";
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001212 string result;
1213 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001214 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001215 EXPECT_EQ(0U, result.size());
1216 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -06001217
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001218 string signature;
1219 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
1220 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -06001221}
1222
Shawn Willden61902362014-12-18 10:33:24 -07001223// TODO(swillden): Add more verification failure tests.
1224
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001225typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -06001226TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001227 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001228 string message = "12345678901234567890123456789012";
1229 string signature;
1230 SignMessage(message, &signature);
1231 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -06001232}
1233
Shawn Willden61902362014-12-18 10:33:24 -07001234TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
1235 // Note that without padding, key size must exactly match digest size.
1236 GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_SHA_2_256));
Shawn Willden61902362014-12-18 10:33:24 -07001237 string message(1024, 'a');
1238 string signature;
1239 SignMessage(message, &signature);
1240 VerifyMessage(message, signature);
1241}
1242
Shawn Willdenf90f2352014-12-18 23:01:15 -07001243TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willden61902362014-12-18 10:33:24 -07001244 GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_SHA_2_256));
Shawn Willden61902362014-12-18 10:33:24 -07001245 string message(1024, 'a');
1246 string signature;
1247 SignMessage(message, &signature);
1248 ++signature[signature.size() / 2];
1249
1250 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1251
1252 string result;
1253 size_t input_consumed;
1254 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1255 EXPECT_EQ(message.size(), input_consumed);
1256 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1257}
1258
Shawn Willdenf90f2352014-12-18 23:01:15 -07001259TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
1260 ASSERT_EQ(KM_ERROR_OK,
1261 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
1262 // Use large message, which won't work without digesting.
1263 string message(1024, 'a');
1264 string signature;
1265 SignMessage(message, &signature);
1266 VerifyMessage(message, signature);
1267}
1268
1269TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
1270 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS));
1271 string message(1024, 'a');
1272 string signature;
1273 SignMessage(message, &signature);
1274 ++signature[signature.size() / 2];
1275
1276 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1277
1278 string result;
1279 size_t input_consumed;
1280 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1281 EXPECT_EQ(message.size(), input_consumed);
1282 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1283}
1284
1285TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
1286 ASSERT_EQ(KM_ERROR_OK,
1287 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001288 // Use large message, which won't work without digesting.
1289 string message(1024, 'a');
1290 string signature;
1291 SignMessage(message, &signature);
1292 ++message[message.size() / 2];
1293
1294 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1295
1296 string result;
1297 size_t input_consumed;
1298 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1299 EXPECT_EQ(message.size(), input_consumed);
1300 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1301}
1302
Shawn Willdenf90f2352014-12-18 23:01:15 -07001303TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
1304 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN));
1305 string message(1024, 'a');
1306 string signature;
1307 SignMessage(message, &signature);
1308 VerifyMessage(message, signature);
1309}
1310
1311TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
1312 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN));
1313 string message(1024, 'a');
1314 string signature;
1315 SignMessage(message, &signature);
1316 ++signature[signature.size() / 2];
1317
1318 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1319
1320 string result;
1321 size_t input_consumed;
1322 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1323 EXPECT_EQ(message.size(), input_consumed);
1324 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1325}
1326
1327TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
1328 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256,
1329 KM_PAD_RSA_PKCS1_1_5_SIGN)));
1330 // Use large message, which won't work without digesting.
1331 string message(1024, 'a');
1332 string signature;
1333 SignMessage(message, &signature);
1334 ++message[message.size() / 2];
1335
1336 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1337
1338 string result;
1339 size_t input_consumed;
1340 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1341 EXPECT_EQ(message.size(), input_consumed);
1342 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1343}
1344
1345template <typename T> vector<T> make_vector(const T* array, size_t len) {
1346 return vector<T>(array, array + len);
1347}
1348
1349TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
1350 // Get all supported digests and padding modes.
1351 size_t digests_len;
1352 keymaster_digest_t* digests;
1353 EXPECT_EQ(KM_ERROR_OK,
1354 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1355 &digests_len));
1356
1357 size_t padding_modes_len;
1358 keymaster_padding_t* padding_modes;
1359 EXPECT_EQ(KM_ERROR_OK,
1360 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1361 &padding_modes, &padding_modes_len));
1362
1363 // Try them.
1364 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1365 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
1366 // Compute key & message size that will work.
1367 size_t key_bits = 256;
1368 size_t message_len = 1000;
1369 switch (digest) {
1370 case KM_DIGEST_NONE:
1371 switch (padding_mode) {
1372 case KM_PAD_NONE:
1373 // Match key size.
1374 message_len = key_bits / 8;
1375 break;
1376 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1377 message_len = key_bits / 8 - 11;
1378 break;
1379 case KM_PAD_RSA_PSS:
1380 // PSS requires a digest.
1381 continue;
1382 default:
1383 FAIL() << "Missing padding";
1384 break;
1385 }
1386 break;
1387
1388 case KM_DIGEST_SHA_2_256:
1389 switch (padding_mode) {
1390 case KM_PAD_NONE:
1391 // Key size matches digest size
1392 break;
1393 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1394 key_bits += 8 * 11;
1395 break;
1396 case KM_PAD_RSA_PSS:
1397 key_bits += 8 * 10;
1398 break;
1399 default:
1400 FAIL() << "Missing padding";
1401 break;
1402 }
1403 break;
1404 default:
1405 FAIL() << "Missing digest";
1406 }
1407
1408 GenerateKey(ParamBuilder().RsaSigningKey(key_bits, digest, padding_mode));
1409 string message(message_len, 'a');
1410 string signature;
1411 SignMessage(message, &signature);
1412 VerifyMessage(message, signature);
1413 }
1414 }
1415
1416 free(padding_modes);
1417 free(digests);
1418}
1419
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001420TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001421 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001422 string message = "123456789012345678901234567890123456789012345678";
1423 string signature;
1424 SignMessage(message, &signature);
1425 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001426}
1427
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001428TEST_F(VerificationOperationsTest, HmacSha1Success) {
1429 GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA1, 16));
1430 string message = "123456789012345678901234567890123456789012345678";
1431 string signature;
1432 SignMessage(message, &signature);
1433 VerifyMessage(message, signature);
1434}
1435
1436TEST_F(VerificationOperationsTest, HmacSha224Success) {
1437 GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 16));
1438 string message = "123456789012345678901234567890123456789012345678";
1439 string signature;
1440 SignMessage(message, &signature);
1441 VerifyMessage(message, signature);
1442}
1443
Shawn Willden0d560bf2014-12-15 17:44:02 -07001444TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001445 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001446 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001447 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001448 SignMessage(message, &signature);
1449 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001450}
1451
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001452TEST_F(VerificationOperationsTest, HmacSha384Success) {
1453 GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 16));
1454 string message = "123456789012345678901234567890123456789012345678";
1455 string signature;
1456 SignMessage(message, &signature);
1457 VerifyMessage(message, signature);
1458}
1459
1460TEST_F(VerificationOperationsTest, HmacSha512Success) {
1461 GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 16));
1462 string message = "123456789012345678901234567890123456789012345678";
1463 string signature;
1464 SignMessage(message, &signature);
1465 VerifyMessage(message, signature);
1466}
1467
Shawn Willden5b53c992015-02-02 08:05:25 -07001468typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001469TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001470 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001471 string export_data;
1472 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1473 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001474
1475 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001476}
1477
Shawn Willdenf268d742014-08-19 15:36:26 -06001478TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001479 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey(224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001480 string export_data;
1481 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1482 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001483
1484 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001485}
1486
1487TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001488 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001489 string export_data;
1490 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001491}
1492
1493TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001494 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001495 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001496 string export_data;
1497 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001498}
1499
Shawn Willden7dad93b2015-02-05 10:20:47 -07001500TEST_F(ExportKeyTest, AesKeyExportFails) {
1501 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128)));
1502 string export_data;
1503
1504 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1505 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1506 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1507}
1508
Shawn Willden437fbd12014-08-20 11:59:49 -06001509static string read_file(const string& file_name) {
1510 ifstream file_stream(file_name, std::ios::binary);
1511 istreambuf_iterator<char> file_begin(file_stream);
1512 istreambuf_iterator<char> file_end;
1513 return string(file_begin, file_end);
1514}
1515
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001516typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001517TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001518 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001519 ASSERT_EQ(633U, pk8_key.size());
1520
Shawn Willdena278f612014-12-23 11:22:21 -07001521 ASSERT_EQ(KM_ERROR_OK, ImportKey(ParamBuilder().RsaSigningKey().NoDigestOrPadding(),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001522 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001523
1524 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001525 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1526 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1527 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001528
1529 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001530 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1531 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001532
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001533 string message(1024 / 8, 'a');
1534 string signature;
1535 SignMessage(message, &signature);
1536 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001537}
1538
Shawn Willden6bbe6782014-09-18 11:26:15 -06001539TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001540 string pk8_key = read_file("rsa_privkey_pk8.der");
1541 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001542 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenc24c1102014-12-22 15:30:09 -07001543 ImportKey(ParamBuilder()
Shawn Willdena278f612014-12-23 11:22:21 -07001544 .RsaSigningKey(2048) // Size doesn't match key
Shawn Willdenc24c1102014-12-22 15:30:09 -07001545 .NoDigestOrPadding(),
1546 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001547}
1548
1549TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001550 string pk8_key = read_file("rsa_privkey_pk8.der");
1551 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001552 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenc24c1102014-12-22 15:30:09 -07001553 ImportKey(ParamBuilder()
Shawn Willdena278f612014-12-23 11:22:21 -07001554 .RsaSigningKey()
Shawn Willdenc24c1102014-12-22 15:30:09 -07001555 .Option(TAG_RSA_PUBLIC_EXPONENT, 3) // Doesn't match key
1556 .NoDigestOrPadding(),
1557 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001558}
1559
Shawn Willden81effc62014-08-27 10:08:46 -06001560TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001561 string pk8_key = read_file("ec_privkey_pk8.der");
1562 ASSERT_EQ(138U, pk8_key.size());
1563
Shawn Willdena278f612014-12-23 11:22:21 -07001564 ASSERT_EQ(KM_ERROR_OK,
1565 ImportKey(ParamBuilder().EcdsaSigningKey(), KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001566
1567 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001568 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1569 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001570
1571 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001572 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1573 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001574
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001575 string message(1024 / 8, 'a');
1576 string signature;
1577 SignMessage(message, &signature);
1578 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001579}
1580
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001581TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1582 string pk8_key = read_file("ec_privkey_pk8.der");
1583 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001584
Shawn Willdena278f612014-12-23 11:22:21 -07001585 ASSERT_EQ(KM_ERROR_OK,
1586 ImportKey(ParamBuilder().EcdsaSigningKey(256), KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001587
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001588 // Check values derived from the key.
1589 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1590 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1591
1592 // And values provided by GoogleKeymaster
1593 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1594 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1595
1596 string message(1024 / 8, 'a');
1597 string signature;
1598 SignMessage(message, &signature);
1599 VerifyMessage(message, signature);
1600}
1601
1602TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1603 string pk8_key = read_file("ec_privkey_pk8.der");
1604 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001605 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdena278f612014-12-23 11:22:21 -07001606 ImportKey(ParamBuilder().EcdsaSigningKey(224), // Size does not match key
1607 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001608}
1609
Shawn Willden3b702e22015-02-05 10:26:47 -07001610TEST_F(ImportKeyTest, AesKeySuccess) {
1611 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1612 string key(key_data, sizeof(key_data));
1613 ASSERT_EQ(KM_ERROR_OK, ImportKey(ParamBuilder().AesEncryptionKey().OcbMode(4096, 16),
1614 KM_KEY_FORMAT_RAW, key));
1615
1616 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1617 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1618
1619 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001620 string nonce;
1621 string ciphertext = EncryptMessage(message, &nonce);
1622 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden3b702e22015-02-05 10:26:47 -07001623 EXPECT_EQ(message, plaintext);
1624}
1625
1626TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1627 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1628 string key(key_data, sizeof(key_data));
1629 ASSERT_EQ(KM_ERROR_OK,
1630 ImportKey(ParamBuilder().HmacKey(sizeof(key_data) * 8, KM_DIGEST_SHA_2_256, 32),
1631 KM_KEY_FORMAT_RAW, key));
1632
1633 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1634 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1635
1636 string message = "Hello World!";
1637 string signature;
1638 SignMessage(message, &signature);
1639 VerifyMessage(message, signature);
1640}
1641
Shawn Willden2665e862014-11-24 14:46:21 -07001642typedef KeymasterTest VersionTest;
1643TEST_F(VersionTest, GetVersion) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001644 uint8_t major, minor, subminor;
1645 ASSERT_EQ(KM_ERROR_OK, GetVersion(&major, &minor, &subminor));
1646 EXPECT_EQ(1, major);
1647 EXPECT_EQ(0, minor);
1648 EXPECT_EQ(0, subminor);
Shawn Willden2665e862014-11-24 14:46:21 -07001649}
1650
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001651typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001652TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001653 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001654
1655 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001656 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001657 EXPECT_EQ(512 / 8, ciphertext1.size());
1658
Shawn Willden6dde87c2014-12-11 14:08:48 -07001659 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001660 EXPECT_EQ(512 / 8, ciphertext2.size());
1661
1662 // OAEP randomizes padding so every result should be different.
1663 EXPECT_NE(ciphertext1, ciphertext2);
1664}
1665
1666TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001667 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001668 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001669 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001670 EXPECT_EQ(512 / 8, ciphertext.size());
1671
Shawn Willden6dde87c2014-12-11 14:08:48 -07001672 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001673 EXPECT_EQ(message, plaintext);
1674}
1675
1676TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001677 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001678 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001679 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001680 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001681
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001682 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1683 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001684 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001685 EXPECT_EQ(0, result.size());
1686}
1687
1688TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001689 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001690 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001691 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001692 EXPECT_EQ(512 / 8, ciphertext.size());
1693
1694 // Corrupt the ciphertext
1695 ciphertext[512 / 8 / 2]++;
1696
Shawn Willden4200f212014-12-02 07:01:21 -07001697 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001698 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001699 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1700 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001701 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001702 EXPECT_EQ(0, result.size());
1703}
1704
1705TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001706 ASSERT_EQ(KM_ERROR_OK,
1707 GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001708 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001709 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001710 EXPECT_EQ(512 / 8, ciphertext1.size());
1711
Shawn Willden6dde87c2014-12-11 14:08:48 -07001712 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001713 EXPECT_EQ(512 / 8, ciphertext2.size());
1714
1715 // PKCS1 v1.5 randomizes padding so every result should be different.
1716 EXPECT_NE(ciphertext1, ciphertext2);
1717}
1718
1719TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001720 ASSERT_EQ(KM_ERROR_OK,
1721 GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001722 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001723 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001724 EXPECT_EQ(512 / 8, ciphertext.size());
1725
Shawn Willden6dde87c2014-12-11 14:08:48 -07001726 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001727 EXPECT_EQ(message, plaintext);
1728}
1729
1730TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001731 ASSERT_EQ(KM_ERROR_OK,
1732 GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001733 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001734 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001735 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001736
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001737 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1738 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001739 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001740 EXPECT_EQ(0, result.size());
1741}
1742
1743TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001744 ASSERT_EQ(KM_ERROR_OK,
1745 GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001746 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001747 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001748 EXPECT_EQ(512 / 8, ciphertext.size());
1749
1750 // Corrupt the ciphertext
1751 ciphertext[512 / 8 / 2]++;
1752
Shawn Willden4200f212014-12-02 07:01:21 -07001753 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001754 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001755 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1756 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001757 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001758 EXPECT_EQ(0, result.size());
1759}
1760
Shawn Willden907c3012014-12-08 15:51:55 -07001761TEST_F(EncryptionOperationsTest, AesOcbSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001762 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001763 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001764 string nonce1;
1765 string ciphertext1 = EncryptMessage(message, &nonce1);
1766 EXPECT_EQ(12, nonce1.size());
1767 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext1.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001768
Shawn Willdendfa1c032015-02-07 00:39:01 -07001769 string nonce2;
1770 string ciphertext2 = EncryptMessage(message, &nonce2);
1771 EXPECT_EQ(12, nonce2.size());
1772 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext2.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001773
Shawn Willdendfa1c032015-02-07 00:39:01 -07001774 // Nonces should be random
1775 EXPECT_NE(nonce1, nonce2);
1776
1777 // Therefore ciphertexts are different
Shawn Willden907c3012014-12-08 15:51:55 -07001778 EXPECT_NE(ciphertext1, ciphertext2);
1779}
1780
Shawn Willden6dde87c2014-12-11 14:08:48 -07001781TEST_F(EncryptionOperationsTest, AesOcbRoundTripSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001782 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001783 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001784 string nonce;
1785 string ciphertext = EncryptMessage(message, &nonce);
1786 EXPECT_EQ(12, nonce.size());
1787 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001788
Shawn Willdendfa1c032015-02-07 00:39:01 -07001789 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001790 EXPECT_EQ(message, plaintext);
1791}
1792
1793TEST_F(EncryptionOperationsTest, AesOcbRoundTripCorrupted) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001794 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001795 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001796 string nonce;
1797 string ciphertext = EncryptMessage(message, &nonce);
1798 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001799
1800 ciphertext[ciphertext.size() / 2]++;
1801
Shawn Willdendfa1c032015-02-07 00:39:01 -07001802 AuthorizationSet input_set, output_set;
1803 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1804 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set, &output_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001805
1806 string result;
1807 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001808 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001809 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001810 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001811}
1812
1813TEST_F(EncryptionOperationsTest, AesDecryptGarbage) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001814 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001815 string ciphertext(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001816 AuthorizationSet input_params;
1817 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaa", 12);
1818 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001819
1820 string result;
1821 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001822 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001823 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001824 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001825}
1826
Shawn Willdendfa1c032015-02-07 00:39:01 -07001827TEST_F(EncryptionOperationsTest, AesDecryptTooShortNonce) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001828 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001829
Shawn Willdendfa1c032015-02-07 00:39:01 -07001830 // Try decrypting garbage ciphertext with too-short nonce
1831 string ciphertext(15, 'a');
1832 AuthorizationSet input_params;
1833 input_params.push_back(TAG_NONCE, "aaaaaaaaaaa", 11);
1834 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001835}
1836
1837TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptySuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001838 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001839 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001840 string nonce;
1841 string ciphertext = EncryptMessage(message, &nonce);
1842 EXPECT_EQ(12, nonce.size());
1843 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001844
Shawn Willdendfa1c032015-02-07 00:39:01 -07001845 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001846 EXPECT_EQ(message, plaintext);
1847}
1848
1849TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptyCorrupted) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001850 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001851 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001852 string nonce;
1853 string ciphertext = EncryptMessage(message, &nonce);
1854 EXPECT_EQ(12, nonce.size());
1855 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001856
1857 ciphertext[ciphertext.size() / 2]++;
1858
Shawn Willdendfa1c032015-02-07 00:39:01 -07001859 AuthorizationSet input_set;
1860 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1861 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001862
1863 string result;
1864 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001865 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001866 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001867 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001868}
1869
1870TEST_F(EncryptionOperationsTest, AesOcbFullChunk) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001871 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001872 string message(4096, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001873 string nonce;
1874 string ciphertext = EncryptMessage(message, &nonce);
1875 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001876
Shawn Willdendfa1c032015-02-07 00:39:01 -07001877 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001878 EXPECT_EQ(message, plaintext);
1879}
1880
1881TEST_F(EncryptionOperationsTest, AesOcbVariousChunkLengths) {
1882 for (unsigned chunk_length = 1; chunk_length <= 128; ++chunk_length) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001883 ASSERT_EQ(KM_ERROR_OK,
1884 GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(chunk_length, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001885 string message(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001886 string nonce;
1887 string ciphertext = EncryptMessage(message, &nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001888 int expected_tag_count = (message.length() + chunk_length - 1) / chunk_length;
Shawn Willdendfa1c032015-02-07 00:39:01 -07001889 EXPECT_EQ(message.length() + 16 * expected_tag_count, ciphertext.size())
Shawn Willden6dde87c2014-12-11 14:08:48 -07001890 << "Unexpected ciphertext size for chunk length " << chunk_length
1891 << " expected tag count was " << expected_tag_count
1892 << " but actual tag count was probably "
1893 << (ciphertext.size() - message.length() - 12) / 16;
1894
Shawn Willdendfa1c032015-02-07 00:39:01 -07001895 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001896 EXPECT_EQ(message, plaintext);
1897 }
1898}
1899
1900TEST_F(EncryptionOperationsTest, AesOcbAbort) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001901 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001902 string message = "Hello";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001903
Shawn Willdendfa1c032015-02-07 00:39:01 -07001904 AuthorizationSet input_set, output_set;
1905 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_set, &output_set));
1906 EXPECT_EQ(1, output_set.size());
1907 EXPECT_EQ(0, output_set.find(TAG_NONCE));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001908
1909 string result;
1910 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001911 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1912 EXPECT_EQ(message.length(), input_consumed);
1913 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001914}
1915
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001916TEST_F(EncryptionOperationsTest, AesOcbNoChunkLength) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001917 EXPECT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
1918 .AesEncryptionKey(128)
1919 .Option(TAG_BLOCK_MODE, KM_MODE_OCB)
1920 .Option(TAG_MAC_LENGTH, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001921 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001922}
1923
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001924TEST_F(EncryptionOperationsTest, AesOcbPaddingUnsupported) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001925 ASSERT_EQ(KM_ERROR_OK,
1926 GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Option(
1927 TAG_PADDING, KM_PAD_ZERO)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001928 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001929}
1930
1931TEST_F(EncryptionOperationsTest, AesOcbInvalidMacLength) {
Shawn Willden63ac0432014-12-29 14:07:08 -07001932 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 17)));
1933 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001934}
1935
Shawn Willdendfa1c032015-02-07 00:39:01 -07001936uint8_t rfc_7523_test_key_data[] = {
1937 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1938};
1939string rfc_7523_test_key = make_string(rfc_7523_test_key_data);
1940
1941TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector1) {
1942 uint8_t nonce[] = {
1943 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
1944 };
1945 uint8_t expected_ciphertext[] = {
1946 0x78, 0x54, 0x07, 0xBF, 0xFF, 0xC8, 0xAD, 0x9E,
1947 0xDC, 0xC5, 0x52, 0x0A, 0xC9, 0x11, 0x1E, 0xE6,
1948 };
1949 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1950 "" /* plaintext */, make_string(expected_ciphertext));
1951}
1952
1953TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector2) {
1954 uint8_t nonce[] = {
1955 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x01,
1956 };
1957 uint8_t associated_data[] = {
1958 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1959 };
1960 uint8_t plaintext[] = {
1961 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1962 };
1963 uint8_t expected_ciphertext[] = {
1964 0x68, 0x20, 0xB3, 0x65, 0x7B, 0x6F, 0x61, 0x5A, 0x57, 0x25, 0xBD, 0xA0,
1965 0xD3, 0xB4, 0xEB, 0x3A, 0x25, 0x7C, 0x9A, 0xF1, 0xF8, 0xF0, 0x30, 0x09,
1966 };
1967 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1968 make_string(plaintext), make_string(expected_ciphertext));
1969}
1970
1971TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector3) {
1972 uint8_t nonce[] = {
1973 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x02,
1974 };
1975 uint8_t associated_data[] = {
1976 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1977 };
1978 uint8_t expected_ciphertext[] = {
1979 0x81, 0x01, 0x7F, 0x82, 0x03, 0xF0, 0x81, 0x27,
1980 0x71, 0x52, 0xFA, 0xDE, 0x69, 0x4A, 0x0A, 0x00,
1981 };
1982 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1983 "" /* plaintext */, make_string(expected_ciphertext));
1984}
1985
1986TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector4) {
1987 uint8_t nonce[] = {
1988 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x03,
1989 };
1990 uint8_t plaintext[] = {
1991 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1992 };
1993 uint8_t expected_ciphertext[] = {
1994 0x45, 0xDD, 0x69, 0xF8, 0xF5, 0xAA, 0xE7, 0x24, 0x14, 0x05, 0x4C, 0xD1,
1995 0xF3, 0x5D, 0x82, 0x76, 0x0B, 0x2C, 0xD0, 0x0D, 0x2F, 0x99, 0xBF, 0xA9,
1996 };
1997 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1998 make_string(plaintext), make_string(expected_ciphertext));
1999}
2000
2001TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector5) {
2002 uint8_t nonce[] = {
2003 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x04,
2004 };
2005 uint8_t associated_data[] = {
2006 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2007 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2008 };
2009 uint8_t plaintext[] = {
2010 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2011 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2012 };
2013 uint8_t expected_ciphertext[] = {
2014 0x57, 0x1D, 0x53, 0x5B, 0x60, 0xB2, 0x77, 0x18, 0x8B, 0xE5, 0x14,
2015 0x71, 0x70, 0xA9, 0xA2, 0x2C, 0x3A, 0xD7, 0xA4, 0xFF, 0x38, 0x35,
2016 0xB8, 0xC5, 0x70, 0x1C, 0x1C, 0xCE, 0xC8, 0xFC, 0x33, 0x58,
2017 };
2018 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2019 make_string(plaintext), make_string(expected_ciphertext));
2020}
2021
2022TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector6) {
2023 uint8_t nonce[] = {
2024 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x05,
2025 };
2026 uint8_t associated_data[] = {
2027 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2028 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2029 };
2030 uint8_t expected_ciphertext[] = {
2031 0x8C, 0xF7, 0x61, 0xB6, 0x90, 0x2E, 0xF7, 0x64,
2032 0x46, 0x2A, 0xD8, 0x64, 0x98, 0xCA, 0x6B, 0x97,
2033 };
2034 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2035 "" /* plaintext */, make_string(expected_ciphertext));
2036}
2037
2038TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector7) {
2039 uint8_t nonce[] = {
2040 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x06,
2041 };
2042 uint8_t plaintext[] = {
2043 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2044 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
2045 };
2046 uint8_t expected_ciphertext[] = {
2047 0x5C, 0xE8, 0x8E, 0xC2, 0xE0, 0x69, 0x27, 0x06, 0xA9, 0x15, 0xC0,
2048 0x0A, 0xEB, 0x8B, 0x23, 0x96, 0xF4, 0x0E, 0x1C, 0x74, 0x3F, 0x52,
2049 0x43, 0x6B, 0xDF, 0x06, 0xD8, 0xFA, 0x1E, 0xCA, 0x34, 0x3D,
2050 };
2051 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
2052 make_string(plaintext), make_string(expected_ciphertext));
2053}
2054
2055TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector8) {
2056 uint8_t nonce[] = {
2057 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x07,
2058 };
2059 uint8_t associated_data[] = {
2060 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
2061 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2062 };
2063 uint8_t plaintext[] = {
2064 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
2065 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2066 };
2067 uint8_t expected_ciphertext[] = {
2068 0x1C, 0xA2, 0x20, 0x73, 0x08, 0xC8, 0x7C, 0x01, 0x07, 0x56, 0x10, 0x4D, 0x88, 0x40,
2069 0xCE, 0x19, 0x52, 0xF0, 0x96, 0x73, 0xA4, 0x48, 0xA1, 0x22, 0xC9, 0x2C, 0x62, 0x24,
2070 0x10, 0x51, 0xF5, 0x73, 0x56, 0xD7, 0xF3, 0xC9, 0x0B, 0xB0, 0xE0, 0x7F,
2071 };
2072 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2073 make_string(plaintext), make_string(expected_ciphertext));
2074}
2075
2076TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector9) {
2077 uint8_t nonce[] = {
2078 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x08,
2079 };
2080 uint8_t associated_data[] = {
2081 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
2082 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2083 };
2084 uint8_t expected_ciphertext[] = {
2085 0x6D, 0xC2, 0x25, 0xA0, 0x71, 0xFC, 0x1B, 0x9F,
2086 0x7C, 0x69, 0xF9, 0x3B, 0x0F, 0x1E, 0x10, 0xDE,
2087 };
2088 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2089 "" /* plaintext */, make_string(expected_ciphertext));
2090}
2091
2092TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector10) {
2093 uint8_t nonce[] = {
2094 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x09,
2095 };
2096 uint8_t plaintext[] = {
2097 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
2098 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2099 };
2100 uint8_t expected_ciphertext[] = {
2101 0x22, 0x1B, 0xD0, 0xDE, 0x7F, 0xA6, 0xFE, 0x99, 0x3E, 0xCC, 0xD7, 0x69, 0x46, 0x0A,
2102 0x0A, 0xF2, 0xD6, 0xCD, 0xED, 0x0C, 0x39, 0x5B, 0x1C, 0x3C, 0xE7, 0x25, 0xF3, 0x24,
2103 0x94, 0xB9, 0xF9, 0x14, 0xD8, 0x5C, 0x0B, 0x1E, 0xB3, 0x83, 0x57, 0xFF,
2104 };
2105 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
2106 make_string(plaintext), make_string(expected_ciphertext));
2107}
2108
2109TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector11) {
2110 uint8_t nonce[] = {
2111 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0A,
2112 };
2113 uint8_t associated_data[] = {
2114 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2115 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2116 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2117 };
2118 uint8_t plaintext[] = {
2119 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2120 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2121 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2122 };
2123 uint8_t expected_ciphertext[] = {
2124 0xBD, 0x6F, 0x6C, 0x49, 0x62, 0x01, 0xC6, 0x92, 0x96, 0xC1, 0x1E, 0xFD,
2125 0x13, 0x8A, 0x46, 0x7A, 0xBD, 0x3C, 0x70, 0x79, 0x24, 0xB9, 0x64, 0xDE,
2126 0xAF, 0xFC, 0x40, 0x31, 0x9A, 0xF5, 0xA4, 0x85, 0x40, 0xFB, 0xBA, 0x18,
2127 0x6C, 0x55, 0x53, 0xC6, 0x8A, 0xD9, 0xF5, 0x92, 0xA7, 0x9A, 0x42, 0x40,
2128 };
2129 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2130 make_string(plaintext), make_string(expected_ciphertext));
2131}
2132
2133TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector12) {
2134 uint8_t nonce[] = {
2135 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0B,
2136 };
2137 uint8_t associated_data[] = {
2138 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2139 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2140 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2141 };
2142 uint8_t plaintext[] = {};
2143 uint8_t expected_ciphertext[] = {
2144 0xFE, 0x80, 0x69, 0x0B, 0xEE, 0x8A, 0x48, 0x5D,
2145 0x11, 0xF3, 0x29, 0x65, 0xBC, 0x9D, 0x2A, 0x32,
2146 };
2147 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2148 "" /* plaintext */, make_string(expected_ciphertext));
2149}
2150
2151TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector13) {
2152 uint8_t nonce[] = {
2153 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0C,
2154 };
2155 uint8_t associated_data[] = {};
2156 uint8_t plaintext[] = {
2157 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2158 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2159 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2160 };
2161 uint8_t expected_ciphertext[] = {
2162 0x29, 0x42, 0xBF, 0xC7, 0x73, 0xBD, 0xA2, 0x3C, 0xAB, 0xC6, 0xAC, 0xFD,
2163 0x9B, 0xFD, 0x58, 0x35, 0xBD, 0x30, 0x0F, 0x09, 0x73, 0x79, 0x2E, 0xF4,
2164 0x60, 0x40, 0xC5, 0x3F, 0x14, 0x32, 0xBC, 0xDF, 0xB5, 0xE1, 0xDD, 0xE3,
2165 0xBC, 0x18, 0xA5, 0xF8, 0x40, 0xB5, 0x2E, 0x65, 0x34, 0x44, 0xD5, 0xDF,
2166 };
2167 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
2168 make_string(plaintext), make_string(expected_ciphertext));
2169}
2170
2171TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector14) {
2172 uint8_t nonce[] = {
2173 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0D,
2174 };
2175 uint8_t associated_data[] = {
2176 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2177 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2178 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2179 };
2180 uint8_t plaintext[] = {
2181 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2182 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2183 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2184 };
2185 uint8_t expected_ciphertext[] = {
2186 0xD5, 0xCA, 0x91, 0x74, 0x84, 0x10, 0xC1, 0x75, 0x1F, 0xF8, 0xA2, 0xF6, 0x18, 0x25,
2187 0x5B, 0x68, 0xA0, 0xA1, 0x2E, 0x09, 0x3F, 0xF4, 0x54, 0x60, 0x6E, 0x59, 0xF9, 0xC1,
2188 0xD0, 0xDD, 0xC5, 0x4B, 0x65, 0xE8, 0x62, 0x8E, 0x56, 0x8B, 0xAD, 0x7A, 0xED, 0x07,
2189 0xBA, 0x06, 0xA4, 0xA6, 0x94, 0x83, 0xA7, 0x03, 0x54, 0x90, 0xC5, 0x76, 0x9E, 0x60,
2190 };
2191 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2192 make_string(plaintext), make_string(expected_ciphertext));
2193}
2194
2195TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector15) {
2196 uint8_t nonce[] = {
2197 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0E,
2198 };
2199 uint8_t associated_data[] = {
2200 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2201 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2202 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2203 };
2204 uint8_t plaintext[] = {};
2205 uint8_t expected_ciphertext[] = {
2206 0xC5, 0xCD, 0x9D, 0x18, 0x50, 0xC1, 0x41, 0xE3,
2207 0x58, 0x64, 0x99, 0x94, 0xEE, 0x70, 0x1B, 0x68,
2208 };
2209 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2210 "" /* plaintext */, make_string(expected_ciphertext));
2211}
2212
2213TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector16) {
2214 uint8_t nonce[] = {
2215 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0F,
2216 };
2217 uint8_t associated_data[] = {};
2218 uint8_t plaintext[] = {
2219 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2220 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2221 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2222 };
2223 uint8_t expected_ciphertext[] = {
2224 0x44, 0x12, 0x92, 0x34, 0x93, 0xC5, 0x7D, 0x5D, 0xE0, 0xD7, 0x00, 0xF7, 0x53, 0xCC,
2225 0xE0, 0xD1, 0xD2, 0xD9, 0x50, 0x60, 0x12, 0x2E, 0x9F, 0x15, 0xA5, 0xDD, 0xBF, 0xC5,
2226 0x78, 0x7E, 0x50, 0xB5, 0xCC, 0x55, 0xEE, 0x50, 0x7B, 0xCB, 0x08, 0x4E, 0x47, 0x9A,
2227 0xD3, 0x63, 0xAC, 0x36, 0x6B, 0x95, 0xA9, 0x8C, 0xA5, 0xF3, 0x00, 0x0B, 0x14, 0x79,
2228 };
2229 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
2230 make_string(plaintext), make_string(expected_ciphertext));
2231}
2232
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002233TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
2234 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).Option(TAG_BLOCK_MODE,
2235 KM_MODE_ECB)));
2236 // Two-block message.
2237 string message = "12345678901234567890123456789012";
2238 string ciphertext1 = EncryptMessage(message);
2239 EXPECT_EQ(message.size(), ciphertext1.size());
2240
2241 string ciphertext2 = EncryptMessage(string(message));
2242 EXPECT_EQ(message.size(), ciphertext2.size());
2243
2244 // ECB is deterministic.
2245 EXPECT_EQ(ciphertext1, ciphertext2);
2246
2247 string plaintext = DecryptMessage(ciphertext1);
2248 EXPECT_EQ(message, plaintext);
2249}
2250
2251TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
2252 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).Option(TAG_BLOCK_MODE,
2253 KM_MODE_ECB)));
2254 // Message is slightly shorter than two blocks.
2255 string message = "1234567890123456789012345678901";
2256
2257 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
2258 string ciphertext;
2259 size_t input_consumed;
2260 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
2261 EXPECT_EQ(message.size(), input_consumed);
2262 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
2263}
2264
2265TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
2266 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
2267 .AesEncryptionKey(128)
2268 .Option(TAG_BLOCK_MODE, KM_MODE_ECB)
2269 .Option(TAG_PADDING, KM_PAD_PKCS7)));
2270
2271 // Try various message lengths; all should work.
2272 for (int i = 0; i < 32; ++i) {
2273 string message(i, 'a');
2274 string ciphertext = EncryptMessage(message);
2275 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
2276 string plaintext = DecryptMessage(ciphertext);
2277 EXPECT_EQ(message, plaintext);
2278 }
2279}
2280
2281TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
2282 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
2283 .AesEncryptionKey(128)
2284 .Option(TAG_BLOCK_MODE, KM_MODE_ECB)
2285 .Option(TAG_PADDING, KM_PAD_PKCS7)));
2286
2287 string message = "a";
2288 string ciphertext = EncryptMessage(message);
2289 EXPECT_EQ(16, ciphertext.size());
2290 EXPECT_NE(ciphertext, message);
2291 ++ciphertext[ciphertext.size() / 2];
2292
2293 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
2294 string plaintext;
2295 size_t input_consumed;
2296 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
2297 EXPECT_EQ(ciphertext.size(), input_consumed);
2298 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
2299}
2300
2301TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
2302 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).Option(TAG_BLOCK_MODE,
2303 KM_MODE_CBC)));
2304 // Two-block message.
2305 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002306 string iv1;
2307 string ciphertext1 = EncryptMessage(message, &iv1);
2308 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002309
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002310 string iv2;
2311 string ciphertext2 = EncryptMessage(message, &iv2);
2312 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002313
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002314 // IVs should be random, so ciphertexts should differ.
2315 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002316 EXPECT_NE(ciphertext1, ciphertext2);
2317
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002318 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002319 EXPECT_EQ(message, plaintext);
2320}
2321
2322TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
2323 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).Option(TAG_BLOCK_MODE,
2324 KM_MODE_CBC)));
2325
2326 int increment = 15;
2327 string message(240, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002328 AuthorizationSet input_params;
2329 AuthorizationSet output_params;
2330 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2331
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002332 string ciphertext;
2333 size_t input_consumed;
2334 for (size_t i = 0; i < message.size(); i += increment)
2335 EXPECT_EQ(KM_ERROR_OK,
2336 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2337 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002338 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002339
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002340 // Move TAG_NONCE into input_params
2341 input_params.Reinitialize(output_params);
2342 output_params.Clear();
2343
2344 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002345 string plaintext;
2346 for (size_t i = 0; i < ciphertext.size(); i += increment)
2347 EXPECT_EQ(KM_ERROR_OK,
2348 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2349 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002350 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002351 EXPECT_EQ(message, plaintext);
2352}
2353
2354TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
2355 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
2356 .AesEncryptionKey(128)
2357 .Option(TAG_BLOCK_MODE, KM_MODE_CBC)
2358 .Option(TAG_PADDING, KM_PAD_PKCS7)));
2359
2360 // Try various message lengths; all should work.
2361 for (int i = 0; i < 32; ++i) {
2362 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002363 string iv;
2364 string ciphertext = EncryptMessage(message, &iv);
2365 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
2366 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002367 EXPECT_EQ(message, plaintext);
2368 }
2369}
2370
Shawn Willdencd695822015-01-26 14:06:32 -07002371typedef KeymasterTest AddEntropyTest;
2372TEST_F(AddEntropyTest, AddEntropy) {
2373 // There's no obvious way to test that entropy is actually added, but we can test that the API
2374 // doesn't blow up or return an error.
2375 EXPECT_EQ(KM_ERROR_OK,
2376 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
2377}
2378
Shawn Willden5fad7852015-01-26 16:10:56 -07002379typedef KeymasterTest RescopingTest;
2380TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
2381 ASSERT_EQ(KM_ERROR_OK,
2382 GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Option(
2383 TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)));
2384 // TODO(swillden): Add a better error code for this.
2385 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, BeginOperation(KM_PURPOSE_ENCRYPT));
2386}
2387
2388TEST_F(RescopingTest, RescopeSymmetric) {
2389 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
2390 .AesEncryptionKey(128)
2391 .OcbMode(4096, 16)
2392 .Option(TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)
2393 .Option(TAG_RESCOPING_DEL, KM_TAG_MAC_LENGTH)));
2394 EXPECT_FALSE(contains(sw_enforced(), TAG_MAC_LENGTH, 15));
2395 EXPECT_TRUE(contains(sw_enforced(), TAG_MAC_LENGTH, 16));
2396
2397 keymaster_key_blob_t rescoped_blob;
2398 keymaster_key_characteristics_t* rescoped_characteristics;
2399 AuthorizationSet new_params =
2400 ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 15 /* note changed */).build();
2401
2402 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
2403 ASSERT_TRUE(rescoped_characteristics != NULL);
2404
2405 EXPECT_EQ(0, rescoped_characteristics->hw_enforced.length);
2406 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
2407 keymaster_free_characteristics(rescoped_characteristics);
2408 free(rescoped_characteristics);
2409 free(const_cast<uint8_t*>(rescoped_blob.key_material));
2410
2411 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
2412 EXPECT_TRUE(contains(auths, TAG_MAC_LENGTH, 15));
2413 EXPECT_FALSE(contains(auths, TAG_MAC_LENGTH, 16));
2414}
2415
2416TEST_F(RescopingTest, RescopeRsa) {
2417 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
2418 .RsaEncryptionKey(256)
2419 .Option(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
2420 .Option(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
2421 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
2422 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
2423 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
2424 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
2425
2426 keymaster_key_blob_t rescoped_blob;
2427 keymaster_key_characteristics_t* rescoped_characteristics;
2428 AuthorizationSet new_params = ParamBuilder().RsaSigningKey(256).build();
2429
2430 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
2431 ASSERT_TRUE(rescoped_characteristics != NULL);
2432
2433 EXPECT_EQ(0, rescoped_characteristics->hw_enforced.length);
2434 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
2435 keymaster_free_characteristics(rescoped_characteristics);
2436 free(rescoped_characteristics);
2437 free(const_cast<uint8_t*>(rescoped_blob.key_material));
2438
2439 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
2440 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
2441 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
2442 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
2443}
2444
2445// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
2446// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
2447// may not be changed.
2448
Shawn Willden128ffe02014-08-06 12:31:33 -06002449} // namespace test
2450} // namespace keymaster