blob: 93a0323e7d9bb67feff6ab0f3a7c7d0d37ee0639 [file] [log] [blame]
Shawn Willden128ffe02014-08-06 12:31:33 -06001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Shawn Willden437fbd12014-08-20 11:59:49 -060017#include <fstream>
Shawn Willden76076ab2014-12-18 08:36:35 -070018#include <string>
19#include <vector>
Shawn Willden437fbd12014-08-20 11:59:49 -060020
Shawn Willden2beb6282015-05-20 16:36:24 -060021#include <hardware/keymaster0.h>
Shawn Willdenb7510332015-02-06 19:58:29 -070022#include <keymaster/soft_keymaster_device.h>
Shawn Willden2beb6282015-05-20 16:36:24 -060023#include <keymaster/softkeymaster.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060024
Shawn Willdenb6837e72015-05-16 09:20:59 -060025#include "android_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060026
Shawn Willden437fbd12014-08-20 11:59:49 -060027using std::ifstream;
28using std::istreambuf_iterator;
Shawn Willden76076ab2014-12-18 08:36:35 -070029using std::string;
30using std::vector;
Shawn Willden2beb6282015-05-20 16:36:24 -060031using std::unique_ptr;
32
33extern "C" {
34int __android_log_print(int prio, const char* tag, const char* fmt);
35int __android_log_print(int prio, const char* tag, const char* fmt) {
36 prio, tag, fmt;
37 return 0;
38}
39} // extern "C"
Shawn Willden437fbd12014-08-20 11:59:49 -060040
Shawn Willden128ffe02014-08-06 12:31:33 -060041namespace keymaster {
42namespace test {
43
Shawn Willden567a4a02014-12-31 12:14:46 -070044StdoutLogger logger;
45
Shawn Willden58427c42015-05-20 13:00:42 -060046class SoftKeymasterTestInstanceCreator : public Keymaster1TestInstanceCreator {
47 public:
48 keymaster1_device_t* CreateDevice() const override {
Shawn Willden2beb6282015-05-20 16:36:24 -060049 std::cerr << "Creating software-only device" << std::endl;
Shawn Willden95dda362015-02-27 10:58:37 -070050 SoftKeymasterDevice* device = new SoftKeymasterDevice;
Shawn Willden58427c42015-05-20 13:00:42 -060051 return device->keymaster_device();
Shawn Willden5b53c992015-02-02 08:05:25 -070052 }
Shawn Willden2beb6282015-05-20 16:36:24 -060053
54 bool crypto_params_in_hardware(keymaster_algorithm_t) const override { return false; }
55 bool expect_keymaster0_calls() const override { return false; }
56 int keymaster0_calls() const override { return 0; }
Shawn Willden128ffe02014-08-06 12:31:33 -060057};
58
Shawn Willden2beb6282015-05-20 16:36:24 -060059class Keymaster0AdapterTestInstanceCreator : public Keymaster1TestInstanceCreator {
60 public:
61 keymaster1_device_t* CreateDevice() const {
62 std::cerr << "Creating keymaster0-backed device" << std::endl;
63 hw_device_t* softkeymaster_device;
64 EXPECT_EQ(0, openssl_open(&softkeymaster_module.common, KEYSTORE_KEYMASTER,
65 &softkeymaster_device));
66 // Make the software device pretend to be hardware
67 keymaster0_device_t* keymaster0_device =
68 reinterpret_cast<keymaster0_device_t*>(softkeymaster_device);
69 keymaster0_device->flags = KEYMASTER_SUPPORTS_EC;
70
71 counting_keymaster0_device_ = new Keymaster0CountingWrapper(keymaster0_device);
72
73 SoftKeymasterDevice* keymaster = new SoftKeymasterDevice(counting_keymaster0_device_);
74 return keymaster->keymaster_device();
75 }
76
77 bool crypto_params_in_hardware(keymaster_algorithm_t algorithm) const override {
78 return algorithm == KM_ALGORITHM_RSA;
79 }
80 bool expect_keymaster0_calls() const override { return true; }
81 int keymaster0_calls() const override { return counting_keymaster0_device_->count(); }
82
83 private:
84 mutable Keymaster0CountingWrapper* counting_keymaster0_device_;
85};
86
87static auto test_params =
88 testing::Values(InstanceCreatorPtr(new SoftKeymasterTestInstanceCreator),
89 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator));
Shawn Willden58427c42015-05-20 13:00:42 -060090
91typedef Keymaster1Test CheckSupported;
92INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, CheckSupported, test_params);
93
94TEST_P(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -070095 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
96 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060097
Shawn Willden5b53c992015-02-02 08:05:25 -070098 size_t len;
99 keymaster_algorithm_t* algorithms;
100 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -0700101 EXPECT_TRUE(ResponseContains(
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600102 {KM_ALGORITHM_RSA, KM_ALGORITHM_EC, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700103 free(algorithms);
Shawn Willden2beb6282015-05-20 16:36:24 -0600104
105 if (GetParam()->expect_keymaster0_calls())
106 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600107}
108
Shawn Willden58427c42015-05-20 13:00:42 -0600109TEST_P(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700110 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
111 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
112 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600113
Shawn Willden5b53c992015-02-02 08:05:25 -0700114 size_t len;
115 keymaster_block_mode_t* modes;
Shawn Willden0cb69422015-05-26 08:31:37 -0600116 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden63ac0432014-12-29 14:07:08 -0700117 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600118 EXPECT_EQ(0U, len);
Shawn Willden63ac0432014-12-29 14:07:08 -0700119 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600120
Shawn Willden63ac0432014-12-29 14:07:08 -0700121 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600122 device()->get_supported_block_modes(device(), KM_ALGORITHM_EC, KM_PURPOSE_ENCRYPT,
Shawn Willden5b53c992015-02-02 08:05:25 -0700123 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600124
Shawn Willden0cb69422015-05-26 08:31:37 -0600125 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
Shawn Willden63ac0432014-12-29 14:07:08 -0700126 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc47c88f2015-04-07 17:23:27 -0600127 EXPECT_TRUE(ResponseContains({KM_MODE_ECB, KM_MODE_CBC, KM_MODE_CTR}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700128 free(modes);
Shawn Willden2beb6282015-05-20 16:36:24 -0600129
130 if (GetParam()->expect_keymaster0_calls())
131 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600132}
133
Shawn Willden58427c42015-05-20 13:00:42 -0600134TEST_P(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700135 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
136 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
137 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600138
Shawn Willden5b53c992015-02-02 08:05:25 -0700139 size_t len;
140 keymaster_padding_t* modes;
Shawn Willden0cb69422015-05-26 08:31:37 -0600141 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden5b53c992015-02-02 08:05:25 -0700142 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700143 EXPECT_TRUE(
144 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700145 free(modes);
146
Shawn Willden0cb69422015-05-26 08:31:37 -0600147 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden63ac0432014-12-29 14:07:08 -0700148 KM_PURPOSE_ENCRYPT, &modes, &len));
149 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700150 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600151
Shawn Willden0cb69422015-05-26 08:31:37 -0600152 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700153 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600154 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700155 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700156
157 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
158 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
159 &modes, &len));
Shawn Willden2beb6282015-05-20 16:36:24 -0600160
161 if (GetParam()->expect_keymaster0_calls())
162 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600163}
164
Shawn Willden58427c42015-05-20 13:00:42 -0600165TEST_P(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700166 EXPECT_EQ(
167 KM_ERROR_OUTPUT_PARAMETER_NULL,
168 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600169
Shawn Willden5b53c992015-02-02 08:05:25 -0700170 size_t len;
171 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -0600172 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
Shawn Willden5b53c992015-02-02 08:05:25 -0700173 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700174 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700175 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600176
Shawn Willden0cb69422015-05-26 08:31:37 -0600177 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700178 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willdene998c132015-04-14 14:41:46 -0600179 EXPECT_TRUE(ResponseContains(KM_DIGEST_NONE, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700180 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600181
Shawn Willden63ac0432014-12-29 14:07:08 -0700182 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
183 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
184 &len));
185
Shawn Willden0cb69422015-05-26 08:31:37 -0600186 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700187 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700188 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
189 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
190 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700191 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -0600192
193 if (GetParam()->expect_keymaster0_calls())
194 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600195}
196
Shawn Willden58427c42015-05-20 13:00:42 -0600197TEST_P(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700198 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
199 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600200
Shawn Willden5b53c992015-02-02 08:05:25 -0700201 size_t len;
202 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600203 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700204 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700205 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700206 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700207
Shawn Willden0cb69422015-05-26 08:31:37 -0600208 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700209 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
210 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
211 free(formats);
212
Shawn Willden0cb69422015-05-26 08:31:37 -0600213 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700214 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
215 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
216 free(formats);
Shawn Willden2beb6282015-05-20 16:36:24 -0600217
218 if (GetParam()->expect_keymaster0_calls())
219 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600220}
221
Shawn Willden58427c42015-05-20 13:00:42 -0600222TEST_P(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700223 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
224 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600225
Shawn Willden5b53c992015-02-02 08:05:25 -0700226 size_t len;
227 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600228 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700229 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700230 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700231 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600232
Shawn Willden0cb69422015-05-26 08:31:37 -0600233 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600234 device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700235 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700236 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600237
Shawn Willden0cb69422015-05-26 08:31:37 -0600238 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700239 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600240 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700241 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700242
Shawn Willden0cb69422015-05-26 08:31:37 -0600243 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700244 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600245 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700246 free(formats);
247
Shawn Willden0cb69422015-05-26 08:31:37 -0600248 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700249 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600250 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700251 free(formats);
Shawn Willden2beb6282015-05-20 16:36:24 -0600252
253 if (GetParam()->expect_keymaster0_calls())
254 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600255}
256
Shawn Willden58427c42015-05-20 13:00:42 -0600257class NewKeyGeneration : public Keymaster1Test {
Shawn Willdend0772312014-09-18 12:27:57 -0600258 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700259 void CheckBaseParams() {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700260 AuthorizationSet auths = sw_enforced();
261 EXPECT_GT(auths.SerializedSize(), 12U);
262
Shawn Willden5b53c992015-02-02 08:05:25 -0700263 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
264 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
265 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600266 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700267 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600268
269 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700270 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
271 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
272 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600273
274 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700275 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
276 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
277 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600278
279 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600280 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700281 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600282 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700283};
Shawn Willden58427c42015-05-20 13:00:42 -0600284INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, NewKeyGeneration, test_params);
285
286TEST_P(NewKeyGeneration, Rsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600287 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
288 .RsaSigningKey(256, 3)
289 .Digest(KM_DIGEST_NONE)
290 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700291 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600292
Shawn Willden2beb6282015-05-20 16:36:24 -0600293 // Check specified tags are all present, and in the right set.
294 AuthorizationSet crypto_params;
295 AuthorizationSet non_crypto_params;
296 if (GetParam()->crypto_params_in_hardware(KM_ALGORITHM_RSA)) {
297 EXPECT_NE(0U, hw_enforced().size());
298 EXPECT_NE(0U, sw_enforced().size());
299 crypto_params.push_back(hw_enforced());
300 non_crypto_params.push_back(sw_enforced());
301 } else {
302 EXPECT_EQ(0U, hw_enforced().size());
303 EXPECT_NE(0U, sw_enforced().size());
304 crypto_params.push_back(sw_enforced());
305 }
306
307 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
308 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
309 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 256));
310 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 256));
311 EXPECT_TRUE(contains(crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
312 EXPECT_FALSE(contains(non_crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
313
314 if (GetParam()->expect_keymaster0_calls())
315 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600316}
317
Shawn Willden58427c42015-05-20 13:00:42 -0600318TEST_P(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700319 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
320 GenerateKey(AuthorizationSetBuilder()
321 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
322 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
323 .SigningKey()));
Shawn Willden2beb6282015-05-20 16:36:24 -0600324
325 if (GetParam()->expect_keymaster0_calls())
326 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600327}
328
Shawn Willden58427c42015-05-20 13:00:42 -0600329TEST_P(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600330 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600331 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700332 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600333
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700334 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600335 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700336 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden2beb6282015-05-20 16:36:24 -0600337
338 if (GetParam()->expect_keymaster0_calls())
339 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600340}
341
Shawn Willden58427c42015-05-20 13:00:42 -0600342TEST_P(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600343 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600344 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700345 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600346
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700347 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600348 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600349
350 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700351 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden2beb6282015-05-20 16:36:24 -0600352
353 if (GetParam()->expect_keymaster0_calls())
354 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600355}
356
Shawn Willden58427c42015-05-20 13:00:42 -0600357TEST_P(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700358 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willdenaf533992015-04-15 13:48:28 -0600359 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600360
361 if (GetParam()->expect_keymaster0_calls())
362 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600363}
364
Shawn Willden58427c42015-05-20 13:00:42 -0600365TEST_P(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600366 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600367 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600368 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
369 KM_DIGEST_NONE)))
Shawn Willden58427c42015-05-20 13:00:42 -0600370 << "Failed to generate size: "
371 << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600372 }
Shawn Willden2beb6282015-05-20 16:36:24 -0600373
374 if (GetParam()->expect_keymaster0_calls())
375 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600376}
377
Shawn Willden58427c42015-05-20 13:00:42 -0600378TEST_P(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700379 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600380 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600381
382 if (GetParam()->expect_keymaster0_calls())
383 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700384}
385
Shawn Willden58427c42015-05-20 13:00:42 -0600386typedef Keymaster1Test GetKeyCharacteristics;
387INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, GetKeyCharacteristics, test_params);
388
389TEST_P(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600390 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
391 .RsaSigningKey(256, 3)
392 .Digest(KM_DIGEST_NONE)
393 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700394 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600395
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700396 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
397 EXPECT_EQ(original, sw_enforced());
Shawn Willden2beb6282015-05-20 16:36:24 -0600398
399 if (GetParam()->expect_keymaster0_calls())
400 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden76364712014-08-11 17:48:04 -0600401}
402
Shawn Willden58427c42015-05-20 13:00:42 -0600403typedef Keymaster1Test SigningOperationsTest;
404INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, SigningOperationsTest, test_params);
405
406TEST_P(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600407 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
408 .RsaSigningKey(256, 3)
409 .Digest(KM_DIGEST_NONE)
410 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700411 string message = "12345678901234567890123456789012";
412 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600413 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600414
415 if (GetParam()->expect_keymaster0_calls())
416 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600417}
418
Shawn Willden58427c42015-05-20 13:00:42 -0600419TEST_P(SigningOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600420 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600421 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600422 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600423 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700424 string message(1024, 'a');
425 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600426 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600427
428 if (GetParam()->expect_keymaster0_calls())
429 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700430}
431
Shawn Willden58427c42015-05-20 13:00:42 -0600432TEST_P(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600433 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
434 .RsaSigningKey(512, 3)
435 .Digest(KM_DIGEST_SHA_2_256)
436 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700437 // Use large message, which won't work without digesting.
438 string message(1024, 'a');
439 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600440 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600441
442 if (GetParam()->expect_keymaster0_calls())
443 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -0700444}
445
Shawn Willden58427c42015-05-20 13:00:42 -0600446TEST_P(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600447 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
448 .RsaSigningKey(512, 3)
449 .Digest(KM_DIGEST_SHA_2_256)
450 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700451 string message(1024, 'a');
452 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600453 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -0600454
455 if (GetParam()->expect_keymaster0_calls())
456 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700457}
458
Shawn Willden58427c42015-05-20 13:00:42 -0600459TEST_P(SigningOperationsTest, RsaPssSha256TooSmallKey) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700460 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
461 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600462 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
463 .RsaSigningKey(256 + 9 * 8, 3)
464 .Digest(KM_DIGEST_SHA_2_256)
465 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700466 string message(1024, 'a');
467 string signature;
468
Shawn Willden226746b2015-05-08 11:36:56 -0600469 AuthorizationSet begin_params(client_params());
470 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600471 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600472 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700473
474 string result;
475 size_t input_consumed;
476 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
477 EXPECT_EQ(message.size(), input_consumed);
478 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -0600479
480 if (GetParam()->expect_keymaster0_calls())
481 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700482}
483
Shawn Willden58427c42015-05-20 13:00:42 -0600484TEST_P(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600485 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
486 .RsaSigningKey(256, 3)
487 .Digest(KM_DIGEST_NONE)
488 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600489 AuthorizationSet begin_params(client_params());
490 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600491 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600492 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700493 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
494 // Another abort should fail
495 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden2beb6282015-05-20 16:36:24 -0600496
497 if (GetParam()->expect_keymaster0_calls())
498 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600499}
500
Shawn Willden58427c42015-05-20 13:00:42 -0600501TEST_P(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600502 GenerateKey(AuthorizationSetBuilder()
503 .RsaSigningKey(256, 3)
504 .Digest(KM_DIGEST_MD5)
505 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700506 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden2beb6282015-05-20 16:36:24 -0600507
508 if (GetParam()->expect_keymaster0_calls())
509 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600510}
511
Shawn Willden58427c42015-05-20 13:00:42 -0600512TEST_P(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600513 GenerateKey(AuthorizationSetBuilder()
514 .RsaSigningKey(256, 3)
515 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
516 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600517 AuthorizationSet begin_params(client_params());
518 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
519 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600520
521 if (GetParam()->expect_keymaster0_calls())
522 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600523}
524
Shawn Willden58427c42015-05-20 13:00:42 -0600525TEST_P(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700526 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600527 GenerateKey(AuthorizationSetBuilder()
528 .RsaSigningKey(256, 3)
529 .Digest(KM_DIGEST_NONE)
530 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600531 AuthorizationSet begin_params(client_params());
532 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600533 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600534 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600535
536 if (GetParam()->expect_keymaster0_calls())
537 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600538}
539
Shawn Willden58427c42015-05-20 13:00:42 -0600540TEST_P(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700541 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600542 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
543 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600544 AuthorizationSet begin_params(client_params());
545 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
546 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600547
548 if (GetParam()->expect_keymaster0_calls())
549 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600550}
551
Shawn Willden58427c42015-05-20 13:00:42 -0600552TEST_P(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600553 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
554 .RsaSigningKey(256, 3)
555 .Digest(KM_DIGEST_NONE)
556 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600557 AuthorizationSet begin_params(client_params());
558 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600559 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600560 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600561
562 string message = "1234567890123456789012345678901";
563 string result;
564 size_t input_consumed;
565 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
566 EXPECT_EQ(0U, result.size());
567 EXPECT_EQ(31U, input_consumed);
568
569 string signature;
570 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
571 EXPECT_EQ(0U, signature.length());
Shawn Willden2beb6282015-05-20 16:36:24 -0600572
573 if (GetParam()->expect_keymaster0_calls())
574 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600575}
576
Shawn Willden58427c42015-05-20 13:00:42 -0600577TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600578 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
579 .RsaEncryptionKey(256, 3)
580 .Digest(KM_DIGEST_NONE)
581 .Padding(KM_PAD_NONE)));
582 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
583 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600584
585 if (GetParam()->expect_keymaster0_calls())
586 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600587}
588
Shawn Willden58427c42015-05-20 13:00:42 -0600589TEST_P(SigningOperationsTest, EcdsaSuccess) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600590 ASSERT_EQ(KM_ERROR_OK,
591 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
592 string message = "123456789012345678901234567890123456789012345678";
593 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600594 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600595
596 if (GetParam()->expect_keymaster0_calls())
597 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600598}
599
Shawn Willden58427c42015-05-20 13:00:42 -0600600TEST_P(SigningOperationsTest, AesEcbSign) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600601 ASSERT_EQ(KM_ERROR_OK,
602 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
603 TAG_BLOCK_MODE, KM_MODE_ECB)));
604 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
605 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600606
607 if (GetParam()->expect_keymaster0_calls())
608 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600609}
610
Shawn Willden58427c42015-05-20 13:00:42 -0600611TEST_P(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600612 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700613 string message = "12345678901234567890123456789012";
614 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600615 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600616 ASSERT_EQ(20U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600617
618 if (GetParam()->expect_keymaster0_calls())
619 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700620}
621
Shawn Willden58427c42015-05-20 13:00:42 -0600622TEST_P(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600623 ASSERT_EQ(KM_ERROR_OK,
624 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700625 string message = "12345678901234567890123456789012";
626 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600627 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600628 ASSERT_EQ(28U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600629
630 if (GetParam()->expect_keymaster0_calls())
631 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700632}
633
Shawn Willden58427c42015-05-20 13:00:42 -0600634TEST_P(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600635 ASSERT_EQ(KM_ERROR_OK,
636 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700637 string message = "12345678901234567890123456789012";
638 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600639 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600640 ASSERT_EQ(32U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600641
642 if (GetParam()->expect_keymaster0_calls())
643 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700644}
645
Shawn Willden58427c42015-05-20 13:00:42 -0600646TEST_P(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600647 ASSERT_EQ(KM_ERROR_OK,
648 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
649
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700650 string message = "12345678901234567890123456789012";
651 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600652 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600653 ASSERT_EQ(48U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600654
655 if (GetParam()->expect_keymaster0_calls())
656 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700657}
658
Shawn Willden58427c42015-05-20 13:00:42 -0600659TEST_P(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600660 ASSERT_EQ(KM_ERROR_OK,
661 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700662 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700663 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600664 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600665 ASSERT_EQ(64U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600666
667 if (GetParam()->expect_keymaster0_calls())
668 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700669}
670
Shawn Willden58427c42015-05-20 13:00:42 -0600671TEST_P(SigningOperationsTest, HmacLengthInKey) {
Shawn Willden09f25272015-04-15 13:49:49 -0600672 // TODO(swillden): unified API should generate an error on key generation.
673 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
674 .HmacKey(128)
675 .Digest(KM_DIGEST_SHA_2_256)
676 .Authorization(TAG_MAC_LENGTH, 20)));
677 string message = "12345678901234567890123456789012";
678 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600679 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600680 // Size in key was ignored.
681 ASSERT_EQ(30U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600682
683 if (GetParam()->expect_keymaster0_calls())
684 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden09f25272015-04-15 13:49:49 -0600685}
686
Shawn Willden58427c42015-05-20 13:00:42 -0600687TEST_P(SigningOperationsTest, HmacRfc4231TestCase1) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700688 uint8_t key_data[] = {
689 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
690 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
691 };
692 string message = "Hi There";
693 uint8_t sha_224_expected[] = {
694 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
695 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
696 };
697 uint8_t sha_256_expected[] = {
698 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
699 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
700 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
701 };
702 uint8_t sha_384_expected[] = {
703 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
704 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
705 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
706 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
707 };
708 uint8_t sha_512_expected[] = {
709 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
710 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
711 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
712 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
713 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
714 };
715
716 string key = make_string(key_data);
717
718 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
719 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
720 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
721 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600722
723 if (GetParam()->expect_keymaster0_calls())
724 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700725}
726
Shawn Willden58427c42015-05-20 13:00:42 -0600727TEST_P(SigningOperationsTest, HmacRfc4231TestCase2) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700728 string key = "Jefe";
729 string message = "what do ya want for nothing?";
730 uint8_t sha_224_expected[] = {
731 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
732 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
733 };
734 uint8_t sha_256_expected[] = {
735 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
736 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
737 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
738 };
739 uint8_t sha_384_expected[] = {
740 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
741 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
742 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
743 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
744 };
745 uint8_t sha_512_expected[] = {
746 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
747 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
748 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
749 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
750 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
751 };
752
753 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
754 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
755 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
756 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600757
758 if (GetParam()->expect_keymaster0_calls())
759 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700760}
761
Shawn Willden58427c42015-05-20 13:00:42 -0600762TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700763 string key(20, 0xaa);
764 string message(50, 0xdd);
765 uint8_t sha_224_expected[] = {
766 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
767 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
768 };
769 uint8_t sha_256_expected[] = {
770 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
771 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
772 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
773 };
774 uint8_t sha_384_expected[] = {
775 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
776 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
777 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
778 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
779 };
780 uint8_t sha_512_expected[] = {
781 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
782 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
783 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
784 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
785 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
786 };
787
788 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
789 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
790 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
791 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600792
793 if (GetParam()->expect_keymaster0_calls())
794 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700795}
796
Shawn Willden58427c42015-05-20 13:00:42 -0600797TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700798 uint8_t key_data[25] = {
799 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
800 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
801 };
802 string key = make_string(key_data);
803 string message(50, 0xcd);
804 uint8_t sha_224_expected[] = {
805 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
806 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
807 };
808 uint8_t sha_256_expected[] = {
809 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
810 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
811 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
812 };
813 uint8_t sha_384_expected[] = {
814 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
815 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
816 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
817 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
818 };
819 uint8_t sha_512_expected[] = {
820 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
821 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
822 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
823 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
824 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
825 };
826
827 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
828 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
829 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
830 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600831
832 if (GetParam()->expect_keymaster0_calls())
833 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700834}
835
Shawn Willden58427c42015-05-20 13:00:42 -0600836TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700837 string key(20, 0x0c);
838 string message = "Test With Truncation";
839
840 uint8_t sha_224_expected[] = {
841 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
842 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
843 };
844 uint8_t sha_256_expected[] = {
845 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
846 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
847 };
848 uint8_t sha_384_expected[] = {
849 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
850 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
851 };
852 uint8_t sha_512_expected[] = {
853 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
854 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
855 };
856
857 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
858 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
859 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
860 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600861
862 if (GetParam()->expect_keymaster0_calls())
863 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700864}
865
Shawn Willden58427c42015-05-20 13:00:42 -0600866TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700867 string key(131, 0xaa);
868 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
869
870 uint8_t sha_224_expected[] = {
871 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
872 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
873 };
874 uint8_t sha_256_expected[] = {
875 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
876 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
877 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
878 };
879 uint8_t sha_384_expected[] = {
880 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
881 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
882 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
883 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
884 };
885 uint8_t sha_512_expected[] = {
886 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
887 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
888 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
889 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
890 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
891 };
892
893 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
894 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
895 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
896 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600897
898 if (GetParam()->expect_keymaster0_calls())
899 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700900}
901
Shawn Willden58427c42015-05-20 13:00:42 -0600902TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700903 string key(131, 0xaa);
904 string message = "This is a test using a larger than block-size key and a larger than "
905 "block-size data. The key needs to be hashed before being used by the HMAC "
906 "algorithm.";
907
908 uint8_t sha_224_expected[] = {
909 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
910 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
911 };
912 uint8_t sha_256_expected[] = {
913 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
914 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
915 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
916 };
917 uint8_t sha_384_expected[] = {
918 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
919 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
920 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
921 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
922 };
923 uint8_t sha_512_expected[] = {
924 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
925 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
926 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
927 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
928 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
929 };
930
931 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
932 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
933 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
934 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600935
936 if (GetParam()->expect_keymaster0_calls())
937 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700938}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700939
Shawn Willden58427c42015-05-20 13:00:42 -0600940TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600941 ASSERT_EQ(KM_ERROR_OK,
942 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
943 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600944 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600945 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600946 ASSERT_EQ(KM_ERROR_OK,
947 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
948 string message = "1234567890123456789012345678901";
949 string result;
950 size_t input_consumed;
951 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
952 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden2beb6282015-05-20 16:36:24 -0600953
954 if (GetParam()->expect_keymaster0_calls())
955 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700956}
957
Shawn Willden61902362014-12-18 10:33:24 -0700958// TODO(swillden): Add more verification failure tests.
959
Shawn Willden58427c42015-05-20 13:00:42 -0600960typedef Keymaster1Test VerificationOperationsTest;
961INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params);
962
963TEST_P(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600964 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
965 .RsaSigningKey(256, 3)
966 .Digest(KM_DIGEST_NONE)
967 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700968 string message = "12345678901234567890123456789012";
969 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600970 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
971 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600972
973 if (GetParam()->expect_keymaster0_calls())
974 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600975}
976
Shawn Willden58427c42015-05-20 13:00:42 -0600977TEST_P(VerificationOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600978 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600979 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600980 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600981 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700982 string message(1024, 'a');
983 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600984 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
985 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600986
987 if (GetParam()->expect_keymaster0_calls())
988 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -0700989}
990
Shawn Willden58427c42015-05-20 13:00:42 -0600991TEST_P(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600992 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600993 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600994 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600995 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700996 string message(1024, 'a');
997 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600998 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700999 ++signature[signature.size() / 2];
1000
Shawn Willden226746b2015-05-08 11:36:56 -06001001 AuthorizationSet begin_params(client_params());
1002 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001003 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001004 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001005
1006 string result;
1007 size_t input_consumed;
1008 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1009 EXPECT_EQ(message.size(), input_consumed);
1010 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001011
1012 if (GetParam()->expect_keymaster0_calls())
1013 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001014}
1015
Shawn Willden58427c42015-05-20 13:00:42 -06001016TEST_P(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001017 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1018 .RsaSigningKey(512, 3)
1019 .Digest(KM_DIGEST_SHA_2_256)
1020 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001021 // Use large message, which won't work without digesting.
1022 string message(1024, 'a');
1023 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001024 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
1025 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -06001026
1027 if (GetParam()->expect_keymaster0_calls())
1028 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001029}
1030
Shawn Willden58427c42015-05-20 13:00:42 -06001031TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001032 GenerateKey(AuthorizationSetBuilder()
1033 .RsaSigningKey(512, 3)
1034 .Digest(KM_DIGEST_SHA_2_256)
1035 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001036 string message(1024, 'a');
1037 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001038 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001039 ++signature[signature.size() / 2];
1040
Shawn Willden226746b2015-05-08 11:36:56 -06001041 AuthorizationSet begin_params(client_params());
1042 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001043 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001044 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001045
1046 string result;
1047 size_t input_consumed;
1048 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1049 EXPECT_EQ(message.size(), input_consumed);
1050 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001051
1052 if (GetParam()->expect_keymaster0_calls())
1053 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001054}
1055
Shawn Willden58427c42015-05-20 13:00:42 -06001056TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001057 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1058 .RsaSigningKey(512, 3)
1059 .Digest(KM_DIGEST_SHA_2_256)
1060 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001061 // Use large message, which won't work without digesting.
1062 string message(1024, 'a');
1063 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001064 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -07001065 ++message[message.size() / 2];
1066
Shawn Willden226746b2015-05-08 11:36:56 -06001067 AuthorizationSet begin_params(client_params());
1068 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001069 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001070 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001071
1072 string result;
1073 size_t input_consumed;
1074 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1075 EXPECT_EQ(message.size(), input_consumed);
1076 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001077
1078 if (GetParam()->expect_keymaster0_calls())
1079 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001080}
1081
Shawn Willden58427c42015-05-20 13:00:42 -06001082TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001083 GenerateKey(AuthorizationSetBuilder()
1084 .RsaSigningKey(512, 3)
1085 .Digest(KM_DIGEST_SHA_2_256)
1086 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001087 string message(1024, 'a');
1088 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001089 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1090 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -06001091
1092 if (GetParam()->expect_keymaster0_calls())
1093 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001094}
1095
Shawn Willden58427c42015-05-20 13:00:42 -06001096TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001097 GenerateKey(AuthorizationSetBuilder()
1098 .RsaSigningKey(512, 3)
1099 .Digest(KM_DIGEST_SHA_2_256)
1100 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001101 string message(1024, 'a');
1102 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001103 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001104 ++signature[signature.size() / 2];
1105
Shawn Willden226746b2015-05-08 11:36:56 -06001106 AuthorizationSet begin_params(client_params());
1107 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001108 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001109 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001110
1111 string result;
1112 size_t input_consumed;
1113 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1114 EXPECT_EQ(message.size(), input_consumed);
1115 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001116
1117 if (GetParam()->expect_keymaster0_calls())
1118 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001119}
1120
Shawn Willden58427c42015-05-20 13:00:42 -06001121TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001122 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1123 .RsaSigningKey(512, 3)
1124 .Digest(KM_DIGEST_SHA_2_256)
1125 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001126 // Use large message, which won't work without digesting.
1127 string message(1024, 'a');
1128 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001129 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001130 ++message[message.size() / 2];
1131
Shawn Willden226746b2015-05-08 11:36:56 -06001132 AuthorizationSet begin_params(client_params());
1133 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001134 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001135 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001136
1137 string result;
1138 size_t input_consumed;
1139 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1140 EXPECT_EQ(message.size(), input_consumed);
1141 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001142
1143 if (GetParam()->expect_keymaster0_calls())
1144 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001145}
1146
1147template <typename T> vector<T> make_vector(const T* array, size_t len) {
1148 return vector<T>(array, array + len);
1149}
1150
Shawn Willden58427c42015-05-20 13:00:42 -06001151TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001152 // Get all supported digests and padding modes.
1153 size_t digests_len;
1154 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -06001155 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001156 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1157 &digests_len));
1158
1159 size_t padding_modes_len;
1160 keymaster_padding_t* padding_modes;
Shawn Willden0cb69422015-05-26 08:31:37 -06001161 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001162 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1163 &padding_modes, &padding_modes_len));
1164
1165 // Try them.
1166 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1167 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
1168 // Compute key & message size that will work.
1169 size_t key_bits = 256;
1170 size_t message_len = 1000;
1171 switch (digest) {
1172 case KM_DIGEST_NONE:
1173 switch (padding_mode) {
1174 case KM_PAD_NONE:
1175 // Match key size.
1176 message_len = key_bits / 8;
1177 break;
1178 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1179 message_len = key_bits / 8 - 11;
1180 break;
1181 case KM_PAD_RSA_PSS:
1182 // PSS requires a digest.
1183 continue;
1184 default:
1185 FAIL() << "Missing padding";
1186 break;
1187 }
1188 break;
1189
1190 case KM_DIGEST_SHA_2_256:
1191 switch (padding_mode) {
1192 case KM_PAD_NONE:
Shawn Willden3ad5f052015-05-08 14:05:13 -06001193 // Digesting requires padding
1194 continue;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001195 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1196 key_bits += 8 * 11;
1197 break;
1198 case KM_PAD_RSA_PSS:
1199 key_bits += 8 * 10;
1200 break;
1201 default:
1202 FAIL() << "Missing padding";
1203 break;
1204 }
1205 break;
1206 default:
1207 FAIL() << "Missing digest";
1208 }
1209
Shawn Willdenaf533992015-04-15 13:48:28 -06001210 GenerateKey(AuthorizationSetBuilder()
1211 .RsaSigningKey(key_bits, 3)
1212 .Digest(digest)
1213 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001214 string message(message_len, 'a');
1215 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001216 SignMessage(message, &signature, digest, padding_mode);
1217 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001218 }
1219 }
1220
1221 free(padding_modes);
1222 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -06001223
1224 if (GetParam()->expect_keymaster0_calls())
1225 EXPECT_EQ(16, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001226}
1227
Shawn Willden58427c42015-05-20 13:00:42 -06001228TEST_P(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001229 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001230 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001231 string message = "123456789012345678901234567890123456789012345678";
1232 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001233 SignMessage(message, &signature, KM_DIGEST_NONE);
1234 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001235
1236 if (GetParam()->expect_keymaster0_calls())
1237 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001238}
1239
Shawn Willden58427c42015-05-20 13:00:42 -06001240TEST_P(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001241 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001242 string message = "123456789012345678901234567890123456789012345678";
1243 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001244 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1245 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden2beb6282015-05-20 16:36:24 -06001246
1247 if (GetParam()->expect_keymaster0_calls())
1248 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001249}
1250
Shawn Willden58427c42015-05-20 13:00:42 -06001251TEST_P(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001252 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001253 string message = "123456789012345678901234567890123456789012345678";
1254 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001255 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1256 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden2beb6282015-05-20 16:36:24 -06001257
1258 if (GetParam()->expect_keymaster0_calls())
1259 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001260}
1261
Shawn Willden58427c42015-05-20 13:00:42 -06001262TEST_P(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001263 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001264 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001265 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001266 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1267 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001268
1269 if (GetParam()->expect_keymaster0_calls())
1270 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -07001271}
1272
Shawn Willden58427c42015-05-20 13:00:42 -06001273TEST_P(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001274 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001275 string message = "123456789012345678901234567890123456789012345678";
1276 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001277 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1278 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden2beb6282015-05-20 16:36:24 -06001279
1280 if (GetParam()->expect_keymaster0_calls())
1281 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001282}
1283
Shawn Willden58427c42015-05-20 13:00:42 -06001284TEST_P(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001285 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001286 string message = "123456789012345678901234567890123456789012345678";
1287 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001288 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1289 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden2beb6282015-05-20 16:36:24 -06001290
1291 if (GetParam()->expect_keymaster0_calls())
1292 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001293}
1294
Shawn Willden58427c42015-05-20 13:00:42 -06001295typedef Keymaster1Test ExportKeyTest;
1296INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params);
1297
1298TEST_P(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001299 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1300 .RsaSigningKey(256, 3)
1301 .Digest(KM_DIGEST_NONE)
1302 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001303 string export_data;
1304 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001305 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001306
1307 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001308
1309 if (GetParam()->expect_keymaster0_calls())
1310 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenffd790c2014-08-18 21:20:06 -06001311}
1312
Shawn Willden58427c42015-05-20 13:00:42 -06001313TEST_P(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001314 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001315 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001316 string export_data;
1317 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001318 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001319
1320 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001321
1322 if (GetParam()->expect_keymaster0_calls())
1323 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001324}
1325
Shawn Willden58427c42015-05-20 13:00:42 -06001326TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001327 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1328 .RsaSigningKey(256, 3)
1329 .Digest(KM_DIGEST_NONE)
1330 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001331 string export_data;
1332 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001333
1334 if (GetParam()->expect_keymaster0_calls())
1335 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001336}
1337
Shawn Willden58427c42015-05-20 13:00:42 -06001338TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001339 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1340 .RsaSigningKey(256, 3)
1341 .Digest(KM_DIGEST_NONE)
1342 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001343 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001344 string export_data;
1345 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001346
1347 if (GetParam()->expect_keymaster0_calls())
1348 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001349}
1350
Shawn Willden58427c42015-05-20 13:00:42 -06001351TEST_P(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001352 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001353 string export_data;
1354
1355 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1356 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1357 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001358
1359 if (GetParam()->expect_keymaster0_calls())
1360 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden7dad93b2015-02-05 10:20:47 -07001361}
1362
Shawn Willden437fbd12014-08-20 11:59:49 -06001363static string read_file(const string& file_name) {
1364 ifstream file_stream(file_name, std::ios::binary);
1365 istreambuf_iterator<char> file_begin(file_stream);
1366 istreambuf_iterator<char> file_end;
1367 return string(file_begin, file_end);
1368}
1369
Shawn Willden58427c42015-05-20 13:00:42 -06001370typedef Keymaster1Test ImportKeyTest;
1371INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params);
1372
1373TEST_P(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001374 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001375 ASSERT_EQ(633U, pk8_key.size());
1376
Shawn Willdenaf533992015-04-15 13:48:28 -06001377 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1378 .RsaSigningKey(1024, 65537)
1379 .Digest(KM_DIGEST_NONE)
1380 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001381 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001382
1383 // Check values derived from the key.
Shawn Willden2beb6282015-05-20 16:36:24 -06001384 EXPECT_TRUE(contains(GetParam()->crypto_params_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1385 : sw_enforced(),
1386 TAG_ALGORITHM, KM_ALGORITHM_RSA));
1387 EXPECT_TRUE(contains(GetParam()->crypto_params_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1388 : sw_enforced(),
1389 TAG_KEY_SIZE, 1024));
1390 EXPECT_TRUE(contains(GetParam()->crypto_params_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1391 : sw_enforced(),
1392 TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001393
Shawn Willdenb6837e72015-05-16 09:20:59 -06001394 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001395 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1396 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001397
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001398 string message(1024 / 8, 'a');
1399 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001400 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1401 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001402
1403 if (GetParam()->expect_keymaster0_calls())
1404 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden437fbd12014-08-20 11:59:49 -06001405}
1406
Shawn Willden58427c42015-05-20 13:00:42 -06001407TEST_P(ImportKeyTest, OldApiRsaSuccess) {
Shawn Willdend7a5c712015-04-09 16:33:52 -06001408 string pk8_key = read_file("rsa_privkey_pk8.der");
1409 ASSERT_EQ(633U, pk8_key.size());
1410
1411 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1412 // point softkeymaster will no longer support keymaster0 APIs anyway.
1413 uint8_t* key_blob;
1414 size_t key_blob_length;
1415 ASSERT_EQ(0,
1416 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1417 pk8_key.size(), &key_blob, &key_blob_length));
1418 set_key_blob(key_blob, key_blob_length);
1419
1420 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001421 AuthorizationSet begin_params; // Don't use client data.
1422 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001423 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001424 AuthorizationSet update_params;
1425 AuthorizationSet output_params;
1426 string signature =
1427 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1428 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1429 &output_params);
Shawn Willden2beb6282015-05-20 16:36:24 -06001430
1431 if (GetParam()->expect_keymaster0_calls())
1432 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdend7a5c712015-04-09 16:33:52 -06001433}
1434
Shawn Willden58427c42015-05-20 13:00:42 -06001435TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001436 string pk8_key = read_file("rsa_privkey_pk8.der");
1437 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001438 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001439 ImportKey(AuthorizationSetBuilder()
1440 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1441 .Digest(KM_DIGEST_NONE)
1442 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001443 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001444
1445 if (GetParam()->expect_keymaster0_calls())
1446 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001447}
1448
Shawn Willden58427c42015-05-20 13:00:42 -06001449TEST_P(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001450 string pk8_key = read_file("rsa_privkey_pk8.der");
1451 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001452 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001453 ImportKey(AuthorizationSetBuilder()
1454 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1455 .Digest(KM_DIGEST_NONE)
1456 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001457 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001458
1459 if (GetParam()->expect_keymaster0_calls())
1460 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001461}
1462
Shawn Willden58427c42015-05-20 13:00:42 -06001463TEST_P(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001464 string pk8_key = read_file("ec_privkey_pk8.der");
1465 ASSERT_EQ(138U, pk8_key.size());
1466
Shawn Willdenaf533992015-04-15 13:48:28 -06001467 ASSERT_EQ(KM_ERROR_OK,
1468 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1469 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001470
1471 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001472 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001473 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001474
Shawn Willdenb6837e72015-05-16 09:20:59 -06001475 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001476 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1477 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001478
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001479 string message(1024 / 8, 'a');
1480 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001481 SignMessage(message, &signature, KM_DIGEST_NONE);
1482 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001483
1484 if (GetParam()->expect_keymaster0_calls())
1485 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden81effc62014-08-27 10:08:46 -06001486}
1487
Shawn Willden58427c42015-05-20 13:00:42 -06001488TEST_P(ImportKeyTest, EcdsaSizeSpecified) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001489 string pk8_key = read_file("ec_privkey_pk8.der");
1490 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001491
Shawn Willdenaf533992015-04-15 13:48:28 -06001492 ASSERT_EQ(KM_ERROR_OK,
1493 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1494 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001495
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001496 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001497 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001498 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1499
Shawn Willdenb6837e72015-05-16 09:20:59 -06001500 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001501 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1502 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1503
1504 string message(1024 / 8, 'a');
1505 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001506 SignMessage(message, &signature, KM_DIGEST_NONE);
1507 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001508
1509 if (GetParam()->expect_keymaster0_calls())
1510 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001511}
1512
Shawn Willden58427c42015-05-20 13:00:42 -06001513TEST_P(ImportKeyTest, EcdsaSizeMismatch) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001514 string pk8_key = read_file("ec_privkey_pk8.der");
1515 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001516 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001517 ImportKey(AuthorizationSetBuilder()
1518 .EcdsaSigningKey(224 /* Doesn't match key */)
1519 .Digest(KM_DIGEST_NONE),
1520 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001521
1522 if (GetParam()->expect_keymaster0_calls())
1523 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001524}
1525
Shawn Willden58427c42015-05-20 13:00:42 -06001526TEST_P(ImportKeyTest, AesKeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001527 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1528 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001529 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001530 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1531 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001532 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001533
1534 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1535 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1536
1537 string message = "Hello World!";
Shawn Willdenc4424672015-05-11 11:56:02 -06001538 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1539 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willden3b702e22015-02-05 10:26:47 -07001540 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001541
1542 if (GetParam()->expect_keymaster0_calls())
1543 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001544}
1545
Shawn Willden58427c42015-05-20 13:00:42 -06001546TEST_P(ImportKeyTest, HmacSha256KeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001547 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1548 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001549 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1550 .HmacKey(sizeof(key_data) * 8)
1551 .Digest(KM_DIGEST_SHA_2_256)
1552 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001553 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001554
1555 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1556 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1557
1558 string message = "Hello World!";
1559 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001560 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1561 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001562
1563 if (GetParam()->expect_keymaster0_calls())
1564 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001565}
1566
Shawn Willden58427c42015-05-20 13:00:42 -06001567typedef Keymaster1Test EncryptionOperationsTest;
1568INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params);
1569
1570TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001571 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1572 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001573
1574 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001575 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001576 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001577
Shawn Willden3ad5f052015-05-08 14:05:13 -06001578 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001579 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001580
1581 // OAEP randomizes padding so every result should be different.
1582 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001583
1584 if (GetParam()->expect_keymaster0_calls())
1585 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001586}
1587
Shawn Willden58427c42015-05-20 13:00:42 -06001588TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001589 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1590 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001591 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001592 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001593 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001594
Shawn Willden3ad5f052015-05-08 14:05:13 -06001595 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001596 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001597
1598 if (GetParam()->expect_keymaster0_calls())
1599 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001600}
1601
Shawn Willden58427c42015-05-20 13:00:42 -06001602TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001603 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1604 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001605 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001606 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001607 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001608
Shawn Willden3ad5f052015-05-08 14:05:13 -06001609 AuthorizationSet begin_params(client_params());
1610 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1611 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001612 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001613 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001614 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001615
1616 if (GetParam()->expect_keymaster0_calls())
1617 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001618}
1619
Shawn Willden58427c42015-05-20 13:00:42 -06001620TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001621 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1622 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001623 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001624 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001625 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001626
1627 // Corrupt the ciphertext
1628 ciphertext[512 / 8 / 2]++;
1629
Shawn Willden4200f212014-12-02 07:01:21 -07001630 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001631 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001632 AuthorizationSet begin_params(client_params());
1633 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1634 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001635 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001636 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001637 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001638
1639 if (GetParam()->expect_keymaster0_calls())
1640 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001641}
1642
Shawn Willden58427c42015-05-20 13:00:42 -06001643TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001644 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1645 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001646 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001647 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001648 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001649
Shawn Willden3ad5f052015-05-08 14:05:13 -06001650 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001651 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001652
1653 // PKCS1 v1.5 randomizes padding so every result should be different.
1654 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001655
1656 if (GetParam()->expect_keymaster0_calls())
1657 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001658}
1659
Shawn Willden58427c42015-05-20 13:00:42 -06001660TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001661 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1662 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001663 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001664 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001665 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001666
Shawn Willden3ad5f052015-05-08 14:05:13 -06001667 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001668 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001669
1670 if (GetParam()->expect_keymaster0_calls())
1671 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001672}
1673
Shawn Willden58427c42015-05-20 13:00:42 -06001674TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001675 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1676 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willden7bae1322015-05-26 10:16:49 -06001677 string message = "123456789012345678901234567890123456789012345678901234";
Shawn Willden4200f212014-12-02 07:01:21 -07001678 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001679 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001680
Shawn Willden3ad5f052015-05-08 14:05:13 -06001681 AuthorizationSet begin_params(client_params());
1682 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1683 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001684 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001685 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001686 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001687
1688 if (GetParam()->expect_keymaster0_calls())
1689 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001690}
1691
Shawn Willden58427c42015-05-20 13:00:42 -06001692TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001693 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1694 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001695 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001696 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001697 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001698
1699 // Corrupt the ciphertext
1700 ciphertext[512 / 8 / 2]++;
1701
Shawn Willden4200f212014-12-02 07:01:21 -07001702 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001703 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001704 AuthorizationSet begin_params(client_params());
1705 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1706 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001707 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001708 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001709 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001710
1711 if (GetParam()->expect_keymaster0_calls())
1712 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001713}
1714
Shawn Willden58427c42015-05-20 13:00:42 -06001715TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001716 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1717 .RsaSigningKey(256, 3)
1718 .Digest(KM_DIGEST_NONE)
1719 .Padding(KM_PAD_NONE)));
1720 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1721 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001722
1723 if (GetParam()->expect_keymaster0_calls())
1724 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001725}
1726
Shawn Willden58427c42015-05-20 13:00:42 -06001727TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001728 ASSERT_EQ(KM_ERROR_OK,
1729 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1730 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1731 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001732
1733 if (GetParam()->expect_keymaster0_calls())
1734 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001735}
1736
Shawn Willden58427c42015-05-20 13:00:42 -06001737TEST_P(EncryptionOperationsTest, HmacEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001738 ASSERT_EQ(
1739 KM_ERROR_OK,
1740 GenerateKey(
1741 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1742 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1743 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001744
1745 if (GetParam()->expect_keymaster0_calls())
1746 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001747}
1748
Shawn Willden58427c42015-05-20 13:00:42 -06001749TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001750 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1751 .AesEncryptionKey(128)
1752 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1753 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001754 // Two-block message.
1755 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001756 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001757 EXPECT_EQ(message.size(), ciphertext1.size());
1758
Shawn Willden31e063f2015-05-08 14:31:22 -06001759 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001760 EXPECT_EQ(message.size(), ciphertext2.size());
1761
1762 // ECB is deterministic.
1763 EXPECT_EQ(ciphertext1, ciphertext2);
1764
Shawn Willden31e063f2015-05-08 14:31:22 -06001765 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001766 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001767
1768 if (GetParam()->expect_keymaster0_calls())
1769 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001770}
1771
Shawn Willden58427c42015-05-20 13:00:42 -06001772TEST_P(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001773 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1774 .AesEncryptionKey(128)
1775 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1776 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001777 // Message is slightly shorter than two blocks.
1778 string message = "1234567890123456789012345678901";
1779
Shawn Willden31e063f2015-05-08 14:31:22 -06001780 AuthorizationSet begin_params(client_params());
1781 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001782 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001783 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001784 string ciphertext;
1785 size_t input_consumed;
1786 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1787 EXPECT_EQ(message.size(), input_consumed);
1788 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001789
1790 if (GetParam()->expect_keymaster0_calls())
1791 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001792}
1793
Shawn Willden58427c42015-05-20 13:00:42 -06001794TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001795 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001796 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001797 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1798 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001799
1800 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001801 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001802 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001803 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001804 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001805 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001806 EXPECT_EQ(message, plaintext);
1807 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001808
1809 if (GetParam()->expect_keymaster0_calls())
1810 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001811}
1812
Shawn Willden58427c42015-05-20 13:00:42 -06001813TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001814 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001815 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001816 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1817 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001818
1819 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001820 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001821 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001822 EXPECT_NE(ciphertext, message);
1823 ++ciphertext[ciphertext.size() / 2];
1824
Shawn Willden31e063f2015-05-08 14:31:22 -06001825 AuthorizationSet begin_params(client_params());
1826 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001827 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
Shawn Willden31e063f2015-05-08 14:31:22 -06001828 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001829 string plaintext;
1830 size_t input_consumed;
1831 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1832 EXPECT_EQ(ciphertext.size(), input_consumed);
1833 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001834
1835 if (GetParam()->expect_keymaster0_calls())
1836 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001837}
1838
Shawn Willden58427c42015-05-20 13:00:42 -06001839TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001840 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1841 .AesEncryptionKey(128)
1842 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1843 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001844 string message = "123";
1845 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001846 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001847 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001848 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001849
1850 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001851 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001852 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001853 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001854
1855 // IVs should be random, so ciphertexts should differ.
1856 EXPECT_NE(iv1, iv2);
1857 EXPECT_NE(ciphertext1, ciphertext2);
1858
Shawn Willden31e063f2015-05-08 14:31:22 -06001859 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001860 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001861
1862 if (GetParam()->expect_keymaster0_calls())
1863 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001864}
1865
Shawn Willden58427c42015-05-20 13:00:42 -06001866TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001867 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1868 .AesEncryptionKey(128)
1869 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1870 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001871
1872 int increment = 15;
1873 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001874 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001875 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001876 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001877 AuthorizationSet output_params;
1878 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1879
1880 string ciphertext;
1881 size_t input_consumed;
1882 for (size_t i = 0; i < message.size(); i += increment)
1883 EXPECT_EQ(KM_ERROR_OK,
1884 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1885 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1886 EXPECT_EQ(message.size(), ciphertext.size());
1887
1888 // Move TAG_NONCE into input_params
1889 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001890 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001891 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001892 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001893 output_params.Clear();
1894
1895 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1896 string plaintext;
1897 for (size_t i = 0; i < ciphertext.size(); i += increment)
1898 EXPECT_EQ(KM_ERROR_OK,
1899 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1900 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1901 EXPECT_EQ(ciphertext.size(), plaintext.size());
1902 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001903
1904 if (GetParam()->expect_keymaster0_calls())
1905 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001906}
1907
1908struct AesCtrSp80038aTestVector {
1909 const char* key;
1910 const char* nonce;
1911 const char* plaintext;
1912 const char* ciphertext;
1913};
1914
1915// These test vectors are taken from
1916// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1917static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1918 // AES-128
1919 {
1920 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1921 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1922 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1923 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1924 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1925 },
1926 // AES-192
1927 {
1928 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1929 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1930 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1931 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1932 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1933 },
1934 // AES-256
1935 {
1936 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1937 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1938 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1939 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1940 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1941 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1942 },
1943};
1944
Shawn Willden58427c42015-05-20 13:00:42 -06001945TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
Thai Duong20d725d2015-03-24 17:49:58 -07001946 for (size_t i = 0; i < 3; i++) {
1947 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1948 const string key = hex2str(test.key);
1949 const string nonce = hex2str(test.nonce);
1950 const string plaintext = hex2str(test.plaintext);
1951 const string ciphertext = hex2str(test.ciphertext);
1952 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1953 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001954
1955 if (GetParam()->expect_keymaster0_calls())
1956 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001957}
1958
Shawn Willden58427c42015-05-20 13:00:42 -06001959TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
Thai Duong20d725d2015-03-24 17:49:58 -07001960 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1961 .AesEncryptionKey(128)
1962 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1963 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06001964 AuthorizationSet begin_params(client_params());
1965 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001966 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001967 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06001968
1969 if (GetParam()->expect_keymaster0_calls())
1970 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001971}
1972
Shawn Willden58427c42015-05-20 13:00:42 -06001973TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
Thai Duong20d725d2015-03-24 17:49:58 -07001974 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1975 .AesEncryptionKey(128)
1976 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001977 .Authorization(TAG_CALLER_NONCE)
1978 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001979
Shawn Willden09f25272015-04-15 13:49:49 -06001980 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001981 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001982 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001983 input_params.push_back(TAG_NONCE, "123", 3);
1984 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06001985
1986 if (GetParam()->expect_keymaster0_calls())
1987 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001988}
1989
Shawn Willden58427c42015-05-20 13:00:42 -06001990TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001991 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1992 .AesEncryptionKey(128)
1993 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1994 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001995 // Two-block message.
1996 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001997 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001998 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001999 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002000
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002001 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06002002 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002003 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002004
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002005 // IVs should be random, so ciphertexts should differ.
2006 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002007 EXPECT_NE(ciphertext1, ciphertext2);
2008
Shawn Willden31e063f2015-05-08 14:31:22 -06002009 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002010 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002011
2012 if (GetParam()->expect_keymaster0_calls())
2013 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002014}
2015
Shawn Willden58427c42015-05-20 13:00:42 -06002016TEST_P(EncryptionOperationsTest, AesCallerNonce) {
Shawn Willden969aa382015-04-15 17:05:53 -07002017 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2018 .AesEncryptionKey(128)
2019 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002020 .Authorization(TAG_CALLER_NONCE)
2021 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07002022 string message = "12345678901234567890123456789012";
2023 string iv1;
2024 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002025 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002026 EXPECT_EQ(message.size(), ciphertext1.size());
2027 EXPECT_EQ(16U, iv1.size());
2028
Shawn Willden31e063f2015-05-08 14:31:22 -06002029 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002030 EXPECT_EQ(message, plaintext);
2031
2032 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06002033 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07002034 AuthorizationSet update_params;
2035 AuthorizationSet output_params;
2036 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002037 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002038 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002039 string ciphertext2 =
2040 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
2041
2042 // Decrypt with correct nonce.
2043 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2044 &output_params);
2045 EXPECT_EQ(message, plaintext);
2046
2047 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06002048 input_params.Reinitialize(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002049 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002050 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002051 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
2052 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2053 &output_params);
2054 EXPECT_NE(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002055
2056 if (GetParam()->expect_keymaster0_calls())
2057 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden969aa382015-04-15 17:05:53 -07002058}
2059
Shawn Willden58427c42015-05-20 13:00:42 -06002060TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002061 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2062 .AesEncryptionKey(128)
2063 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2064 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06002065
2066 string message = "12345678901234567890123456789012";
2067 string iv1;
2068 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002069 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002070 EXPECT_EQ(message.size(), ciphertext1.size());
2071 EXPECT_EQ(16U, iv1.size());
2072
Shawn Willden31e063f2015-05-08 14:31:22 -06002073 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002074 EXPECT_EQ(message, plaintext);
2075
2076 // Now specify a nonce, should fail.
2077 AuthorizationSet input_params(client_params());
2078 AuthorizationSet update_params;
2079 AuthorizationSet output_params;
2080 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002081 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002082 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden67706352015-04-28 00:43:19 -06002083
2084 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
2085 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002086
2087 if (GetParam()->expect_keymaster0_calls())
2088 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden67706352015-04-28 00:43:19 -06002089}
2090
Shawn Willden58427c42015-05-20 13:00:42 -06002091TEST_P(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002092 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2093 .AesEncryptionKey(128)
2094 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2095 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002096
2097 int increment = 15;
2098 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06002099 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002100 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002101 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002102 AuthorizationSet output_params;
2103 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2104
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002105 string ciphertext;
2106 size_t input_consumed;
2107 for (size_t i = 0; i < message.size(); i += increment)
2108 EXPECT_EQ(KM_ERROR_OK,
2109 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2110 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002111 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002112
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002113 // Move TAG_NONCE into input_params
2114 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06002115 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002116 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002117 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002118 output_params.Clear();
2119
2120 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002121 string plaintext;
2122 for (size_t i = 0; i < ciphertext.size(); i += increment)
2123 EXPECT_EQ(KM_ERROR_OK,
2124 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2125 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002126 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002127 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002128
2129 if (GetParam()->expect_keymaster0_calls())
2130 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002131}
2132
Shawn Willden58427c42015-05-20 13:00:42 -06002133TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002134 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002135 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002136 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2137 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002138
2139 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06002140 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002141 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002142 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06002143 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002144 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06002145 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002146 EXPECT_EQ(message, plaintext);
2147 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002148
2149 if (GetParam()->expect_keymaster0_calls())
2150 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002151}
2152
Shawn Willden58427c42015-05-20 13:00:42 -06002153typedef Keymaster1Test AddEntropyTest;
2154INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params);
2155
2156TEST_P(AddEntropyTest, AddEntropy) {
Shawn Willdencd695822015-01-26 14:06:32 -07002157 // There's no obvious way to test that entropy is actually added, but we can test that the API
2158 // doesn't blow up or return an error.
2159 EXPECT_EQ(KM_ERROR_OK,
2160 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
Shawn Willden2beb6282015-05-20 16:36:24 -06002161
2162 if (GetParam()->expect_keymaster0_calls())
2163 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2164}
2165
2166typedef Keymaster1Test Keymaster0AdapterTest;
2167INSTANTIATE_TEST_CASE_P(
2168 AndroidKeymasterTest, Keymaster0AdapterTest,
2169 ::testing::Values(InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator)));
2170
2171TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1Blob) {
2172 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2173 // key data.
2174 string km1_sw = read_file("km1_sw_rsa_512.blob");
2175 EXPECT_EQ(486U, km1_sw.length());
2176
2177 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2178 memcpy(key_data, km1_sw.data(), km1_sw.length());
2179 set_key_blob(key_data, km1_sw.length());
2180
2181 string message(64, 'a');
2182 string signature;
2183 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2184
2185 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2186}
2187
2188struct Malloc_Delete {
2189 void operator()(void* p) { free(p); }
2190};
2191
2192TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster0Blob) {
2193 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2194 string km0_sw = read_file("km0_sw_rsa_512.blob");
2195 EXPECT_EQ(333U, km0_sw.length());
2196
2197 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2198 memcpy(key_data, km0_sw.data(), km0_sw.length());
2199 set_key_blob(key_data, km0_sw.length());
2200
2201 string message(64, 'a');
2202 string signature;
2203 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2204
2205 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdencd695822015-01-26 14:06:32 -07002206}
2207
Shawn Willden128ffe02014-08-06 12:31:33 -06002208} // namespace test
2209} // namespace keymaster