blob: 5a4cba785bd0aee953df311899b52784ce67b446 [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 Willden61902362014-12-18 10:33:24 -0700186 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700187 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600188
Shawn Willden0cb69422015-05-26 08:31:37 -0600189 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700190 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willdene998c132015-04-14 14:41:46 -0600191 EXPECT_TRUE(ResponseContains(KM_DIGEST_NONE, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700192 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600193
Shawn Willden63ac0432014-12-29 14:07:08 -0700194 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
195 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
196 &len));
197
Shawn Willden0cb69422015-05-26 08:31:37 -0600198 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700199 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700200 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
201 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
202 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700203 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -0600204
Shawn Willden6270aca2015-05-26 13:12:24 -0600205 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600206}
207
Shawn Willden58427c42015-05-20 13:00:42 -0600208TEST_P(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700209 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
210 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600211
Shawn Willden5b53c992015-02-02 08:05:25 -0700212 size_t len;
213 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600214 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700215 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700216 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700217 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700218
Shawn Willden0cb69422015-05-26 08:31:37 -0600219 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700220 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
221 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
222 free(formats);
223
Shawn Willden0cb69422015-05-26 08:31:37 -0600224 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700225 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
226 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
227 free(formats);
Shawn Willden2beb6282015-05-20 16:36:24 -0600228
Shawn Willden6270aca2015-05-26 13:12:24 -0600229 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600230}
231
Shawn Willden58427c42015-05-20 13:00:42 -0600232TEST_P(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700233 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
234 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600235
Shawn Willden5b53c992015-02-02 08:05:25 -0700236 size_t len;
237 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600238 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700239 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700240 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700241 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600242
Shawn Willden0cb69422015-05-26 08:31:37 -0600243 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600244 device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700245 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700246 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600247
Shawn Willden0cb69422015-05-26 08:31:37 -0600248 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700249 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600250 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700251 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700252
Shawn Willden0cb69422015-05-26 08:31:37 -0600253 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700254 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600255 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700256 free(formats);
257
Shawn Willden0cb69422015-05-26 08:31:37 -0600258 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700259 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600260 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700261 free(formats);
Shawn Willden2beb6282015-05-20 16:36:24 -0600262
Shawn Willden6270aca2015-05-26 13:12:24 -0600263 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600264}
265
Shawn Willden58427c42015-05-20 13:00:42 -0600266class NewKeyGeneration : public Keymaster1Test {
Shawn Willdend0772312014-09-18 12:27:57 -0600267 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700268 void CheckBaseParams() {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700269 AuthorizationSet auths = sw_enforced();
270 EXPECT_GT(auths.SerializedSize(), 12U);
271
Shawn Willden5b53c992015-02-02 08:05:25 -0700272 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
273 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
274 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600275 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700276 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600277
278 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700279 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
280 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
281 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600282
283 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700284 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
285 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
286 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600287
288 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600289 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700290 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600291 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700292};
Shawn Willden58427c42015-05-20 13:00:42 -0600293INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, NewKeyGeneration, test_params);
294
295TEST_P(NewKeyGeneration, Rsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600296 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
297 .RsaSigningKey(256, 3)
298 .Digest(KM_DIGEST_NONE)
299 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700300 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600301
Shawn Willden2beb6282015-05-20 16:36:24 -0600302 // Check specified tags are all present, and in the right set.
303 AuthorizationSet crypto_params;
304 AuthorizationSet non_crypto_params;
Shawn Willden6270aca2015-05-26 13:12:24 -0600305 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA)) {
Shawn Willden2beb6282015-05-20 16:36:24 -0600306 EXPECT_NE(0U, hw_enforced().size());
307 EXPECT_NE(0U, sw_enforced().size());
308 crypto_params.push_back(hw_enforced());
309 non_crypto_params.push_back(sw_enforced());
310 } else {
311 EXPECT_EQ(0U, hw_enforced().size());
312 EXPECT_NE(0U, sw_enforced().size());
313 crypto_params.push_back(sw_enforced());
314 }
315
316 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
317 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
318 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 256));
319 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 256));
320 EXPECT_TRUE(contains(crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
321 EXPECT_FALSE(contains(non_crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
322
Shawn Willden6270aca2015-05-26 13:12:24 -0600323 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600324 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600325}
326
Shawn Willden58427c42015-05-20 13:00:42 -0600327TEST_P(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700328 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
329 GenerateKey(AuthorizationSetBuilder()
330 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
331 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
332 .SigningKey()));
Shawn Willden2beb6282015-05-20 16:36:24 -0600333
Shawn Willden6270aca2015-05-26 13:12:24 -0600334 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600335}
336
Shawn Willden58427c42015-05-20 13:00:42 -0600337TEST_P(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600338 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600339 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700340 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600341
Shawn Willden6270aca2015-05-26 13:12:24 -0600342 // Check specified tags are all present, and in the right set.
343 AuthorizationSet crypto_params;
344 AuthorizationSet non_crypto_params;
345 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC)) {
346 EXPECT_NE(0U, hw_enforced().size());
347 EXPECT_NE(0U, sw_enforced().size());
348 crypto_params.push_back(hw_enforced());
349 non_crypto_params.push_back(sw_enforced());
350 } else {
351 EXPECT_EQ(0U, hw_enforced().size());
352 EXPECT_NE(0U, sw_enforced().size());
353 crypto_params.push_back(sw_enforced());
354 }
Shawn Willden2beb6282015-05-20 16:36:24 -0600355
Shawn Willden6270aca2015-05-26 13:12:24 -0600356 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC));
357 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC));
358 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 224));
359 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 224));
360
361 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
362 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600363}
364
Shawn Willden58427c42015-05-20 13:00:42 -0600365TEST_P(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden4f83b892015-05-26 12:52:54 -0600366 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
367 GenerateKey(AuthorizationSetBuilder()
368 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_EC)
369 .SigningKey()
370 .Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600371
Shawn Willden6270aca2015-05-26 13:12:24 -0600372 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600373}
374
Shawn Willden58427c42015-05-20 13:00:42 -0600375TEST_P(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden6270aca2015-05-26 13:12:24 -0600376 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
377 ASSERT_EQ(
378 KM_ERROR_UNKNOWN_ERROR,
379 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
380 else
381 ASSERT_EQ(
382 KM_ERROR_UNSUPPORTED_KEY_SIZE,
383 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600384
Shawn Willden6270aca2015-05-26 13:12:24 -0600385 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
386 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600387}
388
Shawn Willden58427c42015-05-20 13:00:42 -0600389TEST_P(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600390 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600391 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600392 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
393 KM_DIGEST_NONE)))
Shawn Willden58427c42015-05-20 13:00:42 -0600394 << "Failed to generate size: "
395 << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600396 }
Shawn Willden2beb6282015-05-20 16:36:24 -0600397
Shawn Willden6270aca2015-05-26 13:12:24 -0600398 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
399 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600400}
401
Shawn Willden58427c42015-05-20 13:00:42 -0600402TEST_P(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700403 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600404 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600405
Shawn Willden6270aca2015-05-26 13:12:24 -0600406 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700407}
408
Shawn Willden58427c42015-05-20 13:00:42 -0600409typedef Keymaster1Test GetKeyCharacteristics;
410INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, GetKeyCharacteristics, test_params);
411
412TEST_P(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600413 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
414 .RsaSigningKey(256, 3)
415 .Digest(KM_DIGEST_NONE)
416 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700417 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600418
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700419 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
420 EXPECT_EQ(original, sw_enforced());
Shawn Willden2beb6282015-05-20 16:36:24 -0600421
Shawn Willden6270aca2015-05-26 13:12:24 -0600422 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600423 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden76364712014-08-11 17:48:04 -0600424}
425
Shawn Willden58427c42015-05-20 13:00:42 -0600426typedef Keymaster1Test SigningOperationsTest;
427INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, SigningOperationsTest, test_params);
428
429TEST_P(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600430 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
431 .RsaSigningKey(256, 3)
432 .Digest(KM_DIGEST_NONE)
433 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700434 string message = "12345678901234567890123456789012";
435 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600436 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600437
Shawn Willden6270aca2015-05-26 13:12:24 -0600438 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600439 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600440}
441
Shawn Willden58427c42015-05-20 13:00:42 -0600442TEST_P(SigningOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600443 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600444 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600445 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600446 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700447 string message(1024, 'a');
448 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600449 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600450
Shawn Willden6270aca2015-05-26 13:12:24 -0600451 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600452 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700453}
454
Shawn Willden58427c42015-05-20 13:00:42 -0600455TEST_P(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600456 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
457 .RsaSigningKey(512, 3)
458 .Digest(KM_DIGEST_SHA_2_256)
459 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700460 // Use large message, which won't work without digesting.
461 string message(1024, 'a');
462 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600463 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600464
Shawn Willden6270aca2015-05-26 13:12:24 -0600465 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600466 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -0700467}
468
Shawn Willden58427c42015-05-20 13:00:42 -0600469TEST_P(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600470 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
471 .RsaSigningKey(512, 3)
472 .Digest(KM_DIGEST_SHA_2_256)
473 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700474 string message(1024, 'a');
475 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600476 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -0600477
Shawn Willden6270aca2015-05-26 13:12:24 -0600478 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600479 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700480}
481
Shawn Willden58427c42015-05-20 13:00:42 -0600482TEST_P(SigningOperationsTest, RsaPssSha256TooSmallKey) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700483 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
484 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600485 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
486 .RsaSigningKey(256 + 9 * 8, 3)
487 .Digest(KM_DIGEST_SHA_2_256)
488 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700489 string message(1024, 'a');
490 string signature;
491
Shawn Willden226746b2015-05-08 11:36:56 -0600492 AuthorizationSet begin_params(client_params());
493 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600494 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600495 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700496
497 string result;
498 size_t input_consumed;
499 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
500 EXPECT_EQ(message.size(), input_consumed);
501 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -0600502
Shawn Willden6270aca2015-05-26 13:12:24 -0600503 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600504 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700505}
506
Shawn Willden58427c42015-05-20 13:00:42 -0600507TEST_P(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600508 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
509 .RsaSigningKey(256, 3)
510 .Digest(KM_DIGEST_NONE)
511 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600512 AuthorizationSet begin_params(client_params());
513 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600514 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600515 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700516 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
517 // Another abort should fail
518 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden2beb6282015-05-20 16:36:24 -0600519
Shawn Willden6270aca2015-05-26 13:12:24 -0600520 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600521 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600522}
523
Shawn Willden58427c42015-05-20 13:00:42 -0600524TEST_P(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600525 GenerateKey(AuthorizationSetBuilder()
526 .RsaSigningKey(256, 3)
527 .Digest(KM_DIGEST_MD5)
528 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700529 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden2beb6282015-05-20 16:36:24 -0600530
Shawn Willden6270aca2015-05-26 13:12:24 -0600531 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600532 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600533}
534
Shawn Willden58427c42015-05-20 13:00:42 -0600535TEST_P(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600536 GenerateKey(AuthorizationSetBuilder()
537 .RsaSigningKey(256, 3)
538 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
539 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600540 AuthorizationSet begin_params(client_params());
541 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
542 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600543
Shawn Willden6270aca2015-05-26 13:12:24 -0600544 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600545 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600546}
547
Shawn Willden58427c42015-05-20 13:00:42 -0600548TEST_P(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700549 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600550 GenerateKey(AuthorizationSetBuilder()
551 .RsaSigningKey(256, 3)
552 .Digest(KM_DIGEST_NONE)
553 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600554 AuthorizationSet begin_params(client_params());
555 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600556 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600557 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600558
Shawn Willden6270aca2015-05-26 13:12:24 -0600559 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600560 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600561}
562
Shawn Willden58427c42015-05-20 13:00:42 -0600563TEST_P(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700564 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600565 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
566 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600567 AuthorizationSet begin_params(client_params());
568 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
569 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600570
Shawn Willden6270aca2015-05-26 13:12:24 -0600571 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600572 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600573}
574
Shawn Willden58427c42015-05-20 13:00:42 -0600575TEST_P(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600576 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
577 .RsaSigningKey(256, 3)
578 .Digest(KM_DIGEST_NONE)
579 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600580 AuthorizationSet begin_params(client_params());
581 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600582 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600583 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600584
585 string message = "1234567890123456789012345678901";
586 string result;
587 size_t input_consumed;
588 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
589 EXPECT_EQ(0U, result.size());
590 EXPECT_EQ(31U, input_consumed);
591
592 string signature;
593 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
594 EXPECT_EQ(0U, signature.length());
Shawn Willden2beb6282015-05-20 16:36:24 -0600595
Shawn Willden6270aca2015-05-26 13:12:24 -0600596 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600597 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600598}
599
Shawn Willden58427c42015-05-20 13:00:42 -0600600TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600601 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
602 .RsaEncryptionKey(256, 3)
603 .Digest(KM_DIGEST_NONE)
604 .Padding(KM_PAD_NONE)));
605 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
606 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600607
Shawn Willden6270aca2015-05-26 13:12:24 -0600608 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600609 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600610}
611
Shawn Willden58427c42015-05-20 13:00:42 -0600612TEST_P(SigningOperationsTest, EcdsaSuccess) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600613 ASSERT_EQ(KM_ERROR_OK,
614 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
615 string message = "123456789012345678901234567890123456789012345678";
616 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600617 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600618
Shawn Willden6270aca2015-05-26 13:12:24 -0600619 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
620 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600621}
622
Shawn Willden58427c42015-05-20 13:00:42 -0600623TEST_P(SigningOperationsTest, AesEcbSign) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600624 ASSERT_EQ(KM_ERROR_OK,
625 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
626 TAG_BLOCK_MODE, KM_MODE_ECB)));
627 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
628 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600629
Shawn Willden6270aca2015-05-26 13:12:24 -0600630 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600631}
632
Shawn Willden58427c42015-05-20 13:00:42 -0600633TEST_P(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600634 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700635 string message = "12345678901234567890123456789012";
636 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600637 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600638 ASSERT_EQ(20U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600639
Shawn Willden6270aca2015-05-26 13:12:24 -0600640 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700641}
642
Shawn Willden58427c42015-05-20 13:00:42 -0600643TEST_P(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600644 ASSERT_EQ(KM_ERROR_OK,
645 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700646 string message = "12345678901234567890123456789012";
647 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600648 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600649 ASSERT_EQ(28U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600650
Shawn Willden6270aca2015-05-26 13:12:24 -0600651 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700652}
653
Shawn Willden58427c42015-05-20 13:00:42 -0600654TEST_P(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600655 ASSERT_EQ(KM_ERROR_OK,
656 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700657 string message = "12345678901234567890123456789012";
658 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600659 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600660 ASSERT_EQ(32U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600661
Shawn Willden6270aca2015-05-26 13:12:24 -0600662 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700663}
664
Shawn Willden58427c42015-05-20 13:00:42 -0600665TEST_P(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600666 ASSERT_EQ(KM_ERROR_OK,
667 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
668
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700669 string message = "12345678901234567890123456789012";
670 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600671 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600672 ASSERT_EQ(48U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600673
Shawn Willden6270aca2015-05-26 13:12:24 -0600674 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700675}
676
Shawn Willden58427c42015-05-20 13:00:42 -0600677TEST_P(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600678 ASSERT_EQ(KM_ERROR_OK,
679 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700680 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700681 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600682 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600683 ASSERT_EQ(64U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600684
Shawn Willden6270aca2015-05-26 13:12:24 -0600685 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700686}
687
Shawn Willden58427c42015-05-20 13:00:42 -0600688TEST_P(SigningOperationsTest, HmacLengthInKey) {
Shawn Willden09f25272015-04-15 13:49:49 -0600689 // TODO(swillden): unified API should generate an error on key generation.
690 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
691 .HmacKey(128)
692 .Digest(KM_DIGEST_SHA_2_256)
693 .Authorization(TAG_MAC_LENGTH, 20)));
694 string message = "12345678901234567890123456789012";
695 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600696 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600697 // Size in key was ignored.
698 ASSERT_EQ(30U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600699
Shawn Willden6270aca2015-05-26 13:12:24 -0600700 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden09f25272015-04-15 13:49:49 -0600701}
702
Shawn Willden58427c42015-05-20 13:00:42 -0600703TEST_P(SigningOperationsTest, HmacRfc4231TestCase1) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700704 uint8_t key_data[] = {
705 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
706 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
707 };
708 string message = "Hi There";
709 uint8_t sha_224_expected[] = {
710 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
711 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
712 };
713 uint8_t sha_256_expected[] = {
714 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
715 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
716 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
717 };
718 uint8_t sha_384_expected[] = {
719 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
720 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
721 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
722 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
723 };
724 uint8_t sha_512_expected[] = {
725 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
726 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
727 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
728 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
729 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
730 };
731
732 string key = make_string(key_data);
733
734 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
735 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
736 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
737 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600738
Shawn Willden6270aca2015-05-26 13:12:24 -0600739 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700740}
741
Shawn Willden58427c42015-05-20 13:00:42 -0600742TEST_P(SigningOperationsTest, HmacRfc4231TestCase2) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700743 string key = "Jefe";
744 string message = "what do ya want for nothing?";
745 uint8_t sha_224_expected[] = {
746 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
747 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
748 };
749 uint8_t sha_256_expected[] = {
750 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
751 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
752 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
753 };
754 uint8_t sha_384_expected[] = {
755 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
756 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
757 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
758 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
759 };
760 uint8_t sha_512_expected[] = {
761 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
762 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
763 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
764 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
765 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
766 };
767
768 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
769 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
770 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
771 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600772
Shawn Willden6270aca2015-05-26 13:12:24 -0600773 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700774}
775
Shawn Willden58427c42015-05-20 13:00:42 -0600776TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700777 string key(20, 0xaa);
778 string message(50, 0xdd);
779 uint8_t sha_224_expected[] = {
780 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
781 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
782 };
783 uint8_t sha_256_expected[] = {
784 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
785 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
786 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
787 };
788 uint8_t sha_384_expected[] = {
789 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
790 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
791 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
792 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
793 };
794 uint8_t sha_512_expected[] = {
795 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
796 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
797 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
798 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
799 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
800 };
801
802 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
803 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
804 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
805 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600806
Shawn Willden6270aca2015-05-26 13:12:24 -0600807 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700808}
809
Shawn Willden58427c42015-05-20 13:00:42 -0600810TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700811 uint8_t key_data[25] = {
812 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
813 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
814 };
815 string key = make_string(key_data);
816 string message(50, 0xcd);
817 uint8_t sha_224_expected[] = {
818 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
819 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
820 };
821 uint8_t sha_256_expected[] = {
822 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
823 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
824 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
825 };
826 uint8_t sha_384_expected[] = {
827 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
828 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
829 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
830 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
831 };
832 uint8_t sha_512_expected[] = {
833 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
834 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
835 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
836 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
837 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
838 };
839
840 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
841 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
842 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
843 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600844
Shawn Willden6270aca2015-05-26 13:12:24 -0600845 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700846}
847
Shawn Willden58427c42015-05-20 13:00:42 -0600848TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700849 string key(20, 0x0c);
850 string message = "Test With Truncation";
851
852 uint8_t sha_224_expected[] = {
853 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
854 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
855 };
856 uint8_t sha_256_expected[] = {
857 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
858 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
859 };
860 uint8_t sha_384_expected[] = {
861 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
862 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
863 };
864 uint8_t sha_512_expected[] = {
865 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
866 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
867 };
868
869 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
870 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
871 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
872 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600873
Shawn Willden6270aca2015-05-26 13:12:24 -0600874 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700875}
876
Shawn Willden58427c42015-05-20 13:00:42 -0600877TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700878 string key(131, 0xaa);
879 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
880
881 uint8_t sha_224_expected[] = {
882 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
883 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
884 };
885 uint8_t sha_256_expected[] = {
886 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
887 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
888 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
889 };
890 uint8_t sha_384_expected[] = {
891 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
892 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
893 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
894 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
895 };
896 uint8_t sha_512_expected[] = {
897 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
898 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
899 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
900 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
901 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
902 };
903
904 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
905 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
906 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
907 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600908
Shawn Willden6270aca2015-05-26 13:12:24 -0600909 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700910}
911
Shawn Willden58427c42015-05-20 13:00:42 -0600912TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700913 string key(131, 0xaa);
914 string message = "This is a test using a larger than block-size key and a larger than "
915 "block-size data. The key needs to be hashed before being used by the HMAC "
916 "algorithm.";
917
918 uint8_t sha_224_expected[] = {
919 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
920 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
921 };
922 uint8_t sha_256_expected[] = {
923 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
924 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
925 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
926 };
927 uint8_t sha_384_expected[] = {
928 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
929 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
930 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
931 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
932 };
933 uint8_t sha_512_expected[] = {
934 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
935 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
936 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
937 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
938 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
939 };
940
941 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
942 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
943 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
944 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600945
Shawn Willden6270aca2015-05-26 13:12:24 -0600946 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700947}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700948
Shawn Willden58427c42015-05-20 13:00:42 -0600949TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600950 ASSERT_EQ(KM_ERROR_OK,
951 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
952 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600953 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600954 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600955 ASSERT_EQ(KM_ERROR_OK,
956 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
957 string message = "1234567890123456789012345678901";
958 string result;
959 size_t input_consumed;
960 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
961 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden2beb6282015-05-20 16:36:24 -0600962
Shawn Willden6270aca2015-05-26 13:12:24 -0600963 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700964}
965
Shawn Willden61902362014-12-18 10:33:24 -0700966// TODO(swillden): Add more verification failure tests.
967
Shawn Willden58427c42015-05-20 13:00:42 -0600968typedef Keymaster1Test VerificationOperationsTest;
969INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params);
970
971TEST_P(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600972 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
973 .RsaSigningKey(256, 3)
974 .Digest(KM_DIGEST_NONE)
975 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700976 string message = "12345678901234567890123456789012";
977 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600978 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
979 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600980
Shawn Willden6270aca2015-05-26 13:12:24 -0600981 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600982 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600983}
984
Shawn Willden58427c42015-05-20 13:00:42 -0600985TEST_P(VerificationOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600986 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600987 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600988 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600989 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700990 string message(1024, 'a');
991 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600992 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
993 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600994
Shawn Willden6270aca2015-05-26 13:12:24 -0600995 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600996 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -0700997}
998
Shawn Willden58427c42015-05-20 13:00:42 -0600999TEST_P(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001000 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -06001001 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -06001002 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001003 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -07001004 string message(1024, 'a');
1005 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001006 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -07001007 ++signature[signature.size() / 2];
1008
Shawn Willden226746b2015-05-08 11:36:56 -06001009 AuthorizationSet begin_params(client_params());
1010 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001011 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001012 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001013
1014 string result;
1015 size_t input_consumed;
1016 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1017 EXPECT_EQ(message.size(), input_consumed);
1018 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001019
Shawn Willden6270aca2015-05-26 13:12:24 -06001020 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001021 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001022}
1023
Shawn Willden58427c42015-05-20 13:00:42 -06001024TEST_P(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001025 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1026 .RsaSigningKey(512, 3)
1027 .Digest(KM_DIGEST_SHA_2_256)
1028 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001029 // Use large message, which won't work without digesting.
1030 string message(1024, 'a');
1031 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001032 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
1033 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -06001034
Shawn Willden6270aca2015-05-26 13:12:24 -06001035 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001036 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001037}
1038
Shawn Willden58427c42015-05-20 13:00:42 -06001039TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001040 GenerateKey(AuthorizationSetBuilder()
1041 .RsaSigningKey(512, 3)
1042 .Digest(KM_DIGEST_SHA_2_256)
1043 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001044 string message(1024, 'a');
1045 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001046 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001047 ++signature[signature.size() / 2];
1048
Shawn Willden226746b2015-05-08 11:36:56 -06001049 AuthorizationSet begin_params(client_params());
1050 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001051 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001052 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001053
1054 string result;
1055 size_t input_consumed;
1056 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1057 EXPECT_EQ(message.size(), input_consumed);
1058 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001059
Shawn Willden6270aca2015-05-26 13:12:24 -06001060 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001061 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001062}
1063
Shawn Willden58427c42015-05-20 13:00:42 -06001064TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001065 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1066 .RsaSigningKey(512, 3)
1067 .Digest(KM_DIGEST_SHA_2_256)
1068 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001069 // Use large message, which won't work without digesting.
1070 string message(1024, 'a');
1071 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001072 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -07001073 ++message[message.size() / 2];
1074
Shawn Willden226746b2015-05-08 11:36:56 -06001075 AuthorizationSet begin_params(client_params());
1076 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001077 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001078 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001079
1080 string result;
1081 size_t input_consumed;
1082 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1083 EXPECT_EQ(message.size(), input_consumed);
1084 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001085
Shawn Willden6270aca2015-05-26 13:12:24 -06001086 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001087 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001088}
1089
Shawn Willden58427c42015-05-20 13:00:42 -06001090TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001091 GenerateKey(AuthorizationSetBuilder()
1092 .RsaSigningKey(512, 3)
1093 .Digest(KM_DIGEST_SHA_2_256)
1094 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001095 string message(1024, 'a');
1096 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001097 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1098 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -06001099
Shawn Willden6270aca2015-05-26 13:12:24 -06001100 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001101 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001102}
1103
Shawn Willden58427c42015-05-20 13:00:42 -06001104TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001105 GenerateKey(AuthorizationSetBuilder()
1106 .RsaSigningKey(512, 3)
1107 .Digest(KM_DIGEST_SHA_2_256)
1108 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001109 string message(1024, 'a');
1110 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001111 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001112 ++signature[signature.size() / 2];
1113
Shawn Willden226746b2015-05-08 11:36:56 -06001114 AuthorizationSet begin_params(client_params());
1115 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001116 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001117 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001118
1119 string result;
1120 size_t input_consumed;
1121 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1122 EXPECT_EQ(message.size(), input_consumed);
1123 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001124
Shawn Willden6270aca2015-05-26 13:12:24 -06001125 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001126 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001127}
1128
Shawn Willden58427c42015-05-20 13:00:42 -06001129TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001130 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1131 .RsaSigningKey(512, 3)
1132 .Digest(KM_DIGEST_SHA_2_256)
1133 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001134 // Use large message, which won't work without digesting.
1135 string message(1024, 'a');
1136 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001137 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001138 ++message[message.size() / 2];
1139
Shawn Willden226746b2015-05-08 11:36:56 -06001140 AuthorizationSet begin_params(client_params());
1141 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001142 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001143 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001144
1145 string result;
1146 size_t input_consumed;
1147 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1148 EXPECT_EQ(message.size(), input_consumed);
1149 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001150
Shawn Willden6270aca2015-05-26 13:12:24 -06001151 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001152 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001153}
1154
1155template <typename T> vector<T> make_vector(const T* array, size_t len) {
1156 return vector<T>(array, array + len);
1157}
1158
Shawn Willden58427c42015-05-20 13:00:42 -06001159TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001160 // Get all supported digests and padding modes.
1161 size_t digests_len;
1162 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -06001163 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001164 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1165 &digests_len));
1166
1167 size_t padding_modes_len;
1168 keymaster_padding_t* padding_modes;
Shawn Willden0cb69422015-05-26 08:31:37 -06001169 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001170 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1171 &padding_modes, &padding_modes_len));
1172
1173 // Try them.
1174 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1175 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
1176 // Compute key & message size that will work.
1177 size_t key_bits = 256;
1178 size_t message_len = 1000;
1179 switch (digest) {
1180 case KM_DIGEST_NONE:
1181 switch (padding_mode) {
1182 case KM_PAD_NONE:
1183 // Match key size.
1184 message_len = key_bits / 8;
1185 break;
1186 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1187 message_len = key_bits / 8 - 11;
1188 break;
1189 case KM_PAD_RSA_PSS:
1190 // PSS requires a digest.
1191 continue;
1192 default:
1193 FAIL() << "Missing padding";
1194 break;
1195 }
1196 break;
1197
1198 case KM_DIGEST_SHA_2_256:
1199 switch (padding_mode) {
1200 case KM_PAD_NONE:
Shawn Willden3ad5f052015-05-08 14:05:13 -06001201 // Digesting requires padding
1202 continue;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001203 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1204 key_bits += 8 * 11;
1205 break;
1206 case KM_PAD_RSA_PSS:
1207 key_bits += 8 * 10;
1208 break;
1209 default:
1210 FAIL() << "Missing padding";
1211 break;
1212 }
1213 break;
1214 default:
1215 FAIL() << "Missing digest";
1216 }
1217
Shawn Willdenaf533992015-04-15 13:48:28 -06001218 GenerateKey(AuthorizationSetBuilder()
1219 .RsaSigningKey(key_bits, 3)
1220 .Digest(digest)
1221 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001222 string message(message_len, 'a');
1223 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001224 SignMessage(message, &signature, digest, padding_mode);
1225 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001226 }
1227 }
1228
1229 free(padding_modes);
1230 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -06001231
Shawn Willden6270aca2015-05-26 13:12:24 -06001232 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001233 EXPECT_EQ(16, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001234}
1235
Shawn Willden58427c42015-05-20 13:00:42 -06001236TEST_P(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001237 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001238 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001239 string message = "123456789012345678901234567890123456789012345678";
1240 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001241 SignMessage(message, &signature, KM_DIGEST_NONE);
1242 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001243
Shawn Willden6270aca2015-05-26 13:12:24 -06001244 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1245 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001246}
1247
Shawn Willden58427c42015-05-20 13:00:42 -06001248TEST_P(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001249 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001250 string message = "123456789012345678901234567890123456789012345678";
1251 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001252 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1253 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden2beb6282015-05-20 16:36:24 -06001254
Shawn Willden6270aca2015-05-26 13:12:24 -06001255 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001256}
1257
Shawn Willden58427c42015-05-20 13:00:42 -06001258TEST_P(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001259 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001260 string message = "123456789012345678901234567890123456789012345678";
1261 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001262 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1263 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden2beb6282015-05-20 16:36:24 -06001264
Shawn Willden6270aca2015-05-26 13:12:24 -06001265 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001266}
1267
Shawn Willden58427c42015-05-20 13:00:42 -06001268TEST_P(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001269 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001270 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001271 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001272 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1273 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001274
Shawn Willden6270aca2015-05-26 13:12:24 -06001275 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -07001276}
1277
Shawn Willden58427c42015-05-20 13:00:42 -06001278TEST_P(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001279 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001280 string message = "123456789012345678901234567890123456789012345678";
1281 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001282 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1283 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden2beb6282015-05-20 16:36:24 -06001284
Shawn Willden6270aca2015-05-26 13:12:24 -06001285 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001286}
1287
Shawn Willden58427c42015-05-20 13:00:42 -06001288TEST_P(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001289 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001290 string message = "123456789012345678901234567890123456789012345678";
1291 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001292 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1293 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden2beb6282015-05-20 16:36:24 -06001294
Shawn Willden6270aca2015-05-26 13:12:24 -06001295 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001296}
1297
Shawn Willden58427c42015-05-20 13:00:42 -06001298typedef Keymaster1Test ExportKeyTest;
1299INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params);
1300
1301TEST_P(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001302 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1303 .RsaSigningKey(256, 3)
1304 .Digest(KM_DIGEST_NONE)
1305 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001306 string export_data;
1307 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001308 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001309
1310 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001311
Shawn Willden6270aca2015-05-26 13:12:24 -06001312 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001313 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenffd790c2014-08-18 21:20:06 -06001314}
1315
Shawn Willden58427c42015-05-20 13:00:42 -06001316TEST_P(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001317 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001318 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001319 string export_data;
1320 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001321 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001322
1323 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001324
Shawn Willden6270aca2015-05-26 13:12:24 -06001325 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1326 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001327}
1328
Shawn Willden58427c42015-05-20 13:00:42 -06001329TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001330 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1331 .RsaSigningKey(256, 3)
1332 .Digest(KM_DIGEST_NONE)
1333 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001334 string export_data;
1335 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001336
Shawn Willden6270aca2015-05-26 13:12:24 -06001337 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001338 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001339}
1340
Shawn Willden58427c42015-05-20 13:00:42 -06001341TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001342 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1343 .RsaSigningKey(256, 3)
1344 .Digest(KM_DIGEST_NONE)
1345 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001346 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001347 string export_data;
1348 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001349
Shawn Willden6270aca2015-05-26 13:12:24 -06001350 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001351 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001352}
1353
Shawn Willden58427c42015-05-20 13:00:42 -06001354TEST_P(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001355 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001356 string export_data;
1357
1358 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1359 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1360 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001361
Shawn Willden6270aca2015-05-26 13:12:24 -06001362 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden7dad93b2015-02-05 10:20:47 -07001363}
1364
Shawn Willden437fbd12014-08-20 11:59:49 -06001365static string read_file(const string& file_name) {
1366 ifstream file_stream(file_name, std::ios::binary);
1367 istreambuf_iterator<char> file_begin(file_stream);
1368 istreambuf_iterator<char> file_end;
1369 return string(file_begin, file_end);
1370}
1371
Shawn Willden58427c42015-05-20 13:00:42 -06001372typedef Keymaster1Test ImportKeyTest;
1373INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params);
1374
1375TEST_P(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001376 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001377 ASSERT_EQ(633U, pk8_key.size());
1378
Shawn Willdenaf533992015-04-15 13:48:28 -06001379 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1380 .RsaSigningKey(1024, 65537)
1381 .Digest(KM_DIGEST_NONE)
1382 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001383 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001384
1385 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001386 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1387 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001388 TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6270aca2015-05-26 13:12:24 -06001389 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1390 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001391 TAG_KEY_SIZE, 1024));
Shawn Willden6270aca2015-05-26 13:12:24 -06001392 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1393 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001394 TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001395
Shawn Willdenb6837e72015-05-16 09:20:59 -06001396 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001397 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1398 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001399
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001400 string message(1024 / 8, 'a');
1401 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001402 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1403 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001404
Shawn Willden6270aca2015-05-26 13:12:24 -06001405 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001406 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden437fbd12014-08-20 11:59:49 -06001407}
1408
Shawn Willden58427c42015-05-20 13:00:42 -06001409TEST_P(ImportKeyTest, OldApiRsaSuccess) {
Shawn Willdend7a5c712015-04-09 16:33:52 -06001410 string pk8_key = read_file("rsa_privkey_pk8.der");
1411 ASSERT_EQ(633U, pk8_key.size());
1412
1413 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1414 // point softkeymaster will no longer support keymaster0 APIs anyway.
1415 uint8_t* key_blob;
1416 size_t key_blob_length;
1417 ASSERT_EQ(0,
1418 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1419 pk8_key.size(), &key_blob, &key_blob_length));
1420 set_key_blob(key_blob, key_blob_length);
1421
1422 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001423 AuthorizationSet begin_params; // Don't use client data.
1424 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001425 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001426 AuthorizationSet update_params;
1427 AuthorizationSet output_params;
1428 string signature =
1429 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1430 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1431 &output_params);
Shawn Willden2beb6282015-05-20 16:36:24 -06001432
Shawn Willden6270aca2015-05-26 13:12:24 -06001433 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001434 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdend7a5c712015-04-09 16:33:52 -06001435}
1436
Shawn Willden58427c42015-05-20 13:00:42 -06001437TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001438 string pk8_key = read_file("rsa_privkey_pk8.der");
1439 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001440 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001441 ImportKey(AuthorizationSetBuilder()
1442 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1443 .Digest(KM_DIGEST_NONE)
1444 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001445 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001446
Shawn Willden6270aca2015-05-26 13:12:24 -06001447 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001448}
1449
Shawn Willden58427c42015-05-20 13:00:42 -06001450TEST_P(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001451 string pk8_key = read_file("rsa_privkey_pk8.der");
1452 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001453 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001454 ImportKey(AuthorizationSetBuilder()
1455 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1456 .Digest(KM_DIGEST_NONE)
1457 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001458 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001459
Shawn Willden6270aca2015-05-26 13:12:24 -06001460 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001461}
1462
Shawn Willden58427c42015-05-20 13:00:42 -06001463TEST_P(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001464 string pk8_key = read_file("ec_privkey_pk8.der");
1465 ASSERT_EQ(138U, pk8_key.size());
1466
Shawn Willdenaf533992015-04-15 13:48:28 -06001467 ASSERT_EQ(KM_ERROR_OK,
1468 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1469 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001470
1471 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001472 EXPECT_TRUE(
1473 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1474 TAG_ALGORITHM, KM_ALGORITHM_EC));
1475 EXPECT_TRUE(
1476 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1477 TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001478
Shawn Willdenb6837e72015-05-16 09:20:59 -06001479 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001480 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1481 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001482
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001483 string message(1024 / 8, 'a');
1484 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001485 SignMessage(message, &signature, KM_DIGEST_NONE);
1486 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001487
Shawn Willden6270aca2015-05-26 13:12:24 -06001488 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1489 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden81effc62014-08-27 10:08:46 -06001490}
1491
Shawn Willden58427c42015-05-20 13:00:42 -06001492TEST_P(ImportKeyTest, EcdsaSizeSpecified) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001493 string pk8_key = read_file("ec_privkey_pk8.der");
1494 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001495
Shawn Willdenaf533992015-04-15 13:48:28 -06001496 ASSERT_EQ(KM_ERROR_OK,
1497 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1498 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001499
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001500 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001501 EXPECT_TRUE(
1502 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1503 TAG_ALGORITHM, KM_ALGORITHM_EC));
1504 EXPECT_TRUE(
1505 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1506 TAG_KEY_SIZE, 256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001507
Shawn Willdenb6837e72015-05-16 09:20:59 -06001508 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001509 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1510 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1511
1512 string message(1024 / 8, 'a');
1513 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001514 SignMessage(message, &signature, KM_DIGEST_NONE);
1515 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001516
Shawn Willden6270aca2015-05-26 13:12:24 -06001517 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1518 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001519}
1520
Shawn Willden58427c42015-05-20 13:00:42 -06001521TEST_P(ImportKeyTest, EcdsaSizeMismatch) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001522 string pk8_key = read_file("ec_privkey_pk8.der");
1523 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001524 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001525 ImportKey(AuthorizationSetBuilder()
1526 .EcdsaSigningKey(224 /* Doesn't match key */)
1527 .Digest(KM_DIGEST_NONE),
1528 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001529
Shawn Willden6270aca2015-05-26 13:12:24 -06001530 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001531}
1532
Shawn Willden58427c42015-05-20 13:00:42 -06001533TEST_P(ImportKeyTest, AesKeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001534 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1535 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001536 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001537 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1538 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001539 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001540
1541 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1542 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1543
1544 string message = "Hello World!";
Shawn Willdenc4424672015-05-11 11:56:02 -06001545 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1546 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willden3b702e22015-02-05 10:26:47 -07001547 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001548
Shawn Willden6270aca2015-05-26 13:12:24 -06001549 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001550}
1551
Shawn Willden58427c42015-05-20 13:00:42 -06001552TEST_P(ImportKeyTest, HmacSha256KeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001553 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1554 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001555 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1556 .HmacKey(sizeof(key_data) * 8)
1557 .Digest(KM_DIGEST_SHA_2_256)
1558 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001559 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001560
1561 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1562 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1563
1564 string message = "Hello World!";
1565 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001566 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1567 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001568
Shawn Willden6270aca2015-05-26 13:12:24 -06001569 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001570}
1571
Shawn Willden58427c42015-05-20 13:00:42 -06001572typedef Keymaster1Test EncryptionOperationsTest;
1573INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params);
1574
1575TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001576 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1577 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001578
1579 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001580 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001581 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001582
Shawn Willden3ad5f052015-05-08 14:05:13 -06001583 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001584 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001585
1586 // OAEP randomizes padding so every result should be different.
1587 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001588
Shawn Willden6270aca2015-05-26 13:12:24 -06001589 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001590 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001591}
1592
Shawn Willden58427c42015-05-20 13:00:42 -06001593TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001594 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1595 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001596 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001597 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001598 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001599
Shawn Willden3ad5f052015-05-08 14:05:13 -06001600 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001601 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001602
Shawn Willden6270aca2015-05-26 13:12:24 -06001603 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001604 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001605}
1606
Shawn Willden58427c42015-05-20 13:00:42 -06001607TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001608 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1609 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001610 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001611 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001612 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001613
Shawn Willden3ad5f052015-05-08 14:05:13 -06001614 AuthorizationSet begin_params(client_params());
1615 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1616 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001617 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001618 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001619 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001620
Shawn Willden6270aca2015-05-26 13:12:24 -06001621 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001622 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001623}
1624
Shawn Willden58427c42015-05-20 13:00:42 -06001625TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001626 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1627 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001628 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001629 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001630 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001631
1632 // Corrupt the ciphertext
1633 ciphertext[512 / 8 / 2]++;
1634
Shawn Willden4200f212014-12-02 07:01:21 -07001635 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001636 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001637 AuthorizationSet begin_params(client_params());
1638 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1639 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001640 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001641 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001642 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001643
Shawn Willden6270aca2015-05-26 13:12:24 -06001644 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001645 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001646}
1647
Shawn Willden58427c42015-05-20 13:00:42 -06001648TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001649 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1650 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001651 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001652 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001653 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001654
Shawn Willden3ad5f052015-05-08 14:05:13 -06001655 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001656 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001657
1658 // PKCS1 v1.5 randomizes padding so every result should be different.
1659 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001660
Shawn Willden6270aca2015-05-26 13:12:24 -06001661 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001662 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001663}
1664
Shawn Willden58427c42015-05-20 13:00:42 -06001665TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001666 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1667 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001668 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001669 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001670 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001671
Shawn Willden3ad5f052015-05-08 14:05:13 -06001672 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001673 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001674
Shawn Willden6270aca2015-05-26 13:12:24 -06001675 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001676 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001677}
1678
Shawn Willden58427c42015-05-20 13:00:42 -06001679TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001680 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1681 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willden7bae1322015-05-26 10:16:49 -06001682 string message = "123456789012345678901234567890123456789012345678901234";
Shawn Willden4200f212014-12-02 07:01:21 -07001683 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001684 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001685
Shawn Willden3ad5f052015-05-08 14:05:13 -06001686 AuthorizationSet begin_params(client_params());
1687 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1688 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001689 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001690 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001691 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001692
Shawn Willden6270aca2015-05-26 13:12:24 -06001693 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001694 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001695}
1696
Shawn Willden58427c42015-05-20 13:00:42 -06001697TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001698 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1699 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001700 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001701 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001702 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001703
1704 // Corrupt the ciphertext
1705 ciphertext[512 / 8 / 2]++;
1706
Shawn Willden4200f212014-12-02 07:01:21 -07001707 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001708 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001709 AuthorizationSet begin_params(client_params());
1710 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1711 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001712 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001713 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001714 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001715
Shawn Willden6270aca2015-05-26 13:12:24 -06001716 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001717 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001718}
1719
Shawn Willden58427c42015-05-20 13:00:42 -06001720TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001721 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1722 .RsaSigningKey(256, 3)
1723 .Digest(KM_DIGEST_NONE)
1724 .Padding(KM_PAD_NONE)));
1725 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1726 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001727
Shawn Willden6270aca2015-05-26 13:12:24 -06001728 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001729 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001730}
1731
Shawn Willden58427c42015-05-20 13:00:42 -06001732TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001733 ASSERT_EQ(KM_ERROR_OK,
1734 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1735 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1736 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001737
Shawn Willden6270aca2015-05-26 13:12:24 -06001738 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1739 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001740}
1741
Shawn Willden58427c42015-05-20 13:00:42 -06001742TEST_P(EncryptionOperationsTest, HmacEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001743 ASSERT_EQ(
1744 KM_ERROR_OK,
1745 GenerateKey(
1746 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1747 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1748 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001749
Shawn Willden6270aca2015-05-26 13:12:24 -06001750 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001751}
1752
Shawn Willden58427c42015-05-20 13:00:42 -06001753TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001754 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1755 .AesEncryptionKey(128)
1756 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1757 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001758 // Two-block message.
1759 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001760 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001761 EXPECT_EQ(message.size(), ciphertext1.size());
1762
Shawn Willden31e063f2015-05-08 14:31:22 -06001763 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001764 EXPECT_EQ(message.size(), ciphertext2.size());
1765
1766 // ECB is deterministic.
1767 EXPECT_EQ(ciphertext1, ciphertext2);
1768
Shawn Willden31e063f2015-05-08 14:31:22 -06001769 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001770 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001771
Shawn Willden6270aca2015-05-26 13:12:24 -06001772 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001773}
1774
Shawn Willden58427c42015-05-20 13:00:42 -06001775TEST_P(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001776 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1777 .AesEncryptionKey(128)
1778 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1779 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001780 // Message is slightly shorter than two blocks.
1781 string message = "1234567890123456789012345678901";
1782
Shawn Willden31e063f2015-05-08 14:31:22 -06001783 AuthorizationSet begin_params(client_params());
1784 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001785 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001786 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001787 string ciphertext;
1788 size_t input_consumed;
1789 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1790 EXPECT_EQ(message.size(), input_consumed);
1791 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001792
Shawn Willden6270aca2015-05-26 13:12:24 -06001793 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001794}
1795
Shawn Willden58427c42015-05-20 13:00:42 -06001796TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001797 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001798 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001799 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1800 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001801
1802 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001803 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001804 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001805 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001806 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001807 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001808 EXPECT_EQ(message, plaintext);
1809 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001810
Shawn Willden6270aca2015-05-26 13:12:24 -06001811 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001812}
1813
Shawn Willden58427c42015-05-20 13:00:42 -06001814TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001815 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001816 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001817 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1818 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001819
1820 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001821 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001822 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001823 EXPECT_NE(ciphertext, message);
1824 ++ciphertext[ciphertext.size() / 2];
1825
Shawn Willden31e063f2015-05-08 14:31:22 -06001826 AuthorizationSet begin_params(client_params());
1827 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001828 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
Shawn Willden31e063f2015-05-08 14:31:22 -06001829 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001830 string plaintext;
1831 size_t input_consumed;
1832 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1833 EXPECT_EQ(ciphertext.size(), input_consumed);
1834 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001835
Shawn Willden6270aca2015-05-26 13:12:24 -06001836 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001837}
1838
Shawn Willden58427c42015-05-20 13:00:42 -06001839TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001840 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1841 .AesEncryptionKey(128)
1842 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1843 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001844 string message = "123";
1845 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001846 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001847 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001848 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001849
1850 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001851 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001852 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001853 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001854
1855 // IVs should be random, so ciphertexts should differ.
1856 EXPECT_NE(iv1, iv2);
1857 EXPECT_NE(ciphertext1, ciphertext2);
1858
Shawn Willden31e063f2015-05-08 14:31:22 -06001859 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001860 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001861
Shawn Willden6270aca2015-05-26 13:12:24 -06001862 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001863}
1864
Shawn Willden58427c42015-05-20 13:00:42 -06001865TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001866 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1867 .AesEncryptionKey(128)
1868 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1869 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001870
1871 int increment = 15;
1872 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001873 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001874 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001875 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001876 AuthorizationSet output_params;
1877 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1878
1879 string ciphertext;
1880 size_t input_consumed;
1881 for (size_t i = 0; i < message.size(); i += increment)
1882 EXPECT_EQ(KM_ERROR_OK,
1883 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1884 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1885 EXPECT_EQ(message.size(), ciphertext.size());
1886
1887 // Move TAG_NONCE into input_params
1888 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001889 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001890 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001891 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001892 output_params.Clear();
1893
1894 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1895 string plaintext;
1896 for (size_t i = 0; i < ciphertext.size(); i += increment)
1897 EXPECT_EQ(KM_ERROR_OK,
1898 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1899 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1900 EXPECT_EQ(ciphertext.size(), plaintext.size());
1901 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001902
Shawn Willden6270aca2015-05-26 13:12:24 -06001903 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001904}
1905
1906struct AesCtrSp80038aTestVector {
1907 const char* key;
1908 const char* nonce;
1909 const char* plaintext;
1910 const char* ciphertext;
1911};
1912
1913// These test vectors are taken from
1914// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1915static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1916 // AES-128
1917 {
1918 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1919 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1920 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1921 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1922 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1923 },
1924 // AES-192
1925 {
1926 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1927 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1928 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1929 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1930 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1931 },
1932 // AES-256
1933 {
1934 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1935 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1936 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1937 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1938 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1939 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1940 },
1941};
1942
Shawn Willden58427c42015-05-20 13:00:42 -06001943TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
Thai Duong20d725d2015-03-24 17:49:58 -07001944 for (size_t i = 0; i < 3; i++) {
1945 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1946 const string key = hex2str(test.key);
1947 const string nonce = hex2str(test.nonce);
1948 const string plaintext = hex2str(test.plaintext);
1949 const string ciphertext = hex2str(test.ciphertext);
1950 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1951 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001952
Shawn Willden6270aca2015-05-26 13:12:24 -06001953 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001954}
1955
Shawn Willden58427c42015-05-20 13:00:42 -06001956TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
Thai Duong20d725d2015-03-24 17:49:58 -07001957 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1958 .AesEncryptionKey(128)
1959 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1960 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06001961 AuthorizationSet begin_params(client_params());
1962 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001963 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001964 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06001965
Shawn Willden6270aca2015-05-26 13:12:24 -06001966 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001967}
1968
Shawn Willden58427c42015-05-20 13:00:42 -06001969TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
Thai Duong20d725d2015-03-24 17:49:58 -07001970 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1971 .AesEncryptionKey(128)
1972 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001973 .Authorization(TAG_CALLER_NONCE)
1974 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001975
Shawn Willden09f25272015-04-15 13:49:49 -06001976 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001977 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001978 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001979 input_params.push_back(TAG_NONCE, "123", 3);
1980 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06001981
Shawn Willden6270aca2015-05-26 13:12:24 -06001982 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001983}
1984
Shawn Willden58427c42015-05-20 13:00:42 -06001985TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001986 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1987 .AesEncryptionKey(128)
1988 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1989 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001990 // Two-block message.
1991 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001992 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001993 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001994 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001995
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001996 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001997 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001998 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001999
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002000 // IVs should be random, so ciphertexts should differ.
2001 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002002 EXPECT_NE(ciphertext1, ciphertext2);
2003
Shawn Willden31e063f2015-05-08 14:31:22 -06002004 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002005 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002006
Shawn Willden6270aca2015-05-26 13:12:24 -06002007 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002008}
2009
Shawn Willden58427c42015-05-20 13:00:42 -06002010TEST_P(EncryptionOperationsTest, AesCallerNonce) {
Shawn Willden969aa382015-04-15 17:05:53 -07002011 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2012 .AesEncryptionKey(128)
2013 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002014 .Authorization(TAG_CALLER_NONCE)
2015 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07002016 string message = "12345678901234567890123456789012";
2017 string iv1;
2018 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002019 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002020 EXPECT_EQ(message.size(), ciphertext1.size());
2021 EXPECT_EQ(16U, iv1.size());
2022
Shawn Willden31e063f2015-05-08 14:31:22 -06002023 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002024 EXPECT_EQ(message, plaintext);
2025
2026 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06002027 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07002028 AuthorizationSet update_params;
2029 AuthorizationSet output_params;
2030 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002031 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002032 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002033 string ciphertext2 =
2034 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
2035
2036 // Decrypt with correct nonce.
2037 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2038 &output_params);
2039 EXPECT_EQ(message, plaintext);
2040
2041 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06002042 input_params.Reinitialize(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002043 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002044 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002045 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
2046 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2047 &output_params);
2048 EXPECT_NE(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002049
Shawn Willden6270aca2015-05-26 13:12:24 -06002050 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden969aa382015-04-15 17:05:53 -07002051}
2052
Shawn Willden58427c42015-05-20 13:00:42 -06002053TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002054 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2055 .AesEncryptionKey(128)
2056 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2057 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06002058
2059 string message = "12345678901234567890123456789012";
2060 string iv1;
2061 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002062 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002063 EXPECT_EQ(message.size(), ciphertext1.size());
2064 EXPECT_EQ(16U, iv1.size());
2065
Shawn Willden31e063f2015-05-08 14:31:22 -06002066 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002067 EXPECT_EQ(message, plaintext);
2068
2069 // Now specify a nonce, should fail.
2070 AuthorizationSet input_params(client_params());
2071 AuthorizationSet update_params;
2072 AuthorizationSet output_params;
2073 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002074 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002075 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden67706352015-04-28 00:43:19 -06002076
2077 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
2078 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002079
Shawn Willden6270aca2015-05-26 13:12:24 -06002080 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden67706352015-04-28 00:43:19 -06002081}
2082
Shawn Willden58427c42015-05-20 13:00:42 -06002083TEST_P(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002084 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2085 .AesEncryptionKey(128)
2086 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2087 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002088
2089 int increment = 15;
2090 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06002091 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002092 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002093 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002094 AuthorizationSet output_params;
2095 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2096
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002097 string ciphertext;
2098 size_t input_consumed;
2099 for (size_t i = 0; i < message.size(); i += increment)
2100 EXPECT_EQ(KM_ERROR_OK,
2101 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2102 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002103 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002104
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002105 // Move TAG_NONCE into input_params
2106 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06002107 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002108 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002109 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002110 output_params.Clear();
2111
2112 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002113 string plaintext;
2114 for (size_t i = 0; i < ciphertext.size(); i += increment)
2115 EXPECT_EQ(KM_ERROR_OK,
2116 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2117 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002118 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002119 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002120
Shawn Willden6270aca2015-05-26 13:12:24 -06002121 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002122}
2123
Shawn Willden58427c42015-05-20 13:00:42 -06002124TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002125 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002126 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002127 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2128 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002129
2130 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06002131 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002132 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002133 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06002134 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002135 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06002136 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002137 EXPECT_EQ(message, plaintext);
2138 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002139
Shawn Willden6270aca2015-05-26 13:12:24 -06002140 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002141}
2142
Shawn Willden58427c42015-05-20 13:00:42 -06002143typedef Keymaster1Test AddEntropyTest;
2144INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params);
2145
2146TEST_P(AddEntropyTest, AddEntropy) {
Shawn Willdencd695822015-01-26 14:06:32 -07002147 // There's no obvious way to test that entropy is actually added, but we can test that the API
2148 // doesn't blow up or return an error.
2149 EXPECT_EQ(KM_ERROR_OK,
2150 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
Shawn Willden2beb6282015-05-20 16:36:24 -06002151
Shawn Willden6270aca2015-05-26 13:12:24 -06002152 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden2beb6282015-05-20 16:36:24 -06002153}
2154
2155typedef Keymaster1Test Keymaster0AdapterTest;
2156INSTANTIATE_TEST_CASE_P(
2157 AndroidKeymasterTest, Keymaster0AdapterTest,
Shawn Willden6270aca2015-05-26 13:12:24 -06002158 ::testing::Values(
2159 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(true /* support_ec */)),
2160 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(false /* support_ec */))));
Shawn Willden2beb6282015-05-20 16:36:24 -06002161
Shawn Willden6270aca2015-05-26 13:12:24 -06002162TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002163 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2164 // key data.
2165 string km1_sw = read_file("km1_sw_rsa_512.blob");
2166 EXPECT_EQ(486U, km1_sw.length());
2167
2168 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2169 memcpy(key_data, km1_sw.data(), km1_sw.length());
2170 set_key_blob(key_data, km1_sw.length());
2171
2172 string message(64, 'a');
2173 string signature;
2174 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2175
2176 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2177}
2178
Shawn Willden6270aca2015-05-26 13:12:24 -06002179TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1EcdsaBlob) {
2180 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2181 // key data.
2182 string km1_sw = read_file("km1_sw_ecdsa_256.blob");
2183 EXPECT_EQ(270U, km1_sw.length());
2184
2185 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2186 memcpy(key_data, km1_sw.data(), km1_sw.length());
2187 set_key_blob(key_data, km1_sw.length());
2188
2189 string message(64, 'a');
2190 string signature;
2191 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2192
2193 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2194}
2195
Shawn Willden2beb6282015-05-20 16:36:24 -06002196struct Malloc_Delete {
2197 void operator()(void* p) { free(p); }
2198};
2199
Shawn Willden6270aca2015-05-26 13:12:24 -06002200TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster0RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002201 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2202 string km0_sw = read_file("km0_sw_rsa_512.blob");
2203 EXPECT_EQ(333U, km0_sw.length());
2204
2205 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2206 memcpy(key_data, km0_sw.data(), km0_sw.length());
2207 set_key_blob(key_data, km0_sw.length());
2208
2209 string message(64, 'a');
2210 string signature;
2211 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2212
2213 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdencd695822015-01-26 14:06:32 -07002214}
2215
Shawn Willden128ffe02014-08-06 12:31:33 -06002216} // namespace test
2217} // namespace keymaster