blob: e2a2102627185c287a7d9bbaf559ec9a14049562 [file] [log] [blame]
Shawn Willden128ffe02014-08-06 12:31:33 -06001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Shawn Willden76076ab2014-12-18 08:36:35 -070017#include <algorithm>
Shawn Willden437fbd12014-08-20 11:59:49 -060018#include <fstream>
Shawn Willden76076ab2014-12-18 08:36:35 -070019#include <string>
20#include <vector>
Shawn Willden437fbd12014-08-20 11:59:49 -060021
Shawn Willden128ffe02014-08-06 12:31:33 -060022#include <gtest/gtest.h>
Shawn Willden76364712014-08-11 17:48:04 -060023
Shawn Willden128ffe02014-08-06 12:31:33 -060024#include <openssl/engine.h>
25
Shawn Willden98d9b922014-08-26 08:14:10 -060026#include <keymaster/google_keymaster_utils.h>
27#include <keymaster/keymaster_tags.h>
Shawn Willdenb7510332015-02-06 19:58:29 -070028#include <keymaster/soft_keymaster_device.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060029
Shawn Willden76364712014-08-11 17:48:04 -060030#include "google_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060031
Shawn Willden437fbd12014-08-20 11:59:49 -060032using std::ifstream;
33using std::istreambuf_iterator;
Shawn Willden76076ab2014-12-18 08:36:35 -070034using std::string;
35using std::vector;
Shawn Willden437fbd12014-08-20 11:59:49 -060036
Shawn Willden128ffe02014-08-06 12:31:33 -060037int main(int argc, char** argv) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -070038 ERR_load_crypto_strings();
Shawn Willden128ffe02014-08-06 12:31:33 -060039 ::testing::InitGoogleTest(&argc, argv);
40 int result = RUN_ALL_TESTS();
41 // Clean up stuff OpenSSL leaves around, so Valgrind doesn't complain.
42 CRYPTO_cleanup_all_ex_data();
Shawn Willden7c0a82b2014-09-17 12:57:32 -060043 ERR_remove_thread_state(NULL);
Shawn Willden128ffe02014-08-06 12:31:33 -060044 ERR_free_strings();
45 return result;
46}
47
Shawn Willden63ac0432014-12-29 14:07:08 -070048template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
49 os << "{ ";
50 bool first = true;
51 for (T t : vec) {
52 os << (first ? "" : ", ") << t;
53 if (first)
54 first = false;
55 }
56 os << " }";
57 return os;
58}
59
Shawn Willden128ffe02014-08-06 12:31:33 -060060namespace keymaster {
61namespace test {
62
Shawn Willdenb15d77e2014-12-17 16:44:29 -070063/**
64 * Utility class to make construction of AuthorizationSets easy, and readable. Use like:
65 *
66 * ParamBuilder()
67 * .Option(TAG_ALGORITHM, KM_ALGORITHM_RSA)
68 * .Option(TAG_KEY_SIZE, 512)
69 * .Option(TAG_DIGEST, KM_DIGEST_NONE)
70 * .Option(TAG_PADDING, KM_PAD_NONE)
71 * .Option(TAG_SINGLE_USE_PER_BOOT, true)
72 * .build();
73 *
74 * In addition there are methods that add common sets of parameters, like RsaSigningKey().
75 */
76class ParamBuilder {
77 public:
78 template <typename TagType, typename ValueType>
79 ParamBuilder& Option(TagType tag, ValueType value) {
80 set.push_back(tag, value);
81 return *this;
82 }
83
84 ParamBuilder& RsaKey(uint32_t key_size = 0, uint64_t public_exponent = 0) {
85 Option(TAG_ALGORITHM, KM_ALGORITHM_RSA);
86 if (key_size != 0)
87 Option(TAG_KEY_SIZE, key_size);
88 if (public_exponent != 0)
89 Option(TAG_RSA_PUBLIC_EXPONENT, public_exponent);
90 return *this;
91 }
92
93 ParamBuilder& EcdsaKey(uint32_t key_size = 0) {
94 Option(TAG_ALGORITHM, KM_ALGORITHM_ECDSA);
95 if (key_size != 0)
96 Option(TAG_KEY_SIZE, key_size);
97 return *this;
98 }
99
100 ParamBuilder& AesKey(uint32_t key_size) {
101 Option(TAG_ALGORITHM, KM_ALGORITHM_AES);
102 return Option(TAG_KEY_SIZE, key_size);
103 }
104
105 ParamBuilder& HmacKey(uint32_t key_size, keymaster_digest_t digest, uint32_t mac_length) {
106 Option(TAG_ALGORITHM, KM_ALGORITHM_HMAC);
107 Option(TAG_KEY_SIZE, key_size);
108 SigningKey();
109 Option(TAG_DIGEST, digest);
110 return Option(TAG_MAC_LENGTH, mac_length);
111 }
112
113 ParamBuilder& RsaSigningKey(uint32_t key_size = 0, keymaster_digest_t digest = KM_DIGEST_NONE,
114 keymaster_padding_t padding = KM_PAD_NONE,
115 uint64_t public_exponent = 0) {
116 RsaKey(key_size, public_exponent);
117 SigningKey();
118 Option(TAG_DIGEST, digest);
119 return Option(TAG_PADDING, padding);
120 }
121
122 ParamBuilder& RsaEncryptionKey(uint32_t key_size = 0,
123 keymaster_padding_t padding = KM_PAD_RSA_OAEP,
124 uint64_t public_exponent = 0) {
125 RsaKey(key_size, public_exponent);
126 EncryptionKey();
127 return Option(TAG_PADDING, padding);
128 }
129
130 ParamBuilder& EcdsaSigningKey(uint32_t key_size = 0) {
131 EcdsaKey(key_size);
132 return SigningKey();
133 }
134
Shawn Willden3b702e22015-02-05 10:26:47 -0700135 ParamBuilder& AesEncryptionKey(uint32_t key_size = 128) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700136 AesKey(key_size);
137 return EncryptionKey();
138 }
139
140 ParamBuilder& SigningKey() {
141 Option(TAG_PURPOSE, KM_PURPOSE_SIGN);
142 return Option(TAG_PURPOSE, KM_PURPOSE_VERIFY);
143 }
144
145 ParamBuilder& EncryptionKey() {
146 Option(TAG_PURPOSE, KM_PURPOSE_ENCRYPT);
147 return Option(TAG_PURPOSE, KM_PURPOSE_DECRYPT);
148 }
149
150 ParamBuilder& NoDigestOrPadding() {
151 Option(TAG_DIGEST, KM_DIGEST_NONE);
152 return Option(TAG_PADDING, KM_PAD_NONE);
153 }
154
155 ParamBuilder& OcbMode(uint32_t chunk_length, uint32_t mac_length) {
156 Option(TAG_BLOCK_MODE, KM_MODE_OCB);
157 Option(TAG_CHUNK_LENGTH, chunk_length);
158 return Option(TAG_MAC_LENGTH, mac_length);
159 }
160
161 AuthorizationSet build() const { return set; }
162
163 private:
164 AuthorizationSet set;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600165};
166
Shawn Willden567a4a02014-12-31 12:14:46 -0700167StdoutLogger logger;
168
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700169const uint64_t OP_HANDLE_SENTINEL = 0xFFFFFFFFFFFFFFFF;
Shawn Willden128ffe02014-08-06 12:31:33 -0600170class KeymasterTest : public testing::Test {
171 protected:
Shawn Willden567a4a02014-12-31 12:14:46 -0700172 KeymasterTest() : out_params_(NULL), op_handle_(OP_HANDLE_SENTINEL), characteristics_(NULL) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700173 blob_.key_material = NULL;
174 RAND_seed("foobar", 6);
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700175 blob_.key_material = 0;
Shawn Willden5b53c992015-02-02 08:05:25 -0700176 }
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700177
Shawn Willden5b53c992015-02-02 08:05:25 -0700178 ~KeymasterTest() {
179 FreeCharacteristics();
180 FreeKeyBlob();
Shawn Willdend0772312014-09-18 12:27:57 -0600181 }
182
Shawn Willden30255022015-02-24 14:00:21 -0700183 keymaster1_device_t* device() {
184 return reinterpret_cast<keymaster1_device_t*>(device_.hw_device());
185 }
Shawn Willden5b53c992015-02-02 08:05:25 -0700186
Shawn Willdenc24c1102014-12-22 15:30:09 -0700187 keymaster_error_t GenerateKey(const ParamBuilder& builder) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700188 AuthorizationSet params(builder.build());
189 params.push_back(UserAuthParams());
190 params.push_back(ClientParams());
191
Shawn Willden0d560bf2014-12-15 17:44:02 -0700192 FreeKeyBlob();
193 FreeCharacteristics();
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700194 return device()->generate_key(device(), params.data(), params.size(), &blob_,
195 &characteristics_);
Shawn Willden0d560bf2014-12-15 17:44:02 -0700196 }
197
Shawn Willdenc24c1102014-12-22 15:30:09 -0700198 keymaster_error_t ImportKey(const ParamBuilder& builder, keymaster_key_format_t format,
199 const string& key_material) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700200 AuthorizationSet params(builder.build());
201 params.push_back(UserAuthParams());
202 params.push_back(ClientParams());
203
204 FreeKeyBlob();
205 FreeCharacteristics();
206 return device()->import_key(device(), params.data(), params.size(), format,
207 reinterpret_cast<const uint8_t*>(key_material.c_str()),
208 key_material.length(), &blob_, &characteristics_);
209 }
210
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700211 AuthorizationSet UserAuthParams() {
212 AuthorizationSet set;
213 set.push_back(TAG_USER_ID, 7);
214 set.push_back(TAG_USER_AUTH_ID, 8);
215 set.push_back(TAG_AUTH_TIMEOUT, 300);
216 return set;
217 }
218
219 AuthorizationSet ClientParams() {
220 AuthorizationSet set;
221 set.push_back(TAG_APPLICATION_ID, "app_id", 6);
222 return set;
223 }
224
225 keymaster_error_t BeginOperation(keymaster_purpose_t purpose) {
226 return device()->begin(device(), purpose, &blob_, client_params_,
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700227 array_length(client_params_), &out_params_, &out_params_count_,
228 &op_handle_);
229 }
230
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700231 keymaster_error_t UpdateOperation(const string& message, string* output,
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700232 size_t* input_consumed) {
233 uint8_t* out_tmp = NULL;
234 size_t out_length;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700235 EXPECT_NE(op_handle_, OP_HANDLE_SENTINEL);
236 keymaster_error_t error = device()->update(
Shawn Willden6bfbff02015-02-06 19:48:24 -0700237 device(), op_handle_, NULL /* additional_params */, 0 /* additional_params_count */,
238 reinterpret_cast<const uint8_t*>(message.c_str()), message.length(), input_consumed,
239 &out_tmp, &out_length);
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700240 if (out_tmp)
241 output->append(reinterpret_cast<char*>(out_tmp), out_length);
242 free(out_tmp);
243 return error;
244 }
245
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700246 keymaster_error_t FinishOperation(string* output) { return FinishOperation("", output); }
247
248 keymaster_error_t FinishOperation(const string& signature, string* output) {
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700249 uint8_t* out_tmp = NULL;
250 size_t out_length;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700251 keymaster_error_t error = device()->finish(
Shawn Willden6bfbff02015-02-06 19:48:24 -0700252 device(), op_handle_, NULL /* additional_params */, 0 /* additional_params_count */,
253 reinterpret_cast<const uint8_t*>(signature.c_str()), signature.length(), &out_tmp,
254 &out_length);
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700255 if (out_tmp)
256 output->append(reinterpret_cast<char*>(out_tmp), out_length);
257 free(out_tmp);
258 return error;
259 }
260
Shawn Willden76076ab2014-12-18 08:36:35 -0700261 template <typename T>
262 bool ResponseContains(const vector<T>& expected, const T* values, size_t len) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700263 return expected.size() == len &&
264 std::is_permutation(values, values + len, expected.begin());
Shawn Willden76076ab2014-12-18 08:36:35 -0700265 }
266
267 template <typename T> bool ResponseContains(T expected, const T* values, size_t len) {
268 return (len == 1 && *values == expected);
Shawn Willdend0772312014-09-18 12:27:57 -0600269 }
270
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700271 keymaster_error_t AbortOperation() { return device()->abort(device(), op_handle_); }
272
273 string ProcessMessage(keymaster_purpose_t purpose, const string& message) {
274 EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose));
275
276 string result;
277 size_t input_consumed;
278 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
279 EXPECT_EQ(message.size(), input_consumed);
280 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&result));
281 return result;
282 }
283
284 string ProcessMessage(keymaster_purpose_t purpose, const string& message,
285 const string& signature) {
286 EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose));
287
288 string result;
289 size_t input_consumed;
290 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
291 EXPECT_EQ(message.size(), input_consumed);
292 EXPECT_EQ(KM_ERROR_OK, FinishOperation(signature, &result));
293 return result;
294 }
295
296 void SignMessage(const string& message, string* signature) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700297 SCOPED_TRACE("SignMessage");
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700298 *signature = ProcessMessage(KM_PURPOSE_SIGN, message);
299 EXPECT_GT(signature->size(), 0);
300 }
301
302 void VerifyMessage(const string& message, const string& signature) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700303 SCOPED_TRACE("VerifyMessage");
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700304 ProcessMessage(KM_PURPOSE_VERIFY, message, signature);
305 }
306
307 string EncryptMessage(const string& message) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700308 SCOPED_TRACE("EncryptMessage");
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700309 return ProcessMessage(KM_PURPOSE_ENCRYPT, message);
310 }
311
312 string DecryptMessage(const string& ciphertext) {
Shawn Willden63ac0432014-12-29 14:07:08 -0700313 SCOPED_TRACE("DecryptMessage");
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700314 return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext);
315 }
316
317 keymaster_error_t GetCharacteristics() {
318 FreeCharacteristics();
319 return device()->get_key_characteristics(device(), &blob_, &client_id_, NULL /* app_data */,
320 &characteristics_);
321 }
322
323 keymaster_error_t ExportKey(keymaster_key_format_t format, string* export_data) {
324 uint8_t* export_data_tmp;
325 size_t export_data_length;
326
327 keymaster_error_t error =
328 device()->export_key(device(), format, &blob_, &client_id_, NULL /* app_data */,
329 &export_data_tmp, &export_data_length);
330
331 if (error != KM_ERROR_OK)
332 return error;
333
334 *export_data = string(reinterpret_cast<char*>(export_data_tmp), export_data_length);
335 free(export_data_tmp);
336 return error;
337 }
338
339 keymaster_error_t GetVersion(uint8_t* major, uint8_t* minor, uint8_t* subminor) {
340 GetVersionRequest request;
341 GetVersionResponse response;
342 device_.GetVersion(request, &response);
343 if (response.error != KM_ERROR_OK)
344 return response.error;
345 *major = response.major_ver;
346 *minor = response.minor_ver;
347 *subminor = response.subminor_ver;
348 return response.error;
349 }
350
Shawn Willden3b702e22015-02-05 10:26:47 -0700351 void CheckHmacTestVector(string key, string message, keymaster_digest_t digest,
352 string expected_mac) {
353 ASSERT_EQ(KM_ERROR_OK,
354 ImportKey(ParamBuilder().HmacKey(key.size() * 8, digest, expected_mac.size()),
355 KM_KEY_FORMAT_RAW, key));
356 string signature;
357 SignMessage(message, &signature);
358 EXPECT_EQ(expected_mac, signature) << "Test vector didn't match for digest " << digest;
359 }
360
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700361 AuthorizationSet hw_enforced() {
362 EXPECT_TRUE(characteristics_ != NULL);
363 return AuthorizationSet(characteristics_->hw_enforced);
364 }
365
366 AuthorizationSet sw_enforced() {
367 EXPECT_TRUE(characteristics_ != NULL);
368 return AuthorizationSet(characteristics_->sw_enforced);
369 }
370
Shawn Willden5b53c992015-02-02 08:05:25 -0700371 void FreeCharacteristics() {
372 keymaster_free_characteristics(characteristics_);
373 free(characteristics_);
374 characteristics_ = NULL;
375 }
376
377 void FreeKeyBlob() {
378 free(const_cast<uint8_t*>(blob_.key_material));
379 blob_.key_material = NULL;
380 }
381
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700382 void corrupt_key_blob() {
383 assert(blob_.key_material);
384 uint8_t* tmp = const_cast<uint8_t*>(blob_.key_material);
385 ++tmp[blob_.key_material_size / 2];
386 }
Shawn Willden5b53c992015-02-02 08:05:25 -0700387
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700388 private:
389 SoftKeymasterDevice device_;
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700390 keymaster_blob_t client_id_ = {.data = reinterpret_cast<const uint8_t*>("app_id"),
391 .data_length = 6};
392 keymaster_key_param_t client_params_[1] = {
393 Authorization(TAG_APPLICATION_ID, client_id_.data, client_id_.data_length)};
394
395 keymaster_key_param_t* out_params_;
396 size_t out_params_count_;
397 uint64_t op_handle_;
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700398
Shawn Willden5b53c992015-02-02 08:05:25 -0700399 keymaster_key_blob_t blob_;
400 keymaster_key_characteristics_t* characteristics_;
Shawn Willden128ffe02014-08-06 12:31:33 -0600401};
402
Shawn Willden128ffe02014-08-06 12:31:33 -0600403typedef KeymasterTest CheckSupported;
404TEST_F(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700405 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
406 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600407
Shawn Willden5b53c992015-02-02 08:05:25 -0700408 size_t len;
409 keymaster_algorithm_t* algorithms;
410 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -0700411 EXPECT_TRUE(ResponseContains(
412 {KM_ALGORITHM_RSA, KM_ALGORITHM_ECDSA, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms,
413 len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700414 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -0600415}
416
417TEST_F(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700418 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
419 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
420 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600421
Shawn Willden5b53c992015-02-02 08:05:25 -0700422 size_t len;
423 keymaster_block_mode_t* modes;
Shawn Willden63ac0432014-12-29 14:07:08 -0700424 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
425 KM_PURPOSE_ENCRYPT, &modes, &len));
426 EXPECT_EQ(0, len);
427 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600428
Shawn Willden76076ab2014-12-18 08:36:35 -0700429 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
Shawn Willden5b53c992015-02-02 08:05:25 -0700430 device()->get_supported_block_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_ENCRYPT,
431 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600432
Shawn Willden63ac0432014-12-29 14:07:08 -0700433 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden5b53c992015-02-02 08:05:25 -0700434 device()->get_supported_block_modes(device(), KM_ALGORITHM_ECDSA, KM_PURPOSE_ENCRYPT,
435 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600436
Shawn Willden63ac0432014-12-29 14:07:08 -0700437 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
438 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willden498e0aa2015-03-04 15:35:45 -0700439 EXPECT_TRUE(ResponseContains({KM_MODE_OCB, KM_MODE_ECB, KM_MODE_CBC}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700440 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600441}
442
443TEST_F(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700444 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
445 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
446 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600447
Shawn Willden5b53c992015-02-02 08:05:25 -0700448 size_t len;
449 keymaster_padding_t* modes;
450 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
451 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700452 EXPECT_TRUE(
453 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700454 free(modes);
455
456 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
457 KM_PURPOSE_ENCRYPT, &modes, &len));
458 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700459 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600460
Shawn Willden76076ab2014-12-18 08:36:35 -0700461 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
462 device()->get_supported_padding_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_SIGN,
463 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600464
Shawn Willden5b53c992015-02-02 08:05:25 -0700465 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_ECDSA,
466 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700467 EXPECT_EQ(0, len);
468 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700469
470 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
471 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
472 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600473}
474
475TEST_F(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700476 EXPECT_EQ(
477 KM_ERROR_OUTPUT_PARAMETER_NULL,
478 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600479
Shawn Willden5b53c992015-02-02 08:05:25 -0700480 size_t len;
481 keymaster_digest_t* digests;
482 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
483 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700484 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700485 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600486
Shawn Willden76076ab2014-12-18 08:36:35 -0700487 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
488 device()->get_supported_digests(device(), KM_ALGORITHM_DSA, KM_PURPOSE_SIGN, &digests,
489 &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600490
Shawn Willden5b53c992015-02-02 08:05:25 -0700491 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_ECDSA,
492 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700493 EXPECT_EQ(0, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700494 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600495
Shawn Willden63ac0432014-12-29 14:07:08 -0700496 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
497 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
498 &len));
499
500 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700501 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700502 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
503 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
504 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700505 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600506}
507
508TEST_F(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700509 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
510 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600511
Shawn Willden5b53c992015-02-02 08:05:25 -0700512 size_t len;
513 keymaster_key_format_t* formats;
514 EXPECT_EQ(KM_ERROR_OK,
515 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700516 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700517 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700518
519 EXPECT_EQ(KM_ERROR_OK,
520 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
521 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
522 free(formats);
523
524 EXPECT_EQ(KM_ERROR_OK,
525 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
526 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
527 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600528}
529
530TEST_F(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700531 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
532 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600533
Shawn Willden5b53c992015-02-02 08:05:25 -0700534 size_t len;
535 keymaster_key_format_t* formats;
536 EXPECT_EQ(KM_ERROR_OK,
537 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700538 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700539 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600540
Shawn Willden76076ab2014-12-18 08:36:35 -0700541 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
Shawn Willden5b53c992015-02-02 08:05:25 -0700542 device()->get_supported_export_formats(device(), KM_ALGORITHM_DSA, &formats, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600543
Shawn Willden5b53c992015-02-02 08:05:25 -0700544 EXPECT_EQ(KM_ERROR_OK,
545 device()->get_supported_export_formats(device(), KM_ALGORITHM_ECDSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700546 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700547 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600548
Shawn Willden5b53c992015-02-02 08:05:25 -0700549 EXPECT_EQ(KM_ERROR_OK,
550 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
551 EXPECT_EQ(0, len);
552 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700553
554 EXPECT_EQ(KM_ERROR_OK,
555 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
556 EXPECT_EQ(0, len);
557 free(formats);
558
559 EXPECT_EQ(KM_ERROR_OK,
560 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
561 EXPECT_EQ(0, len);
562 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600563}
564
Shawn Willdend0772312014-09-18 12:27:57 -0600565class NewKeyGeneration : public KeymasterTest {
566 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700567 void CheckBaseParams() {
568 EXPECT_EQ(0U, hw_enforced().size());
569 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600570
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700571 AuthorizationSet auths = sw_enforced();
572 EXPECT_GT(auths.SerializedSize(), 12U);
573
Shawn Willden5b53c992015-02-02 08:05:25 -0700574 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
575 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
576 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
577 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_ID, 8));
578 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600579
580 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700581 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
582 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
583 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600584
585 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700586 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
587 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
588 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600589
590 // Now check that unspecified, defaulted tags are correct.
Shawn Willden5b53c992015-02-02 08:05:25 -0700591 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
592 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600593 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700594};
595
Shawn Willden128ffe02014-08-06 12:31:33 -0600596TEST_F(NewKeyGeneration, Rsa) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700597 ASSERT_EQ(KM_ERROR_OK,
598 GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_NONE, KM_PAD_NONE, 3)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700599 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600600
Shawn Willden5b53c992015-02-02 08:05:25 -0700601 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700602 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700603 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
604 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
605 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600606}
607
Shawn Willden6bbe6782014-09-18 11:26:15 -0600608TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700609 // TODO(swillden): Remove support for defaulting RSA parameter size and pub exponent.
Shawn Willdenc24c1102014-12-22 15:30:09 -0700610 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700611 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600612
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700613 // Check specified tags are all present in unenforced characteristics
614 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600615
616 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700617 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537));
618 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 2048));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600619}
620
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600621TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700622 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey(224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700623 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600624
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700625 // Check specified tags are all present in unenforced characteristics
626 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
627 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600628}
629
Shawn Willden6bbe6782014-09-18 11:26:15 -0600630TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700631 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700632 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600633
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700634 // Check specified tags are all present in unenforced characteristics
635 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600636
637 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700638 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600639}
640
641TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700642 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE, GenerateKey(ParamBuilder().EcdsaSigningKey(190)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600643}
644
645TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600646 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600647 for (size_t size : valid_sizes) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700648 EXPECT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey(size)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700649 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600650 }
651}
652
Shawn Willden19fca882015-01-22 16:35:30 -0700653TEST_F(NewKeyGeneration, AesOcb) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700654 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700655}
656
657TEST_F(NewKeyGeneration, AesOcbInvalidKeySize) {
Shawn Willden7dad93b2015-02-05 10:20:47 -0700658 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
659 GenerateKey(ParamBuilder().AesEncryptionKey(136).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700660}
661
662TEST_F(NewKeyGeneration, AesOcbAllValidSizes) {
Shawn Willden19fca882015-01-22 16:35:30 -0700663 size_t valid_sizes[] = {128, 192, 256};
664 for (size_t size : valid_sizes) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700665 EXPECT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(size)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700666 << "Failed to generate size: " << size;
Shawn Willden19fca882015-01-22 16:35:30 -0700667 }
668}
669
Shawn Willden0d560bf2014-12-15 17:44:02 -0700670TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700671 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700672}
673
Shawn Willden76364712014-08-11 17:48:04 -0600674typedef KeymasterTest GetKeyCharacteristics;
675TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700676 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700677 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600678
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700679 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
680 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600681}
682
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700683typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600684TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700685 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700686 string message = "12345678901234567890123456789012";
687 string signature;
688 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600689}
690
Shawn Willden61902362014-12-18 10:33:24 -0700691TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
692 // Note that without padding, key size must exactly match digest size.
Shawn Willdenf90f2352014-12-18 23:01:15 -0700693 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_SHA_2_256)));
694 string message(1024, 'a');
695 string signature;
696 SignMessage(message, &signature);
697}
698
699TEST_F(SigningOperationsTest, RsaPssSha256Success) {
700 ASSERT_EQ(KM_ERROR_OK,
701 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700702 // Use large message, which won't work without digesting.
703 string message(1024, 'a');
704 string signature;
705 SignMessage(message, &signature);
706}
707
Shawn Willdenf90f2352014-12-18 23:01:15 -0700708TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
709 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256,
710 KM_PAD_RSA_PKCS1_1_5_SIGN)));
711 string message(1024, 'a');
712 string signature;
713 SignMessage(message, &signature);
714}
715
716TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
717 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
718 // that 9 bytes larger than hash won't work.
719 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(
720 256 + 9 * 8, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
721 string message(1024, 'a');
722 string signature;
723
724 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
725
726 string result;
727 size_t input_consumed;
728 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
729 EXPECT_EQ(message.size(), input_consumed);
730 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
731}
732
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600733TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700734 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey(224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700735 string message = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700736 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700737 SignMessage(message, &signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600738}
739
Shawn Willden1615f2e2014-08-13 10:37:40 -0600740TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700741 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700742 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
743 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
744 // Another abort should fail
745 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600746}
747
748TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700749 GenerateKey(
750 ParamBuilder().RsaSigningKey(256, KM_DIGEST_MD5, KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700751 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600752}
753
754TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700755 GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_SHA_2_256 /* supported digest */,
756 KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700757 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600758}
759
760TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700761 // Digest must be specified.
Shawn Willdenc24c1102014-12-22 15:30:09 -0700762 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaKey(256).SigningKey().Option(
763 TAG_PADDING, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700764 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700765 // PSS requires a digest.
766 GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_NONE, KM_PAD_RSA_PSS));
767 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600768}
769
770TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700771 // Padding must be specified
Shawn Willdenc24c1102014-12-22 15:30:09 -0700772 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaKey(256).SigningKey().Option(
773 TAG_DIGEST, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700774 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600775}
776
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700777TEST_F(SigningOperationsTest, HmacSha1Success) {
778 GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA1, 20));
779 string message = "12345678901234567890123456789012";
780 string signature;
781 SignMessage(message, &signature);
782 ASSERT_EQ(20, signature.size());
783}
784
Shawn Willden62c22862014-12-17 08:36:20 -0700785TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700786 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 28)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700787 string message = "12345678901234567890123456789012";
788 string signature;
789 SignMessage(message, &signature);
790 ASSERT_EQ(28, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700791}
792
Shawn Willden0d560bf2014-12-15 17:44:02 -0700793TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700794 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700795 string message = "12345678901234567890123456789012";
796 string signature;
797 SignMessage(message, &signature);
798 ASSERT_EQ(32, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700799}
800
Shawn Willden62c22862014-12-17 08:36:20 -0700801TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700802 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 48)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700803 string message = "12345678901234567890123456789012";
804 string signature;
805 SignMessage(message, &signature);
806 ASSERT_EQ(48, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700807}
808
809TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -0700810 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 64)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700811 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700812 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700813 SignMessage(message, &signature);
814 ASSERT_EQ(64, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700815}
816
Shawn Willden3b702e22015-02-05 10:26:47 -0700817template <size_t N> string make_string(const uint8_t(&a)[N]) {
818 return string(reinterpret_cast<const char*>(a), N);
819}
820
821TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
822 uint8_t key_data[] = {
823 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
824 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
825 };
826 string message = "Hi There";
827 uint8_t sha_224_expected[] = {
828 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
829 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
830 };
831 uint8_t sha_256_expected[] = {
832 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
833 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
834 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
835 };
836 uint8_t sha_384_expected[] = {
837 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
838 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
839 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
840 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
841 };
842 uint8_t sha_512_expected[] = {
843 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
844 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
845 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
846 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
847 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
848 };
849
850 string key = make_string(key_data);
851
852 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
853 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
854 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
855 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
856}
857
858TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
859 string key = "Jefe";
860 string message = "what do ya want for nothing?";
861 uint8_t sha_224_expected[] = {
862 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
863 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
864 };
865 uint8_t sha_256_expected[] = {
866 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
867 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
868 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
869 };
870 uint8_t sha_384_expected[] = {
871 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
872 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
873 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
874 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
875 };
876 uint8_t sha_512_expected[] = {
877 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
878 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
879 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
880 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
881 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
882 };
883
884 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
885 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
886 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
887 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
888}
889
890TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
891 string key(20, 0xaa);
892 string message(50, 0xdd);
893 uint8_t sha_224_expected[] = {
894 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
895 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
896 };
897 uint8_t sha_256_expected[] = {
898 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
899 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
900 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
901 };
902 uint8_t sha_384_expected[] = {
903 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
904 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
905 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
906 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
907 };
908 uint8_t sha_512_expected[] = {
909 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
910 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
911 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
912 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
913 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
914 };
915
916 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
917 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
918 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
919 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
920}
921
922TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
923 uint8_t key_data[25] = {
924 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
925 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
926 };
927 string key = make_string(key_data);
928 string message(50, 0xcd);
929 uint8_t sha_224_expected[] = {
930 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
931 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
932 };
933 uint8_t sha_256_expected[] = {
934 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
935 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
936 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
937 };
938 uint8_t sha_384_expected[] = {
939 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
940 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
941 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
942 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
943 };
944 uint8_t sha_512_expected[] = {
945 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
946 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
947 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
948 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
949 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
950 };
951
952 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
953 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
954 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
955 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
956}
957
958TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
959 string key(20, 0x0c);
960 string message = "Test With Truncation";
961
962 uint8_t sha_224_expected[] = {
963 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
964 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
965 };
966 uint8_t sha_256_expected[] = {
967 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
968 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
969 };
970 uint8_t sha_384_expected[] = {
971 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
972 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
973 };
974 uint8_t sha_512_expected[] = {
975 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
976 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
977 };
978
979 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
980 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
981 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
982 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
983}
984
985TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
986 string key(131, 0xaa);
987 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
988
989 uint8_t sha_224_expected[] = {
990 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
991 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
992 };
993 uint8_t sha_256_expected[] = {
994 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
995 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
996 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
997 };
998 uint8_t sha_384_expected[] = {
999 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
1000 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
1001 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
1002 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
1003 };
1004 uint8_t sha_512_expected[] = {
1005 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
1006 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
1007 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
1008 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
1009 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
1010 };
1011
1012 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1013 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1014 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1015 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1016}
1017
1018TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
1019 string key(131, 0xaa);
1020 string message = "This is a test using a larger than block-size key and a larger than "
1021 "block-size data. The key needs to be hashed before being used by the HMAC "
1022 "algorithm.";
1023
1024 uint8_t sha_224_expected[] = {
1025 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
1026 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
1027 };
1028 uint8_t sha_256_expected[] = {
1029 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
1030 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
1031 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
1032 };
1033 uint8_t sha_384_expected[] = {
1034 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
1035 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
1036 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
1037 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
1038 };
1039 uint8_t sha_512_expected[] = {
1040 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
1041 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
1042 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
1043 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
1044 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
1045 };
1046
1047 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1048 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1049 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1050 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1051}
Shawn Willden0d560bf2014-12-15 17:44:02 -07001052
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001053TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001054 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
1055 .Option(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
1056 .Option(TAG_KEY_SIZE, 128)
1057 .SigningKey()
1058 .Option(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001059 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -07001060}
1061
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001062TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001063 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 33)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001064 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -07001065}
1066
Shawn Willden1615f2e2014-08-13 10:37:40 -06001067TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001068 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001069 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001070
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001071 string message = "1234567890123456789012345678901";
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001072 string result;
1073 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001074 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001075 EXPECT_EQ(0U, result.size());
1076 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -06001077
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001078 string signature;
1079 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
1080 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -06001081}
1082
Shawn Willden61902362014-12-18 10:33:24 -07001083// TODO(swillden): Add more verification failure tests.
1084
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001085typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -06001086TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001087 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001088 string message = "12345678901234567890123456789012";
1089 string signature;
1090 SignMessage(message, &signature);
1091 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -06001092}
1093
Shawn Willden61902362014-12-18 10:33:24 -07001094TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
1095 // Note that without padding, key size must exactly match digest size.
1096 GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_SHA_2_256));
Shawn Willden61902362014-12-18 10:33:24 -07001097 string message(1024, 'a');
1098 string signature;
1099 SignMessage(message, &signature);
1100 VerifyMessage(message, signature);
1101}
1102
Shawn Willdenf90f2352014-12-18 23:01:15 -07001103TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willden61902362014-12-18 10:33:24 -07001104 GenerateKey(ParamBuilder().RsaSigningKey(256, KM_DIGEST_SHA_2_256));
Shawn Willden61902362014-12-18 10:33:24 -07001105 string message(1024, 'a');
1106 string signature;
1107 SignMessage(message, &signature);
1108 ++signature[signature.size() / 2];
1109
1110 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1111
1112 string result;
1113 size_t input_consumed;
1114 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1115 EXPECT_EQ(message.size(), input_consumed);
1116 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1117}
1118
Shawn Willdenf90f2352014-12-18 23:01:15 -07001119TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
1120 ASSERT_EQ(KM_ERROR_OK,
1121 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
1122 // Use large message, which won't work without digesting.
1123 string message(1024, 'a');
1124 string signature;
1125 SignMessage(message, &signature);
1126 VerifyMessage(message, signature);
1127}
1128
1129TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
1130 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS));
1131 string message(1024, 'a');
1132 string signature;
1133 SignMessage(message, &signature);
1134 ++signature[signature.size() / 2];
1135
1136 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1137
1138 string result;
1139 size_t input_consumed;
1140 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1141 EXPECT_EQ(message.size(), input_consumed);
1142 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1143}
1144
1145TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
1146 ASSERT_EQ(KM_ERROR_OK,
1147 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001148 // Use large message, which won't work without digesting.
1149 string message(1024, 'a');
1150 string signature;
1151 SignMessage(message, &signature);
1152 ++message[message.size() / 2];
1153
1154 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1155
1156 string result;
1157 size_t input_consumed;
1158 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1159 EXPECT_EQ(message.size(), input_consumed);
1160 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1161}
1162
Shawn Willdenf90f2352014-12-18 23:01:15 -07001163TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
1164 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN));
1165 string message(1024, 'a');
1166 string signature;
1167 SignMessage(message, &signature);
1168 VerifyMessage(message, signature);
1169}
1170
1171TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
1172 GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN));
1173 string message(1024, 'a');
1174 string signature;
1175 SignMessage(message, &signature);
1176 ++signature[signature.size() / 2];
1177
1178 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1179
1180 string result;
1181 size_t input_consumed;
1182 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1183 EXPECT_EQ(message.size(), input_consumed);
1184 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1185}
1186
1187TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
1188 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(512, KM_DIGEST_SHA_2_256,
1189 KM_PAD_RSA_PKCS1_1_5_SIGN)));
1190 // Use large message, which won't work without digesting.
1191 string message(1024, 'a');
1192 string signature;
1193 SignMessage(message, &signature);
1194 ++message[message.size() / 2];
1195
1196 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
1197
1198 string result;
1199 size_t input_consumed;
1200 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1201 EXPECT_EQ(message.size(), input_consumed);
1202 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1203}
1204
1205template <typename T> vector<T> make_vector(const T* array, size_t len) {
1206 return vector<T>(array, array + len);
1207}
1208
1209TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
1210 // Get all supported digests and padding modes.
1211 size_t digests_len;
1212 keymaster_digest_t* digests;
1213 EXPECT_EQ(KM_ERROR_OK,
1214 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1215 &digests_len));
1216
1217 size_t padding_modes_len;
1218 keymaster_padding_t* padding_modes;
1219 EXPECT_EQ(KM_ERROR_OK,
1220 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1221 &padding_modes, &padding_modes_len));
1222
1223 // Try them.
1224 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1225 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
1226 // Compute key & message size that will work.
1227 size_t key_bits = 256;
1228 size_t message_len = 1000;
1229 switch (digest) {
1230 case KM_DIGEST_NONE:
1231 switch (padding_mode) {
1232 case KM_PAD_NONE:
1233 // Match key size.
1234 message_len = key_bits / 8;
1235 break;
1236 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1237 message_len = key_bits / 8 - 11;
1238 break;
1239 case KM_PAD_RSA_PSS:
1240 // PSS requires a digest.
1241 continue;
1242 default:
1243 FAIL() << "Missing padding";
1244 break;
1245 }
1246 break;
1247
1248 case KM_DIGEST_SHA_2_256:
1249 switch (padding_mode) {
1250 case KM_PAD_NONE:
1251 // Key size matches digest size
1252 break;
1253 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1254 key_bits += 8 * 11;
1255 break;
1256 case KM_PAD_RSA_PSS:
1257 key_bits += 8 * 10;
1258 break;
1259 default:
1260 FAIL() << "Missing padding";
1261 break;
1262 }
1263 break;
1264 default:
1265 FAIL() << "Missing digest";
1266 }
1267
1268 GenerateKey(ParamBuilder().RsaSigningKey(key_bits, digest, padding_mode));
1269 string message(message_len, 'a');
1270 string signature;
1271 SignMessage(message, &signature);
1272 VerifyMessage(message, signature);
1273 }
1274 }
1275
1276 free(padding_modes);
1277 free(digests);
1278}
1279
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001280TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001281 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001282 string message = "123456789012345678901234567890123456789012345678";
1283 string signature;
1284 SignMessage(message, &signature);
1285 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001286}
1287
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001288TEST_F(VerificationOperationsTest, HmacSha1Success) {
1289 GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA1, 16));
1290 string message = "123456789012345678901234567890123456789012345678";
1291 string signature;
1292 SignMessage(message, &signature);
1293 VerifyMessage(message, signature);
1294}
1295
1296TEST_F(VerificationOperationsTest, HmacSha224Success) {
1297 GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 16));
1298 string message = "123456789012345678901234567890123456789012345678";
1299 string signature;
1300 SignMessage(message, &signature);
1301 VerifyMessage(message, signature);
1302}
1303
Shawn Willden0d560bf2014-12-15 17:44:02 -07001304TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001305 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001306 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001307 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001308 SignMessage(message, &signature);
1309 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001310}
1311
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001312TEST_F(VerificationOperationsTest, HmacSha384Success) {
1313 GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 16));
1314 string message = "123456789012345678901234567890123456789012345678";
1315 string signature;
1316 SignMessage(message, &signature);
1317 VerifyMessage(message, signature);
1318}
1319
1320TEST_F(VerificationOperationsTest, HmacSha512Success) {
1321 GenerateKey(ParamBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 16));
1322 string message = "123456789012345678901234567890123456789012345678";
1323 string signature;
1324 SignMessage(message, &signature);
1325 VerifyMessage(message, signature);
1326}
1327
Shawn Willden5b53c992015-02-02 08:05:25 -07001328typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001329TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001330 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001331 string export_data;
1332 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1333 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001334
1335 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001336}
1337
Shawn Willdenf268d742014-08-19 15:36:26 -06001338TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001339 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().EcdsaSigningKey(224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001340 string export_data;
1341 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1342 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001343
1344 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001345}
1346
1347TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001348 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001349 string export_data;
1350 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001351}
1352
1353TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001354 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaSigningKey(256)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001355 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001356 string export_data;
1357 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001358}
1359
Shawn Willden7dad93b2015-02-05 10:20:47 -07001360TEST_F(ExportKeyTest, AesKeyExportFails) {
1361 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128)));
1362 string export_data;
1363
1364 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1365 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1366 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1367}
1368
Shawn Willden437fbd12014-08-20 11:59:49 -06001369static string read_file(const string& file_name) {
1370 ifstream file_stream(file_name, std::ios::binary);
1371 istreambuf_iterator<char> file_begin(file_stream);
1372 istreambuf_iterator<char> file_end;
1373 return string(file_begin, file_end);
1374}
1375
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001376typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001377TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001378 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001379 ASSERT_EQ(633U, pk8_key.size());
1380
Shawn Willdena278f612014-12-23 11:22:21 -07001381 ASSERT_EQ(KM_ERROR_OK, ImportKey(ParamBuilder().RsaSigningKey().NoDigestOrPadding(),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001382 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001383
1384 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001385 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1386 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1387 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001388
1389 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001390 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1391 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001392
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001393 string message(1024 / 8, 'a');
1394 string signature;
1395 SignMessage(message, &signature);
1396 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001397}
1398
Shawn Willden6bbe6782014-09-18 11:26:15 -06001399TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001400 string pk8_key = read_file("rsa_privkey_pk8.der");
1401 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001402 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenc24c1102014-12-22 15:30:09 -07001403 ImportKey(ParamBuilder()
Shawn Willdena278f612014-12-23 11:22:21 -07001404 .RsaSigningKey(2048) // Size doesn't match key
Shawn Willdenc24c1102014-12-22 15:30:09 -07001405 .NoDigestOrPadding(),
1406 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001407}
1408
1409TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001410 string pk8_key = read_file("rsa_privkey_pk8.der");
1411 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001412 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenc24c1102014-12-22 15:30:09 -07001413 ImportKey(ParamBuilder()
Shawn Willdena278f612014-12-23 11:22:21 -07001414 .RsaSigningKey()
Shawn Willdenc24c1102014-12-22 15:30:09 -07001415 .Option(TAG_RSA_PUBLIC_EXPONENT, 3) // Doesn't match key
1416 .NoDigestOrPadding(),
1417 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001418}
1419
Shawn Willden81effc62014-08-27 10:08:46 -06001420TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001421 string pk8_key = read_file("ec_privkey_pk8.der");
1422 ASSERT_EQ(138U, pk8_key.size());
1423
Shawn Willdena278f612014-12-23 11:22:21 -07001424 ASSERT_EQ(KM_ERROR_OK,
1425 ImportKey(ParamBuilder().EcdsaSigningKey(), KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001426
1427 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001428 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1429 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001430
1431 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001432 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1433 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001434
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001435 string message(1024 / 8, 'a');
1436 string signature;
1437 SignMessage(message, &signature);
1438 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001439}
1440
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001441TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1442 string pk8_key = read_file("ec_privkey_pk8.der");
1443 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001444
Shawn Willdena278f612014-12-23 11:22:21 -07001445 ASSERT_EQ(KM_ERROR_OK,
1446 ImportKey(ParamBuilder().EcdsaSigningKey(256), KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001447
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001448 // Check values derived from the key.
1449 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1450 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1451
1452 // And values provided by GoogleKeymaster
1453 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1454 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1455
1456 string message(1024 / 8, 'a');
1457 string signature;
1458 SignMessage(message, &signature);
1459 VerifyMessage(message, signature);
1460}
1461
1462TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1463 string pk8_key = read_file("ec_privkey_pk8.der");
1464 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001465 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdena278f612014-12-23 11:22:21 -07001466 ImportKey(ParamBuilder().EcdsaSigningKey(224), // Size does not match key
1467 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001468}
1469
Shawn Willden3b702e22015-02-05 10:26:47 -07001470TEST_F(ImportKeyTest, AesKeySuccess) {
1471 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1472 string key(key_data, sizeof(key_data));
1473 ASSERT_EQ(KM_ERROR_OK, ImportKey(ParamBuilder().AesEncryptionKey().OcbMode(4096, 16),
1474 KM_KEY_FORMAT_RAW, key));
1475
1476 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1477 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1478
1479 string message = "Hello World!";
1480 string ciphertext = EncryptMessage(message);
1481 string plaintext = DecryptMessage(ciphertext);
1482 EXPECT_EQ(message, plaintext);
1483}
1484
1485TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1486 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1487 string key(key_data, sizeof(key_data));
1488 ASSERT_EQ(KM_ERROR_OK,
1489 ImportKey(ParamBuilder().HmacKey(sizeof(key_data) * 8, KM_DIGEST_SHA_2_256, 32),
1490 KM_KEY_FORMAT_RAW, key));
1491
1492 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1493 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1494
1495 string message = "Hello World!";
1496 string signature;
1497 SignMessage(message, &signature);
1498 VerifyMessage(message, signature);
1499}
1500
Shawn Willden2665e862014-11-24 14:46:21 -07001501typedef KeymasterTest VersionTest;
1502TEST_F(VersionTest, GetVersion) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001503 uint8_t major, minor, subminor;
1504 ASSERT_EQ(KM_ERROR_OK, GetVersion(&major, &minor, &subminor));
1505 EXPECT_EQ(1, major);
1506 EXPECT_EQ(0, minor);
1507 EXPECT_EQ(0, subminor);
Shawn Willden2665e862014-11-24 14:46:21 -07001508}
1509
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001510typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001511TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001512 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001513
1514 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001515 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001516 EXPECT_EQ(512 / 8, ciphertext1.size());
1517
Shawn Willden6dde87c2014-12-11 14:08:48 -07001518 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001519 EXPECT_EQ(512 / 8, ciphertext2.size());
1520
1521 // OAEP randomizes padding so every result should be different.
1522 EXPECT_NE(ciphertext1, ciphertext2);
1523}
1524
1525TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001526 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001527 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001528 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001529 EXPECT_EQ(512 / 8, ciphertext.size());
1530
Shawn Willden6dde87c2014-12-11 14:08:48 -07001531 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001532 EXPECT_EQ(message, plaintext);
1533}
1534
1535TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001536 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001537 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001538 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001539 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001540
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001541 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1542 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001543 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001544 EXPECT_EQ(0, result.size());
1545}
1546
1547TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001548 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001549 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001550 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001551 EXPECT_EQ(512 / 8, ciphertext.size());
1552
1553 // Corrupt the ciphertext
1554 ciphertext[512 / 8 / 2]++;
1555
Shawn Willden4200f212014-12-02 07:01:21 -07001556 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001557 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001558 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1559 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001560 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001561 EXPECT_EQ(0, result.size());
1562}
1563
1564TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001565 ASSERT_EQ(KM_ERROR_OK,
1566 GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001567 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001568 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001569 EXPECT_EQ(512 / 8, ciphertext1.size());
1570
Shawn Willden6dde87c2014-12-11 14:08:48 -07001571 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001572 EXPECT_EQ(512 / 8, ciphertext2.size());
1573
1574 // PKCS1 v1.5 randomizes padding so every result should be different.
1575 EXPECT_NE(ciphertext1, ciphertext2);
1576}
1577
1578TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001579 ASSERT_EQ(KM_ERROR_OK,
1580 GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001581 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001582 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001583 EXPECT_EQ(512 / 8, ciphertext.size());
1584
Shawn Willden6dde87c2014-12-11 14:08:48 -07001585 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001586 EXPECT_EQ(message, plaintext);
1587}
1588
1589TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001590 ASSERT_EQ(KM_ERROR_OK,
1591 GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001592 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001593 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001594 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001595
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001596 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1597 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001598 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001599 EXPECT_EQ(0, result.size());
1600}
1601
1602TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001603 ASSERT_EQ(KM_ERROR_OK,
1604 GenerateKey(ParamBuilder().RsaEncryptionKey(512, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001605 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001606 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001607 EXPECT_EQ(512 / 8, ciphertext.size());
1608
1609 // Corrupt the ciphertext
1610 ciphertext[512 / 8 / 2]++;
1611
Shawn Willden4200f212014-12-02 07:01:21 -07001612 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001613 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001614 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1615 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001616 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001617 EXPECT_EQ(0, result.size());
1618}
1619
Shawn Willden907c3012014-12-08 15:51:55 -07001620TEST_F(EncryptionOperationsTest, AesOcbSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001621 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001622 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001623 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001624 EXPECT_EQ(12 /* nonce */ + message.size() + 16 /* tag */, ciphertext1.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001625
Shawn Willden6dde87c2014-12-11 14:08:48 -07001626 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001627 EXPECT_EQ(12 /* nonce */ + message.size() + 16 /* tag */, ciphertext2.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001628
1629 // OCB uses a random nonce, so every output should be different
1630 EXPECT_NE(ciphertext1, ciphertext2);
1631}
1632
Shawn Willden6dde87c2014-12-11 14:08:48 -07001633TEST_F(EncryptionOperationsTest, AesOcbRoundTripSuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001634 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001635 string message = "Hello World!";
1636 string ciphertext = EncryptMessage(message);
1637 EXPECT_EQ(12 /* nonce */ + message.length() + 16 /* tag */, ciphertext.size());
1638
1639 string plaintext = DecryptMessage(ciphertext);
1640 EXPECT_EQ(message, plaintext);
1641}
1642
1643TEST_F(EncryptionOperationsTest, AesOcbRoundTripCorrupted) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001644 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001645 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001646 string ciphertext = EncryptMessage(string(message));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001647 EXPECT_EQ(12 /* nonce */ + message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001648
1649 ciphertext[ciphertext.size() / 2]++;
1650
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001651 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001652
1653 string result;
1654 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001655 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001656 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001657 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001658}
1659
1660TEST_F(EncryptionOperationsTest, AesDecryptGarbage) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001661 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001662 string ciphertext(128, 'a');
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001663 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001664
1665 string result;
1666 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001667 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001668 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001669 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001670}
1671
1672TEST_F(EncryptionOperationsTest, AesDecryptTooShort) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001673 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001674
Shawn Willden6dde87c2014-12-11 14:08:48 -07001675 // Try decrypting garbage ciphertext that is too short to be valid (< nonce + tag).
Shawn Willden6dde87c2014-12-11 14:08:48 -07001676 string ciphertext(12 + 15, 'a');
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001677 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001678
1679 string result;
1680 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001681 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001682 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001683 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001684}
1685
1686TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptySuccess) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001687 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001688 string message = "";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001689 string ciphertext = EncryptMessage(string(message));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001690 EXPECT_EQ(12 /* nonce */ + message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001691
1692 string plaintext = DecryptMessage(ciphertext);
1693 EXPECT_EQ(message, plaintext);
1694}
1695
1696TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptyCorrupted) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001697 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001698 string message = "";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001699 string ciphertext = EncryptMessage(string(message));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001700 EXPECT_EQ(12 /* nonce */ + message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001701
1702 ciphertext[ciphertext.size() / 2]++;
1703
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001704 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001705
1706 string result;
1707 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001708 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001709 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001710 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001711}
1712
1713TEST_F(EncryptionOperationsTest, AesOcbFullChunk) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001714 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001715 string message(4096, 'a');
1716 string ciphertext = EncryptMessage(message);
1717 EXPECT_EQ(12 /* nonce */ + message.length() + 16 /* tag */, ciphertext.size());
1718
1719 string plaintext = DecryptMessage(ciphertext);
1720 EXPECT_EQ(message, plaintext);
1721}
1722
1723TEST_F(EncryptionOperationsTest, AesOcbVariousChunkLengths) {
1724 for (unsigned chunk_length = 1; chunk_length <= 128; ++chunk_length) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001725 ASSERT_EQ(KM_ERROR_OK,
1726 GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(chunk_length, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001727 string message(128, 'a');
1728 string ciphertext = EncryptMessage(message);
1729 int expected_tag_count = (message.length() + chunk_length - 1) / chunk_length;
1730 EXPECT_EQ(12 /* nonce */ + message.length() + 16 * expected_tag_count, ciphertext.size())
1731 << "Unexpected ciphertext size for chunk length " << chunk_length
1732 << " expected tag count was " << expected_tag_count
1733 << " but actual tag count was probably "
1734 << (ciphertext.size() - message.length() - 12) / 16;
1735
1736 string plaintext = DecryptMessage(ciphertext);
1737 EXPECT_EQ(message, plaintext);
1738 }
1739}
1740
1741TEST_F(EncryptionOperationsTest, AesOcbAbort) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001742 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001743 string message = "Hello";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001744
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001745 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001746
1747 string result;
1748 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001749 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1750 EXPECT_EQ(message.length(), input_consumed);
1751 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001752}
1753
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001754TEST_F(EncryptionOperationsTest, AesOcbNoChunkLength) {
Shawn Willdenc24c1102014-12-22 15:30:09 -07001755 EXPECT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
1756 .AesEncryptionKey(128)
1757 .Option(TAG_BLOCK_MODE, KM_MODE_OCB)
1758 .Option(TAG_MAC_LENGTH, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001759 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001760}
1761
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001762TEST_F(EncryptionOperationsTest, AesOcbPaddingUnsupported) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001763 ASSERT_EQ(KM_ERROR_OK,
1764 GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Option(
1765 TAG_PADDING, KM_PAD_ZERO)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001766 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001767}
1768
1769TEST_F(EncryptionOperationsTest, AesOcbInvalidMacLength) {
Shawn Willden63ac0432014-12-29 14:07:08 -07001770 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).OcbMode(4096, 17)));
1771 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001772}
1773
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001774TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
1775 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).Option(TAG_BLOCK_MODE,
1776 KM_MODE_ECB)));
1777 // Two-block message.
1778 string message = "12345678901234567890123456789012";
1779 string ciphertext1 = EncryptMessage(message);
1780 EXPECT_EQ(message.size(), ciphertext1.size());
1781
1782 string ciphertext2 = EncryptMessage(string(message));
1783 EXPECT_EQ(message.size(), ciphertext2.size());
1784
1785 // ECB is deterministic.
1786 EXPECT_EQ(ciphertext1, ciphertext2);
1787
1788 string plaintext = DecryptMessage(ciphertext1);
1789 EXPECT_EQ(message, plaintext);
1790}
1791
1792TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
1793 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).Option(TAG_BLOCK_MODE,
1794 KM_MODE_ECB)));
1795 // Message is slightly shorter than two blocks.
1796 string message = "1234567890123456789012345678901";
1797
1798 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1799 string ciphertext;
1800 size_t input_consumed;
1801 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1802 EXPECT_EQ(message.size(), input_consumed);
1803 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1804}
1805
1806TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
1807 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
1808 .AesEncryptionKey(128)
1809 .Option(TAG_BLOCK_MODE, KM_MODE_ECB)
1810 .Option(TAG_PADDING, KM_PAD_PKCS7)));
1811
1812 // Try various message lengths; all should work.
1813 for (int i = 0; i < 32; ++i) {
1814 string message(i, 'a');
1815 string ciphertext = EncryptMessage(message);
1816 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1817 string plaintext = DecryptMessage(ciphertext);
1818 EXPECT_EQ(message, plaintext);
1819 }
1820}
1821
1822TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
1823 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
1824 .AesEncryptionKey(128)
1825 .Option(TAG_BLOCK_MODE, KM_MODE_ECB)
1826 .Option(TAG_PADDING, KM_PAD_PKCS7)));
1827
1828 string message = "a";
1829 string ciphertext = EncryptMessage(message);
1830 EXPECT_EQ(16, ciphertext.size());
1831 EXPECT_NE(ciphertext, message);
1832 ++ciphertext[ciphertext.size() / 2];
1833
1834 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1835 string plaintext;
1836 size_t input_consumed;
1837 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1838 EXPECT_EQ(ciphertext.size(), input_consumed);
1839 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1840}
1841
1842TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
1843 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).Option(TAG_BLOCK_MODE,
1844 KM_MODE_CBC)));
1845 // Two-block message.
1846 string message = "12345678901234567890123456789012";
1847 string ciphertext1 = EncryptMessage(message);
1848 EXPECT_EQ(message.size() + 16, ciphertext1.size());
1849
1850 string ciphertext2 = EncryptMessage(string(message));
1851 EXPECT_EQ(message.size() + 16, ciphertext2.size());
1852
1853 // CBC uses random IVs, so ciphertexts shouldn't match.
1854 EXPECT_NE(ciphertext1, ciphertext2);
1855
1856 string plaintext = DecryptMessage(ciphertext1);
1857 EXPECT_EQ(message, plaintext);
1858}
1859
1860TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
1861 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder().AesEncryptionKey(128).Option(TAG_BLOCK_MODE,
1862 KM_MODE_CBC)));
1863
1864 int increment = 15;
1865 string message(240, 'a');
1866 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1867 string ciphertext;
1868 size_t input_consumed;
1869 for (size_t i = 0; i < message.size(); i += increment)
1870 EXPECT_EQ(KM_ERROR_OK,
1871 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1872 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1873 EXPECT_EQ(message.size() + 16, ciphertext.size());
1874
1875 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1876 string plaintext;
1877 for (size_t i = 0; i < ciphertext.size(); i += increment)
1878 EXPECT_EQ(KM_ERROR_OK,
1879 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1880 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1881 EXPECT_EQ(ciphertext.size() - 16, plaintext.size());
1882 EXPECT_EQ(message, plaintext);
1883}
1884
1885TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
1886 ASSERT_EQ(KM_ERROR_OK, GenerateKey(ParamBuilder()
1887 .AesEncryptionKey(128)
1888 .Option(TAG_BLOCK_MODE, KM_MODE_CBC)
1889 .Option(TAG_PADDING, KM_PAD_PKCS7)));
1890
1891 // Try various message lengths; all should work.
1892 for (int i = 0; i < 32; ++i) {
1893 string message(i, 'a');
1894 string ciphertext = EncryptMessage(message);
1895 EXPECT_EQ(i + 32 - (i % 16), ciphertext.size());
1896 string plaintext = DecryptMessage(ciphertext);
1897 EXPECT_EQ(message, plaintext);
1898 }
1899}
1900
Shawn Willden128ffe02014-08-06 12:31:33 -06001901} // namespace test
1902} // namespace keymaster