blob: aaf7425b4c890a7bdb9a94aee29886df92ab6e59 [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 Willdendfa1c032015-02-07 00:39:01 -070063inline string make_string(const uint8_t* data, size_t length) {
64 return string(reinterpret_cast<const char*>(data), length);
65}
66
67template <size_t N> string make_string(const uint8_t(&a)[N]) {
68 return make_string(a, N);
69}
70
71static string make_string(const uint8_t(&)[0]) {
72 return string();
73}
74
Shawn Willden567a4a02014-12-31 12:14:46 -070075StdoutLogger logger;
76
Shawn Willdend6cd7e32014-12-17 08:01:26 -070077const uint64_t OP_HANDLE_SENTINEL = 0xFFFFFFFFFFFFFFFF;
Shawn Willden128ffe02014-08-06 12:31:33 -060078class KeymasterTest : public testing::Test {
79 protected:
Shawn Willdendfa1c032015-02-07 00:39:01 -070080 KeymasterTest() : op_handle_(OP_HANDLE_SENTINEL), characteristics_(NULL) {
Shawn Willden5b53c992015-02-02 08:05:25 -070081 blob_.key_material = NULL;
82 RAND_seed("foobar", 6);
Shawn Willdenb15d77e2014-12-17 16:44:29 -070083 blob_.key_material = 0;
Shawn Willden5b53c992015-02-02 08:05:25 -070084 }
Shawn Willdenb15d77e2014-12-17 16:44:29 -070085
Shawn Willden5b53c992015-02-02 08:05:25 -070086 ~KeymasterTest() {
87 FreeCharacteristics();
88 FreeKeyBlob();
Shawn Willdend0772312014-09-18 12:27:57 -060089 }
90
Shawn Willden30255022015-02-24 14:00:21 -070091 keymaster1_device_t* device() {
92 return reinterpret_cast<keymaster1_device_t*>(device_.hw_device());
93 }
Shawn Willden5b53c992015-02-02 08:05:25 -070094
Shawn Willden2c242002015-02-27 07:01:02 -070095 keymaster_error_t GenerateKey(const AuthorizationSetBuilder& builder) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -070096 AuthorizationSet params(builder.build());
97 params.push_back(UserAuthParams());
98 params.push_back(ClientParams());
99
Shawn Willden0d560bf2014-12-15 17:44:02 -0700100 FreeKeyBlob();
101 FreeCharacteristics();
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700102 return device()->generate_key(device(), params.data(), params.size(), &blob_,
103 &characteristics_);
Shawn Willden0d560bf2014-12-15 17:44:02 -0700104 }
105
Shawn Willden2c242002015-02-27 07:01:02 -0700106 keymaster_error_t ImportKey(const AuthorizationSetBuilder& builder,
107 keymaster_key_format_t format, const string& key_material) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700108 AuthorizationSet params(builder.build());
109 params.push_back(UserAuthParams());
110 params.push_back(ClientParams());
111
112 FreeKeyBlob();
113 FreeCharacteristics();
114 return device()->import_key(device(), params.data(), params.size(), format,
115 reinterpret_cast<const uint8_t*>(key_material.c_str()),
116 key_material.length(), &blob_, &characteristics_);
117 }
118
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700119 AuthorizationSet UserAuthParams() {
120 AuthorizationSet set;
121 set.push_back(TAG_USER_ID, 7);
122 set.push_back(TAG_USER_AUTH_ID, 8);
123 set.push_back(TAG_AUTH_TIMEOUT, 300);
124 return set;
125 }
126
127 AuthorizationSet ClientParams() {
128 AuthorizationSet set;
129 set.push_back(TAG_APPLICATION_ID, "app_id", 6);
130 return set;
131 }
132
133 keymaster_error_t BeginOperation(keymaster_purpose_t purpose) {
Shawn Willdendfa1c032015-02-07 00:39:01 -0700134 keymaster_key_param_t* out_params = NULL;
135 size_t out_params_count = 0;
136 keymaster_error_t error =
137 device()->begin(device(), purpose, &blob_, client_params_, array_length(client_params_),
138 &out_params, &out_params_count, &op_handle_);
139 EXPECT_EQ(0, out_params_count);
140 EXPECT_TRUE(out_params == NULL);
141 return error;
142 }
143
144 keymaster_error_t BeginOperation(keymaster_purpose_t purpose, const AuthorizationSet& input_set,
145 AuthorizationSet* output_set = NULL) {
146 AuthorizationSet additional_params(client_params_, array_length(client_params_));
147 additional_params.push_back(input_set);
148
149 keymaster_key_param_t* out_params;
150 size_t out_params_count;
151 keymaster_error_t error =
152 device()->begin(device(), purpose, &blob_, additional_params.data(),
153 additional_params.size(), &out_params, &out_params_count, &op_handle_);
154 if (output_set) {
155 output_set->Reinitialize(out_params, out_params_count);
156 } else {
157 EXPECT_EQ(0, out_params_count);
158 EXPECT_TRUE(out_params == NULL);
159 }
160 keymaster_free_param_values(out_params, out_params_count);
161 free(out_params);
162 return error;
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700163 }
164
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700165 keymaster_error_t UpdateOperation(const string& message, string* output,
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700166 size_t* input_consumed) {
167 uint8_t* out_tmp = NULL;
168 size_t out_length;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700169 EXPECT_NE(op_handle_, OP_HANDLE_SENTINEL);
Shawn Willdendfa1c032015-02-07 00:39:01 -0700170 keymaster_error_t error =
171 device()->update(device(), op_handle_, NULL /* params */, 0 /* params_count */,
172 reinterpret_cast<const uint8_t*>(message.c_str()), message.length(),
173 input_consumed, &out_tmp, &out_length);
174 if (out_tmp)
175 output->append(reinterpret_cast<char*>(out_tmp), out_length);
176 free(out_tmp);
177 return error;
178 }
179
180 keymaster_error_t UpdateOperation(const AuthorizationSet& additional_params,
181 const string& message, string* output,
182 size_t* input_consumed) {
183 uint8_t* out_tmp = NULL;
184 size_t out_length;
185 EXPECT_NE(op_handle_, OP_HANDLE_SENTINEL);
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700186 keymaster_error_t error = device()->update(
Shawn Willdendfa1c032015-02-07 00:39:01 -0700187 device(), op_handle_, additional_params.data(), additional_params.size(),
Shawn Willden6bfbff02015-02-06 19:48:24 -0700188 reinterpret_cast<const uint8_t*>(message.c_str()), message.length(), input_consumed,
189 &out_tmp, &out_length);
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700190 if (out_tmp)
191 output->append(reinterpret_cast<char*>(out_tmp), out_length);
192 free(out_tmp);
193 return error;
194 }
195
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700196 keymaster_error_t FinishOperation(string* output) { return FinishOperation("", output); }
197
198 keymaster_error_t FinishOperation(const string& signature, string* output) {
Shawn Willdendfa1c032015-02-07 00:39:01 -0700199 AuthorizationSet additional_params;
200 return FinishOperation(additional_params, signature, output);
201 }
202
203 keymaster_error_t FinishOperation(const AuthorizationSet& additional_params,
204 const string& signature, string* output) {
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700205 uint8_t* out_tmp = NULL;
206 size_t out_length;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700207 keymaster_error_t error = device()->finish(
Shawn Willdendfa1c032015-02-07 00:39:01 -0700208 device(), op_handle_, additional_params.data(), additional_params.size(),
Shawn Willden6bfbff02015-02-06 19:48:24 -0700209 reinterpret_cast<const uint8_t*>(signature.c_str()), signature.length(), &out_tmp,
210 &out_length);
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700211 if (out_tmp)
212 output->append(reinterpret_cast<char*>(out_tmp), out_length);
213 free(out_tmp);
214 return error;
215 }
216
Shawn Willden76076ab2014-12-18 08:36:35 -0700217 template <typename T>
218 bool ResponseContains(const vector<T>& expected, const T* values, size_t len) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700219 return expected.size() == len &&
220 std::is_permutation(values, values + len, expected.begin());
Shawn Willden76076ab2014-12-18 08:36:35 -0700221 }
222
223 template <typename T> bool ResponseContains(T expected, const T* values, size_t len) {
224 return (len == 1 && *values == expected);
Shawn Willdend0772312014-09-18 12:27:57 -0600225 }
226
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700227 keymaster_error_t AbortOperation() { return device()->abort(device(), op_handle_); }
228
229 string ProcessMessage(keymaster_purpose_t purpose, const string& message) {
Shawn Willdendfa1c032015-02-07 00:39:01 -0700230 AuthorizationSet input_params;
231 EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, input_params, NULL /* output_params */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700232
233 string result;
234 size_t input_consumed;
235 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
236 EXPECT_EQ(message.size(), input_consumed);
237 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&result));
238 return result;
239 }
240
241 string ProcessMessage(keymaster_purpose_t purpose, const string& message,
Shawn Willdendfa1c032015-02-07 00:39:01 -0700242 const AuthorizationSet& begin_params,
243 const AuthorizationSet& update_params,
244 AuthorizationSet* output_params = NULL) {
245 EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, begin_params, output_params));
246
247 string result;
248 size_t input_consumed;
249 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &result, &input_consumed));
250 EXPECT_EQ(message.size(), input_consumed);
251 EXPECT_EQ(KM_ERROR_OK, FinishOperation(update_params, "", &result));
252 return result;
253 }
254
255 string ProcessMessage(keymaster_purpose_t purpose, const string& message,
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700256 const string& signature) {
Shawn Willdendfa1c032015-02-07 00:39:01 -0700257 AuthorizationSet input_params;
258 EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, input_params, NULL /* output_params */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700259
260 string result;
261 size_t input_consumed;
262 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
263 EXPECT_EQ(message.size(), input_consumed);
264 EXPECT_EQ(KM_ERROR_OK, FinishOperation(signature, &result));
265 return result;
266 }
267
268 void SignMessage(const string& message, string* signature) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700269 SCOPED_TRACE("SignMessage");
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700270 *signature = ProcessMessage(KM_PURPOSE_SIGN, message);
271 EXPECT_GT(signature->size(), 0);
272 }
273
274 void VerifyMessage(const string& message, const string& signature) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700275 SCOPED_TRACE("VerifyMessage");
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700276 ProcessMessage(KM_PURPOSE_VERIFY, message, signature);
277 }
278
Shawn Willdendfa1c032015-02-07 00:39:01 -0700279 string EncryptMessage(const string& message, string* generated_nonce = NULL) {
280 AuthorizationSet update_params;
281 return EncryptMessage(update_params, message, generated_nonce);
282 }
283
284 string EncryptMessage(const AuthorizationSet& update_params, const string& message,
285 string* generated_nonce = NULL) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700286 SCOPED_TRACE("EncryptMessage");
Shawn Willdendfa1c032015-02-07 00:39:01 -0700287 AuthorizationSet begin_params, output_params;
288 string ciphertext = ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params,
289 &output_params);
290 if (generated_nonce) {
291 keymaster_blob_t nonce_blob;
292 EXPECT_TRUE(output_params.GetTagValue(TAG_NONCE, &nonce_blob));
293 *generated_nonce = make_string(nonce_blob.data, nonce_blob.data_length);
294 } else {
295 EXPECT_EQ(-1, output_params.find(TAG_NONCE));
296 }
297 return ciphertext;
298 }
299
300 string EncryptMessageWithParams(const string& message, const AuthorizationSet& begin_params,
301 const AuthorizationSet& update_params,
302 AuthorizationSet* output_params) {
303 SCOPED_TRACE("EncryptMessageWithParams");
304 return ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params,
305 output_params);
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700306 }
307
308 string DecryptMessage(const string& ciphertext) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700309 SCOPED_TRACE("DecryptMessage");
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700310 return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext);
311 }
312
Shawn Willdendfa1c032015-02-07 00:39:01 -0700313 string DecryptMessage(const string& ciphertext, const string& nonce) {
314 SCOPED_TRACE("DecryptMessage");
315 AuthorizationSet update_params;
316 return DecryptMessage(update_params, ciphertext, nonce);
317 }
318
319 string DecryptMessage(const AuthorizationSet& update_params, const string& ciphertext,
320 const string& nonce) {
321 SCOPED_TRACE("DecryptMessage");
322 AuthorizationSet begin_params;
323 begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
324 return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
325 }
326
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700327 keymaster_error_t GetCharacteristics() {
328 FreeCharacteristics();
329 return device()->get_key_characteristics(device(), &blob_, &client_id_, NULL /* app_data */,
330 &characteristics_);
331 }
332
333 keymaster_error_t ExportKey(keymaster_key_format_t format, string* export_data) {
334 uint8_t* export_data_tmp;
335 size_t export_data_length;
336
337 keymaster_error_t error =
338 device()->export_key(device(), format, &blob_, &client_id_, NULL /* app_data */,
339 &export_data_tmp, &export_data_length);
340
341 if (error != KM_ERROR_OK)
342 return error;
343
344 *export_data = string(reinterpret_cast<char*>(export_data_tmp), export_data_length);
345 free(export_data_tmp);
346 return error;
347 }
348
349 keymaster_error_t GetVersion(uint8_t* major, uint8_t* minor, uint8_t* subminor) {
350 GetVersionRequest request;
351 GetVersionResponse response;
352 device_.GetVersion(request, &response);
353 if (response.error != KM_ERROR_OK)
354 return response.error;
355 *major = response.major_ver;
356 *minor = response.minor_ver;
357 *subminor = response.subminor_ver;
358 return response.error;
359 }
360
Shawn Willden5fad7852015-01-26 16:10:56 -0700361 keymaster_error_t Rescope(const AuthorizationSet& new_params,
362 keymaster_key_blob_t* rescoped_blob,
363 keymaster_key_characteristics_t** rescoped_characteristics) {
364 return device()->rescope(device(), new_params.data(), new_params.size(), &blob_,
365 &client_id_, NULL /* app data */, rescoped_blob,
366 rescoped_characteristics);
367 }
368
Shawn Willden3b702e22015-02-05 10:26:47 -0700369 void CheckHmacTestVector(string key, string message, keymaster_digest_t digest,
370 string expected_mac) {
Shawn Willden2c242002015-02-27 07:01:02 -0700371 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().HmacKey(key.size() * 8, digest,
372 expected_mac.size()),
373 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -0700374 string signature;
375 SignMessage(message, &signature);
376 EXPECT_EQ(expected_mac, signature) << "Test vector didn't match for digest " << digest;
377 }
378
Shawn Willdendfa1c032015-02-07 00:39:01 -0700379 void CheckAesOcbTestVector(const string& key, const string& nonce,
380 const string& associated_data, const string& message,
381 const string& expected_ciphertext) {
Shawn Willden2c242002015-02-27 07:01:02 -0700382 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
Shawn Willdendfa1c032015-02-07 00:39:01 -0700383 .AesEncryptionKey(key.size() * 8)
384 .OcbMode(4096 /* chunk length */, 16 /* tag length */)
Shawn Willden2c242002015-02-27 07:01:02 -0700385 .Authorization(TAG_CALLER_NONCE),
Shawn Willdendfa1c032015-02-07 00:39:01 -0700386 KM_KEY_FORMAT_RAW, key));
387
388 AuthorizationSet begin_params, update_params, output_params;
389 begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
390 update_params.push_back(TAG_ASSOCIATED_DATA, associated_data.data(),
391 associated_data.size());
392 string ciphertext =
393 EncryptMessageWithParams(message, begin_params, update_params, &output_params);
394 EXPECT_EQ(expected_ciphertext, ciphertext);
395 }
396
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700397 AuthorizationSet hw_enforced() {
398 EXPECT_TRUE(characteristics_ != NULL);
399 return AuthorizationSet(characteristics_->hw_enforced);
400 }
401
402 AuthorizationSet sw_enforced() {
403 EXPECT_TRUE(characteristics_ != NULL);
404 return AuthorizationSet(characteristics_->sw_enforced);
405 }
406
Shawn Willden5b53c992015-02-02 08:05:25 -0700407 void FreeCharacteristics() {
408 keymaster_free_characteristics(characteristics_);
409 free(characteristics_);
410 characteristics_ = NULL;
411 }
412
413 void FreeKeyBlob() {
414 free(const_cast<uint8_t*>(blob_.key_material));
415 blob_.key_material = NULL;
416 }
417
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700418 void corrupt_key_blob() {
419 assert(blob_.key_material);
420 uint8_t* tmp = const_cast<uint8_t*>(blob_.key_material);
421 ++tmp[blob_.key_material_size / 2];
422 }
Shawn Willden5b53c992015-02-02 08:05:25 -0700423
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700424 private:
425 SoftKeymasterDevice device_;
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700426 keymaster_blob_t client_id_ = {.data = reinterpret_cast<const uint8_t*>("app_id"),
427 .data_length = 6};
428 keymaster_key_param_t client_params_[1] = {
429 Authorization(TAG_APPLICATION_ID, client_id_.data, client_id_.data_length)};
430
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700431 uint64_t op_handle_;
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700432
Shawn Willden5b53c992015-02-02 08:05:25 -0700433 keymaster_key_blob_t blob_;
434 keymaster_key_characteristics_t* characteristics_;
Shawn Willden128ffe02014-08-06 12:31:33 -0600435};
436
Shawn Willden128ffe02014-08-06 12:31:33 -0600437typedef KeymasterTest CheckSupported;
438TEST_F(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700439 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
440 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600441
Shawn Willden5b53c992015-02-02 08:05:25 -0700442 size_t len;
443 keymaster_algorithm_t* algorithms;
444 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -0700445 EXPECT_TRUE(ResponseContains(
446 {KM_ALGORITHM_RSA, KM_ALGORITHM_ECDSA, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms,
447 len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700448 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -0600449}
450
451TEST_F(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700452 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
453 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
454 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600455
Shawn Willden5b53c992015-02-02 08:05:25 -0700456 size_t len;
457 keymaster_block_mode_t* modes;
Shawn Willden63ac0432014-12-29 14:07:08 -0700458 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
459 KM_PURPOSE_ENCRYPT, &modes, &len));
460 EXPECT_EQ(0, len);
461 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600462
Shawn Willden76076ab2014-12-18 08:36:35 -0700463 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
Shawn Willden5b53c992015-02-02 08:05:25 -0700464 device()->get_supported_block_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_ENCRYPT,
465 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600466
Shawn Willden63ac0432014-12-29 14:07:08 -0700467 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden5b53c992015-02-02 08:05:25 -0700468 device()->get_supported_block_modes(device(), KM_ALGORITHM_ECDSA, KM_PURPOSE_ENCRYPT,
469 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600470
Shawn Willden63ac0432014-12-29 14:07:08 -0700471 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
472 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willden498e0aa2015-03-04 15:35:45 -0700473 EXPECT_TRUE(ResponseContains({KM_MODE_OCB, KM_MODE_ECB, KM_MODE_CBC}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700474 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600475}
476
477TEST_F(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700478 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
479 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
480 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600481
Shawn Willden5b53c992015-02-02 08:05:25 -0700482 size_t len;
483 keymaster_padding_t* modes;
484 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
485 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700486 EXPECT_TRUE(
487 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700488 free(modes);
489
490 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
491 KM_PURPOSE_ENCRYPT, &modes, &len));
492 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700493 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600494
Shawn Willden76076ab2014-12-18 08:36:35 -0700495 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
496 device()->get_supported_padding_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_SIGN,
497 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600498
Shawn Willden5b53c992015-02-02 08:05:25 -0700499 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_ECDSA,
500 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700501 EXPECT_EQ(0, len);
502 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700503
504 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
505 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
506 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600507}
508
509TEST_F(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700510 EXPECT_EQ(
511 KM_ERROR_OUTPUT_PARAMETER_NULL,
512 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600513
Shawn Willden5b53c992015-02-02 08:05:25 -0700514 size_t len;
515 keymaster_digest_t* digests;
516 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
517 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700518 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700519 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600520
Shawn Willden76076ab2014-12-18 08:36:35 -0700521 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
522 device()->get_supported_digests(device(), KM_ALGORITHM_DSA, KM_PURPOSE_SIGN, &digests,
523 &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600524
Shawn Willden5b53c992015-02-02 08:05:25 -0700525 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_ECDSA,
526 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden84b8da52015-03-11 07:21:32 -0600527 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700528 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600529
Shawn Willden63ac0432014-12-29 14:07:08 -0700530 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
531 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
532 &len));
533
534 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700535 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700536 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
537 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
538 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700539 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600540}
541
542TEST_F(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700543 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
544 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600545
Shawn Willden5b53c992015-02-02 08:05:25 -0700546 size_t len;
547 keymaster_key_format_t* formats;
548 EXPECT_EQ(KM_ERROR_OK,
549 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700550 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700551 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700552
553 EXPECT_EQ(KM_ERROR_OK,
554 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
555 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
556 free(formats);
557
558 EXPECT_EQ(KM_ERROR_OK,
559 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
560 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
561 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600562}
563
564TEST_F(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700565 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
566 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600567
Shawn Willden5b53c992015-02-02 08:05:25 -0700568 size_t len;
569 keymaster_key_format_t* formats;
570 EXPECT_EQ(KM_ERROR_OK,
571 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700572 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700573 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600574
Shawn Willden76076ab2014-12-18 08:36:35 -0700575 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
Shawn Willden5b53c992015-02-02 08:05:25 -0700576 device()->get_supported_export_formats(device(), KM_ALGORITHM_DSA, &formats, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600577
Shawn Willden5b53c992015-02-02 08:05:25 -0700578 EXPECT_EQ(KM_ERROR_OK,
579 device()->get_supported_export_formats(device(), KM_ALGORITHM_ECDSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700580 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700581 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600582
Shawn Willden5b53c992015-02-02 08:05:25 -0700583 EXPECT_EQ(KM_ERROR_OK,
584 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
585 EXPECT_EQ(0, len);
586 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700587
588 EXPECT_EQ(KM_ERROR_OK,
589 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
590 EXPECT_EQ(0, len);
591 free(formats);
592
593 EXPECT_EQ(KM_ERROR_OK,
594 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
595 EXPECT_EQ(0, len);
596 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600597}
598
Shawn Willdend0772312014-09-18 12:27:57 -0600599class NewKeyGeneration : public KeymasterTest {
600 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700601 void CheckBaseParams() {
602 EXPECT_EQ(0U, hw_enforced().size());
603 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600604
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700605 AuthorizationSet auths = sw_enforced();
606 EXPECT_GT(auths.SerializedSize(), 12U);
607
Shawn Willden5b53c992015-02-02 08:05:25 -0700608 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
609 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
610 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
611 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_ID, 8));
612 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600613
614 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700615 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
616 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
617 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600618
619 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700620 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
621 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
622 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600623
624 // Now check that unspecified, defaulted tags are correct.
Shawn Willden5b53c992015-02-02 08:05:25 -0700625 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
626 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600627 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700628};
629
Shawn Willden128ffe02014-08-06 12:31:33 -0600630TEST_F(NewKeyGeneration, Rsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700631 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
632 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700633 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600634
Shawn Willden5b53c992015-02-02 08:05:25 -0700635 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700636 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700637 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
638 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
639 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600640}
641
Shawn Willden6bbe6782014-09-18 11:26:15 -0600642TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700643 ASSERT_EQ(
644 KM_ERROR_OK,
645 GenerateKey(
646 AuthorizationSetBuilder().Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA).SigningKey()));
647
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700648 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600649
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700650 // Check specified tags are all present in unenforced characteristics
651 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600652
653 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700654 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537));
655 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 2048));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600656}
657
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600658TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600659 ASSERT_EQ(KM_ERROR_OK,
660 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700661 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600662
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700663 // Check specified tags are all present in unenforced characteristics
664 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
665 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600666}
667
Shawn Willden6bbe6782014-09-18 11:26:15 -0600668TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600669 ASSERT_EQ(KM_ERROR_OK,
670 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700671 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600672
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700673 // Check specified tags are all present in unenforced characteristics
674 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600675
676 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700677 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600678}
679
680TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700681 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden84b8da52015-03-11 07:21:32 -0600682 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190, KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600683}
684
685TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600686 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600687 for (size_t size : valid_sizes) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600688 EXPECT_EQ(KM_ERROR_OK,
689 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size, KM_DIGEST_NONE)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700690 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600691 }
692}
693
Shawn Willden19fca882015-01-22 16:35:30 -0700694TEST_F(NewKeyGeneration, AesOcb) {
Shawn Willden2c242002015-02-27 07:01:02 -0700695 ASSERT_EQ(KM_ERROR_OK,
696 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700697}
698
699TEST_F(NewKeyGeneration, AesOcbInvalidKeySize) {
Shawn Willden7dad93b2015-02-05 10:20:47 -0700700 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden2c242002015-02-27 07:01:02 -0700701 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(136).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700702}
703
704TEST_F(NewKeyGeneration, AesOcbAllValidSizes) {
Shawn Willden19fca882015-01-22 16:35:30 -0700705 size_t valid_sizes[] = {128, 192, 256};
706 for (size_t size : valid_sizes) {
Shawn Willden2c242002015-02-27 07:01:02 -0700707 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(size)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700708 << "Failed to generate size: " << size;
Shawn Willden19fca882015-01-22 16:35:30 -0700709 }
710}
711
Shawn Willden0d560bf2014-12-15 17:44:02 -0700712TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700713 ASSERT_EQ(KM_ERROR_OK,
714 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700715}
716
Shawn Willden76364712014-08-11 17:48:04 -0600717typedef KeymasterTest GetKeyCharacteristics;
718TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700719 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
720 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700721 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600722
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700723 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
724 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600725}
726
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700727typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600728TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700729 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
730 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700731 string message = "12345678901234567890123456789012";
732 string signature;
733 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600734}
735
Shawn Willden61902362014-12-18 10:33:24 -0700736TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
737 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700738 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
739 256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700740 string message(1024, 'a');
741 string signature;
742 SignMessage(message, &signature);
743}
744
745TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700746 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
747 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700748 // Use large message, which won't work without digesting.
749 string message(1024, 'a');
750 string signature;
751 SignMessage(message, &signature);
752}
753
Shawn Willdenf90f2352014-12-18 23:01:15 -0700754TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700755 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
756 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700757 string message(1024, 'a');
758 string signature;
759 SignMessage(message, &signature);
760}
761
762TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
763 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
764 // that 9 bytes larger than hash won't work.
Shawn Willden2c242002015-02-27 07:01:02 -0700765 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
766 256 + 9 * 8, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700767 string message(1024, 'a');
768 string signature;
769
770 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
771
772 string result;
773 size_t input_consumed;
774 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
775 EXPECT_EQ(message.size(), input_consumed);
776 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
777}
778
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600779TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600780 ASSERT_EQ(KM_ERROR_OK,
781 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700782 string message = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700783 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700784 SignMessage(message, &signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600785}
786
Shawn Willden1615f2e2014-08-13 10:37:40 -0600787TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -0700788 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
789 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdendfa1c032015-02-07 00:39:01 -0700790 AuthorizationSet input_params, output_params;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700791 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
792 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
793 // Another abort should fail
794 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600795}
796
797TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willden2c242002015-02-27 07:01:02 -0700798 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_MD5,
799 KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700800 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600801}
802
803TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -0700804 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
805 256, 3, KM_DIGEST_SHA_2_256 /* supported digest */, KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700806 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600807}
808
809TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700810 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700811 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700812 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700813 // PSS requires a digest.
Shawn Willden2c242002015-02-27 07:01:02 -0700814 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_NONE, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700815 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600816}
817
818TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700819 // Padding must be specified
Shawn Willden2c242002015-02-27 07:01:02 -0700820 ASSERT_EQ(KM_ERROR_OK,
821 GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Authorization(
822 TAG_DIGEST, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700823 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600824}
825
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700826TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700827 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 20));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700828 string message = "12345678901234567890123456789012";
829 string signature;
830 SignMessage(message, &signature);
831 ASSERT_EQ(20, signature.size());
832}
833
Shawn Willden62c22862014-12-17 08:36:20 -0700834TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700835 ASSERT_EQ(KM_ERROR_OK,
836 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 28)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700837 string message = "12345678901234567890123456789012";
838 string signature;
839 SignMessage(message, &signature);
840 ASSERT_EQ(28, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700841}
842
Shawn Willden0d560bf2014-12-15 17:44:02 -0700843TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700844 ASSERT_EQ(KM_ERROR_OK,
845 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700846 string message = "12345678901234567890123456789012";
847 string signature;
848 SignMessage(message, &signature);
849 ASSERT_EQ(32, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700850}
851
Shawn Willden62c22862014-12-17 08:36:20 -0700852TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700853 ASSERT_EQ(KM_ERROR_OK,
854 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 48)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700855 string message = "12345678901234567890123456789012";
856 string signature;
857 SignMessage(message, &signature);
858 ASSERT_EQ(48, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700859}
860
861TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700862 ASSERT_EQ(KM_ERROR_OK,
863 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 64)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700864 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700865 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700866 SignMessage(message, &signature);
867 ASSERT_EQ(64, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700868}
869
Shawn Willden3b702e22015-02-05 10:26:47 -0700870TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
871 uint8_t key_data[] = {
872 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
873 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
874 };
875 string message = "Hi There";
876 uint8_t sha_224_expected[] = {
877 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
878 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
879 };
880 uint8_t sha_256_expected[] = {
881 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
882 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
883 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
884 };
885 uint8_t sha_384_expected[] = {
886 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
887 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
888 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
889 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
890 };
891 uint8_t sha_512_expected[] = {
892 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
893 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
894 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
895 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
896 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
897 };
898
899 string key = make_string(key_data);
900
901 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
902 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
903 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
904 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
905}
906
907TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
908 string key = "Jefe";
909 string message = "what do ya want for nothing?";
910 uint8_t sha_224_expected[] = {
911 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
912 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
913 };
914 uint8_t sha_256_expected[] = {
915 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
916 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
917 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
918 };
919 uint8_t sha_384_expected[] = {
920 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
921 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
922 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
923 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
924 };
925 uint8_t sha_512_expected[] = {
926 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
927 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
928 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
929 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
930 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
931 };
932
933 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
934 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
935 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
936 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
937}
938
939TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
940 string key(20, 0xaa);
941 string message(50, 0xdd);
942 uint8_t sha_224_expected[] = {
943 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
944 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
945 };
946 uint8_t sha_256_expected[] = {
947 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
948 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
949 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
950 };
951 uint8_t sha_384_expected[] = {
952 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
953 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
954 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
955 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
956 };
957 uint8_t sha_512_expected[] = {
958 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
959 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
960 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
961 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
962 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
963 };
964
965 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
966 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
967 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
968 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
969}
970
971TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
972 uint8_t key_data[25] = {
973 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
974 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
975 };
976 string key = make_string(key_data);
977 string message(50, 0xcd);
978 uint8_t sha_224_expected[] = {
979 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
980 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
981 };
982 uint8_t sha_256_expected[] = {
983 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
984 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
985 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
986 };
987 uint8_t sha_384_expected[] = {
988 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
989 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
990 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
991 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
992 };
993 uint8_t sha_512_expected[] = {
994 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
995 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
996 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
997 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
998 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
999 };
1000
1001 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1002 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1003 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1004 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1005}
1006
1007TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
1008 string key(20, 0x0c);
1009 string message = "Test With Truncation";
1010
1011 uint8_t sha_224_expected[] = {
1012 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
1013 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
1014 };
1015 uint8_t sha_256_expected[] = {
1016 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
1017 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
1018 };
1019 uint8_t sha_384_expected[] = {
1020 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
1021 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
1022 };
1023 uint8_t sha_512_expected[] = {
1024 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
1025 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
1026 };
1027
1028 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1029 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1030 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1031 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1032}
1033
1034TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
1035 string key(131, 0xaa);
1036 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
1037
1038 uint8_t sha_224_expected[] = {
1039 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
1040 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
1041 };
1042 uint8_t sha_256_expected[] = {
1043 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
1044 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
1045 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
1046 };
1047 uint8_t sha_384_expected[] = {
1048 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
1049 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
1050 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
1051 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
1052 };
1053 uint8_t sha_512_expected[] = {
1054 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
1055 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
1056 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
1057 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
1058 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
1059 };
1060
1061 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1062 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1063 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1064 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1065}
1066
1067TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
1068 string key(131, 0xaa);
1069 string message = "This is a test using a larger than block-size key and a larger than "
1070 "block-size data. The key needs to be hashed before being used by the HMAC "
1071 "algorithm.";
1072
1073 uint8_t sha_224_expected[] = {
1074 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
1075 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
1076 };
1077 uint8_t sha_256_expected[] = {
1078 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
1079 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
1080 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
1081 };
1082 uint8_t sha_384_expected[] = {
1083 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
1084 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
1085 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
1086 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
1087 };
1088 uint8_t sha_512_expected[] = {
1089 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
1090 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
1091 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
1092 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
1093 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
1094 };
1095
1096 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1097 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1098 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1099 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1100}
Shawn Willden0d560bf2014-12-15 17:44:02 -07001101
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001102TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001103 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1104 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
1105 .Authorization(TAG_KEY_SIZE, 128)
Shawn Willdenc24c1102014-12-22 15:30:09 -07001106 .SigningKey()
Shawn Willden2c242002015-02-27 07:01:02 -07001107 .Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001108 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -07001109}
1110
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001111TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001112 ASSERT_EQ(KM_ERROR_OK,
1113 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 33)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001114 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -07001115}
1116
Shawn Willden1615f2e2014-08-13 10:37:40 -06001117TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willden2c242002015-02-27 07:01:02 -07001118 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1119 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001120 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001121
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001122 string message = "1234567890123456789012345678901";
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001123 string result;
1124 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001125 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001126 EXPECT_EQ(0U, result.size());
1127 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -06001128
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001129 string signature;
1130 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
1131 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -06001132}
1133
Shawn Willden61902362014-12-18 10:33:24 -07001134// TODO(swillden): Add more verification failure tests.
1135
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001136typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -06001137TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001138 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1139 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001140 string message = "12345678901234567890123456789012";
1141 string signature;
1142 SignMessage(message, &signature);
1143 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -06001144}
1145
Shawn Willden61902362014-12-18 10:33:24 -07001146TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
1147 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -07001148 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -07001149 string message(1024, 'a');
1150 string signature;
1151 SignMessage(message, &signature);
1152 VerifyMessage(message, signature);
1153}
1154
Shawn Willdenf90f2352014-12-18 23:01:15 -07001155TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -07001156 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -07001157 string message(1024, 'a');
1158 string signature;
1159 SignMessage(message, &signature);
1160 ++signature[signature.size() / 2];
1161
1162 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1163
1164 string result;
1165 size_t input_consumed;
1166 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1167 EXPECT_EQ(message.size(), input_consumed);
1168 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1169}
1170
Shawn Willdenf90f2352014-12-18 23:01:15 -07001171TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001172 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1173 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001174 // Use large message, which won't work without digesting.
1175 string message(1024, 'a');
1176 string signature;
1177 SignMessage(message, &signature);
1178 VerifyMessage(message, signature);
1179}
1180
1181TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -07001182 GenerateKey(
1183 AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001184 string message(1024, 'a');
1185 string signature;
1186 SignMessage(message, &signature);
1187 ++signature[signature.size() / 2];
1188
1189 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1190
1191 string result;
1192 size_t input_consumed;
1193 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1194 EXPECT_EQ(message.size(), input_consumed);
1195 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1196}
1197
1198TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -07001199 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1200 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001201 // Use large message, which won't work without digesting.
1202 string message(1024, 'a');
1203 string signature;
1204 SignMessage(message, &signature);
1205 ++message[message.size() / 2];
1206
1207 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1208
1209 string result;
1210 size_t input_consumed;
1211 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1212 EXPECT_EQ(message.size(), input_consumed);
1213 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1214}
1215
Shawn Willdenf90f2352014-12-18 23:01:15 -07001216TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001217 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
1218 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001219 string message(1024, 'a');
1220 string signature;
1221 SignMessage(message, &signature);
1222 VerifyMessage(message, signature);
1223}
1224
1225TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -07001226 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
1227 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001228 string message(1024, 'a');
1229 string signature;
1230 SignMessage(message, &signature);
1231 ++signature[signature.size() / 2];
1232
1233 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1234
1235 string result;
1236 size_t input_consumed;
1237 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1238 EXPECT_EQ(message.size(), input_consumed);
1239 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1240}
1241
1242TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -07001243 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1244 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001245 // Use large message, which won't work without digesting.
1246 string message(1024, 'a');
1247 string signature;
1248 SignMessage(message, &signature);
1249 ++message[message.size() / 2];
1250
1251 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1252
1253 string result;
1254 size_t input_consumed;
1255 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1256 EXPECT_EQ(message.size(), input_consumed);
1257 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1258}
1259
1260template <typename T> vector<T> make_vector(const T* array, size_t len) {
1261 return vector<T>(array, array + len);
1262}
1263
1264TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
1265 // Get all supported digests and padding modes.
1266 size_t digests_len;
1267 keymaster_digest_t* digests;
1268 EXPECT_EQ(KM_ERROR_OK,
1269 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1270 &digests_len));
1271
1272 size_t padding_modes_len;
1273 keymaster_padding_t* padding_modes;
1274 EXPECT_EQ(KM_ERROR_OK,
1275 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1276 &padding_modes, &padding_modes_len));
1277
1278 // Try them.
1279 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1280 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
1281 // Compute key & message size that will work.
1282 size_t key_bits = 256;
1283 size_t message_len = 1000;
1284 switch (digest) {
1285 case KM_DIGEST_NONE:
1286 switch (padding_mode) {
1287 case KM_PAD_NONE:
1288 // Match key size.
1289 message_len = key_bits / 8;
1290 break;
1291 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1292 message_len = key_bits / 8 - 11;
1293 break;
1294 case KM_PAD_RSA_PSS:
1295 // PSS requires a digest.
1296 continue;
1297 default:
1298 FAIL() << "Missing padding";
1299 break;
1300 }
1301 break;
1302
1303 case KM_DIGEST_SHA_2_256:
1304 switch (padding_mode) {
1305 case KM_PAD_NONE:
1306 // Key size matches digest size
1307 break;
1308 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1309 key_bits += 8 * 11;
1310 break;
1311 case KM_PAD_RSA_PSS:
1312 key_bits += 8 * 10;
1313 break;
1314 default:
1315 FAIL() << "Missing padding";
1316 break;
1317 }
1318 break;
1319 default:
1320 FAIL() << "Missing digest";
1321 }
1322
Shawn Willden2c242002015-02-27 07:01:02 -07001323 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(key_bits, 3, digest, padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001324 string message(message_len, 'a');
1325 string signature;
1326 SignMessage(message, &signature);
1327 VerifyMessage(message, signature);
1328 }
1329 }
1330
1331 free(padding_modes);
1332 free(digests);
1333}
1334
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001335TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001336 ASSERT_EQ(KM_ERROR_OK,
1337 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001338 string message = "123456789012345678901234567890123456789012345678";
1339 string signature;
1340 SignMessage(message, &signature);
1341 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001342}
1343
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001344TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001345 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001346 string message = "123456789012345678901234567890123456789012345678";
1347 string signature;
1348 SignMessage(message, &signature);
1349 VerifyMessage(message, signature);
1350}
1351
1352TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001353 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001354 string message = "123456789012345678901234567890123456789012345678";
1355 string signature;
1356 SignMessage(message, &signature);
1357 VerifyMessage(message, signature);
1358}
1359
Shawn Willden0d560bf2014-12-15 17:44:02 -07001360TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001361 ASSERT_EQ(KM_ERROR_OK,
1362 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001363 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001364 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001365 SignMessage(message, &signature);
1366 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001367}
1368
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001369TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001370 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001371 string message = "123456789012345678901234567890123456789012345678";
1372 string signature;
1373 SignMessage(message, &signature);
1374 VerifyMessage(message, signature);
1375}
1376
1377TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001378 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001379 string message = "123456789012345678901234567890123456789012345678";
1380 string signature;
1381 SignMessage(message, &signature);
1382 VerifyMessage(message, signature);
1383}
1384
Shawn Willden5b53c992015-02-02 08:05:25 -07001385typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001386TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001387 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1388 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001389 string export_data;
1390 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1391 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001392
1393 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001394}
1395
Shawn Willdenf268d742014-08-19 15:36:26 -06001396TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001397 ASSERT_EQ(KM_ERROR_OK,
1398 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001399 string export_data;
1400 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1401 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001402
1403 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001404}
1405
1406TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willden2c242002015-02-27 07:01:02 -07001407 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1408 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001409 string export_data;
1410 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001411}
1412
1413TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willden2c242002015-02-27 07:01:02 -07001414 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1415 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001416 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001417 string export_data;
1418 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001419}
1420
Shawn Willden7dad93b2015-02-05 10:20:47 -07001421TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001422 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001423 string export_data;
1424
1425 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1426 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1427 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1428}
1429
Shawn Willden437fbd12014-08-20 11:59:49 -06001430static string read_file(const string& file_name) {
1431 ifstream file_stream(file_name, std::ios::binary);
1432 istreambuf_iterator<char> file_begin(file_stream);
1433 istreambuf_iterator<char> file_end;
1434 return string(file_begin, file_end);
1435}
1436
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001437typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001438TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001439 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001440 ASSERT_EQ(633U, pk8_key.size());
1441
Shawn Willden2c242002015-02-27 07:01:02 -07001442 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().RsaSigningKey(
1443 1024, 65537, KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001444 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001445
1446 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001447 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1448 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1449 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001450
1451 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001452 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1453 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001454
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001455 string message(1024 / 8, 'a');
1456 string signature;
1457 SignMessage(message, &signature);
1458 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001459}
1460
Shawn Willden6bbe6782014-09-18 11:26:15 -06001461TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001462 string pk8_key = read_file("rsa_privkey_pk8.der");
1463 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001464 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001465 ImportKey(AuthorizationSetBuilder().RsaSigningKey(2048 /* Doesn't match key */, 3,
1466 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001467 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001468}
1469
1470TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001471 string pk8_key = read_file("rsa_privkey_pk8.der");
1472 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001473 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001474 ImportKey(AuthorizationSetBuilder().RsaSigningKey(256, 3 /* Doesnt' match key */,
1475 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001476 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001477}
1478
Shawn Willden81effc62014-08-27 10:08:46 -06001479TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001480 string pk8_key = read_file("ec_privkey_pk8.der");
1481 ASSERT_EQ(138U, pk8_key.size());
1482
Shawn Willden84b8da52015-03-11 07:21:32 -06001483 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001484 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001485
1486 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001487 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1488 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001489
1490 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001491 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1492 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001493
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001494 string message(1024 / 8, 'a');
1495 string signature;
1496 SignMessage(message, &signature);
1497 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001498}
1499
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001500TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1501 string pk8_key = read_file("ec_privkey_pk8.der");
1502 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001503
Shawn Willden84b8da52015-03-11 07:21:32 -06001504 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001505 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001506
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001507 // Check values derived from the key.
1508 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1509 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1510
1511 // And values provided by GoogleKeymaster
1512 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1513 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1514
1515 string message(1024 / 8, 'a');
1516 string signature;
1517 SignMessage(message, &signature);
1518 VerifyMessage(message, signature);
1519}
1520
1521TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1522 string pk8_key = read_file("ec_privkey_pk8.der");
1523 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001524 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden84b8da52015-03-11 07:21:32 -06001525 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(
1526 224, KM_DIGEST_NONE), // Size does not match key
1527 KM_KEY_FORMAT_PKCS8,
1528 pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001529}
1530
Shawn Willden3b702e22015-02-05 10:26:47 -07001531TEST_F(ImportKeyTest, AesKeySuccess) {
1532 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1533 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001534 ASSERT_EQ(KM_ERROR_OK,
1535 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16),
1536 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001537
1538 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1539 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1540
1541 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001542 string nonce;
1543 string ciphertext = EncryptMessage(message, &nonce);
1544 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden3b702e22015-02-05 10:26:47 -07001545 EXPECT_EQ(message, plaintext);
1546}
1547
1548TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1549 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1550 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001551 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().HmacKey(sizeof(key_data) * 8,
1552 KM_DIGEST_SHA_2_256, 32),
1553 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001554
1555 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1556 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1557
1558 string message = "Hello World!";
1559 string signature;
1560 SignMessage(message, &signature);
1561 VerifyMessage(message, signature);
1562}
1563
Shawn Willden2665e862014-11-24 14:46:21 -07001564typedef KeymasterTest VersionTest;
1565TEST_F(VersionTest, GetVersion) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001566 uint8_t major, minor, subminor;
1567 ASSERT_EQ(KM_ERROR_OK, GetVersion(&major, &minor, &subminor));
1568 EXPECT_EQ(1, major);
1569 EXPECT_EQ(0, minor);
1570 EXPECT_EQ(0, subminor);
Shawn Willden2665e862014-11-24 14:46:21 -07001571}
1572
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001573typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001574TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001575 ASSERT_EQ(KM_ERROR_OK,
1576 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001577
1578 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001579 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001580 EXPECT_EQ(512 / 8, ciphertext1.size());
1581
Shawn Willden6dde87c2014-12-11 14:08:48 -07001582 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001583 EXPECT_EQ(512 / 8, ciphertext2.size());
1584
1585 // OAEP randomizes padding so every result should be different.
1586 EXPECT_NE(ciphertext1, ciphertext2);
1587}
1588
1589TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001590 ASSERT_EQ(KM_ERROR_OK,
1591 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001592 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001593 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001594 EXPECT_EQ(512 / 8, ciphertext.size());
1595
Shawn Willden6dde87c2014-12-11 14:08:48 -07001596 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001597 EXPECT_EQ(message, plaintext);
1598}
1599
1600TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willden2c242002015-02-27 07:01:02 -07001601 ASSERT_EQ(KM_ERROR_OK,
1602 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001603 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001604 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001605 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001606
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001607 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1608 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001609 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001610 EXPECT_EQ(0, result.size());
1611}
1612
1613TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001614 ASSERT_EQ(KM_ERROR_OK,
1615 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001616 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001617 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001618 EXPECT_EQ(512 / 8, ciphertext.size());
1619
1620 // Corrupt the ciphertext
1621 ciphertext[512 / 8 / 2]++;
1622
Shawn Willden4200f212014-12-02 07:01:21 -07001623 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001624 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001625 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1626 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001627 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001628 EXPECT_EQ(0, result.size());
1629}
1630
1631TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001632 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1633 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001634 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001635 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001636 EXPECT_EQ(512 / 8, ciphertext1.size());
1637
Shawn Willden6dde87c2014-12-11 14:08:48 -07001638 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001639 EXPECT_EQ(512 / 8, ciphertext2.size());
1640
1641 // PKCS1 v1.5 randomizes padding so every result should be different.
1642 EXPECT_NE(ciphertext1, ciphertext2);
1643}
1644
1645TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001646 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1647 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001648 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001649 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001650 EXPECT_EQ(512 / 8, ciphertext.size());
1651
Shawn Willden6dde87c2014-12-11 14:08:48 -07001652 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001653 EXPECT_EQ(message, plaintext);
1654}
1655
1656TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willden2c242002015-02-27 07:01:02 -07001657 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1658 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001659 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001660 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001661 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001662
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001663 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1664 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001665 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001666 EXPECT_EQ(0, result.size());
1667}
1668
1669TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001670 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1671 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001672 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001673 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001674 EXPECT_EQ(512 / 8, ciphertext.size());
1675
1676 // Corrupt the ciphertext
1677 ciphertext[512 / 8 / 2]++;
1678
Shawn Willden4200f212014-12-02 07:01:21 -07001679 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001680 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001681 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1682 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001683 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001684 EXPECT_EQ(0, result.size());
1685}
1686
Shawn Willden907c3012014-12-08 15:51:55 -07001687TEST_F(EncryptionOperationsTest, AesOcbSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001688 ASSERT_EQ(KM_ERROR_OK,
1689 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001690 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001691 string nonce1;
1692 string ciphertext1 = EncryptMessage(message, &nonce1);
1693 EXPECT_EQ(12, nonce1.size());
1694 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext1.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001695
Shawn Willdendfa1c032015-02-07 00:39:01 -07001696 string nonce2;
1697 string ciphertext2 = EncryptMessage(message, &nonce2);
1698 EXPECT_EQ(12, nonce2.size());
1699 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext2.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001700
Shawn Willdendfa1c032015-02-07 00:39:01 -07001701 // Nonces should be random
1702 EXPECT_NE(nonce1, nonce2);
1703
1704 // Therefore ciphertexts are different
Shawn Willden907c3012014-12-08 15:51:55 -07001705 EXPECT_NE(ciphertext1, ciphertext2);
1706}
1707
Shawn Willden6dde87c2014-12-11 14:08:48 -07001708TEST_F(EncryptionOperationsTest, AesOcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001709 ASSERT_EQ(KM_ERROR_OK,
1710 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001711 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001712 string nonce;
1713 string ciphertext = EncryptMessage(message, &nonce);
1714 EXPECT_EQ(12, nonce.size());
1715 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001716
Shawn Willdendfa1c032015-02-07 00:39:01 -07001717 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001718 EXPECT_EQ(message, plaintext);
1719}
1720
1721TEST_F(EncryptionOperationsTest, AesOcbRoundTripCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001722 ASSERT_EQ(KM_ERROR_OK,
1723 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001724 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001725 string nonce;
1726 string ciphertext = EncryptMessage(message, &nonce);
1727 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001728
1729 ciphertext[ciphertext.size() / 2]++;
1730
Shawn Willdendfa1c032015-02-07 00:39:01 -07001731 AuthorizationSet input_set, output_set;
1732 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1733 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set, &output_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001734
1735 string result;
1736 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001737 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001738 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001739 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001740}
1741
1742TEST_F(EncryptionOperationsTest, AesDecryptGarbage) {
Shawn Willden2c242002015-02-27 07:01:02 -07001743 ASSERT_EQ(KM_ERROR_OK,
1744 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001745 string ciphertext(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001746 AuthorizationSet input_params;
1747 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaa", 12);
1748 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001749
1750 string result;
1751 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001752 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001753 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001754 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001755}
1756
Shawn Willdendfa1c032015-02-07 00:39:01 -07001757TEST_F(EncryptionOperationsTest, AesDecryptTooShortNonce) {
Shawn Willden2c242002015-02-27 07:01:02 -07001758 ASSERT_EQ(KM_ERROR_OK,
1759 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001760
Shawn Willdendfa1c032015-02-07 00:39:01 -07001761 // Try decrypting garbage ciphertext with too-short nonce
1762 string ciphertext(15, 'a');
1763 AuthorizationSet input_params;
1764 input_params.push_back(TAG_NONCE, "aaaaaaaaaaa", 11);
1765 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001766}
1767
1768TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptySuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001769 ASSERT_EQ(KM_ERROR_OK,
1770 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001771 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001772 string nonce;
1773 string ciphertext = EncryptMessage(message, &nonce);
1774 EXPECT_EQ(12, nonce.size());
1775 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001776
Shawn Willdendfa1c032015-02-07 00:39:01 -07001777 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001778 EXPECT_EQ(message, plaintext);
1779}
1780
1781TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptyCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001782 ASSERT_EQ(KM_ERROR_OK,
1783 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001784 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001785 string nonce;
1786 string ciphertext = EncryptMessage(message, &nonce);
1787 EXPECT_EQ(12, nonce.size());
1788 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001789
1790 ciphertext[ciphertext.size() / 2]++;
1791
Shawn Willdendfa1c032015-02-07 00:39:01 -07001792 AuthorizationSet input_set;
1793 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1794 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001795
1796 string result;
1797 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001798 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001799 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001800 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001801}
1802
1803TEST_F(EncryptionOperationsTest, AesOcbFullChunk) {
Shawn Willden2c242002015-02-27 07:01:02 -07001804 ASSERT_EQ(KM_ERROR_OK,
1805 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001806 string message(4096, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001807 string nonce;
1808 string ciphertext = EncryptMessage(message, &nonce);
1809 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001810
Shawn Willdendfa1c032015-02-07 00:39:01 -07001811 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001812 EXPECT_EQ(message, plaintext);
1813}
1814
1815TEST_F(EncryptionOperationsTest, AesOcbVariousChunkLengths) {
1816 for (unsigned chunk_length = 1; chunk_length <= 128; ++chunk_length) {
Shawn Willden2c242002015-02-27 07:01:02 -07001817 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(
1818 chunk_length, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001819 string message(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001820 string nonce;
1821 string ciphertext = EncryptMessage(message, &nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001822 int expected_tag_count = (message.length() + chunk_length - 1) / chunk_length;
Shawn Willdendfa1c032015-02-07 00:39:01 -07001823 EXPECT_EQ(message.length() + 16 * expected_tag_count, ciphertext.size())
Shawn Willden6dde87c2014-12-11 14:08:48 -07001824 << "Unexpected ciphertext size for chunk length " << chunk_length
1825 << " expected tag count was " << expected_tag_count
1826 << " but actual tag count was probably "
1827 << (ciphertext.size() - message.length() - 12) / 16;
1828
Shawn Willdendfa1c032015-02-07 00:39:01 -07001829 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001830 EXPECT_EQ(message, plaintext);
1831 }
1832}
1833
1834TEST_F(EncryptionOperationsTest, AesOcbAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -07001835 ASSERT_EQ(KM_ERROR_OK,
1836 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001837 string message = "Hello";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001838
Shawn Willdendfa1c032015-02-07 00:39:01 -07001839 AuthorizationSet input_set, output_set;
1840 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_set, &output_set));
1841 EXPECT_EQ(1, output_set.size());
1842 EXPECT_EQ(0, output_set.find(TAG_NONCE));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001843
1844 string result;
1845 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001846 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1847 EXPECT_EQ(message.length(), input_consumed);
1848 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001849}
1850
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001851TEST_F(EncryptionOperationsTest, AesOcbNoChunkLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001852 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenc24c1102014-12-22 15:30:09 -07001853 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001854 .Authorization(TAG_BLOCK_MODE, KM_MODE_OCB)
1855 .Authorization(TAG_MAC_LENGTH, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001856 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001857}
1858
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001859TEST_F(EncryptionOperationsTest, AesOcbPaddingUnsupported) {
Shawn Willden2c242002015-02-27 07:01:02 -07001860 ASSERT_EQ(
1861 KM_ERROR_OK,
1862 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Authorization(
1863 TAG_PADDING, KM_PAD_ZERO)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001864 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001865}
1866
1867TEST_F(EncryptionOperationsTest, AesOcbInvalidMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001868 ASSERT_EQ(KM_ERROR_OK,
1869 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 17)));
Shawn Willden63ac0432014-12-29 14:07:08 -07001870 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001871}
1872
Shawn Willdendfa1c032015-02-07 00:39:01 -07001873uint8_t rfc_7523_test_key_data[] = {
1874 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1875};
1876string rfc_7523_test_key = make_string(rfc_7523_test_key_data);
1877
1878TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector1) {
1879 uint8_t nonce[] = {
1880 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
1881 };
1882 uint8_t expected_ciphertext[] = {
1883 0x78, 0x54, 0x07, 0xBF, 0xFF, 0xC8, 0xAD, 0x9E,
1884 0xDC, 0xC5, 0x52, 0x0A, 0xC9, 0x11, 0x1E, 0xE6,
1885 };
1886 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1887 "" /* plaintext */, make_string(expected_ciphertext));
1888}
1889
1890TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector2) {
1891 uint8_t nonce[] = {
1892 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x01,
1893 };
1894 uint8_t associated_data[] = {
1895 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1896 };
1897 uint8_t plaintext[] = {
1898 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1899 };
1900 uint8_t expected_ciphertext[] = {
1901 0x68, 0x20, 0xB3, 0x65, 0x7B, 0x6F, 0x61, 0x5A, 0x57, 0x25, 0xBD, 0xA0,
1902 0xD3, 0xB4, 0xEB, 0x3A, 0x25, 0x7C, 0x9A, 0xF1, 0xF8, 0xF0, 0x30, 0x09,
1903 };
1904 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1905 make_string(plaintext), make_string(expected_ciphertext));
1906}
1907
1908TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector3) {
1909 uint8_t nonce[] = {
1910 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x02,
1911 };
1912 uint8_t associated_data[] = {
1913 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1914 };
1915 uint8_t expected_ciphertext[] = {
1916 0x81, 0x01, 0x7F, 0x82, 0x03, 0xF0, 0x81, 0x27,
1917 0x71, 0x52, 0xFA, 0xDE, 0x69, 0x4A, 0x0A, 0x00,
1918 };
1919 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1920 "" /* plaintext */, make_string(expected_ciphertext));
1921}
1922
1923TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector4) {
1924 uint8_t nonce[] = {
1925 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x03,
1926 };
1927 uint8_t plaintext[] = {
1928 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1929 };
1930 uint8_t expected_ciphertext[] = {
1931 0x45, 0xDD, 0x69, 0xF8, 0xF5, 0xAA, 0xE7, 0x24, 0x14, 0x05, 0x4C, 0xD1,
1932 0xF3, 0x5D, 0x82, 0x76, 0x0B, 0x2C, 0xD0, 0x0D, 0x2F, 0x99, 0xBF, 0xA9,
1933 };
1934 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1935 make_string(plaintext), make_string(expected_ciphertext));
1936}
1937
1938TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector5) {
1939 uint8_t nonce[] = {
1940 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x04,
1941 };
1942 uint8_t associated_data[] = {
1943 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1944 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1945 };
1946 uint8_t plaintext[] = {
1947 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1948 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1949 };
1950 uint8_t expected_ciphertext[] = {
1951 0x57, 0x1D, 0x53, 0x5B, 0x60, 0xB2, 0x77, 0x18, 0x8B, 0xE5, 0x14,
1952 0x71, 0x70, 0xA9, 0xA2, 0x2C, 0x3A, 0xD7, 0xA4, 0xFF, 0x38, 0x35,
1953 0xB8, 0xC5, 0x70, 0x1C, 0x1C, 0xCE, 0xC8, 0xFC, 0x33, 0x58,
1954 };
1955 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1956 make_string(plaintext), make_string(expected_ciphertext));
1957}
1958
1959TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector6) {
1960 uint8_t nonce[] = {
1961 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x05,
1962 };
1963 uint8_t associated_data[] = {
1964 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1965 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1966 };
1967 uint8_t expected_ciphertext[] = {
1968 0x8C, 0xF7, 0x61, 0xB6, 0x90, 0x2E, 0xF7, 0x64,
1969 0x46, 0x2A, 0xD8, 0x64, 0x98, 0xCA, 0x6B, 0x97,
1970 };
1971 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1972 "" /* plaintext */, make_string(expected_ciphertext));
1973}
1974
1975TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector7) {
1976 uint8_t nonce[] = {
1977 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x06,
1978 };
1979 uint8_t plaintext[] = {
1980 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1981 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1982 };
1983 uint8_t expected_ciphertext[] = {
1984 0x5C, 0xE8, 0x8E, 0xC2, 0xE0, 0x69, 0x27, 0x06, 0xA9, 0x15, 0xC0,
1985 0x0A, 0xEB, 0x8B, 0x23, 0x96, 0xF4, 0x0E, 0x1C, 0x74, 0x3F, 0x52,
1986 0x43, 0x6B, 0xDF, 0x06, 0xD8, 0xFA, 0x1E, 0xCA, 0x34, 0x3D,
1987 };
1988 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1989 make_string(plaintext), make_string(expected_ciphertext));
1990}
1991
1992TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector8) {
1993 uint8_t nonce[] = {
1994 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x07,
1995 };
1996 uint8_t associated_data[] = {
1997 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1998 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1999 };
2000 uint8_t plaintext[] = {
2001 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
2002 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2003 };
2004 uint8_t expected_ciphertext[] = {
2005 0x1C, 0xA2, 0x20, 0x73, 0x08, 0xC8, 0x7C, 0x01, 0x07, 0x56, 0x10, 0x4D, 0x88, 0x40,
2006 0xCE, 0x19, 0x52, 0xF0, 0x96, 0x73, 0xA4, 0x48, 0xA1, 0x22, 0xC9, 0x2C, 0x62, 0x24,
2007 0x10, 0x51, 0xF5, 0x73, 0x56, 0xD7, 0xF3, 0xC9, 0x0B, 0xB0, 0xE0, 0x7F,
2008 };
2009 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2010 make_string(plaintext), make_string(expected_ciphertext));
2011}
2012
2013TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector9) {
2014 uint8_t nonce[] = {
2015 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x08,
2016 };
2017 uint8_t associated_data[] = {
2018 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
2019 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2020 };
2021 uint8_t expected_ciphertext[] = {
2022 0x6D, 0xC2, 0x25, 0xA0, 0x71, 0xFC, 0x1B, 0x9F,
2023 0x7C, 0x69, 0xF9, 0x3B, 0x0F, 0x1E, 0x10, 0xDE,
2024 };
2025 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2026 "" /* plaintext */, make_string(expected_ciphertext));
2027}
2028
2029TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector10) {
2030 uint8_t nonce[] = {
2031 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x09,
2032 };
2033 uint8_t plaintext[] = {
2034 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
2035 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2036 };
2037 uint8_t expected_ciphertext[] = {
2038 0x22, 0x1B, 0xD0, 0xDE, 0x7F, 0xA6, 0xFE, 0x99, 0x3E, 0xCC, 0xD7, 0x69, 0x46, 0x0A,
2039 0x0A, 0xF2, 0xD6, 0xCD, 0xED, 0x0C, 0x39, 0x5B, 0x1C, 0x3C, 0xE7, 0x25, 0xF3, 0x24,
2040 0x94, 0xB9, 0xF9, 0x14, 0xD8, 0x5C, 0x0B, 0x1E, 0xB3, 0x83, 0x57, 0xFF,
2041 };
2042 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
2043 make_string(plaintext), make_string(expected_ciphertext));
2044}
2045
2046TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector11) {
2047 uint8_t nonce[] = {
2048 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0A,
2049 };
2050 uint8_t associated_data[] = {
2051 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2052 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2053 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2054 };
2055 uint8_t plaintext[] = {
2056 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2057 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2058 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2059 };
2060 uint8_t expected_ciphertext[] = {
2061 0xBD, 0x6F, 0x6C, 0x49, 0x62, 0x01, 0xC6, 0x92, 0x96, 0xC1, 0x1E, 0xFD,
2062 0x13, 0x8A, 0x46, 0x7A, 0xBD, 0x3C, 0x70, 0x79, 0x24, 0xB9, 0x64, 0xDE,
2063 0xAF, 0xFC, 0x40, 0x31, 0x9A, 0xF5, 0xA4, 0x85, 0x40, 0xFB, 0xBA, 0x18,
2064 0x6C, 0x55, 0x53, 0xC6, 0x8A, 0xD9, 0xF5, 0x92, 0xA7, 0x9A, 0x42, 0x40,
2065 };
2066 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2067 make_string(plaintext), make_string(expected_ciphertext));
2068}
2069
2070TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector12) {
2071 uint8_t nonce[] = {
2072 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0B,
2073 };
2074 uint8_t associated_data[] = {
2075 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2076 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2077 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2078 };
2079 uint8_t plaintext[] = {};
2080 uint8_t expected_ciphertext[] = {
2081 0xFE, 0x80, 0x69, 0x0B, 0xEE, 0x8A, 0x48, 0x5D,
2082 0x11, 0xF3, 0x29, 0x65, 0xBC, 0x9D, 0x2A, 0x32,
2083 };
2084 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2085 "" /* plaintext */, make_string(expected_ciphertext));
2086}
2087
2088TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector13) {
2089 uint8_t nonce[] = {
2090 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0C,
2091 };
2092 uint8_t associated_data[] = {};
2093 uint8_t plaintext[] = {
2094 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2095 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2096 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2097 };
2098 uint8_t expected_ciphertext[] = {
2099 0x29, 0x42, 0xBF, 0xC7, 0x73, 0xBD, 0xA2, 0x3C, 0xAB, 0xC6, 0xAC, 0xFD,
2100 0x9B, 0xFD, 0x58, 0x35, 0xBD, 0x30, 0x0F, 0x09, 0x73, 0x79, 0x2E, 0xF4,
2101 0x60, 0x40, 0xC5, 0x3F, 0x14, 0x32, 0xBC, 0xDF, 0xB5, 0xE1, 0xDD, 0xE3,
2102 0xBC, 0x18, 0xA5, 0xF8, 0x40, 0xB5, 0x2E, 0x65, 0x34, 0x44, 0xD5, 0xDF,
2103 };
2104 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
2105 make_string(plaintext), make_string(expected_ciphertext));
2106}
2107
2108TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector14) {
2109 uint8_t nonce[] = {
2110 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0D,
2111 };
2112 uint8_t associated_data[] = {
2113 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2114 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2115 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2116 };
2117 uint8_t plaintext[] = {
2118 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2119 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2120 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2121 };
2122 uint8_t expected_ciphertext[] = {
2123 0xD5, 0xCA, 0x91, 0x74, 0x84, 0x10, 0xC1, 0x75, 0x1F, 0xF8, 0xA2, 0xF6, 0x18, 0x25,
2124 0x5B, 0x68, 0xA0, 0xA1, 0x2E, 0x09, 0x3F, 0xF4, 0x54, 0x60, 0x6E, 0x59, 0xF9, 0xC1,
2125 0xD0, 0xDD, 0xC5, 0x4B, 0x65, 0xE8, 0x62, 0x8E, 0x56, 0x8B, 0xAD, 0x7A, 0xED, 0x07,
2126 0xBA, 0x06, 0xA4, 0xA6, 0x94, 0x83, 0xA7, 0x03, 0x54, 0x90, 0xC5, 0x76, 0x9E, 0x60,
2127 };
2128 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2129 make_string(plaintext), make_string(expected_ciphertext));
2130}
2131
2132TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector15) {
2133 uint8_t nonce[] = {
2134 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0E,
2135 };
2136 uint8_t associated_data[] = {
2137 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2138 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2139 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2140 };
2141 uint8_t plaintext[] = {};
2142 uint8_t expected_ciphertext[] = {
2143 0xC5, 0xCD, 0x9D, 0x18, 0x50, 0xC1, 0x41, 0xE3,
2144 0x58, 0x64, 0x99, 0x94, 0xEE, 0x70, 0x1B, 0x68,
2145 };
2146 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2147 "" /* plaintext */, make_string(expected_ciphertext));
2148}
2149
2150TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector16) {
2151 uint8_t nonce[] = {
2152 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0F,
2153 };
2154 uint8_t associated_data[] = {};
2155 uint8_t plaintext[] = {
2156 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2157 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2158 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2159 };
2160 uint8_t expected_ciphertext[] = {
2161 0x44, 0x12, 0x92, 0x34, 0x93, 0xC5, 0x7D, 0x5D, 0xE0, 0xD7, 0x00, 0xF7, 0x53, 0xCC,
2162 0xE0, 0xD1, 0xD2, 0xD9, 0x50, 0x60, 0x12, 0x2E, 0x9F, 0x15, 0xA5, 0xDD, 0xBF, 0xC5,
2163 0x78, 0x7E, 0x50, 0xB5, 0xCC, 0x55, 0xEE, 0x50, 0x7B, 0xCB, 0x08, 0x4E, 0x47, 0x9A,
2164 0xD3, 0x63, 0xAC, 0x36, 0x6B, 0x95, 0xA9, 0x8C, 0xA5, 0xF3, 0x00, 0x0B, 0x14, 0x79,
2165 };
2166 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
2167 make_string(plaintext), make_string(expected_ciphertext));
2168}
2169
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002170TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07002171 ASSERT_EQ(KM_ERROR_OK,
2172 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
2173 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002174 // Two-block message.
2175 string message = "12345678901234567890123456789012";
2176 string ciphertext1 = EncryptMessage(message);
2177 EXPECT_EQ(message.size(), ciphertext1.size());
2178
2179 string ciphertext2 = EncryptMessage(string(message));
2180 EXPECT_EQ(message.size(), ciphertext2.size());
2181
2182 // ECB is deterministic.
2183 EXPECT_EQ(ciphertext1, ciphertext2);
2184
2185 string plaintext = DecryptMessage(ciphertext1);
2186 EXPECT_EQ(message, plaintext);
2187}
2188
2189TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07002190 ASSERT_EQ(KM_ERROR_OK,
2191 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
2192 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002193 // Message is slightly shorter than two blocks.
2194 string message = "1234567890123456789012345678901";
2195
2196 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
2197 string ciphertext;
2198 size_t input_consumed;
2199 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
2200 EXPECT_EQ(message.size(), input_consumed);
2201 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
2202}
2203
2204TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002205 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002206 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002207 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
2208 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002209
2210 // Try various message lengths; all should work.
2211 for (int i = 0; i < 32; ++i) {
2212 string message(i, 'a');
2213 string ciphertext = EncryptMessage(message);
2214 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
2215 string plaintext = DecryptMessage(ciphertext);
2216 EXPECT_EQ(message, plaintext);
2217 }
2218}
2219
2220TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07002221 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002222 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002223 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
2224 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002225
2226 string message = "a";
2227 string ciphertext = EncryptMessage(message);
2228 EXPECT_EQ(16, ciphertext.size());
2229 EXPECT_NE(ciphertext, message);
2230 ++ciphertext[ciphertext.size() / 2];
2231
2232 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
2233 string plaintext;
2234 size_t input_consumed;
2235 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
2236 EXPECT_EQ(ciphertext.size(), input_consumed);
2237 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
2238}
2239
2240TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07002241 ASSERT_EQ(KM_ERROR_OK,
2242 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
2243 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002244 // Two-block message.
2245 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002246 string iv1;
2247 string ciphertext1 = EncryptMessage(message, &iv1);
2248 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002249
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002250 string iv2;
2251 string ciphertext2 = EncryptMessage(message, &iv2);
2252 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002253
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002254 // IVs should be random, so ciphertexts should differ.
2255 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002256 EXPECT_NE(ciphertext1, ciphertext2);
2257
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002258 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002259 EXPECT_EQ(message, plaintext);
2260}
2261
2262TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002263 ASSERT_EQ(KM_ERROR_OK,
2264 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
2265 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002266
2267 int increment = 15;
2268 string message(240, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002269 AuthorizationSet input_params;
2270 AuthorizationSet output_params;
2271 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2272
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002273 string ciphertext;
2274 size_t input_consumed;
2275 for (size_t i = 0; i < message.size(); i += increment)
2276 EXPECT_EQ(KM_ERROR_OK,
2277 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2278 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002279 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002280
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002281 // Move TAG_NONCE into input_params
2282 input_params.Reinitialize(output_params);
2283 output_params.Clear();
2284
2285 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002286 string plaintext;
2287 for (size_t i = 0; i < ciphertext.size(); i += increment)
2288 EXPECT_EQ(KM_ERROR_OK,
2289 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2290 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002291 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002292 EXPECT_EQ(message, plaintext);
2293}
2294
2295TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002296 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002297 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002298 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2299 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002300
2301 // Try various message lengths; all should work.
2302 for (int i = 0; i < 32; ++i) {
2303 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002304 string iv;
2305 string ciphertext = EncryptMessage(message, &iv);
2306 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
2307 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002308 EXPECT_EQ(message, plaintext);
2309 }
2310}
2311
Shawn Willdencd695822015-01-26 14:06:32 -07002312typedef KeymasterTest AddEntropyTest;
2313TEST_F(AddEntropyTest, AddEntropy) {
2314 // There's no obvious way to test that entropy is actually added, but we can test that the API
2315 // doesn't blow up or return an error.
2316 EXPECT_EQ(KM_ERROR_OK,
2317 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
2318}
2319
Shawn Willden5fad7852015-01-26 16:10:56 -07002320typedef KeymasterTest RescopingTest;
2321TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willden2c242002015-02-27 07:01:02 -07002322 ASSERT_EQ(
2323 KM_ERROR_OK,
2324 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Authorization(
2325 TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)));
Shawn Willden5fad7852015-01-26 16:10:56 -07002326 // TODO(swillden): Add a better error code for this.
2327 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, BeginOperation(KM_PURPOSE_ENCRYPT));
2328}
2329
2330TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07002331 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07002332 .AesEncryptionKey(128)
2333 .OcbMode(4096, 16)
Shawn Willden2c242002015-02-27 07:01:02 -07002334 .Authorization(TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)
2335 .Authorization(TAG_RESCOPING_DEL, KM_TAG_MAC_LENGTH)));
Shawn Willden5fad7852015-01-26 16:10:56 -07002336 EXPECT_FALSE(contains(sw_enforced(), TAG_MAC_LENGTH, 15));
2337 EXPECT_TRUE(contains(sw_enforced(), TAG_MAC_LENGTH, 16));
2338
2339 keymaster_key_blob_t rescoped_blob;
2340 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07002341 AuthorizationSet new_params = AuthorizationSetBuilder()
2342 .AesEncryptionKey(128)
2343 .OcbMode(4096, 15 /* note changed */)
2344 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07002345
2346 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
2347 ASSERT_TRUE(rescoped_characteristics != NULL);
2348
2349 EXPECT_EQ(0, rescoped_characteristics->hw_enforced.length);
2350 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
2351 keymaster_free_characteristics(rescoped_characteristics);
2352 free(rescoped_characteristics);
2353 free(const_cast<uint8_t*>(rescoped_blob.key_material));
2354
2355 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
2356 EXPECT_TRUE(contains(auths, TAG_MAC_LENGTH, 15));
2357 EXPECT_FALSE(contains(auths, TAG_MAC_LENGTH, 16));
2358}
2359
2360TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07002361 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2362 .RsaEncryptionKey(256, 3, KM_PAD_RSA_OAEP)
2363 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
2364 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07002365 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
2366 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
2367 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
2368 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
2369
2370 keymaster_key_blob_t rescoped_blob;
2371 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07002372 AuthorizationSet new_params = AuthorizationSetBuilder()
2373 .RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)
2374 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07002375
2376 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
2377 ASSERT_TRUE(rescoped_characteristics != NULL);
2378
2379 EXPECT_EQ(0, rescoped_characteristics->hw_enforced.length);
2380 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
2381 keymaster_free_characteristics(rescoped_characteristics);
2382 free(rescoped_characteristics);
2383 free(const_cast<uint8_t*>(rescoped_blob.key_material));
2384
2385 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
2386 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
2387 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
2388 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
2389}
2390
2391// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
2392// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
2393// may not be changed.
2394
Shawn Willden128ffe02014-08-06 12:31:33 -06002395} // namespace test
2396} // namespace keymaster