blob: f68733bda6d551f2fdcebfa0ccd61f36d172ab8c [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 Willden4f83b892015-05-26 12:52:54 -0600343 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
344 GenerateKey(AuthorizationSetBuilder()
345 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_EC)
346 .SigningKey()
347 .Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600348
349 if (GetParam()->expect_keymaster0_calls())
350 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600351}
352
Shawn Willden58427c42015-05-20 13:00:42 -0600353TEST_P(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700354 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willdenaf533992015-04-15 13:48:28 -0600355 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600356
357 if (GetParam()->expect_keymaster0_calls())
358 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600359}
360
Shawn Willden58427c42015-05-20 13:00:42 -0600361TEST_P(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600362 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600363 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600364 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
365 KM_DIGEST_NONE)))
Shawn Willden58427c42015-05-20 13:00:42 -0600366 << "Failed to generate size: "
367 << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600368 }
Shawn Willden2beb6282015-05-20 16:36:24 -0600369
370 if (GetParam()->expect_keymaster0_calls())
371 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600372}
373
Shawn Willden58427c42015-05-20 13:00:42 -0600374TEST_P(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700375 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600376 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600377
378 if (GetParam()->expect_keymaster0_calls())
379 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700380}
381
Shawn Willden58427c42015-05-20 13:00:42 -0600382typedef Keymaster1Test GetKeyCharacteristics;
383INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, GetKeyCharacteristics, test_params);
384
385TEST_P(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600386 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
387 .RsaSigningKey(256, 3)
388 .Digest(KM_DIGEST_NONE)
389 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700390 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600391
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700392 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
393 EXPECT_EQ(original, sw_enforced());
Shawn Willden2beb6282015-05-20 16:36:24 -0600394
395 if (GetParam()->expect_keymaster0_calls())
396 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden76364712014-08-11 17:48:04 -0600397}
398
Shawn Willden58427c42015-05-20 13:00:42 -0600399typedef Keymaster1Test SigningOperationsTest;
400INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, SigningOperationsTest, test_params);
401
402TEST_P(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600403 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
404 .RsaSigningKey(256, 3)
405 .Digest(KM_DIGEST_NONE)
406 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700407 string message = "12345678901234567890123456789012";
408 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600409 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600410
411 if (GetParam()->expect_keymaster0_calls())
412 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600413}
414
Shawn Willden58427c42015-05-20 13:00:42 -0600415TEST_P(SigningOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600416 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600417 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600418 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600419 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700420 string message(1024, 'a');
421 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600422 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600423
424 if (GetParam()->expect_keymaster0_calls())
425 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700426}
427
Shawn Willden58427c42015-05-20 13:00:42 -0600428TEST_P(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600429 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
430 .RsaSigningKey(512, 3)
431 .Digest(KM_DIGEST_SHA_2_256)
432 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700433 // Use large message, which won't work without digesting.
434 string message(1024, 'a');
435 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600436 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600437
438 if (GetParam()->expect_keymaster0_calls())
439 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -0700440}
441
Shawn Willden58427c42015-05-20 13:00:42 -0600442TEST_P(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600443 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
444 .RsaSigningKey(512, 3)
445 .Digest(KM_DIGEST_SHA_2_256)
446 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700447 string message(1024, 'a');
448 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600449 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -0600450
451 if (GetParam()->expect_keymaster0_calls())
452 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700453}
454
Shawn Willden58427c42015-05-20 13:00:42 -0600455TEST_P(SigningOperationsTest, RsaPssSha256TooSmallKey) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700456 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
457 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600458 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
459 .RsaSigningKey(256 + 9 * 8, 3)
460 .Digest(KM_DIGEST_SHA_2_256)
461 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700462 string message(1024, 'a');
463 string signature;
464
Shawn Willden226746b2015-05-08 11:36:56 -0600465 AuthorizationSet begin_params(client_params());
466 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600467 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600468 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700469
470 string result;
471 size_t input_consumed;
472 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
473 EXPECT_EQ(message.size(), input_consumed);
474 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -0600475
476 if (GetParam()->expect_keymaster0_calls())
477 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700478}
479
Shawn Willden58427c42015-05-20 13:00:42 -0600480TEST_P(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600481 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
482 .RsaSigningKey(256, 3)
483 .Digest(KM_DIGEST_NONE)
484 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600485 AuthorizationSet begin_params(client_params());
486 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600487 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600488 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700489 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
490 // Another abort should fail
491 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden2beb6282015-05-20 16:36:24 -0600492
493 if (GetParam()->expect_keymaster0_calls())
494 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600495}
496
Shawn Willden58427c42015-05-20 13:00:42 -0600497TEST_P(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600498 GenerateKey(AuthorizationSetBuilder()
499 .RsaSigningKey(256, 3)
500 .Digest(KM_DIGEST_MD5)
501 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700502 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden2beb6282015-05-20 16:36:24 -0600503
504 if (GetParam()->expect_keymaster0_calls())
505 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600506}
507
Shawn Willden58427c42015-05-20 13:00:42 -0600508TEST_P(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600509 GenerateKey(AuthorizationSetBuilder()
510 .RsaSigningKey(256, 3)
511 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
512 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600513 AuthorizationSet begin_params(client_params());
514 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
515 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600516
517 if (GetParam()->expect_keymaster0_calls())
518 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600519}
520
Shawn Willden58427c42015-05-20 13:00:42 -0600521TEST_P(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700522 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600523 GenerateKey(AuthorizationSetBuilder()
524 .RsaSigningKey(256, 3)
525 .Digest(KM_DIGEST_NONE)
526 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600527 AuthorizationSet begin_params(client_params());
528 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600529 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600530 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600531
532 if (GetParam()->expect_keymaster0_calls())
533 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600534}
535
Shawn Willden58427c42015-05-20 13:00:42 -0600536TEST_P(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700537 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600538 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
539 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600540 AuthorizationSet begin_params(client_params());
541 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
542 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600543
544 if (GetParam()->expect_keymaster0_calls())
545 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600546}
547
Shawn Willden58427c42015-05-20 13:00:42 -0600548TEST_P(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600549 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
550 .RsaSigningKey(256, 3)
551 .Digest(KM_DIGEST_NONE)
552 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600553 AuthorizationSet begin_params(client_params());
554 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600555 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600556 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600557
558 string message = "1234567890123456789012345678901";
559 string result;
560 size_t input_consumed;
561 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
562 EXPECT_EQ(0U, result.size());
563 EXPECT_EQ(31U, input_consumed);
564
565 string signature;
566 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
567 EXPECT_EQ(0U, signature.length());
Shawn Willden2beb6282015-05-20 16:36:24 -0600568
569 if (GetParam()->expect_keymaster0_calls())
570 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600571}
572
Shawn Willden58427c42015-05-20 13:00:42 -0600573TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600574 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
575 .RsaEncryptionKey(256, 3)
576 .Digest(KM_DIGEST_NONE)
577 .Padding(KM_PAD_NONE)));
578 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
579 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600580
581 if (GetParam()->expect_keymaster0_calls())
582 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600583}
584
Shawn Willden58427c42015-05-20 13:00:42 -0600585TEST_P(SigningOperationsTest, EcdsaSuccess) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600586 ASSERT_EQ(KM_ERROR_OK,
587 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
588 string message = "123456789012345678901234567890123456789012345678";
589 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600590 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600591
592 if (GetParam()->expect_keymaster0_calls())
593 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600594}
595
Shawn Willden58427c42015-05-20 13:00:42 -0600596TEST_P(SigningOperationsTest, AesEcbSign) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600597 ASSERT_EQ(KM_ERROR_OK,
598 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
599 TAG_BLOCK_MODE, KM_MODE_ECB)));
600 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
601 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600602
603 if (GetParam()->expect_keymaster0_calls())
604 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600605}
606
Shawn Willden58427c42015-05-20 13:00:42 -0600607TEST_P(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600608 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700609 string message = "12345678901234567890123456789012";
610 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600611 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600612 ASSERT_EQ(20U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600613
614 if (GetParam()->expect_keymaster0_calls())
615 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700616}
617
Shawn Willden58427c42015-05-20 13:00:42 -0600618TEST_P(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600619 ASSERT_EQ(KM_ERROR_OK,
620 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700621 string message = "12345678901234567890123456789012";
622 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600623 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600624 ASSERT_EQ(28U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600625
626 if (GetParam()->expect_keymaster0_calls())
627 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700628}
629
Shawn Willden58427c42015-05-20 13:00:42 -0600630TEST_P(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600631 ASSERT_EQ(KM_ERROR_OK,
632 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700633 string message = "12345678901234567890123456789012";
634 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600635 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600636 ASSERT_EQ(32U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600637
638 if (GetParam()->expect_keymaster0_calls())
639 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700640}
641
Shawn Willden58427c42015-05-20 13:00:42 -0600642TEST_P(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600643 ASSERT_EQ(KM_ERROR_OK,
644 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
645
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700646 string message = "12345678901234567890123456789012";
647 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600648 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600649 ASSERT_EQ(48U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600650
651 if (GetParam()->expect_keymaster0_calls())
652 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700653}
654
Shawn Willden58427c42015-05-20 13:00:42 -0600655TEST_P(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600656 ASSERT_EQ(KM_ERROR_OK,
657 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700658 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700659 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600660 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600661 ASSERT_EQ(64U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600662
663 if (GetParam()->expect_keymaster0_calls())
664 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700665}
666
Shawn Willden58427c42015-05-20 13:00:42 -0600667TEST_P(SigningOperationsTest, HmacLengthInKey) {
Shawn Willden09f25272015-04-15 13:49:49 -0600668 // TODO(swillden): unified API should generate an error on key generation.
669 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
670 .HmacKey(128)
671 .Digest(KM_DIGEST_SHA_2_256)
672 .Authorization(TAG_MAC_LENGTH, 20)));
673 string message = "12345678901234567890123456789012";
674 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600675 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600676 // Size in key was ignored.
677 ASSERT_EQ(30U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600678
679 if (GetParam()->expect_keymaster0_calls())
680 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden09f25272015-04-15 13:49:49 -0600681}
682
Shawn Willden58427c42015-05-20 13:00:42 -0600683TEST_P(SigningOperationsTest, HmacRfc4231TestCase1) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700684 uint8_t key_data[] = {
685 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
686 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
687 };
688 string message = "Hi There";
689 uint8_t sha_224_expected[] = {
690 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
691 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
692 };
693 uint8_t sha_256_expected[] = {
694 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
695 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
696 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
697 };
698 uint8_t sha_384_expected[] = {
699 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
700 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
701 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
702 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
703 };
704 uint8_t sha_512_expected[] = {
705 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
706 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
707 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
708 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
709 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
710 };
711
712 string key = make_string(key_data);
713
714 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
715 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
716 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
717 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600718
719 if (GetParam()->expect_keymaster0_calls())
720 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700721}
722
Shawn Willden58427c42015-05-20 13:00:42 -0600723TEST_P(SigningOperationsTest, HmacRfc4231TestCase2) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700724 string key = "Jefe";
725 string message = "what do ya want for nothing?";
726 uint8_t sha_224_expected[] = {
727 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
728 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
729 };
730 uint8_t sha_256_expected[] = {
731 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
732 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
733 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
734 };
735 uint8_t sha_384_expected[] = {
736 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
737 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
738 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
739 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
740 };
741 uint8_t sha_512_expected[] = {
742 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
743 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
744 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
745 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
746 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
747 };
748
749 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
750 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
751 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
752 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600753
754 if (GetParam()->expect_keymaster0_calls())
755 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700756}
757
Shawn Willden58427c42015-05-20 13:00:42 -0600758TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700759 string key(20, 0xaa);
760 string message(50, 0xdd);
761 uint8_t sha_224_expected[] = {
762 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
763 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
764 };
765 uint8_t sha_256_expected[] = {
766 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
767 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
768 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
769 };
770 uint8_t sha_384_expected[] = {
771 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
772 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
773 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
774 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
775 };
776 uint8_t sha_512_expected[] = {
777 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
778 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
779 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
780 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
781 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
782 };
783
784 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
785 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
786 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
787 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600788
789 if (GetParam()->expect_keymaster0_calls())
790 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700791}
792
Shawn Willden58427c42015-05-20 13:00:42 -0600793TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700794 uint8_t key_data[25] = {
795 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
796 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
797 };
798 string key = make_string(key_data);
799 string message(50, 0xcd);
800 uint8_t sha_224_expected[] = {
801 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
802 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
803 };
804 uint8_t sha_256_expected[] = {
805 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
806 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
807 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
808 };
809 uint8_t sha_384_expected[] = {
810 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
811 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
812 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
813 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
814 };
815 uint8_t sha_512_expected[] = {
816 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
817 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
818 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
819 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
820 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
821 };
822
823 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
824 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
825 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
826 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600827
828 if (GetParam()->expect_keymaster0_calls())
829 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700830}
831
Shawn Willden58427c42015-05-20 13:00:42 -0600832TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700833 string key(20, 0x0c);
834 string message = "Test With Truncation";
835
836 uint8_t sha_224_expected[] = {
837 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
838 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
839 };
840 uint8_t sha_256_expected[] = {
841 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
842 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
843 };
844 uint8_t sha_384_expected[] = {
845 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
846 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
847 };
848 uint8_t sha_512_expected[] = {
849 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
850 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
851 };
852
853 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
854 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
855 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
856 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600857
858 if (GetParam()->expect_keymaster0_calls())
859 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700860}
861
Shawn Willden58427c42015-05-20 13:00:42 -0600862TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700863 string key(131, 0xaa);
864 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
865
866 uint8_t sha_224_expected[] = {
867 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
868 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
869 };
870 uint8_t sha_256_expected[] = {
871 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
872 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
873 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
874 };
875 uint8_t sha_384_expected[] = {
876 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
877 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
878 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
879 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
880 };
881 uint8_t sha_512_expected[] = {
882 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
883 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
884 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
885 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
886 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
887 };
888
889 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
890 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
891 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
892 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600893
894 if (GetParam()->expect_keymaster0_calls())
895 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700896}
897
Shawn Willden58427c42015-05-20 13:00:42 -0600898TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700899 string key(131, 0xaa);
900 string message = "This is a test using a larger than block-size key and a larger than "
901 "block-size data. The key needs to be hashed before being used by the HMAC "
902 "algorithm.";
903
904 uint8_t sha_224_expected[] = {
905 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
906 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
907 };
908 uint8_t sha_256_expected[] = {
909 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
910 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
911 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
912 };
913 uint8_t sha_384_expected[] = {
914 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
915 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
916 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
917 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
918 };
919 uint8_t sha_512_expected[] = {
920 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
921 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
922 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
923 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
924 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
925 };
926
927 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
928 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
929 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
930 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600931
932 if (GetParam()->expect_keymaster0_calls())
933 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700934}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700935
Shawn Willden58427c42015-05-20 13:00:42 -0600936TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600937 ASSERT_EQ(KM_ERROR_OK,
938 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
939 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600940 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600941 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600942 ASSERT_EQ(KM_ERROR_OK,
943 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
944 string message = "1234567890123456789012345678901";
945 string result;
946 size_t input_consumed;
947 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
948 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden2beb6282015-05-20 16:36:24 -0600949
950 if (GetParam()->expect_keymaster0_calls())
951 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700952}
953
Shawn Willden61902362014-12-18 10:33:24 -0700954// TODO(swillden): Add more verification failure tests.
955
Shawn Willden58427c42015-05-20 13:00:42 -0600956typedef Keymaster1Test VerificationOperationsTest;
957INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params);
958
959TEST_P(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600960 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
961 .RsaSigningKey(256, 3)
962 .Digest(KM_DIGEST_NONE)
963 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700964 string message = "12345678901234567890123456789012";
965 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600966 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
967 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600968
969 if (GetParam()->expect_keymaster0_calls())
970 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600971}
972
Shawn Willden58427c42015-05-20 13:00:42 -0600973TEST_P(VerificationOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600974 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600975 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600976 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600977 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700978 string message(1024, 'a');
979 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600980 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
981 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600982
983 if (GetParam()->expect_keymaster0_calls())
984 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -0700985}
986
Shawn Willden58427c42015-05-20 13:00:42 -0600987TEST_P(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600988 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600989 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600990 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600991 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700992 string message(1024, 'a');
993 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600994 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700995 ++signature[signature.size() / 2];
996
Shawn Willden226746b2015-05-08 11:36:56 -0600997 AuthorizationSet begin_params(client_params());
998 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600999 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001000 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001001
1002 string result;
1003 size_t input_consumed;
1004 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1005 EXPECT_EQ(message.size(), input_consumed);
1006 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001007
1008 if (GetParam()->expect_keymaster0_calls())
1009 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001010}
1011
Shawn Willden58427c42015-05-20 13:00:42 -06001012TEST_P(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001013 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1014 .RsaSigningKey(512, 3)
1015 .Digest(KM_DIGEST_SHA_2_256)
1016 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001017 // Use large message, which won't work without digesting.
1018 string message(1024, 'a');
1019 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001020 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
1021 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -06001022
1023 if (GetParam()->expect_keymaster0_calls())
1024 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001025}
1026
Shawn Willden58427c42015-05-20 13:00:42 -06001027TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001028 GenerateKey(AuthorizationSetBuilder()
1029 .RsaSigningKey(512, 3)
1030 .Digest(KM_DIGEST_SHA_2_256)
1031 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001032 string message(1024, 'a');
1033 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001034 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001035 ++signature[signature.size() / 2];
1036
Shawn Willden226746b2015-05-08 11:36:56 -06001037 AuthorizationSet begin_params(client_params());
1038 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001039 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001040 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001041
1042 string result;
1043 size_t input_consumed;
1044 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1045 EXPECT_EQ(message.size(), input_consumed);
1046 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001047
1048 if (GetParam()->expect_keymaster0_calls())
1049 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001050}
1051
Shawn Willden58427c42015-05-20 13:00:42 -06001052TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001053 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1054 .RsaSigningKey(512, 3)
1055 .Digest(KM_DIGEST_SHA_2_256)
1056 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001057 // Use large message, which won't work without digesting.
1058 string message(1024, 'a');
1059 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001060 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -07001061 ++message[message.size() / 2];
1062
Shawn Willden226746b2015-05-08 11:36:56 -06001063 AuthorizationSet begin_params(client_params());
1064 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001065 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001066 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001067
1068 string result;
1069 size_t input_consumed;
1070 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1071 EXPECT_EQ(message.size(), input_consumed);
1072 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001073
1074 if (GetParam()->expect_keymaster0_calls())
1075 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001076}
1077
Shawn Willden58427c42015-05-20 13:00:42 -06001078TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001079 GenerateKey(AuthorizationSetBuilder()
1080 .RsaSigningKey(512, 3)
1081 .Digest(KM_DIGEST_SHA_2_256)
1082 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001083 string message(1024, 'a');
1084 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001085 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1086 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -06001087
1088 if (GetParam()->expect_keymaster0_calls())
1089 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001090}
1091
Shawn Willden58427c42015-05-20 13:00:42 -06001092TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001093 GenerateKey(AuthorizationSetBuilder()
1094 .RsaSigningKey(512, 3)
1095 .Digest(KM_DIGEST_SHA_2_256)
1096 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001097 string message(1024, 'a');
1098 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001099 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001100 ++signature[signature.size() / 2];
1101
Shawn Willden226746b2015-05-08 11:36:56 -06001102 AuthorizationSet begin_params(client_params());
1103 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001104 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001105 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001106
1107 string result;
1108 size_t input_consumed;
1109 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1110 EXPECT_EQ(message.size(), input_consumed);
1111 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001112
1113 if (GetParam()->expect_keymaster0_calls())
1114 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001115}
1116
Shawn Willden58427c42015-05-20 13:00:42 -06001117TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001118 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1119 .RsaSigningKey(512, 3)
1120 .Digest(KM_DIGEST_SHA_2_256)
1121 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001122 // Use large message, which won't work without digesting.
1123 string message(1024, 'a');
1124 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001125 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001126 ++message[message.size() / 2];
1127
Shawn Willden226746b2015-05-08 11:36:56 -06001128 AuthorizationSet begin_params(client_params());
1129 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001130 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001131 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001132
1133 string result;
1134 size_t input_consumed;
1135 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1136 EXPECT_EQ(message.size(), input_consumed);
1137 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001138
1139 if (GetParam()->expect_keymaster0_calls())
1140 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001141}
1142
1143template <typename T> vector<T> make_vector(const T* array, size_t len) {
1144 return vector<T>(array, array + len);
1145}
1146
Shawn Willden58427c42015-05-20 13:00:42 -06001147TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001148 // Get all supported digests and padding modes.
1149 size_t digests_len;
1150 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -06001151 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001152 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1153 &digests_len));
1154
1155 size_t padding_modes_len;
1156 keymaster_padding_t* padding_modes;
Shawn Willden0cb69422015-05-26 08:31:37 -06001157 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001158 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1159 &padding_modes, &padding_modes_len));
1160
1161 // Try them.
1162 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1163 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
1164 // Compute key & message size that will work.
1165 size_t key_bits = 256;
1166 size_t message_len = 1000;
1167 switch (digest) {
1168 case KM_DIGEST_NONE:
1169 switch (padding_mode) {
1170 case KM_PAD_NONE:
1171 // Match key size.
1172 message_len = key_bits / 8;
1173 break;
1174 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1175 message_len = key_bits / 8 - 11;
1176 break;
1177 case KM_PAD_RSA_PSS:
1178 // PSS requires a digest.
1179 continue;
1180 default:
1181 FAIL() << "Missing padding";
1182 break;
1183 }
1184 break;
1185
1186 case KM_DIGEST_SHA_2_256:
1187 switch (padding_mode) {
1188 case KM_PAD_NONE:
Shawn Willden3ad5f052015-05-08 14:05:13 -06001189 // Digesting requires padding
1190 continue;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001191 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1192 key_bits += 8 * 11;
1193 break;
1194 case KM_PAD_RSA_PSS:
1195 key_bits += 8 * 10;
1196 break;
1197 default:
1198 FAIL() << "Missing padding";
1199 break;
1200 }
1201 break;
1202 default:
1203 FAIL() << "Missing digest";
1204 }
1205
Shawn Willdenaf533992015-04-15 13:48:28 -06001206 GenerateKey(AuthorizationSetBuilder()
1207 .RsaSigningKey(key_bits, 3)
1208 .Digest(digest)
1209 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001210 string message(message_len, 'a');
1211 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001212 SignMessage(message, &signature, digest, padding_mode);
1213 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001214 }
1215 }
1216
1217 free(padding_modes);
1218 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -06001219
1220 if (GetParam()->expect_keymaster0_calls())
1221 EXPECT_EQ(16, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001222}
1223
Shawn Willden58427c42015-05-20 13:00:42 -06001224TEST_P(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001225 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001226 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001227 string message = "123456789012345678901234567890123456789012345678";
1228 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001229 SignMessage(message, &signature, KM_DIGEST_NONE);
1230 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001231
1232 if (GetParam()->expect_keymaster0_calls())
1233 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001234}
1235
Shawn Willden58427c42015-05-20 13:00:42 -06001236TEST_P(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001237 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001238 string message = "123456789012345678901234567890123456789012345678";
1239 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001240 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1241 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden2beb6282015-05-20 16:36:24 -06001242
1243 if (GetParam()->expect_keymaster0_calls())
1244 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001245}
1246
Shawn Willden58427c42015-05-20 13:00:42 -06001247TEST_P(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001248 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001249 string message = "123456789012345678901234567890123456789012345678";
1250 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001251 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1252 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden2beb6282015-05-20 16:36:24 -06001253
1254 if (GetParam()->expect_keymaster0_calls())
1255 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001256}
1257
Shawn Willden58427c42015-05-20 13:00:42 -06001258TEST_P(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001259 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001260 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001261 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001262 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1263 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001264
1265 if (GetParam()->expect_keymaster0_calls())
1266 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -07001267}
1268
Shawn Willden58427c42015-05-20 13:00:42 -06001269TEST_P(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001270 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001271 string message = "123456789012345678901234567890123456789012345678";
1272 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001273 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1274 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden2beb6282015-05-20 16:36:24 -06001275
1276 if (GetParam()->expect_keymaster0_calls())
1277 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001278}
1279
Shawn Willden58427c42015-05-20 13:00:42 -06001280TEST_P(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001281 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001282 string message = "123456789012345678901234567890123456789012345678";
1283 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001284 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1285 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden2beb6282015-05-20 16:36:24 -06001286
1287 if (GetParam()->expect_keymaster0_calls())
1288 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001289}
1290
Shawn Willden58427c42015-05-20 13:00:42 -06001291typedef Keymaster1Test ExportKeyTest;
1292INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params);
1293
1294TEST_P(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001295 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1296 .RsaSigningKey(256, 3)
1297 .Digest(KM_DIGEST_NONE)
1298 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001299 string export_data;
1300 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001301 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001302
1303 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001304
1305 if (GetParam()->expect_keymaster0_calls())
1306 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenffd790c2014-08-18 21:20:06 -06001307}
1308
Shawn Willden58427c42015-05-20 13:00:42 -06001309TEST_P(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001310 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001311 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001312 string export_data;
1313 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001314 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001315
1316 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001317
1318 if (GetParam()->expect_keymaster0_calls())
1319 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001320}
1321
Shawn Willden58427c42015-05-20 13:00:42 -06001322TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001323 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1324 .RsaSigningKey(256, 3)
1325 .Digest(KM_DIGEST_NONE)
1326 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001327 string export_data;
1328 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001329
1330 if (GetParam()->expect_keymaster0_calls())
1331 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001332}
1333
Shawn Willden58427c42015-05-20 13:00:42 -06001334TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001335 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1336 .RsaSigningKey(256, 3)
1337 .Digest(KM_DIGEST_NONE)
1338 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001339 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001340 string export_data;
1341 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001342
1343 if (GetParam()->expect_keymaster0_calls())
1344 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001345}
1346
Shawn Willden58427c42015-05-20 13:00:42 -06001347TEST_P(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001348 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001349 string export_data;
1350
1351 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1352 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1353 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001354
1355 if (GetParam()->expect_keymaster0_calls())
1356 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden7dad93b2015-02-05 10:20:47 -07001357}
1358
Shawn Willden437fbd12014-08-20 11:59:49 -06001359static string read_file(const string& file_name) {
1360 ifstream file_stream(file_name, std::ios::binary);
1361 istreambuf_iterator<char> file_begin(file_stream);
1362 istreambuf_iterator<char> file_end;
1363 return string(file_begin, file_end);
1364}
1365
Shawn Willden58427c42015-05-20 13:00:42 -06001366typedef Keymaster1Test ImportKeyTest;
1367INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params);
1368
1369TEST_P(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001370 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001371 ASSERT_EQ(633U, pk8_key.size());
1372
Shawn Willdenaf533992015-04-15 13:48:28 -06001373 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1374 .RsaSigningKey(1024, 65537)
1375 .Digest(KM_DIGEST_NONE)
1376 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001377 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001378
1379 // Check values derived from the key.
Shawn Willden2beb6282015-05-20 16:36:24 -06001380 EXPECT_TRUE(contains(GetParam()->crypto_params_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1381 : sw_enforced(),
1382 TAG_ALGORITHM, KM_ALGORITHM_RSA));
1383 EXPECT_TRUE(contains(GetParam()->crypto_params_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1384 : sw_enforced(),
1385 TAG_KEY_SIZE, 1024));
1386 EXPECT_TRUE(contains(GetParam()->crypto_params_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1387 : sw_enforced(),
1388 TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001389
Shawn Willdenb6837e72015-05-16 09:20:59 -06001390 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001391 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1392 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001393
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001394 string message(1024 / 8, 'a');
1395 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001396 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1397 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001398
1399 if (GetParam()->expect_keymaster0_calls())
1400 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden437fbd12014-08-20 11:59:49 -06001401}
1402
Shawn Willden58427c42015-05-20 13:00:42 -06001403TEST_P(ImportKeyTest, OldApiRsaSuccess) {
Shawn Willdend7a5c712015-04-09 16:33:52 -06001404 string pk8_key = read_file("rsa_privkey_pk8.der");
1405 ASSERT_EQ(633U, pk8_key.size());
1406
1407 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1408 // point softkeymaster will no longer support keymaster0 APIs anyway.
1409 uint8_t* key_blob;
1410 size_t key_blob_length;
1411 ASSERT_EQ(0,
1412 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1413 pk8_key.size(), &key_blob, &key_blob_length));
1414 set_key_blob(key_blob, key_blob_length);
1415
1416 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001417 AuthorizationSet begin_params; // Don't use client data.
1418 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001419 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001420 AuthorizationSet update_params;
1421 AuthorizationSet output_params;
1422 string signature =
1423 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1424 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1425 &output_params);
Shawn Willden2beb6282015-05-20 16:36:24 -06001426
1427 if (GetParam()->expect_keymaster0_calls())
1428 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdend7a5c712015-04-09 16:33:52 -06001429}
1430
Shawn Willden58427c42015-05-20 13:00:42 -06001431TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001432 string pk8_key = read_file("rsa_privkey_pk8.der");
1433 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001434 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001435 ImportKey(AuthorizationSetBuilder()
1436 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1437 .Digest(KM_DIGEST_NONE)
1438 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001439 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001440
1441 if (GetParam()->expect_keymaster0_calls())
1442 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001443}
1444
Shawn Willden58427c42015-05-20 13:00:42 -06001445TEST_P(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001446 string pk8_key = read_file("rsa_privkey_pk8.der");
1447 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001448 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001449 ImportKey(AuthorizationSetBuilder()
1450 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1451 .Digest(KM_DIGEST_NONE)
1452 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001453 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001454
1455 if (GetParam()->expect_keymaster0_calls())
1456 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001457}
1458
Shawn Willden58427c42015-05-20 13:00:42 -06001459TEST_P(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001460 string pk8_key = read_file("ec_privkey_pk8.der");
1461 ASSERT_EQ(138U, pk8_key.size());
1462
Shawn Willdenaf533992015-04-15 13:48:28 -06001463 ASSERT_EQ(KM_ERROR_OK,
1464 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1465 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001466
1467 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001468 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001469 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001470
Shawn Willdenb6837e72015-05-16 09:20:59 -06001471 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001472 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1473 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001474
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001475 string message(1024 / 8, 'a');
1476 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001477 SignMessage(message, &signature, KM_DIGEST_NONE);
1478 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001479
1480 if (GetParam()->expect_keymaster0_calls())
1481 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden81effc62014-08-27 10:08:46 -06001482}
1483
Shawn Willden58427c42015-05-20 13:00:42 -06001484TEST_P(ImportKeyTest, EcdsaSizeSpecified) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001485 string pk8_key = read_file("ec_privkey_pk8.der");
1486 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001487
Shawn Willdenaf533992015-04-15 13:48:28 -06001488 ASSERT_EQ(KM_ERROR_OK,
1489 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1490 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001491
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001492 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001493 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001494 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1495
Shawn Willdenb6837e72015-05-16 09:20:59 -06001496 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001497 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1498 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1499
1500 string message(1024 / 8, 'a');
1501 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001502 SignMessage(message, &signature, KM_DIGEST_NONE);
1503 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001504
1505 if (GetParam()->expect_keymaster0_calls())
1506 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001507}
1508
Shawn Willden58427c42015-05-20 13:00:42 -06001509TEST_P(ImportKeyTest, EcdsaSizeMismatch) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001510 string pk8_key = read_file("ec_privkey_pk8.der");
1511 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001512 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001513 ImportKey(AuthorizationSetBuilder()
1514 .EcdsaSigningKey(224 /* Doesn't match key */)
1515 .Digest(KM_DIGEST_NONE),
1516 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001517
1518 if (GetParam()->expect_keymaster0_calls())
1519 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001520}
1521
Shawn Willden58427c42015-05-20 13:00:42 -06001522TEST_P(ImportKeyTest, AesKeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001523 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1524 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001525 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001526 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1527 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001528 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001529
1530 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1531 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1532
1533 string message = "Hello World!";
Shawn Willdenc4424672015-05-11 11:56:02 -06001534 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1535 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willden3b702e22015-02-05 10:26:47 -07001536 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001537
1538 if (GetParam()->expect_keymaster0_calls())
1539 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001540}
1541
Shawn Willden58427c42015-05-20 13:00:42 -06001542TEST_P(ImportKeyTest, HmacSha256KeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001543 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1544 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001545 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1546 .HmacKey(sizeof(key_data) * 8)
1547 .Digest(KM_DIGEST_SHA_2_256)
1548 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001549 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001550
1551 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1552 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1553
1554 string message = "Hello World!";
1555 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001556 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1557 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001558
1559 if (GetParam()->expect_keymaster0_calls())
1560 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001561}
1562
Shawn Willden58427c42015-05-20 13:00:42 -06001563typedef Keymaster1Test EncryptionOperationsTest;
1564INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params);
1565
1566TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001567 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1568 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001569
1570 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001571 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001572 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001573
Shawn Willden3ad5f052015-05-08 14:05:13 -06001574 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001575 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001576
1577 // OAEP randomizes padding so every result should be different.
1578 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001579
1580 if (GetParam()->expect_keymaster0_calls())
1581 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001582}
1583
Shawn Willden58427c42015-05-20 13:00:42 -06001584TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001585 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1586 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001587 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001588 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001589 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001590
Shawn Willden3ad5f052015-05-08 14:05:13 -06001591 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001592 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001593
1594 if (GetParam()->expect_keymaster0_calls())
1595 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001596}
1597
Shawn Willden58427c42015-05-20 13:00:42 -06001598TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001599 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1600 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001601 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001602 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001603 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001604
Shawn Willden3ad5f052015-05-08 14:05:13 -06001605 AuthorizationSet begin_params(client_params());
1606 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1607 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001608 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001609 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001610 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001611
1612 if (GetParam()->expect_keymaster0_calls())
1613 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001614}
1615
Shawn Willden58427c42015-05-20 13:00:42 -06001616TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001617 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1618 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001619 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001620 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001621 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001622
1623 // Corrupt the ciphertext
1624 ciphertext[512 / 8 / 2]++;
1625
Shawn Willden4200f212014-12-02 07:01:21 -07001626 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001627 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001628 AuthorizationSet begin_params(client_params());
1629 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1630 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001631 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001632 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001633 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001634
1635 if (GetParam()->expect_keymaster0_calls())
1636 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001637}
1638
Shawn Willden58427c42015-05-20 13:00:42 -06001639TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001640 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1641 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001642 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001643 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001644 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001645
Shawn Willden3ad5f052015-05-08 14:05:13 -06001646 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001647 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001648
1649 // PKCS1 v1.5 randomizes padding so every result should be different.
1650 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001651
1652 if (GetParam()->expect_keymaster0_calls())
1653 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001654}
1655
Shawn Willden58427c42015-05-20 13:00:42 -06001656TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001657 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1658 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001659 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001660 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001661 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001662
Shawn Willden3ad5f052015-05-08 14:05:13 -06001663 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001664 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001665
1666 if (GetParam()->expect_keymaster0_calls())
1667 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001668}
1669
Shawn Willden58427c42015-05-20 13:00:42 -06001670TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001671 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1672 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willden7bae1322015-05-26 10:16:49 -06001673 string message = "123456789012345678901234567890123456789012345678901234";
Shawn Willden4200f212014-12-02 07:01:21 -07001674 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001675 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001676
Shawn Willden3ad5f052015-05-08 14:05:13 -06001677 AuthorizationSet begin_params(client_params());
1678 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1679 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001680 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001681 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001682 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001683
1684 if (GetParam()->expect_keymaster0_calls())
1685 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001686}
1687
Shawn Willden58427c42015-05-20 13:00:42 -06001688TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001689 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1690 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001691 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001692 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001693 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001694
1695 // Corrupt the ciphertext
1696 ciphertext[512 / 8 / 2]++;
1697
Shawn Willden4200f212014-12-02 07:01:21 -07001698 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001699 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001700 AuthorizationSet begin_params(client_params());
1701 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1702 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001703 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001704 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001705 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001706
1707 if (GetParam()->expect_keymaster0_calls())
1708 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001709}
1710
Shawn Willden58427c42015-05-20 13:00:42 -06001711TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001712 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1713 .RsaSigningKey(256, 3)
1714 .Digest(KM_DIGEST_NONE)
1715 .Padding(KM_PAD_NONE)));
1716 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1717 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001718
1719 if (GetParam()->expect_keymaster0_calls())
1720 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001721}
1722
Shawn Willden58427c42015-05-20 13:00:42 -06001723TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001724 ASSERT_EQ(KM_ERROR_OK,
1725 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1726 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1727 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001728
1729 if (GetParam()->expect_keymaster0_calls())
1730 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001731}
1732
Shawn Willden58427c42015-05-20 13:00:42 -06001733TEST_P(EncryptionOperationsTest, HmacEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001734 ASSERT_EQ(
1735 KM_ERROR_OK,
1736 GenerateKey(
1737 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1738 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1739 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001740
1741 if (GetParam()->expect_keymaster0_calls())
1742 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001743}
1744
Shawn Willden58427c42015-05-20 13:00:42 -06001745TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001746 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1747 .AesEncryptionKey(128)
1748 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1749 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001750 // Two-block message.
1751 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001752 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001753 EXPECT_EQ(message.size(), ciphertext1.size());
1754
Shawn Willden31e063f2015-05-08 14:31:22 -06001755 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001756 EXPECT_EQ(message.size(), ciphertext2.size());
1757
1758 // ECB is deterministic.
1759 EXPECT_EQ(ciphertext1, ciphertext2);
1760
Shawn Willden31e063f2015-05-08 14:31:22 -06001761 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001762 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001763
1764 if (GetParam()->expect_keymaster0_calls())
1765 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001766}
1767
Shawn Willden58427c42015-05-20 13:00:42 -06001768TEST_P(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001769 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1770 .AesEncryptionKey(128)
1771 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1772 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001773 // Message is slightly shorter than two blocks.
1774 string message = "1234567890123456789012345678901";
1775
Shawn Willden31e063f2015-05-08 14:31:22 -06001776 AuthorizationSet begin_params(client_params());
1777 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001778 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001779 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001780 string ciphertext;
1781 size_t input_consumed;
1782 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1783 EXPECT_EQ(message.size(), input_consumed);
1784 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001785
1786 if (GetParam()->expect_keymaster0_calls())
1787 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001788}
1789
Shawn Willden58427c42015-05-20 13:00:42 -06001790TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001791 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001792 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001793 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1794 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001795
1796 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001797 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001798 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001799 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001800 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001801 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001802 EXPECT_EQ(message, plaintext);
1803 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001804
1805 if (GetParam()->expect_keymaster0_calls())
1806 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001807}
1808
Shawn Willden58427c42015-05-20 13:00:42 -06001809TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001810 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001811 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001812 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1813 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001814
1815 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001816 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001817 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001818 EXPECT_NE(ciphertext, message);
1819 ++ciphertext[ciphertext.size() / 2];
1820
Shawn Willden31e063f2015-05-08 14:31:22 -06001821 AuthorizationSet begin_params(client_params());
1822 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001823 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
Shawn Willden31e063f2015-05-08 14:31:22 -06001824 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001825 string plaintext;
1826 size_t input_consumed;
1827 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1828 EXPECT_EQ(ciphertext.size(), input_consumed);
1829 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001830
1831 if (GetParam()->expect_keymaster0_calls())
1832 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001833}
1834
Shawn Willden58427c42015-05-20 13:00:42 -06001835TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001836 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1837 .AesEncryptionKey(128)
1838 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1839 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001840 string message = "123";
1841 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001842 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001843 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001844 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001845
1846 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001847 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001848 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001849 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001850
1851 // IVs should be random, so ciphertexts should differ.
1852 EXPECT_NE(iv1, iv2);
1853 EXPECT_NE(ciphertext1, ciphertext2);
1854
Shawn Willden31e063f2015-05-08 14:31:22 -06001855 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001856 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001857
1858 if (GetParam()->expect_keymaster0_calls())
1859 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001860}
1861
Shawn Willden58427c42015-05-20 13:00:42 -06001862TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001863 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1864 .AesEncryptionKey(128)
1865 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1866 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001867
1868 int increment = 15;
1869 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001870 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001871 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001872 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001873 AuthorizationSet output_params;
1874 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1875
1876 string ciphertext;
1877 size_t input_consumed;
1878 for (size_t i = 0; i < message.size(); i += increment)
1879 EXPECT_EQ(KM_ERROR_OK,
1880 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1881 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1882 EXPECT_EQ(message.size(), ciphertext.size());
1883
1884 // Move TAG_NONCE into input_params
1885 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001886 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001887 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001888 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001889 output_params.Clear();
1890
1891 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1892 string plaintext;
1893 for (size_t i = 0; i < ciphertext.size(); i += increment)
1894 EXPECT_EQ(KM_ERROR_OK,
1895 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1896 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1897 EXPECT_EQ(ciphertext.size(), plaintext.size());
1898 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001899
1900 if (GetParam()->expect_keymaster0_calls())
1901 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001902}
1903
1904struct AesCtrSp80038aTestVector {
1905 const char* key;
1906 const char* nonce;
1907 const char* plaintext;
1908 const char* ciphertext;
1909};
1910
1911// These test vectors are taken from
1912// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1913static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1914 // AES-128
1915 {
1916 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1917 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1918 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1919 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1920 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1921 },
1922 // AES-192
1923 {
1924 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1925 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1926 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1927 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1928 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1929 },
1930 // AES-256
1931 {
1932 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1933 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1934 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1935 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1936 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1937 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1938 },
1939};
1940
Shawn Willden58427c42015-05-20 13:00:42 -06001941TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
Thai Duong20d725d2015-03-24 17:49:58 -07001942 for (size_t i = 0; i < 3; i++) {
1943 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1944 const string key = hex2str(test.key);
1945 const string nonce = hex2str(test.nonce);
1946 const string plaintext = hex2str(test.plaintext);
1947 const string ciphertext = hex2str(test.ciphertext);
1948 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1949 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001950
1951 if (GetParam()->expect_keymaster0_calls())
1952 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001953}
1954
Shawn Willden58427c42015-05-20 13:00:42 -06001955TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
Thai Duong20d725d2015-03-24 17:49:58 -07001956 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1957 .AesEncryptionKey(128)
1958 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1959 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06001960 AuthorizationSet begin_params(client_params());
1961 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001962 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001963 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06001964
1965 if (GetParam()->expect_keymaster0_calls())
1966 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001967}
1968
Shawn Willden58427c42015-05-20 13:00:42 -06001969TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
Thai Duong20d725d2015-03-24 17:49:58 -07001970 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1971 .AesEncryptionKey(128)
1972 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001973 .Authorization(TAG_CALLER_NONCE)
1974 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001975
Shawn Willden09f25272015-04-15 13:49:49 -06001976 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001977 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001978 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001979 input_params.push_back(TAG_NONCE, "123", 3);
1980 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06001981
1982 if (GetParam()->expect_keymaster0_calls())
1983 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001984}
1985
Shawn Willden58427c42015-05-20 13:00:42 -06001986TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001987 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1988 .AesEncryptionKey(128)
1989 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1990 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001991 // Two-block message.
1992 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001993 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001994 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001995 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001996
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001997 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001998 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001999 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002000
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002001 // IVs should be random, so ciphertexts should differ.
2002 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002003 EXPECT_NE(ciphertext1, ciphertext2);
2004
Shawn Willden31e063f2015-05-08 14:31:22 -06002005 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002006 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002007
2008 if (GetParam()->expect_keymaster0_calls())
2009 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002010}
2011
Shawn Willden58427c42015-05-20 13:00:42 -06002012TEST_P(EncryptionOperationsTest, AesCallerNonce) {
Shawn Willden969aa382015-04-15 17:05:53 -07002013 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2014 .AesEncryptionKey(128)
2015 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002016 .Authorization(TAG_CALLER_NONCE)
2017 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07002018 string message = "12345678901234567890123456789012";
2019 string iv1;
2020 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002021 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002022 EXPECT_EQ(message.size(), ciphertext1.size());
2023 EXPECT_EQ(16U, iv1.size());
2024
Shawn Willden31e063f2015-05-08 14:31:22 -06002025 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002026 EXPECT_EQ(message, plaintext);
2027
2028 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06002029 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07002030 AuthorizationSet update_params;
2031 AuthorizationSet output_params;
2032 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002033 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002034 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002035 string ciphertext2 =
2036 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
2037
2038 // Decrypt with correct nonce.
2039 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2040 &output_params);
2041 EXPECT_EQ(message, plaintext);
2042
2043 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06002044 input_params.Reinitialize(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002045 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002046 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002047 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
2048 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2049 &output_params);
2050 EXPECT_NE(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002051
2052 if (GetParam()->expect_keymaster0_calls())
2053 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden969aa382015-04-15 17:05:53 -07002054}
2055
Shawn Willden58427c42015-05-20 13:00:42 -06002056TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002057 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2058 .AesEncryptionKey(128)
2059 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2060 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06002061
2062 string message = "12345678901234567890123456789012";
2063 string iv1;
2064 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002065 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002066 EXPECT_EQ(message.size(), ciphertext1.size());
2067 EXPECT_EQ(16U, iv1.size());
2068
Shawn Willden31e063f2015-05-08 14:31:22 -06002069 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002070 EXPECT_EQ(message, plaintext);
2071
2072 // Now specify a nonce, should fail.
2073 AuthorizationSet input_params(client_params());
2074 AuthorizationSet update_params;
2075 AuthorizationSet output_params;
2076 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002077 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002078 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden67706352015-04-28 00:43:19 -06002079
2080 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
2081 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002082
2083 if (GetParam()->expect_keymaster0_calls())
2084 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden67706352015-04-28 00:43:19 -06002085}
2086
Shawn Willden58427c42015-05-20 13:00:42 -06002087TEST_P(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002088 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2089 .AesEncryptionKey(128)
2090 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2091 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002092
2093 int increment = 15;
2094 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06002095 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002096 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002097 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002098 AuthorizationSet output_params;
2099 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2100
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002101 string ciphertext;
2102 size_t input_consumed;
2103 for (size_t i = 0; i < message.size(); i += increment)
2104 EXPECT_EQ(KM_ERROR_OK,
2105 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2106 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002107 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002108
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002109 // Move TAG_NONCE into input_params
2110 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06002111 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002112 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002113 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002114 output_params.Clear();
2115
2116 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002117 string plaintext;
2118 for (size_t i = 0; i < ciphertext.size(); i += increment)
2119 EXPECT_EQ(KM_ERROR_OK,
2120 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2121 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002122 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002123 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002124
2125 if (GetParam()->expect_keymaster0_calls())
2126 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002127}
2128
Shawn Willden58427c42015-05-20 13:00:42 -06002129TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002130 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002131 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002132 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2133 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002134
2135 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06002136 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002137 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002138 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06002139 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002140 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06002141 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002142 EXPECT_EQ(message, plaintext);
2143 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002144
2145 if (GetParam()->expect_keymaster0_calls())
2146 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002147}
2148
Shawn Willden58427c42015-05-20 13:00:42 -06002149typedef Keymaster1Test AddEntropyTest;
2150INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params);
2151
2152TEST_P(AddEntropyTest, AddEntropy) {
Shawn Willdencd695822015-01-26 14:06:32 -07002153 // There's no obvious way to test that entropy is actually added, but we can test that the API
2154 // doesn't blow up or return an error.
2155 EXPECT_EQ(KM_ERROR_OK,
2156 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
Shawn Willden2beb6282015-05-20 16:36:24 -06002157
2158 if (GetParam()->expect_keymaster0_calls())
2159 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2160}
2161
2162typedef Keymaster1Test Keymaster0AdapterTest;
2163INSTANTIATE_TEST_CASE_P(
2164 AndroidKeymasterTest, Keymaster0AdapterTest,
2165 ::testing::Values(InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator)));
2166
2167TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1Blob) {
2168 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2169 // key data.
2170 string km1_sw = read_file("km1_sw_rsa_512.blob");
2171 EXPECT_EQ(486U, km1_sw.length());
2172
2173 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2174 memcpy(key_data, km1_sw.data(), km1_sw.length());
2175 set_key_blob(key_data, km1_sw.length());
2176
2177 string message(64, 'a');
2178 string signature;
2179 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2180
2181 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2182}
2183
2184struct Malloc_Delete {
2185 void operator()(void* p) { free(p); }
2186};
2187
2188TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster0Blob) {
2189 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2190 string km0_sw = read_file("km0_sw_rsa_512.blob");
2191 EXPECT_EQ(333U, km0_sw.length());
2192
2193 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2194 memcpy(key_data, km0_sw.data(), km0_sw.length());
2195 set_key_blob(key_data, km0_sw.length());
2196
2197 string message(64, 'a');
2198 string signature;
2199 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2200
2201 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdencd695822015-01-26 14:06:32 -07002202}
2203
Shawn Willden128ffe02014-08-06 12:31:33 -06002204} // namespace test
2205} // namespace keymaster