blob: 63e1d2c1deaf756f37453341c4eb984ecc1b342e [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
Shawn Willden6270aca2015-05-26 13:12:24 -060054 bool algorithm_in_hardware(keymaster_algorithm_t) const override { return false; }
Shawn Willden2beb6282015-05-20 16:36:24 -060055 int keymaster0_calls() const override { return 0; }
Shawn Willden128ffe02014-08-06 12:31:33 -060056};
57
Shawn Willden2beb6282015-05-20 16:36:24 -060058class Keymaster0AdapterTestInstanceCreator : public Keymaster1TestInstanceCreator {
59 public:
Shawn Willden6270aca2015-05-26 13:12:24 -060060 Keymaster0AdapterTestInstanceCreator(bool support_ec) : support_ec_(support_ec) {}
61
Shawn Willden2beb6282015-05-20 16:36:24 -060062 keymaster1_device_t* CreateDevice() const {
Shawn Willden6270aca2015-05-26 13:12:24 -060063 std::cerr << "Creating keymaster0-backed device (with ec: " << std::boolalpha << support_ec_
64 << ")." << std::endl;
Shawn Willden2beb6282015-05-20 16:36:24 -060065 hw_device_t* softkeymaster_device;
66 EXPECT_EQ(0, openssl_open(&softkeymaster_module.common, KEYSTORE_KEYMASTER,
67 &softkeymaster_device));
68 // Make the software device pretend to be hardware
69 keymaster0_device_t* keymaster0_device =
70 reinterpret_cast<keymaster0_device_t*>(softkeymaster_device);
Shawn Willden6270aca2015-05-26 13:12:24 -060071 keymaster0_device->flags &= ~KEYMASTER_SOFTWARE_ONLY;
72
73 if (!support_ec_) {
74 // Make the software device pretend not to support EC
75 keymaster0_device->flags &= ~KEYMASTER_SUPPORTS_EC;
76 }
Shawn Willden2beb6282015-05-20 16:36:24 -060077
78 counting_keymaster0_device_ = new Keymaster0CountingWrapper(keymaster0_device);
79
80 SoftKeymasterDevice* keymaster = new SoftKeymasterDevice(counting_keymaster0_device_);
81 return keymaster->keymaster_device();
82 }
83
Shawn Willden6270aca2015-05-26 13:12:24 -060084 bool algorithm_in_hardware(keymaster_algorithm_t algorithm) const override {
85 switch (algorithm) {
86 case KM_ALGORITHM_RSA:
87 return true;
88 case KM_ALGORITHM_EC:
89 return support_ec_;
90 default:
91 return false;
92 }
Shawn Willden2beb6282015-05-20 16:36:24 -060093 }
Shawn Willden2beb6282015-05-20 16:36:24 -060094 int keymaster0_calls() const override { return counting_keymaster0_device_->count(); }
95
96 private:
97 mutable Keymaster0CountingWrapper* counting_keymaster0_device_;
Shawn Willden6270aca2015-05-26 13:12:24 -060098 bool support_ec_;
Shawn Willden2beb6282015-05-20 16:36:24 -060099};
100
Shawn Willden6270aca2015-05-26 13:12:24 -0600101static auto test_params = testing::Values(
102 InstanceCreatorPtr(new SoftKeymasterTestInstanceCreator),
103 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(true /* support_ec */)),
104 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(false /* support_ec */)));
Shawn Willden58427c42015-05-20 13:00:42 -0600105
106typedef Keymaster1Test CheckSupported;
107INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, CheckSupported, test_params);
108
109TEST_P(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700110 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
111 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600112
Shawn Willden5b53c992015-02-02 08:05:25 -0700113 size_t len;
114 keymaster_algorithm_t* algorithms;
115 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -0700116 EXPECT_TRUE(ResponseContains(
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600117 {KM_ALGORITHM_RSA, KM_ALGORITHM_EC, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700118 free(algorithms);
Shawn Willden2beb6282015-05-20 16:36:24 -0600119
Shawn Willden6270aca2015-05-26 13:12:24 -0600120 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600121}
122
Shawn Willden58427c42015-05-20 13:00:42 -0600123TEST_P(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700124 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
125 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
126 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600127
Shawn Willden5b53c992015-02-02 08:05:25 -0700128 size_t len;
129 keymaster_block_mode_t* modes;
Shawn Willden0cb69422015-05-26 08:31:37 -0600130 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden63ac0432014-12-29 14:07:08 -0700131 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600132 EXPECT_EQ(0U, len);
Shawn Willden63ac0432014-12-29 14:07:08 -0700133 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600134
Shawn Willden63ac0432014-12-29 14:07:08 -0700135 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600136 device()->get_supported_block_modes(device(), KM_ALGORITHM_EC, KM_PURPOSE_ENCRYPT,
Shawn Willden5b53c992015-02-02 08:05:25 -0700137 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600138
Shawn Willden0cb69422015-05-26 08:31:37 -0600139 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
Shawn Willden63ac0432014-12-29 14:07:08 -0700140 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc47c88f2015-04-07 17:23:27 -0600141 EXPECT_TRUE(ResponseContains({KM_MODE_ECB, KM_MODE_CBC, KM_MODE_CTR}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700142 free(modes);
Shawn Willden2beb6282015-05-20 16:36:24 -0600143
Shawn Willden6270aca2015-05-26 13:12:24 -0600144 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600145}
146
Shawn Willden58427c42015-05-20 13:00:42 -0600147TEST_P(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700148 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
149 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
150 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600151
Shawn Willden5b53c992015-02-02 08:05:25 -0700152 size_t len;
153 keymaster_padding_t* modes;
Shawn Willden0cb69422015-05-26 08:31:37 -0600154 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden5b53c992015-02-02 08:05:25 -0700155 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700156 EXPECT_TRUE(
157 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700158 free(modes);
159
Shawn Willden0cb69422015-05-26 08:31:37 -0600160 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden63ac0432014-12-29 14:07:08 -0700161 KM_PURPOSE_ENCRYPT, &modes, &len));
162 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700163 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600164
Shawn Willden0cb69422015-05-26 08:31:37 -0600165 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700166 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600167 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700168 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700169
170 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
171 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
172 &modes, &len));
Shawn Willden2beb6282015-05-20 16:36:24 -0600173
Shawn Willden6270aca2015-05-26 13:12:24 -0600174 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600175}
176
Shawn Willden58427c42015-05-20 13:00:42 -0600177TEST_P(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700178 EXPECT_EQ(
179 KM_ERROR_OUTPUT_PARAMETER_NULL,
180 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600181
Shawn Willden5b53c992015-02-02 08:05:25 -0700182 size_t len;
183 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -0600184 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
Shawn Willden5b53c992015-02-02 08:05:25 -0700185 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600186 EXPECT_TRUE(
187 ResponseContains({KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224,
188 KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512},
189 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700190 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600191
Shawn Willden0cb69422015-05-26 08:31:37 -0600192 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700193 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willdenefbd7e42015-06-01 07:07:33 -0600194 EXPECT_TRUE(
195 ResponseContains({KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224,
196 KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512},
197 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700198 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600199
Shawn Willden63ac0432014-12-29 14:07:08 -0700200 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
201 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
202 &len));
203
Shawn Willden0cb69422015-05-26 08:31:37 -0600204 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700205 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700206 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
207 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
208 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700209 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -0600210
Shawn Willden6270aca2015-05-26 13:12:24 -0600211 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600212}
213
Shawn Willden58427c42015-05-20 13:00:42 -0600214TEST_P(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700215 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
216 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600217
Shawn Willden5b53c992015-02-02 08:05:25 -0700218 size_t len;
219 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600220 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700221 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700222 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700223 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700224
Shawn Willden0cb69422015-05-26 08:31:37 -0600225 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700226 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
227 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
228 free(formats);
229
Shawn Willden0cb69422015-05-26 08:31:37 -0600230 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700231 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
232 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
233 free(formats);
Shawn Willden2beb6282015-05-20 16:36:24 -0600234
Shawn Willden6270aca2015-05-26 13:12:24 -0600235 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600236}
237
Shawn Willden58427c42015-05-20 13:00:42 -0600238TEST_P(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700239 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
240 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600241
Shawn Willden5b53c992015-02-02 08:05:25 -0700242 size_t len;
243 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600244 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700245 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700246 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700247 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600248
Shawn Willden0cb69422015-05-26 08:31:37 -0600249 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600250 device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700251 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700252 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600253
Shawn Willden0cb69422015-05-26 08:31:37 -0600254 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700255 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600256 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700257 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700258
Shawn Willden0cb69422015-05-26 08:31:37 -0600259 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700260 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600261 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700262 free(formats);
263
Shawn Willden0cb69422015-05-26 08:31:37 -0600264 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700265 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600266 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700267 free(formats);
Shawn Willden2beb6282015-05-20 16:36:24 -0600268
Shawn Willden6270aca2015-05-26 13:12:24 -0600269 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600270}
271
Shawn Willden58427c42015-05-20 13:00:42 -0600272class NewKeyGeneration : public Keymaster1Test {
Shawn Willdend0772312014-09-18 12:27:57 -0600273 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700274 void CheckBaseParams() {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700275 AuthorizationSet auths = sw_enforced();
276 EXPECT_GT(auths.SerializedSize(), 12U);
277
Shawn Willden5b53c992015-02-02 08:05:25 -0700278 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
279 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
280 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600281 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700282 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600283
284 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700285 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
286 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
287 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600288
289 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700290 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
291 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
292 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600293
294 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600295 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700296 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600297 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700298};
Shawn Willden58427c42015-05-20 13:00:42 -0600299INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, NewKeyGeneration, test_params);
300
301TEST_P(NewKeyGeneration, Rsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600302 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
303 .RsaSigningKey(256, 3)
304 .Digest(KM_DIGEST_NONE)
305 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700306 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600307
Shawn Willden2beb6282015-05-20 16:36:24 -0600308 // Check specified tags are all present, and in the right set.
309 AuthorizationSet crypto_params;
310 AuthorizationSet non_crypto_params;
Shawn Willden6270aca2015-05-26 13:12:24 -0600311 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA)) {
Shawn Willden2beb6282015-05-20 16:36:24 -0600312 EXPECT_NE(0U, hw_enforced().size());
313 EXPECT_NE(0U, sw_enforced().size());
314 crypto_params.push_back(hw_enforced());
315 non_crypto_params.push_back(sw_enforced());
316 } else {
317 EXPECT_EQ(0U, hw_enforced().size());
318 EXPECT_NE(0U, sw_enforced().size());
319 crypto_params.push_back(sw_enforced());
320 }
321
322 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
323 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
324 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 256));
325 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 256));
326 EXPECT_TRUE(contains(crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
327 EXPECT_FALSE(contains(non_crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
328
Shawn Willden6270aca2015-05-26 13:12:24 -0600329 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600330 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600331}
332
Shawn Willden58427c42015-05-20 13:00:42 -0600333TEST_P(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700334 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
335 GenerateKey(AuthorizationSetBuilder()
336 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
337 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
338 .SigningKey()));
Shawn Willden2beb6282015-05-20 16:36:24 -0600339
Shawn Willden6270aca2015-05-26 13:12:24 -0600340 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600341}
342
Shawn Willden58427c42015-05-20 13:00:42 -0600343TEST_P(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600344 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600345 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700346 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600347
Shawn Willden6270aca2015-05-26 13:12:24 -0600348 // Check specified tags are all present, and in the right set.
349 AuthorizationSet crypto_params;
350 AuthorizationSet non_crypto_params;
351 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC)) {
352 EXPECT_NE(0U, hw_enforced().size());
353 EXPECT_NE(0U, sw_enforced().size());
354 crypto_params.push_back(hw_enforced());
355 non_crypto_params.push_back(sw_enforced());
356 } else {
357 EXPECT_EQ(0U, hw_enforced().size());
358 EXPECT_NE(0U, sw_enforced().size());
359 crypto_params.push_back(sw_enforced());
360 }
Shawn Willden2beb6282015-05-20 16:36:24 -0600361
Shawn Willden6270aca2015-05-26 13:12:24 -0600362 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC));
363 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC));
364 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 224));
365 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 224));
366
367 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
368 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600369}
370
Shawn Willden58427c42015-05-20 13:00:42 -0600371TEST_P(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden4f83b892015-05-26 12:52:54 -0600372 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
373 GenerateKey(AuthorizationSetBuilder()
374 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_EC)
375 .SigningKey()
376 .Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600377
Shawn Willden6270aca2015-05-26 13:12:24 -0600378 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600379}
380
Shawn Willden58427c42015-05-20 13:00:42 -0600381TEST_P(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden6270aca2015-05-26 13:12:24 -0600382 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
383 ASSERT_EQ(
384 KM_ERROR_UNKNOWN_ERROR,
385 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
386 else
387 ASSERT_EQ(
388 KM_ERROR_UNSUPPORTED_KEY_SIZE,
389 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600390
Shawn Willden6270aca2015-05-26 13:12:24 -0600391 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
392 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600393}
394
Shawn Willden58427c42015-05-20 13:00:42 -0600395TEST_P(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600396 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600397 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600398 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
399 KM_DIGEST_NONE)))
Shawn Willden58427c42015-05-20 13:00:42 -0600400 << "Failed to generate size: "
401 << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600402 }
Shawn Willden2beb6282015-05-20 16:36:24 -0600403
Shawn Willden6270aca2015-05-26 13:12:24 -0600404 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
405 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600406}
407
Shawn Willden58427c42015-05-20 13:00:42 -0600408TEST_P(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700409 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600410 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600411
Shawn Willden6270aca2015-05-26 13:12:24 -0600412 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700413}
414
Shawn Willden58427c42015-05-20 13:00:42 -0600415typedef Keymaster1Test GetKeyCharacteristics;
416INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, GetKeyCharacteristics, test_params);
417
418TEST_P(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600419 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
420 .RsaSigningKey(256, 3)
421 .Digest(KM_DIGEST_NONE)
422 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700423 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600424
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700425 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
426 EXPECT_EQ(original, sw_enforced());
Shawn Willden2beb6282015-05-20 16:36:24 -0600427
Shawn Willden6270aca2015-05-26 13:12:24 -0600428 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600429 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden76364712014-08-11 17:48:04 -0600430}
431
Shawn Willden58427c42015-05-20 13:00:42 -0600432typedef Keymaster1Test SigningOperationsTest;
433INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, SigningOperationsTest, test_params);
434
435TEST_P(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600436 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
437 .RsaSigningKey(256, 3)
438 .Digest(KM_DIGEST_NONE)
439 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700440 string message = "12345678901234567890123456789012";
441 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600442 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600443
Shawn Willden6270aca2015-05-26 13:12:24 -0600444 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600445 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600446}
447
Shawn Willden58427c42015-05-20 13:00:42 -0600448TEST_P(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600449 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
450 .RsaSigningKey(512, 3)
451 .Digest(KM_DIGEST_SHA_2_256)
452 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700453 // Use large message, which won't work without digesting.
454 string message(1024, 'a');
455 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600456 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600457
Shawn Willden6270aca2015-05-26 13:12:24 -0600458 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600459 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -0700460}
461
Shawn Willden58427c42015-05-20 13:00:42 -0600462TEST_P(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600463 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
464 .RsaSigningKey(512, 3)
465 .Digest(KM_DIGEST_SHA_2_256)
466 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700467 string message(1024, 'a');
468 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600469 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -0600470
Shawn Willden6270aca2015-05-26 13:12:24 -0600471 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600472 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700473}
474
Shawn Willden58427c42015-05-20 13:00:42 -0600475TEST_P(SigningOperationsTest, RsaPssSha256TooSmallKey) {
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600476 // Key must be at least 10 bytes larger than hash, to provide eight bytes of random salt, so
477 // verify that nine bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600478 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
479 .RsaSigningKey(256 + 9 * 8, 3)
480 .Digest(KM_DIGEST_SHA_2_256)
481 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700482 string message(1024, 'a');
483 string signature;
484
Shawn Willden226746b2015-05-08 11:36:56 -0600485 AuthorizationSet begin_params(client_params());
486 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600487 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600488 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700489}
490
Shawn Willden58427c42015-05-20 13:00:42 -0600491TEST_P(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600492 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
493 .RsaSigningKey(256, 3)
494 .Digest(KM_DIGEST_NONE)
495 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600496 AuthorizationSet begin_params(client_params());
497 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600498 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600499 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700500 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
501 // Another abort should fail
502 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden2beb6282015-05-20 16:36:24 -0600503
Shawn Willden6270aca2015-05-26 13:12:24 -0600504 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600505 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, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600509 GenerateKey(AuthorizationSetBuilder()
510 .RsaSigningKey(256, 3)
511 .Digest(KM_DIGEST_MD5)
512 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700513 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden2beb6282015-05-20 16:36:24 -0600514
Shawn Willden6270aca2015-05-26 13:12:24 -0600515 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600516 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600517}
518
Shawn Willden58427c42015-05-20 13:00:42 -0600519TEST_P(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600520 GenerateKey(AuthorizationSetBuilder()
521 .RsaSigningKey(256, 3)
522 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
523 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600524 AuthorizationSet begin_params(client_params());
525 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
526 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600527
Shawn Willden6270aca2015-05-26 13:12:24 -0600528 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600529 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600530}
531
Shawn Willden58427c42015-05-20 13:00:42 -0600532TEST_P(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700533 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600534 GenerateKey(AuthorizationSetBuilder()
535 .RsaSigningKey(256, 3)
536 .Digest(KM_DIGEST_NONE)
537 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600538 AuthorizationSet begin_params(client_params());
539 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600540 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600541 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600542
Shawn Willden6270aca2015-05-26 13:12:24 -0600543 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600544 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600545}
546
Shawn Willden58427c42015-05-20 13:00:42 -0600547TEST_P(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700548 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600549 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
550 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600551 AuthorizationSet begin_params(client_params());
552 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
553 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600554
Shawn Willden6270aca2015-05-26 13:12:24 -0600555 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600556 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600557}
558
Shawn Willden58427c42015-05-20 13:00:42 -0600559TEST_P(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600560 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
561 .RsaSigningKey(256, 3)
562 .Digest(KM_DIGEST_NONE)
563 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600564 AuthorizationSet begin_params(client_params());
565 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600566 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600567 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600568
569 string message = "1234567890123456789012345678901";
570 string result;
571 size_t input_consumed;
572 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
573 EXPECT_EQ(0U, result.size());
574 EXPECT_EQ(31U, input_consumed);
575
576 string signature;
577 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
578 EXPECT_EQ(0U, signature.length());
Shawn Willden2beb6282015-05-20 16:36:24 -0600579
Shawn Willden6270aca2015-05-26 13:12:24 -0600580 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600581 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600582}
583
Shawn Willden58427c42015-05-20 13:00:42 -0600584TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600585 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
586 .RsaEncryptionKey(256, 3)
587 .Digest(KM_DIGEST_NONE)
588 .Padding(KM_PAD_NONE)));
589 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
590 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600591
Shawn Willden6270aca2015-05-26 13:12:24 -0600592 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600593 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600594}
595
Shawn Willden58427c42015-05-20 13:00:42 -0600596TEST_P(SigningOperationsTest, EcdsaSuccess) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600597 ASSERT_EQ(KM_ERROR_OK,
598 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600599 string message(1024, 'a');
Shawn Willdenedb79942015-05-08 06:46:44 -0600600 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600601 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600602
Shawn Willden6270aca2015-05-26 13:12:24 -0600603 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
604 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600605}
606
Shawn Willdenefbd7e42015-06-01 07:07:33 -0600607TEST_P(SigningOperationsTest, EcdsaSha256Success) {
608 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(
609 KM_DIGEST_SHA_2_256)));
610 string message(1024, 'a');
611 string signature;
612 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
613
614 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
615 EXPECT_EQ(3, GetParam()->keymaster0_calls());
616}
617
Shawn Willden58427c42015-05-20 13:00:42 -0600618TEST_P(SigningOperationsTest, AesEcbSign) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600619 ASSERT_EQ(KM_ERROR_OK,
620 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
621 TAG_BLOCK_MODE, KM_MODE_ECB)));
622 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
623 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600624
Shawn Willden6270aca2015-05-26 13:12:24 -0600625 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600626}
627
Shawn Willden58427c42015-05-20 13:00:42 -0600628TEST_P(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600629 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700630 string message = "12345678901234567890123456789012";
631 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600632 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600633 ASSERT_EQ(20U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600634
Shawn Willden6270aca2015-05-26 13:12:24 -0600635 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700636}
637
Shawn Willden58427c42015-05-20 13:00:42 -0600638TEST_P(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600639 ASSERT_EQ(KM_ERROR_OK,
640 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700641 string message = "12345678901234567890123456789012";
642 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600643 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600644 ASSERT_EQ(28U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600645
Shawn Willden6270aca2015-05-26 13:12:24 -0600646 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700647}
648
Shawn Willden58427c42015-05-20 13:00:42 -0600649TEST_P(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600650 ASSERT_EQ(KM_ERROR_OK,
651 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700652 string message = "12345678901234567890123456789012";
653 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600654 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600655 ASSERT_EQ(32U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600656
Shawn Willden6270aca2015-05-26 13:12:24 -0600657 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700658}
659
Shawn Willden58427c42015-05-20 13:00:42 -0600660TEST_P(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600661 ASSERT_EQ(KM_ERROR_OK,
662 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
663
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700664 string message = "12345678901234567890123456789012";
665 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600666 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600667 ASSERT_EQ(48U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600668
Shawn Willden6270aca2015-05-26 13:12:24 -0600669 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700670}
671
Shawn Willden58427c42015-05-20 13:00:42 -0600672TEST_P(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600673 ASSERT_EQ(KM_ERROR_OK,
674 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700675 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700676 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600677 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600678 ASSERT_EQ(64U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600679
Shawn Willden6270aca2015-05-26 13:12:24 -0600680 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700681}
682
Shawn Willden58427c42015-05-20 13:00:42 -0600683TEST_P(SigningOperationsTest, HmacLengthInKey) {
Shawn Willden09f25272015-04-15 13:49:49 -0600684 // TODO(swillden): unified API should generate an error on key generation.
685 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
686 .HmacKey(128)
687 .Digest(KM_DIGEST_SHA_2_256)
688 .Authorization(TAG_MAC_LENGTH, 20)));
689 string message = "12345678901234567890123456789012";
690 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600691 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600692 // Size in key was ignored.
693 ASSERT_EQ(30U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600694
Shawn Willden6270aca2015-05-26 13:12:24 -0600695 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden09f25272015-04-15 13:49:49 -0600696}
697
Shawn Willden58427c42015-05-20 13:00:42 -0600698TEST_P(SigningOperationsTest, HmacRfc4231TestCase1) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700699 uint8_t key_data[] = {
700 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
701 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
702 };
703 string message = "Hi There";
704 uint8_t sha_224_expected[] = {
705 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
706 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
707 };
708 uint8_t sha_256_expected[] = {
709 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
710 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
711 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
712 };
713 uint8_t sha_384_expected[] = {
714 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
715 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
716 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
717 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
718 };
719 uint8_t sha_512_expected[] = {
720 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
721 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
722 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
723 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
724 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
725 };
726
727 string key = make_string(key_data);
728
729 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
730 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
731 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
732 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600733
Shawn Willden6270aca2015-05-26 13:12:24 -0600734 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700735}
736
Shawn Willden58427c42015-05-20 13:00:42 -0600737TEST_P(SigningOperationsTest, HmacRfc4231TestCase2) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700738 string key = "Jefe";
739 string message = "what do ya want for nothing?";
740 uint8_t sha_224_expected[] = {
741 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
742 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
743 };
744 uint8_t sha_256_expected[] = {
745 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
746 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
747 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
748 };
749 uint8_t sha_384_expected[] = {
750 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
751 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
752 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
753 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
754 };
755 uint8_t sha_512_expected[] = {
756 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
757 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
758 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
759 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
760 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
761 };
762
763 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
764 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
765 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
766 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600767
Shawn Willden6270aca2015-05-26 13:12:24 -0600768 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700769}
770
Shawn Willden58427c42015-05-20 13:00:42 -0600771TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700772 string key(20, 0xaa);
773 string message(50, 0xdd);
774 uint8_t sha_224_expected[] = {
775 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
776 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
777 };
778 uint8_t sha_256_expected[] = {
779 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
780 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
781 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
782 };
783 uint8_t sha_384_expected[] = {
784 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
785 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
786 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
787 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
788 };
789 uint8_t sha_512_expected[] = {
790 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
791 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
792 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
793 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
794 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
795 };
796
797 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
798 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
799 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
800 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600801
Shawn Willden6270aca2015-05-26 13:12:24 -0600802 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700803}
804
Shawn Willden58427c42015-05-20 13:00:42 -0600805TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700806 uint8_t key_data[25] = {
807 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
808 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
809 };
810 string key = make_string(key_data);
811 string message(50, 0xcd);
812 uint8_t sha_224_expected[] = {
813 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
814 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
815 };
816 uint8_t sha_256_expected[] = {
817 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
818 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
819 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
820 };
821 uint8_t sha_384_expected[] = {
822 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
823 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
824 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
825 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
826 };
827 uint8_t sha_512_expected[] = {
828 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
829 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
830 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
831 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
832 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
833 };
834
835 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
836 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
837 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
838 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600839
Shawn Willden6270aca2015-05-26 13:12:24 -0600840 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700841}
842
Shawn Willden58427c42015-05-20 13:00:42 -0600843TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700844 string key(20, 0x0c);
845 string message = "Test With Truncation";
846
847 uint8_t sha_224_expected[] = {
848 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
849 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
850 };
851 uint8_t sha_256_expected[] = {
852 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
853 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
854 };
855 uint8_t sha_384_expected[] = {
856 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
857 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
858 };
859 uint8_t sha_512_expected[] = {
860 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
861 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
862 };
863
864 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
865 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
866 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
867 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600868
Shawn Willden6270aca2015-05-26 13:12:24 -0600869 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700870}
871
Shawn Willden58427c42015-05-20 13:00:42 -0600872TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700873 string key(131, 0xaa);
874 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
875
876 uint8_t sha_224_expected[] = {
877 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
878 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
879 };
880 uint8_t sha_256_expected[] = {
881 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
882 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
883 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
884 };
885 uint8_t sha_384_expected[] = {
886 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
887 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
888 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
889 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
890 };
891 uint8_t sha_512_expected[] = {
892 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
893 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
894 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
895 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
896 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
897 };
898
899 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
900 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
901 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
902 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600903
Shawn Willden6270aca2015-05-26 13:12:24 -0600904 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700905}
906
Shawn Willden58427c42015-05-20 13:00:42 -0600907TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700908 string key(131, 0xaa);
909 string message = "This is a test using a larger than block-size key and a larger than "
910 "block-size data. The key needs to be hashed before being used by the HMAC "
911 "algorithm.";
912
913 uint8_t sha_224_expected[] = {
914 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
915 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
916 };
917 uint8_t sha_256_expected[] = {
918 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
919 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
920 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
921 };
922 uint8_t sha_384_expected[] = {
923 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
924 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
925 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
926 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
927 };
928 uint8_t sha_512_expected[] = {
929 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
930 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
931 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
932 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
933 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
934 };
935
936 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
937 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
938 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
939 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600940
Shawn Willden6270aca2015-05-26 13:12:24 -0600941 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700942}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700943
Shawn Willden58427c42015-05-20 13:00:42 -0600944TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600945 ASSERT_EQ(KM_ERROR_OK,
946 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
947 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600948 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600949 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600950 ASSERT_EQ(KM_ERROR_OK,
951 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
952 string message = "1234567890123456789012345678901";
953 string result;
954 size_t input_consumed;
955 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
956 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden2beb6282015-05-20 16:36:24 -0600957
Shawn Willden6270aca2015-05-26 13:12:24 -0600958 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700959}
960
Shawn Willden61902362014-12-18 10:33:24 -0700961// TODO(swillden): Add more verification failure tests.
962
Shawn Willden58427c42015-05-20 13:00:42 -0600963typedef Keymaster1Test VerificationOperationsTest;
964INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params);
965
966TEST_P(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600967 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
968 .RsaSigningKey(256, 3)
969 .Digest(KM_DIGEST_NONE)
970 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700971 string message = "12345678901234567890123456789012";
972 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600973 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
974 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600975
Shawn Willden6270aca2015-05-26 13:12:24 -0600976 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600977 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600978}
979
Shawn Willden58427c42015-05-20 13:00:42 -0600980TEST_P(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600981 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
982 .RsaSigningKey(512, 3)
983 .Digest(KM_DIGEST_SHA_2_256)
984 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700985 // Use large message, which won't work without digesting.
986 string message(1024, 'a');
987 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600988 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
989 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600990
Shawn Willden6270aca2015-05-26 13:12:24 -0600991 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600992 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700993}
994
Shawn Willden58427c42015-05-20 13:00:42 -0600995TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600996 GenerateKey(AuthorizationSetBuilder()
997 .RsaSigningKey(512, 3)
998 .Digest(KM_DIGEST_SHA_2_256)
999 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001000 string message(1024, 'a');
1001 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001002 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001003 ++signature[signature.size() / 2];
1004
Shawn Willden226746b2015-05-08 11:36:56 -06001005 AuthorizationSet begin_params(client_params());
1006 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001007 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001008 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001009
1010 string result;
1011 size_t input_consumed;
1012 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1013 EXPECT_EQ(message.size(), input_consumed);
1014 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001015
Shawn Willden6270aca2015-05-26 13:12:24 -06001016 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001017 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001018}
1019
Shawn Willden58427c42015-05-20 13:00:42 -06001020TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001021 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1022 .RsaSigningKey(512, 3)
1023 .Digest(KM_DIGEST_SHA_2_256)
1024 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001025 // Use large message, which won't work without digesting.
1026 string message(1024, 'a');
1027 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001028 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -07001029 ++message[message.size() / 2];
1030
Shawn Willden226746b2015-05-08 11:36:56 -06001031 AuthorizationSet begin_params(client_params());
1032 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001033 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001034 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001035
1036 string result;
1037 size_t input_consumed;
1038 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1039 EXPECT_EQ(message.size(), input_consumed);
1040 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001041
Shawn Willden6270aca2015-05-26 13:12:24 -06001042 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001043 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001044}
1045
Shawn Willden58427c42015-05-20 13:00:42 -06001046TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001047 GenerateKey(AuthorizationSetBuilder()
1048 .RsaSigningKey(512, 3)
1049 .Digest(KM_DIGEST_SHA_2_256)
1050 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001051 string message(1024, 'a');
1052 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001053 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1054 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -06001055
Shawn Willden6270aca2015-05-26 13:12:24 -06001056 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001057 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001058}
1059
Shawn Willden58427c42015-05-20 13:00:42 -06001060TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001061 GenerateKey(AuthorizationSetBuilder()
1062 .RsaSigningKey(512, 3)
1063 .Digest(KM_DIGEST_SHA_2_256)
1064 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001065 string message(1024, 'a');
1066 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001067 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001068 ++signature[signature.size() / 2];
1069
Shawn Willden226746b2015-05-08 11:36:56 -06001070 AuthorizationSet begin_params(client_params());
1071 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001072 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001073 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001074
1075 string result;
1076 size_t input_consumed;
1077 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1078 EXPECT_EQ(message.size(), input_consumed);
1079 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001080
Shawn Willden6270aca2015-05-26 13:12:24 -06001081 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001082 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001083}
1084
Shawn Willden58427c42015-05-20 13:00:42 -06001085TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001086 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1087 .RsaSigningKey(512, 3)
1088 .Digest(KM_DIGEST_SHA_2_256)
1089 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001090 // Use large message, which won't work without digesting.
1091 string message(1024, 'a');
1092 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001093 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001094 ++message[message.size() / 2];
1095
Shawn Willden226746b2015-05-08 11:36:56 -06001096 AuthorizationSet begin_params(client_params());
1097 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001098 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001099 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001100
1101 string result;
1102 size_t input_consumed;
1103 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1104 EXPECT_EQ(message.size(), input_consumed);
1105 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001106
Shawn Willden6270aca2015-05-26 13:12:24 -06001107 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001108 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001109}
1110
1111template <typename T> vector<T> make_vector(const T* array, size_t len) {
1112 return vector<T>(array, array + len);
1113}
1114
Shawn Willden58427c42015-05-20 13:00:42 -06001115TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001116 // Get all supported digests and padding modes.
1117 size_t digests_len;
1118 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -06001119 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001120 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1121 &digests_len));
1122
1123 size_t padding_modes_len;
1124 keymaster_padding_t* padding_modes;
Shawn Willden0cb69422015-05-26 08:31:37 -06001125 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001126 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1127 &padding_modes, &padding_modes_len));
1128
1129 // Try them.
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001130 int trial_count = 0;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001131 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1132 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001133 if (digest != KM_DIGEST_NONE && padding_mode == KM_PAD_NONE)
1134 // Digesting requires padding
1135 continue;
1136
Shawn Willdenf90f2352014-12-18 23:01:15 -07001137 // Compute key & message size that will work.
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001138 size_t key_bits = 0;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001139 size_t message_len = 1000;
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001140
1141 if (digest == KM_DIGEST_NONE) {
1142 key_bits = 256;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001143 switch (padding_mode) {
1144 case KM_PAD_NONE:
1145 // Match key size.
1146 message_len = key_bits / 8;
1147 break;
1148 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1149 message_len = key_bits / 8 - 11;
1150 break;
1151 case KM_PAD_RSA_PSS:
1152 // PSS requires a digest.
1153 continue;
1154 default:
1155 FAIL() << "Missing padding";
1156 break;
1157 }
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001158 } else {
1159 size_t digest_bits;
1160 switch (digest) {
1161 case KM_DIGEST_MD5:
1162 digest_bits = 128;
1163 break;
1164 case KM_DIGEST_SHA1:
1165 digest_bits = 160;
1166 break;
1167 case KM_DIGEST_SHA_2_224:
1168 digest_bits = 224;
1169 break;
1170 case KM_DIGEST_SHA_2_256:
1171 digest_bits = 256;
1172 break;
1173 case KM_DIGEST_SHA_2_384:
1174 digest_bits = 384;
1175 break;
1176 case KM_DIGEST_SHA_2_512:
1177 digest_bits = 512;
1178 break;
1179 default:
1180 FAIL() << "Missing digest";
1181 }
Shawn Willdenf90f2352014-12-18 23:01:15 -07001182
Shawn Willdenf90f2352014-12-18 23:01:15 -07001183 switch (padding_mode) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001184 case KM_PAD_RSA_PKCS1_1_5_SIGN:
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001185 key_bits = digest_bits + 8 * (11 + 19);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001186 break;
1187 case KM_PAD_RSA_PSS:
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001188 key_bits = digest_bits + 8 * 10;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001189 break;
1190 default:
1191 FAIL() << "Missing padding";
1192 break;
1193 }
Shawn Willdenf90f2352014-12-18 23:01:15 -07001194 }
1195
Shawn Willdenaf533992015-04-15 13:48:28 -06001196 GenerateKey(AuthorizationSetBuilder()
1197 .RsaSigningKey(key_bits, 3)
1198 .Digest(digest)
1199 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001200 string message(message_len, 'a');
1201 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001202 SignMessage(message, &signature, digest, padding_mode);
1203 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001204 ++trial_count;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001205 }
1206 }
1207
1208 free(padding_modes);
1209 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -06001210
Shawn Willden6270aca2015-05-26 13:12:24 -06001211 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001212 EXPECT_EQ(trial_count * 4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001213}
1214
Shawn Willden58427c42015-05-20 13:00:42 -06001215TEST_P(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001216 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001217 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001218 string message = "123456789012345678901234567890123456789012345678";
1219 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001220 SignMessage(message, &signature, KM_DIGEST_NONE);
1221 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001222
Shawn Willden6270aca2015-05-26 13:12:24 -06001223 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1224 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001225}
1226
Shawn Willdenefbd7e42015-06-01 07:07:33 -06001227TEST_P(VerificationOperationsTest, EcdsaSha256Success) {
1228 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1229 .EcdsaSigningKey(256)
1230 .Digest(KM_DIGEST_SHA_2_256)
1231 .Digest(KM_DIGEST_NONE)));
1232 string message = "123456789012345678901234567890123456789012345678";
1233 string signature;
1234 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
1235 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
1236
1237 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1238 EXPECT_EQ(4, GetParam()->keymaster0_calls());
1239
1240 // Just for giggles, try verifying with the wrong digest.
1241 AuthorizationSet begin_params(client_params());
1242 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
1243 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1244
1245 string result;
1246 size_t input_consumed;
1247 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1248 EXPECT_EQ(message.size(), input_consumed);
1249 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1250}
1251
Shawn Willden58427c42015-05-20 13:00:42 -06001252TEST_P(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001253 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001254 string message = "123456789012345678901234567890123456789012345678";
1255 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001256 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1257 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden2beb6282015-05-20 16:36:24 -06001258
Shawn Willden6270aca2015-05-26 13:12:24 -06001259 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001260}
1261
Shawn Willden58427c42015-05-20 13:00:42 -06001262TEST_P(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001263 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001264 string message = "123456789012345678901234567890123456789012345678";
1265 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001266 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1267 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden2beb6282015-05-20 16:36:24 -06001268
Shawn Willden6270aca2015-05-26 13:12:24 -06001269 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001270}
1271
Shawn Willden58427c42015-05-20 13:00:42 -06001272TEST_P(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001273 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001274 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001275 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001276 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1277 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001278
Shawn Willden6270aca2015-05-26 13:12:24 -06001279 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -07001280}
1281
Shawn Willden58427c42015-05-20 13:00:42 -06001282TEST_P(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001283 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001284 string message = "123456789012345678901234567890123456789012345678";
1285 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001286 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1287 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden2beb6282015-05-20 16:36:24 -06001288
Shawn Willden6270aca2015-05-26 13:12:24 -06001289 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001290}
1291
Shawn Willden58427c42015-05-20 13:00:42 -06001292TEST_P(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001293 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001294 string message = "123456789012345678901234567890123456789012345678";
1295 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001296 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1297 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden2beb6282015-05-20 16:36:24 -06001298
Shawn Willden6270aca2015-05-26 13:12:24 -06001299 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001300}
1301
Shawn Willden58427c42015-05-20 13:00:42 -06001302typedef Keymaster1Test ExportKeyTest;
1303INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params);
1304
1305TEST_P(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001306 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1307 .RsaSigningKey(256, 3)
1308 .Digest(KM_DIGEST_NONE)
1309 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001310 string export_data;
1311 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001312 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001313
1314 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001315
Shawn Willden6270aca2015-05-26 13:12:24 -06001316 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001317 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenffd790c2014-08-18 21:20:06 -06001318}
1319
Shawn Willden58427c42015-05-20 13:00:42 -06001320TEST_P(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001321 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001322 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001323 string export_data;
1324 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001325 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001326
1327 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001328
Shawn Willden6270aca2015-05-26 13:12:24 -06001329 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1330 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001331}
1332
Shawn Willden58427c42015-05-20 13:00:42 -06001333TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001334 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1335 .RsaSigningKey(256, 3)
1336 .Digest(KM_DIGEST_NONE)
1337 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001338 string export_data;
1339 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001340
Shawn Willden6270aca2015-05-26 13:12:24 -06001341 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001342 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001343}
1344
Shawn Willden58427c42015-05-20 13:00:42 -06001345TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001346 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1347 .RsaSigningKey(256, 3)
1348 .Digest(KM_DIGEST_NONE)
1349 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001350 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001351 string export_data;
1352 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001353
Shawn Willden6270aca2015-05-26 13:12:24 -06001354 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001355 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001356}
1357
Shawn Willden58427c42015-05-20 13:00:42 -06001358TEST_P(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001359 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001360 string export_data;
1361
1362 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1363 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1364 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001365
Shawn Willden6270aca2015-05-26 13:12:24 -06001366 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden7dad93b2015-02-05 10:20:47 -07001367}
1368
Shawn Willden437fbd12014-08-20 11:59:49 -06001369static string read_file(const string& file_name) {
1370 ifstream file_stream(file_name, std::ios::binary);
1371 istreambuf_iterator<char> file_begin(file_stream);
1372 istreambuf_iterator<char> file_end;
1373 return string(file_begin, file_end);
1374}
1375
Shawn Willden58427c42015-05-20 13:00:42 -06001376typedef Keymaster1Test ImportKeyTest;
1377INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params);
1378
1379TEST_P(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001380 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001381 ASSERT_EQ(633U, pk8_key.size());
1382
Shawn Willdenaf533992015-04-15 13:48:28 -06001383 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1384 .RsaSigningKey(1024, 65537)
1385 .Digest(KM_DIGEST_NONE)
1386 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001387 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001388
1389 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001390 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1391 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001392 TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6270aca2015-05-26 13:12:24 -06001393 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1394 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001395 TAG_KEY_SIZE, 1024));
Shawn Willden6270aca2015-05-26 13:12:24 -06001396 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1397 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001398 TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001399
Shawn Willdenb6837e72015-05-16 09:20:59 -06001400 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001401 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1402 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001403
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001404 string message(1024 / 8, 'a');
1405 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001406 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1407 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001408
Shawn Willden6270aca2015-05-26 13:12:24 -06001409 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001410 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden437fbd12014-08-20 11:59:49 -06001411}
1412
Shawn Willden58427c42015-05-20 13:00:42 -06001413TEST_P(ImportKeyTest, OldApiRsaSuccess) {
Shawn Willdend7a5c712015-04-09 16:33:52 -06001414 string pk8_key = read_file("rsa_privkey_pk8.der");
1415 ASSERT_EQ(633U, pk8_key.size());
1416
1417 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1418 // point softkeymaster will no longer support keymaster0 APIs anyway.
1419 uint8_t* key_blob;
1420 size_t key_blob_length;
1421 ASSERT_EQ(0,
1422 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1423 pk8_key.size(), &key_blob, &key_blob_length));
1424 set_key_blob(key_blob, key_blob_length);
1425
1426 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001427 AuthorizationSet begin_params; // Don't use client data.
1428 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001429 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001430 AuthorizationSet update_params;
1431 AuthorizationSet output_params;
1432 string signature =
1433 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1434 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1435 &output_params);
Shawn Willden2beb6282015-05-20 16:36:24 -06001436
Shawn Willden6270aca2015-05-26 13:12:24 -06001437 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001438 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdend7a5c712015-04-09 16:33:52 -06001439}
1440
Shawn Willden58427c42015-05-20 13:00:42 -06001441TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001442 string pk8_key = read_file("rsa_privkey_pk8.der");
1443 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001444 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001445 ImportKey(AuthorizationSetBuilder()
1446 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1447 .Digest(KM_DIGEST_NONE)
1448 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001449 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001450
Shawn Willden6270aca2015-05-26 13:12:24 -06001451 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001452}
1453
Shawn Willden58427c42015-05-20 13:00:42 -06001454TEST_P(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001455 string pk8_key = read_file("rsa_privkey_pk8.der");
1456 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001457 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001458 ImportKey(AuthorizationSetBuilder()
1459 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1460 .Digest(KM_DIGEST_NONE)
1461 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001462 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001463
Shawn Willden6270aca2015-05-26 13:12:24 -06001464 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001465}
1466
Shawn Willden58427c42015-05-20 13:00:42 -06001467TEST_P(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001468 string pk8_key = read_file("ec_privkey_pk8.der");
1469 ASSERT_EQ(138U, pk8_key.size());
1470
Shawn Willdenaf533992015-04-15 13:48:28 -06001471 ASSERT_EQ(KM_ERROR_OK,
1472 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1473 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001474
1475 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001476 EXPECT_TRUE(
1477 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1478 TAG_ALGORITHM, KM_ALGORITHM_EC));
1479 EXPECT_TRUE(
1480 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1481 TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001482
Shawn Willdenb6837e72015-05-16 09:20:59 -06001483 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001484 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1485 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001486
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001487 string message(1024 / 8, 'a');
1488 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001489 SignMessage(message, &signature, KM_DIGEST_NONE);
1490 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001491
Shawn Willden6270aca2015-05-26 13:12:24 -06001492 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1493 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden81effc62014-08-27 10:08:46 -06001494}
1495
Shawn Willden58427c42015-05-20 13:00:42 -06001496TEST_P(ImportKeyTest, EcdsaSizeSpecified) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001497 string pk8_key = read_file("ec_privkey_pk8.der");
1498 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001499
Shawn Willdenaf533992015-04-15 13:48:28 -06001500 ASSERT_EQ(KM_ERROR_OK,
1501 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1502 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001503
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001504 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001505 EXPECT_TRUE(
1506 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1507 TAG_ALGORITHM, KM_ALGORITHM_EC));
1508 EXPECT_TRUE(
1509 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1510 TAG_KEY_SIZE, 256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001511
Shawn Willdenb6837e72015-05-16 09:20:59 -06001512 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001513 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1514 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1515
1516 string message(1024 / 8, 'a');
1517 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001518 SignMessage(message, &signature, KM_DIGEST_NONE);
1519 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001520
Shawn Willden6270aca2015-05-26 13:12:24 -06001521 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1522 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001523}
1524
Shawn Willden58427c42015-05-20 13:00:42 -06001525TEST_P(ImportKeyTest, EcdsaSizeMismatch) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001526 string pk8_key = read_file("ec_privkey_pk8.der");
1527 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001528 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001529 ImportKey(AuthorizationSetBuilder()
1530 .EcdsaSigningKey(224 /* Doesn't match key */)
1531 .Digest(KM_DIGEST_NONE),
1532 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001533
Shawn Willden6270aca2015-05-26 13:12:24 -06001534 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001535}
1536
Shawn Willden58427c42015-05-20 13:00:42 -06001537TEST_P(ImportKeyTest, AesKeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001538 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1539 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001540 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001541 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1542 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001543 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001544
1545 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1546 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1547
1548 string message = "Hello World!";
Shawn Willdenc4424672015-05-11 11:56:02 -06001549 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1550 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willden3b702e22015-02-05 10:26:47 -07001551 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001552
Shawn Willden6270aca2015-05-26 13:12:24 -06001553 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001554}
1555
Shawn Willden58427c42015-05-20 13:00:42 -06001556TEST_P(ImportKeyTest, HmacSha256KeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001557 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1558 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001559 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1560 .HmacKey(sizeof(key_data) * 8)
1561 .Digest(KM_DIGEST_SHA_2_256)
1562 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001563 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001564
1565 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1566 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1567
1568 string message = "Hello World!";
1569 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001570 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1571 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001572
Shawn Willden6270aca2015-05-26 13:12:24 -06001573 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001574}
1575
Shawn Willden58427c42015-05-20 13:00:42 -06001576typedef Keymaster1Test EncryptionOperationsTest;
1577INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params);
1578
1579TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001580 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1581 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001582
1583 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001584 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001585 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001586
Shawn Willden3ad5f052015-05-08 14:05:13 -06001587 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001588 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001589
1590 // OAEP randomizes padding so every result should be different.
1591 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001592
Shawn Willden6270aca2015-05-26 13:12:24 -06001593 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001594 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001595}
1596
Shawn Willden58427c42015-05-20 13:00:42 -06001597TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001598 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1599 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001600 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001601 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001602 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001603
Shawn Willden3ad5f052015-05-08 14:05:13 -06001604 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001605 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001606
Shawn Willden6270aca2015-05-26 13:12:24 -06001607 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001608 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001609}
1610
Shawn Willden58427c42015-05-20 13:00:42 -06001611TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001612 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1613 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001614 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001615 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001616 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001617
Shawn Willden3ad5f052015-05-08 14:05:13 -06001618 AuthorizationSet begin_params(client_params());
1619 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1620 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001621 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001622 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001623 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001624
Shawn Willden6270aca2015-05-26 13:12:24 -06001625 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001626 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001627}
1628
Shawn Willden58427c42015-05-20 13:00:42 -06001629TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001630 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1631 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001632 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001633 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001634 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001635
1636 // Corrupt the ciphertext
1637 ciphertext[512 / 8 / 2]++;
1638
Shawn Willden4200f212014-12-02 07:01:21 -07001639 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001640 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001641 AuthorizationSet begin_params(client_params());
1642 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1643 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001644 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001645 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001646 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001647
Shawn Willden6270aca2015-05-26 13:12:24 -06001648 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001649 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001650}
1651
Shawn Willden58427c42015-05-20 13:00:42 -06001652TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001653 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1654 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001655 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001656 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001657 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001658
Shawn Willden3ad5f052015-05-08 14:05:13 -06001659 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001660 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001661
1662 // PKCS1 v1.5 randomizes padding so every result should be different.
1663 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001664
Shawn Willden6270aca2015-05-26 13:12:24 -06001665 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001666 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001667}
1668
Shawn Willden58427c42015-05-20 13:00:42 -06001669TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001670 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1671 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001672 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001673 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001674 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001675
Shawn Willden3ad5f052015-05-08 14:05:13 -06001676 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001677 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001678
Shawn Willden6270aca2015-05-26 13:12:24 -06001679 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001680 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001681}
1682
Shawn Willden58427c42015-05-20 13:00:42 -06001683TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001684 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1685 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willden7bae1322015-05-26 10:16:49 -06001686 string message = "123456789012345678901234567890123456789012345678901234";
Shawn Willden4200f212014-12-02 07:01:21 -07001687 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001688 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001689
Shawn Willden3ad5f052015-05-08 14:05:13 -06001690 AuthorizationSet begin_params(client_params());
1691 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1692 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001693 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001694 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001695 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001696
Shawn Willden6270aca2015-05-26 13:12:24 -06001697 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001698 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001699}
1700
Shawn Willden58427c42015-05-20 13:00:42 -06001701TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001702 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1703 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001704 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001705 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001706 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001707
1708 // Corrupt the ciphertext
1709 ciphertext[512 / 8 / 2]++;
1710
Shawn Willden4200f212014-12-02 07:01:21 -07001711 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001712 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001713 AuthorizationSet begin_params(client_params());
1714 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1715 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001716 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001717 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001718 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001719
Shawn Willden6270aca2015-05-26 13:12:24 -06001720 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001721 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001722}
1723
Shawn Willden58427c42015-05-20 13:00:42 -06001724TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001725 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1726 .RsaSigningKey(256, 3)
1727 .Digest(KM_DIGEST_NONE)
1728 .Padding(KM_PAD_NONE)));
1729 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1730 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001731
Shawn Willden6270aca2015-05-26 13:12:24 -06001732 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001733 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001734}
1735
Shawn Willden58427c42015-05-20 13:00:42 -06001736TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001737 ASSERT_EQ(KM_ERROR_OK,
1738 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1739 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1740 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001741
Shawn Willden6270aca2015-05-26 13:12:24 -06001742 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1743 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001744}
1745
Shawn Willden58427c42015-05-20 13:00:42 -06001746TEST_P(EncryptionOperationsTest, HmacEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001747 ASSERT_EQ(
1748 KM_ERROR_OK,
1749 GenerateKey(
1750 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1751 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1752 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001753
Shawn Willden6270aca2015-05-26 13:12:24 -06001754 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001755}
1756
Shawn Willden58427c42015-05-20 13:00:42 -06001757TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001758 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1759 .AesEncryptionKey(128)
1760 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1761 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001762 // Two-block message.
1763 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001764 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001765 EXPECT_EQ(message.size(), ciphertext1.size());
1766
Shawn Willden31e063f2015-05-08 14:31:22 -06001767 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001768 EXPECT_EQ(message.size(), ciphertext2.size());
1769
1770 // ECB is deterministic.
1771 EXPECT_EQ(ciphertext1, ciphertext2);
1772
Shawn Willden31e063f2015-05-08 14:31:22 -06001773 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001774 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001775
Shawn Willden6270aca2015-05-26 13:12:24 -06001776 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001777}
1778
Shawn Willden58427c42015-05-20 13:00:42 -06001779TEST_P(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001780 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1781 .AesEncryptionKey(128)
1782 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1783 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001784 // Message is slightly shorter than two blocks.
1785 string message = "1234567890123456789012345678901";
1786
Shawn Willden31e063f2015-05-08 14:31:22 -06001787 AuthorizationSet begin_params(client_params());
1788 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001789 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001790 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001791 string ciphertext;
1792 size_t input_consumed;
1793 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1794 EXPECT_EQ(message.size(), input_consumed);
1795 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001796
Shawn Willden6270aca2015-05-26 13:12:24 -06001797 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001798}
1799
Shawn Willden58427c42015-05-20 13:00:42 -06001800TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001801 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001802 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001803 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1804 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001805
1806 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001807 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001808 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001809 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001810 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001811 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001812 EXPECT_EQ(message, plaintext);
1813 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001814
Shawn Willden6270aca2015-05-26 13:12:24 -06001815 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001816}
1817
Shawn Willden58427c42015-05-20 13:00:42 -06001818TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001819 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001820 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001821 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1822 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001823
1824 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001825 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001826 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001827 EXPECT_NE(ciphertext, message);
1828 ++ciphertext[ciphertext.size() / 2];
1829
Shawn Willden31e063f2015-05-08 14:31:22 -06001830 AuthorizationSet begin_params(client_params());
1831 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001832 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
Shawn Willden31e063f2015-05-08 14:31:22 -06001833 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001834 string plaintext;
1835 size_t input_consumed;
1836 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1837 EXPECT_EQ(ciphertext.size(), input_consumed);
1838 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001839
Shawn Willden6270aca2015-05-26 13:12:24 -06001840 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001841}
1842
Shawn Willden58427c42015-05-20 13:00:42 -06001843TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001844 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1845 .AesEncryptionKey(128)
1846 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1847 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001848 string message = "123";
1849 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001850 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001851 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001852 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001853
1854 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001855 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001856 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001857 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001858
1859 // IVs should be random, so ciphertexts should differ.
1860 EXPECT_NE(iv1, iv2);
1861 EXPECT_NE(ciphertext1, ciphertext2);
1862
Shawn Willden31e063f2015-05-08 14:31:22 -06001863 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001864 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001865
Shawn Willden6270aca2015-05-26 13:12:24 -06001866 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001867}
1868
Shawn Willden58427c42015-05-20 13:00:42 -06001869TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001870 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1871 .AesEncryptionKey(128)
1872 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1873 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001874
1875 int increment = 15;
1876 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001877 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001878 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001879 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001880 AuthorizationSet output_params;
1881 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1882
1883 string ciphertext;
1884 size_t input_consumed;
1885 for (size_t i = 0; i < message.size(); i += increment)
1886 EXPECT_EQ(KM_ERROR_OK,
1887 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1888 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1889 EXPECT_EQ(message.size(), ciphertext.size());
1890
1891 // Move TAG_NONCE into input_params
1892 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001893 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001894 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001895 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001896 output_params.Clear();
1897
1898 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1899 string plaintext;
1900 for (size_t i = 0; i < ciphertext.size(); i += increment)
1901 EXPECT_EQ(KM_ERROR_OK,
1902 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1903 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1904 EXPECT_EQ(ciphertext.size(), plaintext.size());
1905 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001906
Shawn Willden6270aca2015-05-26 13:12:24 -06001907 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001908}
1909
1910struct AesCtrSp80038aTestVector {
1911 const char* key;
1912 const char* nonce;
1913 const char* plaintext;
1914 const char* ciphertext;
1915};
1916
1917// These test vectors are taken from
1918// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1919static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1920 // AES-128
1921 {
1922 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1923 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1924 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1925 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1926 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1927 },
1928 // AES-192
1929 {
1930 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1931 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1932 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1933 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1934 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1935 },
1936 // AES-256
1937 {
1938 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1939 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1940 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1941 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1942 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1943 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1944 },
1945};
1946
Shawn Willden58427c42015-05-20 13:00:42 -06001947TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
Thai Duong20d725d2015-03-24 17:49:58 -07001948 for (size_t i = 0; i < 3; i++) {
1949 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1950 const string key = hex2str(test.key);
1951 const string nonce = hex2str(test.nonce);
1952 const string plaintext = hex2str(test.plaintext);
1953 const string ciphertext = hex2str(test.ciphertext);
1954 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1955 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001956
Shawn Willden6270aca2015-05-26 13:12:24 -06001957 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001958}
1959
Shawn Willden58427c42015-05-20 13:00:42 -06001960TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
Thai Duong20d725d2015-03-24 17:49:58 -07001961 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1962 .AesEncryptionKey(128)
1963 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1964 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06001965 AuthorizationSet begin_params(client_params());
1966 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001967 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001968 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06001969
Shawn Willden6270aca2015-05-26 13:12:24 -06001970 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001971}
1972
Shawn Willden58427c42015-05-20 13:00:42 -06001973TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
Thai Duong20d725d2015-03-24 17:49:58 -07001974 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1975 .AesEncryptionKey(128)
1976 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001977 .Authorization(TAG_CALLER_NONCE)
1978 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001979
Shawn Willden09f25272015-04-15 13:49:49 -06001980 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001981 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001982 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001983 input_params.push_back(TAG_NONCE, "123", 3);
1984 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06001985
Shawn Willden6270aca2015-05-26 13:12:24 -06001986 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001987}
1988
Shawn Willden58427c42015-05-20 13:00:42 -06001989TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001990 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1991 .AesEncryptionKey(128)
1992 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1993 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001994 // Two-block message.
1995 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001996 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001997 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001998 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001999
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002000 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06002001 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002002 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002003
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002004 // IVs should be random, so ciphertexts should differ.
2005 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002006 EXPECT_NE(ciphertext1, ciphertext2);
2007
Shawn Willden31e063f2015-05-08 14:31:22 -06002008 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002009 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002010
Shawn Willden6270aca2015-05-26 13:12:24 -06002011 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002012}
2013
Shawn Willden58427c42015-05-20 13:00:42 -06002014TEST_P(EncryptionOperationsTest, AesCallerNonce) {
Shawn Willden969aa382015-04-15 17:05:53 -07002015 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2016 .AesEncryptionKey(128)
2017 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002018 .Authorization(TAG_CALLER_NONCE)
2019 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07002020 string message = "12345678901234567890123456789012";
2021 string iv1;
2022 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002023 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002024 EXPECT_EQ(message.size(), ciphertext1.size());
2025 EXPECT_EQ(16U, iv1.size());
2026
Shawn Willden31e063f2015-05-08 14:31:22 -06002027 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002028 EXPECT_EQ(message, plaintext);
2029
2030 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06002031 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07002032 AuthorizationSet update_params;
2033 AuthorizationSet output_params;
2034 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002035 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002036 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002037 string ciphertext2 =
2038 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
2039
2040 // Decrypt with correct nonce.
2041 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2042 &output_params);
2043 EXPECT_EQ(message, plaintext);
2044
2045 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06002046 input_params.Reinitialize(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002047 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002048 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002049 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
2050 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2051 &output_params);
2052 EXPECT_NE(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002053
Shawn Willden6270aca2015-05-26 13:12:24 -06002054 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden969aa382015-04-15 17:05:53 -07002055}
2056
Shawn Willden58427c42015-05-20 13:00:42 -06002057TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002058 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2059 .AesEncryptionKey(128)
2060 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2061 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06002062
2063 string message = "12345678901234567890123456789012";
2064 string iv1;
2065 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002066 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002067 EXPECT_EQ(message.size(), ciphertext1.size());
2068 EXPECT_EQ(16U, iv1.size());
2069
Shawn Willden31e063f2015-05-08 14:31:22 -06002070 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002071 EXPECT_EQ(message, plaintext);
2072
2073 // Now specify a nonce, should fail.
2074 AuthorizationSet input_params(client_params());
2075 AuthorizationSet update_params;
2076 AuthorizationSet output_params;
2077 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002078 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002079 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden67706352015-04-28 00:43:19 -06002080
2081 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
2082 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002083
Shawn Willden6270aca2015-05-26 13:12:24 -06002084 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
Shawn Willden6270aca2015-05-26 13:12:24 -06002125 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002126}
2127
Shawn Willden58427c42015-05-20 13:00:42 -06002128TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002129 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002130 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002131 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2132 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002133
2134 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06002135 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002136 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002137 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06002138 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002139 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06002140 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002141 EXPECT_EQ(message, plaintext);
2142 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002143
Shawn Willden6270aca2015-05-26 13:12:24 -06002144 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002145}
2146
Shawn Willden58427c42015-05-20 13:00:42 -06002147typedef Keymaster1Test AddEntropyTest;
2148INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params);
2149
2150TEST_P(AddEntropyTest, AddEntropy) {
Shawn Willdencd695822015-01-26 14:06:32 -07002151 // There's no obvious way to test that entropy is actually added, but we can test that the API
2152 // doesn't blow up or return an error.
2153 EXPECT_EQ(KM_ERROR_OK,
2154 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
Shawn Willden2beb6282015-05-20 16:36:24 -06002155
Shawn Willden6270aca2015-05-26 13:12:24 -06002156 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden2beb6282015-05-20 16:36:24 -06002157}
2158
2159typedef Keymaster1Test Keymaster0AdapterTest;
2160INSTANTIATE_TEST_CASE_P(
2161 AndroidKeymasterTest, Keymaster0AdapterTest,
Shawn Willden6270aca2015-05-26 13:12:24 -06002162 ::testing::Values(
2163 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(true /* support_ec */)),
2164 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(false /* support_ec */))));
Shawn Willden2beb6282015-05-20 16:36:24 -06002165
Shawn Willden6270aca2015-05-26 13:12:24 -06002166TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002167 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2168 // key data.
2169 string km1_sw = read_file("km1_sw_rsa_512.blob");
2170 EXPECT_EQ(486U, km1_sw.length());
2171
2172 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2173 memcpy(key_data, km1_sw.data(), km1_sw.length());
2174 set_key_blob(key_data, km1_sw.length());
2175
2176 string message(64, 'a');
2177 string signature;
2178 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2179
2180 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2181}
2182
Shawn Willden6270aca2015-05-26 13:12:24 -06002183TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1EcdsaBlob) {
2184 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2185 // key data.
2186 string km1_sw = read_file("km1_sw_ecdsa_256.blob");
2187 EXPECT_EQ(270U, km1_sw.length());
2188
2189 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2190 memcpy(key_data, km1_sw.data(), km1_sw.length());
2191 set_key_blob(key_data, km1_sw.length());
2192
2193 string message(64, 'a');
2194 string signature;
2195 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2196
2197 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2198}
2199
Shawn Willden2beb6282015-05-20 16:36:24 -06002200struct Malloc_Delete {
2201 void operator()(void* p) { free(p); }
2202};
2203
Shawn Willden6270aca2015-05-26 13:12:24 -06002204TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster0RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002205 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2206 string km0_sw = read_file("km0_sw_rsa_512.blob");
2207 EXPECT_EQ(333U, km0_sw.length());
2208
2209 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2210 memcpy(key_data, km0_sw.data(), km0_sw.length());
2211 set_key_blob(key_data, km0_sw.length());
2212
2213 string message(64, 'a');
2214 string signature;
2215 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2216
2217 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdencd695822015-01-26 14:06:32 -07002218}
2219
Shawn Willden128ffe02014-08-06 12:31:33 -06002220} // namespace test
2221} // namespace keymaster