blob: 2787b31736c783e84c07d1aeb3e380ec775b2a4e [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 Willden63ac0432014-12-29 14:07:08 -0700527 EXPECT_EQ(0, 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 Willden2c242002015-02-27 07:01:02 -0700659 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700660 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600661
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700662 // Check specified tags are all present in unenforced characteristics
663 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
664 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600665}
666
Shawn Willden6bbe6782014-09-18 11:26:15 -0600667TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700668 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700669 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600670
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700671 // Check specified tags are all present in unenforced characteristics
672 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600673
674 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700675 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600676}
677
678TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700679 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
680 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600681}
682
683TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600684 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600685 for (size_t size : valid_sizes) {
Shawn Willden2c242002015-02-27 07:01:02 -0700686 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700687 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600688 }
689}
690
Shawn Willden19fca882015-01-22 16:35:30 -0700691TEST_F(NewKeyGeneration, AesOcb) {
Shawn Willden2c242002015-02-27 07:01:02 -0700692 ASSERT_EQ(KM_ERROR_OK,
693 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700694}
695
696TEST_F(NewKeyGeneration, AesOcbInvalidKeySize) {
Shawn Willden7dad93b2015-02-05 10:20:47 -0700697 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden2c242002015-02-27 07:01:02 -0700698 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(136).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700699}
700
701TEST_F(NewKeyGeneration, AesOcbAllValidSizes) {
Shawn Willden19fca882015-01-22 16:35:30 -0700702 size_t valid_sizes[] = {128, 192, 256};
703 for (size_t size : valid_sizes) {
Shawn Willden2c242002015-02-27 07:01:02 -0700704 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(size)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700705 << "Failed to generate size: " << size;
Shawn Willden19fca882015-01-22 16:35:30 -0700706 }
707}
708
Shawn Willden0d560bf2014-12-15 17:44:02 -0700709TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700710 ASSERT_EQ(KM_ERROR_OK,
711 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700712}
713
Shawn Willden76364712014-08-11 17:48:04 -0600714typedef KeymasterTest GetKeyCharacteristics;
715TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700716 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
717 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700718 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600719
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700720 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
721 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600722}
723
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700724typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600725TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700726 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
727 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700728 string message = "12345678901234567890123456789012";
729 string signature;
730 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600731}
732
Shawn Willden61902362014-12-18 10:33:24 -0700733TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
734 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700735 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
736 256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700737 string message(1024, 'a');
738 string signature;
739 SignMessage(message, &signature);
740}
741
742TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700743 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
744 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700745 // Use large message, which won't work without digesting.
746 string message(1024, 'a');
747 string signature;
748 SignMessage(message, &signature);
749}
750
Shawn Willdenf90f2352014-12-18 23:01:15 -0700751TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700752 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
753 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700754 string message(1024, 'a');
755 string signature;
756 SignMessage(message, &signature);
757}
758
759TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
760 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
761 // that 9 bytes larger than hash won't work.
Shawn Willden2c242002015-02-27 07:01:02 -0700762 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
763 256 + 9 * 8, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700764 string message(1024, 'a');
765 string signature;
766
767 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
768
769 string result;
770 size_t input_consumed;
771 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
772 EXPECT_EQ(message.size(), input_consumed);
773 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
774}
775
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600776TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700777 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700778 string message = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700779 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700780 SignMessage(message, &signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600781}
782
Shawn Willden1615f2e2014-08-13 10:37:40 -0600783TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -0700784 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
785 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdendfa1c032015-02-07 00:39:01 -0700786 AuthorizationSet input_params, output_params;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700787 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
788 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
789 // Another abort should fail
790 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600791}
792
793TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willden2c242002015-02-27 07:01:02 -0700794 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_MD5,
795 KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700796 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600797}
798
799TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -0700800 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
801 256, 3, KM_DIGEST_SHA_2_256 /* supported digest */, KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700802 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600803}
804
805TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700806 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700807 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700808 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700809 // PSS requires a digest.
Shawn Willden2c242002015-02-27 07:01:02 -0700810 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_NONE, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700811 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600812}
813
814TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700815 // Padding must be specified
Shawn Willden2c242002015-02-27 07:01:02 -0700816 ASSERT_EQ(KM_ERROR_OK,
817 GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Authorization(
818 TAG_DIGEST, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700819 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600820}
821
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700822TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700823 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 20));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700824 string message = "12345678901234567890123456789012";
825 string signature;
826 SignMessage(message, &signature);
827 ASSERT_EQ(20, signature.size());
828}
829
Shawn Willden62c22862014-12-17 08:36:20 -0700830TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700831 ASSERT_EQ(KM_ERROR_OK,
832 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 28)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700833 string message = "12345678901234567890123456789012";
834 string signature;
835 SignMessage(message, &signature);
836 ASSERT_EQ(28, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700837}
838
Shawn Willden0d560bf2014-12-15 17:44:02 -0700839TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700840 ASSERT_EQ(KM_ERROR_OK,
841 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700842 string message = "12345678901234567890123456789012";
843 string signature;
844 SignMessage(message, &signature);
845 ASSERT_EQ(32, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700846}
847
Shawn Willden62c22862014-12-17 08:36:20 -0700848TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700849 ASSERT_EQ(KM_ERROR_OK,
850 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 48)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700851 string message = "12345678901234567890123456789012";
852 string signature;
853 SignMessage(message, &signature);
854 ASSERT_EQ(48, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700855}
856
857TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700858 ASSERT_EQ(KM_ERROR_OK,
859 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 64)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700860 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700861 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700862 SignMessage(message, &signature);
863 ASSERT_EQ(64, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700864}
865
Shawn Willden3b702e22015-02-05 10:26:47 -0700866TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
867 uint8_t key_data[] = {
868 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
869 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
870 };
871 string message = "Hi There";
872 uint8_t sha_224_expected[] = {
873 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
874 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
875 };
876 uint8_t sha_256_expected[] = {
877 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
878 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
879 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
880 };
881 uint8_t sha_384_expected[] = {
882 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
883 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
884 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
885 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
886 };
887 uint8_t sha_512_expected[] = {
888 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
889 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
890 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
891 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
892 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
893 };
894
895 string key = make_string(key_data);
896
897 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
898 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
899 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
900 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
901}
902
903TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
904 string key = "Jefe";
905 string message = "what do ya want for nothing?";
906 uint8_t sha_224_expected[] = {
907 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
908 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
909 };
910 uint8_t sha_256_expected[] = {
911 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
912 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
913 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
914 };
915 uint8_t sha_384_expected[] = {
916 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
917 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
918 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
919 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
920 };
921 uint8_t sha_512_expected[] = {
922 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
923 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
924 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
925 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
926 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
927 };
928
929 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
930 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
931 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
932 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
933}
934
935TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
936 string key(20, 0xaa);
937 string message(50, 0xdd);
938 uint8_t sha_224_expected[] = {
939 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
940 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
941 };
942 uint8_t sha_256_expected[] = {
943 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
944 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
945 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
946 };
947 uint8_t sha_384_expected[] = {
948 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
949 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
950 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
951 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
952 };
953 uint8_t sha_512_expected[] = {
954 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
955 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
956 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
957 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
958 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
959 };
960
961 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
962 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
963 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
964 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
965}
966
967TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
968 uint8_t key_data[25] = {
969 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
970 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
971 };
972 string key = make_string(key_data);
973 string message(50, 0xcd);
974 uint8_t sha_224_expected[] = {
975 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
976 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
977 };
978 uint8_t sha_256_expected[] = {
979 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
980 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
981 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
982 };
983 uint8_t sha_384_expected[] = {
984 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
985 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
986 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
987 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
988 };
989 uint8_t sha_512_expected[] = {
990 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
991 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
992 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
993 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
994 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
995 };
996
997 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
998 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
999 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1000 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1001}
1002
1003TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
1004 string key(20, 0x0c);
1005 string message = "Test With Truncation";
1006
1007 uint8_t sha_224_expected[] = {
1008 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
1009 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
1010 };
1011 uint8_t sha_256_expected[] = {
1012 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
1013 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
1014 };
1015 uint8_t sha_384_expected[] = {
1016 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
1017 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
1018 };
1019 uint8_t sha_512_expected[] = {
1020 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
1021 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
1022 };
1023
1024 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1025 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1026 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1027 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1028}
1029
1030TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
1031 string key(131, 0xaa);
1032 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
1033
1034 uint8_t sha_224_expected[] = {
1035 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
1036 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
1037 };
1038 uint8_t sha_256_expected[] = {
1039 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
1040 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
1041 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
1042 };
1043 uint8_t sha_384_expected[] = {
1044 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
1045 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
1046 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
1047 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
1048 };
1049 uint8_t sha_512_expected[] = {
1050 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
1051 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
1052 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
1053 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
1054 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
1055 };
1056
1057 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1058 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1059 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1060 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1061}
1062
1063TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
1064 string key(131, 0xaa);
1065 string message = "This is a test using a larger than block-size key and a larger than "
1066 "block-size data. The key needs to be hashed before being used by the HMAC "
1067 "algorithm.";
1068
1069 uint8_t sha_224_expected[] = {
1070 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
1071 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
1072 };
1073 uint8_t sha_256_expected[] = {
1074 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
1075 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
1076 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
1077 };
1078 uint8_t sha_384_expected[] = {
1079 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
1080 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
1081 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
1082 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
1083 };
1084 uint8_t sha_512_expected[] = {
1085 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
1086 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
1087 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
1088 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
1089 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
1090 };
1091
1092 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1093 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1094 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1095 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1096}
Shawn Willden0d560bf2014-12-15 17:44:02 -07001097
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001098TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001099 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1100 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
1101 .Authorization(TAG_KEY_SIZE, 128)
Shawn Willdenc24c1102014-12-22 15:30:09 -07001102 .SigningKey()
Shawn Willden2c242002015-02-27 07:01:02 -07001103 .Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001104 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -07001105}
1106
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001107TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001108 ASSERT_EQ(KM_ERROR_OK,
1109 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 33)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001110 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -07001111}
1112
Shawn Willden1615f2e2014-08-13 10:37:40 -06001113TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willden2c242002015-02-27 07:01:02 -07001114 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1115 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001116 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001117
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001118 string message = "1234567890123456789012345678901";
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001119 string result;
1120 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001121 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001122 EXPECT_EQ(0U, result.size());
1123 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -06001124
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001125 string signature;
1126 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
1127 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -06001128}
1129
Shawn Willden61902362014-12-18 10:33:24 -07001130// TODO(swillden): Add more verification failure tests.
1131
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001132typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -06001133TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001134 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1135 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001136 string message = "12345678901234567890123456789012";
1137 string signature;
1138 SignMessage(message, &signature);
1139 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -06001140}
1141
Shawn Willden61902362014-12-18 10:33:24 -07001142TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
1143 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -07001144 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -07001145 string message(1024, 'a');
1146 string signature;
1147 SignMessage(message, &signature);
1148 VerifyMessage(message, signature);
1149}
1150
Shawn Willdenf90f2352014-12-18 23:01:15 -07001151TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -07001152 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -07001153 string message(1024, 'a');
1154 string signature;
1155 SignMessage(message, &signature);
1156 ++signature[signature.size() / 2];
1157
1158 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1159
1160 string result;
1161 size_t input_consumed;
1162 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1163 EXPECT_EQ(message.size(), input_consumed);
1164 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1165}
1166
Shawn Willdenf90f2352014-12-18 23:01:15 -07001167TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001168 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1169 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001170 // Use large message, which won't work without digesting.
1171 string message(1024, 'a');
1172 string signature;
1173 SignMessage(message, &signature);
1174 VerifyMessage(message, signature);
1175}
1176
1177TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -07001178 GenerateKey(
1179 AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001180 string message(1024, 'a');
1181 string signature;
1182 SignMessage(message, &signature);
1183 ++signature[signature.size() / 2];
1184
1185 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1186
1187 string result;
1188 size_t input_consumed;
1189 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1190 EXPECT_EQ(message.size(), input_consumed);
1191 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1192}
1193
1194TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -07001195 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1196 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001197 // Use large message, which won't work without digesting.
1198 string message(1024, 'a');
1199 string signature;
1200 SignMessage(message, &signature);
1201 ++message[message.size() / 2];
1202
1203 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1204
1205 string result;
1206 size_t input_consumed;
1207 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1208 EXPECT_EQ(message.size(), input_consumed);
1209 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1210}
1211
Shawn Willdenf90f2352014-12-18 23:01:15 -07001212TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001213 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
1214 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001215 string message(1024, 'a');
1216 string signature;
1217 SignMessage(message, &signature);
1218 VerifyMessage(message, signature);
1219}
1220
1221TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -07001222 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
1223 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001224 string message(1024, 'a');
1225 string signature;
1226 SignMessage(message, &signature);
1227 ++signature[signature.size() / 2];
1228
1229 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1230
1231 string result;
1232 size_t input_consumed;
1233 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1234 EXPECT_EQ(message.size(), input_consumed);
1235 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1236}
1237
1238TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -07001239 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1240 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001241 // Use large message, which won't work without digesting.
1242 string message(1024, 'a');
1243 string signature;
1244 SignMessage(message, &signature);
1245 ++message[message.size() / 2];
1246
1247 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1248
1249 string result;
1250 size_t input_consumed;
1251 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1252 EXPECT_EQ(message.size(), input_consumed);
1253 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1254}
1255
1256template <typename T> vector<T> make_vector(const T* array, size_t len) {
1257 return vector<T>(array, array + len);
1258}
1259
1260TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
1261 // Get all supported digests and padding modes.
1262 size_t digests_len;
1263 keymaster_digest_t* digests;
1264 EXPECT_EQ(KM_ERROR_OK,
1265 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1266 &digests_len));
1267
1268 size_t padding_modes_len;
1269 keymaster_padding_t* padding_modes;
1270 EXPECT_EQ(KM_ERROR_OK,
1271 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1272 &padding_modes, &padding_modes_len));
1273
1274 // Try them.
1275 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1276 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
1277 // Compute key & message size that will work.
1278 size_t key_bits = 256;
1279 size_t message_len = 1000;
1280 switch (digest) {
1281 case KM_DIGEST_NONE:
1282 switch (padding_mode) {
1283 case KM_PAD_NONE:
1284 // Match key size.
1285 message_len = key_bits / 8;
1286 break;
1287 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1288 message_len = key_bits / 8 - 11;
1289 break;
1290 case KM_PAD_RSA_PSS:
1291 // PSS requires a digest.
1292 continue;
1293 default:
1294 FAIL() << "Missing padding";
1295 break;
1296 }
1297 break;
1298
1299 case KM_DIGEST_SHA_2_256:
1300 switch (padding_mode) {
1301 case KM_PAD_NONE:
1302 // Key size matches digest size
1303 break;
1304 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1305 key_bits += 8 * 11;
1306 break;
1307 case KM_PAD_RSA_PSS:
1308 key_bits += 8 * 10;
1309 break;
1310 default:
1311 FAIL() << "Missing padding";
1312 break;
1313 }
1314 break;
1315 default:
1316 FAIL() << "Missing digest";
1317 }
1318
Shawn Willden2c242002015-02-27 07:01:02 -07001319 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(key_bits, 3, digest, padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001320 string message(message_len, 'a');
1321 string signature;
1322 SignMessage(message, &signature);
1323 VerifyMessage(message, signature);
1324 }
1325 }
1326
1327 free(padding_modes);
1328 free(digests);
1329}
1330
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001331TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001332 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001333 string message = "123456789012345678901234567890123456789012345678";
1334 string signature;
1335 SignMessage(message, &signature);
1336 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001337}
1338
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001339TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001340 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001341 string message = "123456789012345678901234567890123456789012345678";
1342 string signature;
1343 SignMessage(message, &signature);
1344 VerifyMessage(message, signature);
1345}
1346
1347TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001348 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001349 string message = "123456789012345678901234567890123456789012345678";
1350 string signature;
1351 SignMessage(message, &signature);
1352 VerifyMessage(message, signature);
1353}
1354
Shawn Willden0d560bf2014-12-15 17:44:02 -07001355TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001356 ASSERT_EQ(KM_ERROR_OK,
1357 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001358 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001359 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001360 SignMessage(message, &signature);
1361 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001362}
1363
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001364TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001365 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001366 string message = "123456789012345678901234567890123456789012345678";
1367 string signature;
1368 SignMessage(message, &signature);
1369 VerifyMessage(message, signature);
1370}
1371
1372TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001373 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001374 string message = "123456789012345678901234567890123456789012345678";
1375 string signature;
1376 SignMessage(message, &signature);
1377 VerifyMessage(message, signature);
1378}
1379
Shawn Willden5b53c992015-02-02 08:05:25 -07001380typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001381TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001382 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1383 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001384 string export_data;
1385 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1386 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001387
1388 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001389}
1390
Shawn Willdenf268d742014-08-19 15:36:26 -06001391TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001392 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001393 string export_data;
1394 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1395 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001396
1397 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001398}
1399
1400TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willden2c242002015-02-27 07:01:02 -07001401 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1402 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001403 string export_data;
1404 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001405}
1406
1407TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willden2c242002015-02-27 07:01:02 -07001408 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1409 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001410 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001411 string export_data;
1412 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001413}
1414
Shawn Willden7dad93b2015-02-05 10:20:47 -07001415TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001416 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001417 string export_data;
1418
1419 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1420 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1421 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1422}
1423
Shawn Willden437fbd12014-08-20 11:59:49 -06001424static string read_file(const string& file_name) {
1425 ifstream file_stream(file_name, std::ios::binary);
1426 istreambuf_iterator<char> file_begin(file_stream);
1427 istreambuf_iterator<char> file_end;
1428 return string(file_begin, file_end);
1429}
1430
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001431typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001432TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001433 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001434 ASSERT_EQ(633U, pk8_key.size());
1435
Shawn Willden2c242002015-02-27 07:01:02 -07001436 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().RsaSigningKey(
1437 1024, 65537, KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001438 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001439
1440 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001441 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1442 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1443 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001444
1445 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001446 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1447 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001448
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001449 string message(1024 / 8, 'a');
1450 string signature;
1451 SignMessage(message, &signature);
1452 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001453}
1454
Shawn Willden6bbe6782014-09-18 11:26:15 -06001455TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001456 string pk8_key = read_file("rsa_privkey_pk8.der");
1457 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001458 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001459 ImportKey(AuthorizationSetBuilder().RsaSigningKey(2048 /* Doesn't match key */, 3,
1460 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001461 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001462}
1463
1464TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001465 string pk8_key = read_file("rsa_privkey_pk8.der");
1466 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001467 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001468 ImportKey(AuthorizationSetBuilder().RsaSigningKey(256, 3 /* Doesnt' match key */,
1469 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001470 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001471}
1472
Shawn Willden81effc62014-08-27 10:08:46 -06001473TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001474 string pk8_key = read_file("ec_privkey_pk8.der");
1475 ASSERT_EQ(138U, pk8_key.size());
1476
Shawn Willden2c242002015-02-27 07:01:02 -07001477 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256),
1478 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001479
1480 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001481 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1482 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001483
1484 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001485 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1486 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001487
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001488 string message(1024 / 8, 'a');
1489 string signature;
1490 SignMessage(message, &signature);
1491 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001492}
1493
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001494TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1495 string pk8_key = read_file("ec_privkey_pk8.der");
1496 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001497
Shawn Willden2c242002015-02-27 07:01:02 -07001498 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256),
1499 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001500
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001501 // Check values derived from the key.
1502 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1503 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1504
1505 // And values provided by GoogleKeymaster
1506 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1507 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1508
1509 string message(1024 / 8, 'a');
1510 string signature;
1511 SignMessage(message, &signature);
1512 VerifyMessage(message, signature);
1513}
1514
1515TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1516 string pk8_key = read_file("ec_privkey_pk8.der");
1517 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001518 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001519 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(224), // Size does not match key
Shawn Willdena278f612014-12-23 11:22:21 -07001520 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001521}
1522
Shawn Willden3b702e22015-02-05 10:26:47 -07001523TEST_F(ImportKeyTest, AesKeySuccess) {
1524 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1525 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001526 ASSERT_EQ(KM_ERROR_OK,
1527 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16),
1528 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001529
1530 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1531 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1532
1533 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001534 string nonce;
1535 string ciphertext = EncryptMessage(message, &nonce);
1536 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden3b702e22015-02-05 10:26:47 -07001537 EXPECT_EQ(message, plaintext);
1538}
1539
1540TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1541 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1542 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001543 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().HmacKey(sizeof(key_data) * 8,
1544 KM_DIGEST_SHA_2_256, 32),
1545 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001546
1547 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1548 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1549
1550 string message = "Hello World!";
1551 string signature;
1552 SignMessage(message, &signature);
1553 VerifyMessage(message, signature);
1554}
1555
Shawn Willden2665e862014-11-24 14:46:21 -07001556typedef KeymasterTest VersionTest;
1557TEST_F(VersionTest, GetVersion) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001558 uint8_t major, minor, subminor;
1559 ASSERT_EQ(KM_ERROR_OK, GetVersion(&major, &minor, &subminor));
1560 EXPECT_EQ(1, major);
1561 EXPECT_EQ(0, minor);
1562 EXPECT_EQ(0, subminor);
Shawn Willden2665e862014-11-24 14:46:21 -07001563}
1564
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001565typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001566TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001567 ASSERT_EQ(KM_ERROR_OK,
1568 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001569
1570 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001571 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001572 EXPECT_EQ(512 / 8, ciphertext1.size());
1573
Shawn Willden6dde87c2014-12-11 14:08:48 -07001574 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001575 EXPECT_EQ(512 / 8, ciphertext2.size());
1576
1577 // OAEP randomizes padding so every result should be different.
1578 EXPECT_NE(ciphertext1, ciphertext2);
1579}
1580
1581TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001582 ASSERT_EQ(KM_ERROR_OK,
1583 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001584 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001585 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001586 EXPECT_EQ(512 / 8, ciphertext.size());
1587
Shawn Willden6dde87c2014-12-11 14:08:48 -07001588 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001589 EXPECT_EQ(message, plaintext);
1590}
1591
1592TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willden2c242002015-02-27 07:01:02 -07001593 ASSERT_EQ(KM_ERROR_OK,
1594 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001595 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001596 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001597 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001598
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001599 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1600 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001601 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001602 EXPECT_EQ(0, result.size());
1603}
1604
1605TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001606 ASSERT_EQ(KM_ERROR_OK,
1607 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001608 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001609 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001610 EXPECT_EQ(512 / 8, ciphertext.size());
1611
1612 // Corrupt the ciphertext
1613 ciphertext[512 / 8 / 2]++;
1614
Shawn Willden4200f212014-12-02 07:01:21 -07001615 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001616 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001617 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1618 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001619 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001620 EXPECT_EQ(0, result.size());
1621}
1622
1623TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001624 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1625 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001626 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001627 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001628 EXPECT_EQ(512 / 8, ciphertext1.size());
1629
Shawn Willden6dde87c2014-12-11 14:08:48 -07001630 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001631 EXPECT_EQ(512 / 8, ciphertext2.size());
1632
1633 // PKCS1 v1.5 randomizes padding so every result should be different.
1634 EXPECT_NE(ciphertext1, ciphertext2);
1635}
1636
1637TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001638 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1639 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001640 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001641 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001642 EXPECT_EQ(512 / 8, ciphertext.size());
1643
Shawn Willden6dde87c2014-12-11 14:08:48 -07001644 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001645 EXPECT_EQ(message, plaintext);
1646}
1647
1648TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willden2c242002015-02-27 07:01:02 -07001649 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1650 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001651 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001652 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001653 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001654
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001655 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1656 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001657 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001658 EXPECT_EQ(0, result.size());
1659}
1660
1661TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001662 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1663 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001664 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001665 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001666 EXPECT_EQ(512 / 8, ciphertext.size());
1667
1668 // Corrupt the ciphertext
1669 ciphertext[512 / 8 / 2]++;
1670
Shawn Willden4200f212014-12-02 07:01:21 -07001671 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001672 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001673 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1674 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001675 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001676 EXPECT_EQ(0, result.size());
1677}
1678
Shawn Willden907c3012014-12-08 15:51:55 -07001679TEST_F(EncryptionOperationsTest, AesOcbSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001680 ASSERT_EQ(KM_ERROR_OK,
1681 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001682 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001683 string nonce1;
1684 string ciphertext1 = EncryptMessage(message, &nonce1);
1685 EXPECT_EQ(12, nonce1.size());
1686 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext1.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001687
Shawn Willdendfa1c032015-02-07 00:39:01 -07001688 string nonce2;
1689 string ciphertext2 = EncryptMessage(message, &nonce2);
1690 EXPECT_EQ(12, nonce2.size());
1691 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext2.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001692
Shawn Willdendfa1c032015-02-07 00:39:01 -07001693 // Nonces should be random
1694 EXPECT_NE(nonce1, nonce2);
1695
1696 // Therefore ciphertexts are different
Shawn Willden907c3012014-12-08 15:51:55 -07001697 EXPECT_NE(ciphertext1, ciphertext2);
1698}
1699
Shawn Willden6dde87c2014-12-11 14:08:48 -07001700TEST_F(EncryptionOperationsTest, AesOcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001701 ASSERT_EQ(KM_ERROR_OK,
1702 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001703 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001704 string nonce;
1705 string ciphertext = EncryptMessage(message, &nonce);
1706 EXPECT_EQ(12, nonce.size());
1707 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001708
Shawn Willdendfa1c032015-02-07 00:39:01 -07001709 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001710 EXPECT_EQ(message, plaintext);
1711}
1712
1713TEST_F(EncryptionOperationsTest, AesOcbRoundTripCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001714 ASSERT_EQ(KM_ERROR_OK,
1715 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001716 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001717 string nonce;
1718 string ciphertext = EncryptMessage(message, &nonce);
1719 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001720
1721 ciphertext[ciphertext.size() / 2]++;
1722
Shawn Willdendfa1c032015-02-07 00:39:01 -07001723 AuthorizationSet input_set, output_set;
1724 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1725 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set, &output_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001726
1727 string result;
1728 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001729 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001730 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001731 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001732}
1733
1734TEST_F(EncryptionOperationsTest, AesDecryptGarbage) {
Shawn Willden2c242002015-02-27 07:01:02 -07001735 ASSERT_EQ(KM_ERROR_OK,
1736 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001737 string ciphertext(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001738 AuthorizationSet input_params;
1739 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaa", 12);
1740 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001741
1742 string result;
1743 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001744 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001745 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001746 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001747}
1748
Shawn Willdendfa1c032015-02-07 00:39:01 -07001749TEST_F(EncryptionOperationsTest, AesDecryptTooShortNonce) {
Shawn Willden2c242002015-02-27 07:01:02 -07001750 ASSERT_EQ(KM_ERROR_OK,
1751 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001752
Shawn Willdendfa1c032015-02-07 00:39:01 -07001753 // Try decrypting garbage ciphertext with too-short nonce
1754 string ciphertext(15, 'a');
1755 AuthorizationSet input_params;
1756 input_params.push_back(TAG_NONCE, "aaaaaaaaaaa", 11);
1757 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001758}
1759
1760TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptySuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001761 ASSERT_EQ(KM_ERROR_OK,
1762 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001763 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001764 string nonce;
1765 string ciphertext = EncryptMessage(message, &nonce);
1766 EXPECT_EQ(12, nonce.size());
1767 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001768
Shawn Willdendfa1c032015-02-07 00:39:01 -07001769 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001770 EXPECT_EQ(message, plaintext);
1771}
1772
1773TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptyCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001774 ASSERT_EQ(KM_ERROR_OK,
1775 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001776 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001777 string nonce;
1778 string ciphertext = EncryptMessage(message, &nonce);
1779 EXPECT_EQ(12, nonce.size());
1780 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001781
1782 ciphertext[ciphertext.size() / 2]++;
1783
Shawn Willdendfa1c032015-02-07 00:39:01 -07001784 AuthorizationSet input_set;
1785 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1786 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001787
1788 string result;
1789 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001790 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001791 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001792 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001793}
1794
1795TEST_F(EncryptionOperationsTest, AesOcbFullChunk) {
Shawn Willden2c242002015-02-27 07:01:02 -07001796 ASSERT_EQ(KM_ERROR_OK,
1797 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001798 string message(4096, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001799 string nonce;
1800 string ciphertext = EncryptMessage(message, &nonce);
1801 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001802
Shawn Willdendfa1c032015-02-07 00:39:01 -07001803 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001804 EXPECT_EQ(message, plaintext);
1805}
1806
1807TEST_F(EncryptionOperationsTest, AesOcbVariousChunkLengths) {
1808 for (unsigned chunk_length = 1; chunk_length <= 128; ++chunk_length) {
Shawn Willden2c242002015-02-27 07:01:02 -07001809 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(
1810 chunk_length, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001811 string message(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001812 string nonce;
1813 string ciphertext = EncryptMessage(message, &nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001814 int expected_tag_count = (message.length() + chunk_length - 1) / chunk_length;
Shawn Willdendfa1c032015-02-07 00:39:01 -07001815 EXPECT_EQ(message.length() + 16 * expected_tag_count, ciphertext.size())
Shawn Willden6dde87c2014-12-11 14:08:48 -07001816 << "Unexpected ciphertext size for chunk length " << chunk_length
1817 << " expected tag count was " << expected_tag_count
1818 << " but actual tag count was probably "
1819 << (ciphertext.size() - message.length() - 12) / 16;
1820
Shawn Willdendfa1c032015-02-07 00:39:01 -07001821 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001822 EXPECT_EQ(message, plaintext);
1823 }
1824}
1825
1826TEST_F(EncryptionOperationsTest, AesOcbAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -07001827 ASSERT_EQ(KM_ERROR_OK,
1828 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001829 string message = "Hello";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001830
Shawn Willdendfa1c032015-02-07 00:39:01 -07001831 AuthorizationSet input_set, output_set;
1832 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_set, &output_set));
1833 EXPECT_EQ(1, output_set.size());
1834 EXPECT_EQ(0, output_set.find(TAG_NONCE));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001835
1836 string result;
1837 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001838 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1839 EXPECT_EQ(message.length(), input_consumed);
1840 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001841}
1842
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001843TEST_F(EncryptionOperationsTest, AesOcbNoChunkLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001844 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenc24c1102014-12-22 15:30:09 -07001845 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001846 .Authorization(TAG_BLOCK_MODE, KM_MODE_OCB)
1847 .Authorization(TAG_MAC_LENGTH, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001848 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001849}
1850
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001851TEST_F(EncryptionOperationsTest, AesOcbPaddingUnsupported) {
Shawn Willden2c242002015-02-27 07:01:02 -07001852 ASSERT_EQ(
1853 KM_ERROR_OK,
1854 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Authorization(
1855 TAG_PADDING, KM_PAD_ZERO)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001856 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001857}
1858
1859TEST_F(EncryptionOperationsTest, AesOcbInvalidMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001860 ASSERT_EQ(KM_ERROR_OK,
1861 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 17)));
Shawn Willden63ac0432014-12-29 14:07:08 -07001862 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001863}
1864
Shawn Willdendfa1c032015-02-07 00:39:01 -07001865uint8_t rfc_7523_test_key_data[] = {
1866 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1867};
1868string rfc_7523_test_key = make_string(rfc_7523_test_key_data);
1869
1870TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector1) {
1871 uint8_t nonce[] = {
1872 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
1873 };
1874 uint8_t expected_ciphertext[] = {
1875 0x78, 0x54, 0x07, 0xBF, 0xFF, 0xC8, 0xAD, 0x9E,
1876 0xDC, 0xC5, 0x52, 0x0A, 0xC9, 0x11, 0x1E, 0xE6,
1877 };
1878 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1879 "" /* plaintext */, make_string(expected_ciphertext));
1880}
1881
1882TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector2) {
1883 uint8_t nonce[] = {
1884 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x01,
1885 };
1886 uint8_t associated_data[] = {
1887 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1888 };
1889 uint8_t plaintext[] = {
1890 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1891 };
1892 uint8_t expected_ciphertext[] = {
1893 0x68, 0x20, 0xB3, 0x65, 0x7B, 0x6F, 0x61, 0x5A, 0x57, 0x25, 0xBD, 0xA0,
1894 0xD3, 0xB4, 0xEB, 0x3A, 0x25, 0x7C, 0x9A, 0xF1, 0xF8, 0xF0, 0x30, 0x09,
1895 };
1896 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1897 make_string(plaintext), make_string(expected_ciphertext));
1898}
1899
1900TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector3) {
1901 uint8_t nonce[] = {
1902 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x02,
1903 };
1904 uint8_t associated_data[] = {
1905 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1906 };
1907 uint8_t expected_ciphertext[] = {
1908 0x81, 0x01, 0x7F, 0x82, 0x03, 0xF0, 0x81, 0x27,
1909 0x71, 0x52, 0xFA, 0xDE, 0x69, 0x4A, 0x0A, 0x00,
1910 };
1911 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1912 "" /* plaintext */, make_string(expected_ciphertext));
1913}
1914
1915TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector4) {
1916 uint8_t nonce[] = {
1917 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x03,
1918 };
1919 uint8_t plaintext[] = {
1920 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1921 };
1922 uint8_t expected_ciphertext[] = {
1923 0x45, 0xDD, 0x69, 0xF8, 0xF5, 0xAA, 0xE7, 0x24, 0x14, 0x05, 0x4C, 0xD1,
1924 0xF3, 0x5D, 0x82, 0x76, 0x0B, 0x2C, 0xD0, 0x0D, 0x2F, 0x99, 0xBF, 0xA9,
1925 };
1926 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1927 make_string(plaintext), make_string(expected_ciphertext));
1928}
1929
1930TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector5) {
1931 uint8_t nonce[] = {
1932 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x04,
1933 };
1934 uint8_t associated_data[] = {
1935 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1936 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1937 };
1938 uint8_t plaintext[] = {
1939 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1940 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1941 };
1942 uint8_t expected_ciphertext[] = {
1943 0x57, 0x1D, 0x53, 0x5B, 0x60, 0xB2, 0x77, 0x18, 0x8B, 0xE5, 0x14,
1944 0x71, 0x70, 0xA9, 0xA2, 0x2C, 0x3A, 0xD7, 0xA4, 0xFF, 0x38, 0x35,
1945 0xB8, 0xC5, 0x70, 0x1C, 0x1C, 0xCE, 0xC8, 0xFC, 0x33, 0x58,
1946 };
1947 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1948 make_string(plaintext), make_string(expected_ciphertext));
1949}
1950
1951TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector6) {
1952 uint8_t nonce[] = {
1953 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x05,
1954 };
1955 uint8_t associated_data[] = {
1956 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1957 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1958 };
1959 uint8_t expected_ciphertext[] = {
1960 0x8C, 0xF7, 0x61, 0xB6, 0x90, 0x2E, 0xF7, 0x64,
1961 0x46, 0x2A, 0xD8, 0x64, 0x98, 0xCA, 0x6B, 0x97,
1962 };
1963 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1964 "" /* plaintext */, make_string(expected_ciphertext));
1965}
1966
1967TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector7) {
1968 uint8_t nonce[] = {
1969 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x06,
1970 };
1971 uint8_t plaintext[] = {
1972 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1973 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1974 };
1975 uint8_t expected_ciphertext[] = {
1976 0x5C, 0xE8, 0x8E, 0xC2, 0xE0, 0x69, 0x27, 0x06, 0xA9, 0x15, 0xC0,
1977 0x0A, 0xEB, 0x8B, 0x23, 0x96, 0xF4, 0x0E, 0x1C, 0x74, 0x3F, 0x52,
1978 0x43, 0x6B, 0xDF, 0x06, 0xD8, 0xFA, 0x1E, 0xCA, 0x34, 0x3D,
1979 };
1980 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1981 make_string(plaintext), make_string(expected_ciphertext));
1982}
1983
1984TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector8) {
1985 uint8_t nonce[] = {
1986 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x07,
1987 };
1988 uint8_t associated_data[] = {
1989 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1990 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1991 };
1992 uint8_t plaintext[] = {
1993 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1994 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1995 };
1996 uint8_t expected_ciphertext[] = {
1997 0x1C, 0xA2, 0x20, 0x73, 0x08, 0xC8, 0x7C, 0x01, 0x07, 0x56, 0x10, 0x4D, 0x88, 0x40,
1998 0xCE, 0x19, 0x52, 0xF0, 0x96, 0x73, 0xA4, 0x48, 0xA1, 0x22, 0xC9, 0x2C, 0x62, 0x24,
1999 0x10, 0x51, 0xF5, 0x73, 0x56, 0xD7, 0xF3, 0xC9, 0x0B, 0xB0, 0xE0, 0x7F,
2000 };
2001 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2002 make_string(plaintext), make_string(expected_ciphertext));
2003}
2004
2005TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector9) {
2006 uint8_t nonce[] = {
2007 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x08,
2008 };
2009 uint8_t associated_data[] = {
2010 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
2011 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2012 };
2013 uint8_t expected_ciphertext[] = {
2014 0x6D, 0xC2, 0x25, 0xA0, 0x71, 0xFC, 0x1B, 0x9F,
2015 0x7C, 0x69, 0xF9, 0x3B, 0x0F, 0x1E, 0x10, 0xDE,
2016 };
2017 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2018 "" /* plaintext */, make_string(expected_ciphertext));
2019}
2020
2021TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector10) {
2022 uint8_t nonce[] = {
2023 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x09,
2024 };
2025 uint8_t plaintext[] = {
2026 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
2027 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2028 };
2029 uint8_t expected_ciphertext[] = {
2030 0x22, 0x1B, 0xD0, 0xDE, 0x7F, 0xA6, 0xFE, 0x99, 0x3E, 0xCC, 0xD7, 0x69, 0x46, 0x0A,
2031 0x0A, 0xF2, 0xD6, 0xCD, 0xED, 0x0C, 0x39, 0x5B, 0x1C, 0x3C, 0xE7, 0x25, 0xF3, 0x24,
2032 0x94, 0xB9, 0xF9, 0x14, 0xD8, 0x5C, 0x0B, 0x1E, 0xB3, 0x83, 0x57, 0xFF,
2033 };
2034 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
2035 make_string(plaintext), make_string(expected_ciphertext));
2036}
2037
2038TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector11) {
2039 uint8_t nonce[] = {
2040 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0A,
2041 };
2042 uint8_t associated_data[] = {
2043 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2044 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2045 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2046 };
2047 uint8_t plaintext[] = {
2048 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2049 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2050 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2051 };
2052 uint8_t expected_ciphertext[] = {
2053 0xBD, 0x6F, 0x6C, 0x49, 0x62, 0x01, 0xC6, 0x92, 0x96, 0xC1, 0x1E, 0xFD,
2054 0x13, 0x8A, 0x46, 0x7A, 0xBD, 0x3C, 0x70, 0x79, 0x24, 0xB9, 0x64, 0xDE,
2055 0xAF, 0xFC, 0x40, 0x31, 0x9A, 0xF5, 0xA4, 0x85, 0x40, 0xFB, 0xBA, 0x18,
2056 0x6C, 0x55, 0x53, 0xC6, 0x8A, 0xD9, 0xF5, 0x92, 0xA7, 0x9A, 0x42, 0x40,
2057 };
2058 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2059 make_string(plaintext), make_string(expected_ciphertext));
2060}
2061
2062TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector12) {
2063 uint8_t nonce[] = {
2064 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0B,
2065 };
2066 uint8_t associated_data[] = {
2067 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2068 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2069 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2070 };
2071 uint8_t plaintext[] = {};
2072 uint8_t expected_ciphertext[] = {
2073 0xFE, 0x80, 0x69, 0x0B, 0xEE, 0x8A, 0x48, 0x5D,
2074 0x11, 0xF3, 0x29, 0x65, 0xBC, 0x9D, 0x2A, 0x32,
2075 };
2076 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2077 "" /* plaintext */, make_string(expected_ciphertext));
2078}
2079
2080TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector13) {
2081 uint8_t nonce[] = {
2082 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0C,
2083 };
2084 uint8_t associated_data[] = {};
2085 uint8_t plaintext[] = {
2086 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2087 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
2088 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
2089 };
2090 uint8_t expected_ciphertext[] = {
2091 0x29, 0x42, 0xBF, 0xC7, 0x73, 0xBD, 0xA2, 0x3C, 0xAB, 0xC6, 0xAC, 0xFD,
2092 0x9B, 0xFD, 0x58, 0x35, 0xBD, 0x30, 0x0F, 0x09, 0x73, 0x79, 0x2E, 0xF4,
2093 0x60, 0x40, 0xC5, 0x3F, 0x14, 0x32, 0xBC, 0xDF, 0xB5, 0xE1, 0xDD, 0xE3,
2094 0xBC, 0x18, 0xA5, 0xF8, 0x40, 0xB5, 0x2E, 0x65, 0x34, 0x44, 0xD5, 0xDF,
2095 };
2096 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
2097 make_string(plaintext), make_string(expected_ciphertext));
2098}
2099
2100TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector14) {
2101 uint8_t nonce[] = {
2102 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0D,
2103 };
2104 uint8_t associated_data[] = {
2105 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2106 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2107 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2108 };
2109 uint8_t plaintext[] = {
2110 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2111 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2112 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2113 };
2114 uint8_t expected_ciphertext[] = {
2115 0xD5, 0xCA, 0x91, 0x74, 0x84, 0x10, 0xC1, 0x75, 0x1F, 0xF8, 0xA2, 0xF6, 0x18, 0x25,
2116 0x5B, 0x68, 0xA0, 0xA1, 0x2E, 0x09, 0x3F, 0xF4, 0x54, 0x60, 0x6E, 0x59, 0xF9, 0xC1,
2117 0xD0, 0xDD, 0xC5, 0x4B, 0x65, 0xE8, 0x62, 0x8E, 0x56, 0x8B, 0xAD, 0x7A, 0xED, 0x07,
2118 0xBA, 0x06, 0xA4, 0xA6, 0x94, 0x83, 0xA7, 0x03, 0x54, 0x90, 0xC5, 0x76, 0x9E, 0x60,
2119 };
2120 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2121 make_string(plaintext), make_string(expected_ciphertext));
2122}
2123
2124TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector15) {
2125 uint8_t nonce[] = {
2126 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0E,
2127 };
2128 uint8_t associated_data[] = {
2129 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2130 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2131 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2132 };
2133 uint8_t plaintext[] = {};
2134 uint8_t expected_ciphertext[] = {
2135 0xC5, 0xCD, 0x9D, 0x18, 0x50, 0xC1, 0x41, 0xE3,
2136 0x58, 0x64, 0x99, 0x94, 0xEE, 0x70, 0x1B, 0x68,
2137 };
2138 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
2139 "" /* plaintext */, make_string(expected_ciphertext));
2140}
2141
2142TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector16) {
2143 uint8_t nonce[] = {
2144 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0F,
2145 };
2146 uint8_t associated_data[] = {};
2147 uint8_t plaintext[] = {
2148 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
2149 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
2150 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
2151 };
2152 uint8_t expected_ciphertext[] = {
2153 0x44, 0x12, 0x92, 0x34, 0x93, 0xC5, 0x7D, 0x5D, 0xE0, 0xD7, 0x00, 0xF7, 0x53, 0xCC,
2154 0xE0, 0xD1, 0xD2, 0xD9, 0x50, 0x60, 0x12, 0x2E, 0x9F, 0x15, 0xA5, 0xDD, 0xBF, 0xC5,
2155 0x78, 0x7E, 0x50, 0xB5, 0xCC, 0x55, 0xEE, 0x50, 0x7B, 0xCB, 0x08, 0x4E, 0x47, 0x9A,
2156 0xD3, 0x63, 0xAC, 0x36, 0x6B, 0x95, 0xA9, 0x8C, 0xA5, 0xF3, 0x00, 0x0B, 0x14, 0x79,
2157 };
2158 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
2159 make_string(plaintext), make_string(expected_ciphertext));
2160}
2161
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002162TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07002163 ASSERT_EQ(KM_ERROR_OK,
2164 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
2165 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002166 // Two-block message.
2167 string message = "12345678901234567890123456789012";
2168 string ciphertext1 = EncryptMessage(message);
2169 EXPECT_EQ(message.size(), ciphertext1.size());
2170
2171 string ciphertext2 = EncryptMessage(string(message));
2172 EXPECT_EQ(message.size(), ciphertext2.size());
2173
2174 // ECB is deterministic.
2175 EXPECT_EQ(ciphertext1, ciphertext2);
2176
2177 string plaintext = DecryptMessage(ciphertext1);
2178 EXPECT_EQ(message, plaintext);
2179}
2180
2181TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07002182 ASSERT_EQ(KM_ERROR_OK,
2183 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
2184 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002185 // Message is slightly shorter than two blocks.
2186 string message = "1234567890123456789012345678901";
2187
2188 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
2189 string ciphertext;
2190 size_t input_consumed;
2191 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
2192 EXPECT_EQ(message.size(), input_consumed);
2193 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
2194}
2195
2196TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002197 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002198 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002199 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
2200 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002201
2202 // Try various message lengths; all should work.
2203 for (int i = 0; i < 32; ++i) {
2204 string message(i, 'a');
2205 string ciphertext = EncryptMessage(message);
2206 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
2207 string plaintext = DecryptMessage(ciphertext);
2208 EXPECT_EQ(message, plaintext);
2209 }
2210}
2211
2212TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07002213 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002214 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002215 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
2216 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002217
2218 string message = "a";
2219 string ciphertext = EncryptMessage(message);
2220 EXPECT_EQ(16, ciphertext.size());
2221 EXPECT_NE(ciphertext, message);
2222 ++ciphertext[ciphertext.size() / 2];
2223
2224 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
2225 string plaintext;
2226 size_t input_consumed;
2227 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
2228 EXPECT_EQ(ciphertext.size(), input_consumed);
2229 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
2230}
2231
2232TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07002233 ASSERT_EQ(KM_ERROR_OK,
2234 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
2235 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002236 // Two-block message.
2237 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002238 string iv1;
2239 string ciphertext1 = EncryptMessage(message, &iv1);
2240 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002241
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002242 string iv2;
2243 string ciphertext2 = EncryptMessage(message, &iv2);
2244 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002245
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002246 // IVs should be random, so ciphertexts should differ.
2247 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002248 EXPECT_NE(ciphertext1, ciphertext2);
2249
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002250 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002251 EXPECT_EQ(message, plaintext);
2252}
2253
2254TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002255 ASSERT_EQ(KM_ERROR_OK,
2256 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
2257 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002258
2259 int increment = 15;
2260 string message(240, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002261 AuthorizationSet input_params;
2262 AuthorizationSet output_params;
2263 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2264
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002265 string ciphertext;
2266 size_t input_consumed;
2267 for (size_t i = 0; i < message.size(); i += increment)
2268 EXPECT_EQ(KM_ERROR_OK,
2269 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2270 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002271 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002272
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002273 // Move TAG_NONCE into input_params
2274 input_params.Reinitialize(output_params);
2275 output_params.Clear();
2276
2277 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002278 string plaintext;
2279 for (size_t i = 0; i < ciphertext.size(); i += increment)
2280 EXPECT_EQ(KM_ERROR_OK,
2281 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2282 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002283 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002284 EXPECT_EQ(message, plaintext);
2285}
2286
2287TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002288 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002289 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002290 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2291 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002292
2293 // Try various message lengths; all should work.
2294 for (int i = 0; i < 32; ++i) {
2295 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002296 string iv;
2297 string ciphertext = EncryptMessage(message, &iv);
2298 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
2299 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002300 EXPECT_EQ(message, plaintext);
2301 }
2302}
2303
Shawn Willdencd695822015-01-26 14:06:32 -07002304typedef KeymasterTest AddEntropyTest;
2305TEST_F(AddEntropyTest, AddEntropy) {
2306 // There's no obvious way to test that entropy is actually added, but we can test that the API
2307 // doesn't blow up or return an error.
2308 EXPECT_EQ(KM_ERROR_OK,
2309 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
2310}
2311
Shawn Willden5fad7852015-01-26 16:10:56 -07002312typedef KeymasterTest RescopingTest;
2313TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willden2c242002015-02-27 07:01:02 -07002314 ASSERT_EQ(
2315 KM_ERROR_OK,
2316 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Authorization(
2317 TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)));
Shawn Willden5fad7852015-01-26 16:10:56 -07002318 // TODO(swillden): Add a better error code for this.
2319 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, BeginOperation(KM_PURPOSE_ENCRYPT));
2320}
2321
2322TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07002323 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07002324 .AesEncryptionKey(128)
2325 .OcbMode(4096, 16)
Shawn Willden2c242002015-02-27 07:01:02 -07002326 .Authorization(TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)
2327 .Authorization(TAG_RESCOPING_DEL, KM_TAG_MAC_LENGTH)));
Shawn Willden5fad7852015-01-26 16:10:56 -07002328 EXPECT_FALSE(contains(sw_enforced(), TAG_MAC_LENGTH, 15));
2329 EXPECT_TRUE(contains(sw_enforced(), TAG_MAC_LENGTH, 16));
2330
2331 keymaster_key_blob_t rescoped_blob;
2332 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07002333 AuthorizationSet new_params = AuthorizationSetBuilder()
2334 .AesEncryptionKey(128)
2335 .OcbMode(4096, 15 /* note changed */)
2336 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07002337
2338 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
2339 ASSERT_TRUE(rescoped_characteristics != NULL);
2340
2341 EXPECT_EQ(0, rescoped_characteristics->hw_enforced.length);
2342 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
2343 keymaster_free_characteristics(rescoped_characteristics);
2344 free(rescoped_characteristics);
2345 free(const_cast<uint8_t*>(rescoped_blob.key_material));
2346
2347 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
2348 EXPECT_TRUE(contains(auths, TAG_MAC_LENGTH, 15));
2349 EXPECT_FALSE(contains(auths, TAG_MAC_LENGTH, 16));
2350}
2351
2352TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07002353 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2354 .RsaEncryptionKey(256, 3, KM_PAD_RSA_OAEP)
2355 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
2356 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07002357 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
2358 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
2359 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
2360 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
2361
2362 keymaster_key_blob_t rescoped_blob;
2363 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07002364 AuthorizationSet new_params = AuthorizationSetBuilder()
2365 .RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)
2366 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07002367
2368 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
2369 ASSERT_TRUE(rescoped_characteristics != NULL);
2370
2371 EXPECT_EQ(0, rescoped_characteristics->hw_enforced.length);
2372 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
2373 keymaster_free_characteristics(rescoped_characteristics);
2374 free(rescoped_characteristics);
2375 free(const_cast<uint8_t*>(rescoped_blob.key_material));
2376
2377 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
2378 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
2379 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
2380 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
2381}
2382
2383// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
2384// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
2385// may not be changed.
2386
Shawn Willden128ffe02014-08-06 12:31:33 -06002387} // namespace test
2388} // namespace keymaster