blob: 698e4267e2920167355de1801048054dbfb64d93 [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 Willdenefbd7e42015-06-01 07:07:33 -0600191 EXPECT_TRUE(
192 ResponseContains({KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224,
193 KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512},
194 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700195 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600196
Shawn Willden63ac0432014-12-29 14:07:08 -0700197 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
198 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
199 &len));
200
Shawn Willden0cb69422015-05-26 08:31:37 -0600201 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700202 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700203 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
204 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
205 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700206 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -0600207
Shawn Willden6270aca2015-05-26 13:12:24 -0600208 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600209}
210
Shawn Willden58427c42015-05-20 13:00:42 -0600211TEST_P(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700212 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
213 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600214
Shawn Willden5b53c992015-02-02 08:05:25 -0700215 size_t len;
216 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600217 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700218 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700219 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700220 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700221
Shawn Willden0cb69422015-05-26 08:31:37 -0600222 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700223 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
224 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
225 free(formats);
226
Shawn Willden0cb69422015-05-26 08:31:37 -0600227 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700228 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
229 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
230 free(formats);
Shawn Willden2beb6282015-05-20 16:36:24 -0600231
Shawn Willden6270aca2015-05-26 13:12:24 -0600232 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600233}
234
Shawn Willden58427c42015-05-20 13:00:42 -0600235TEST_P(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700236 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
237 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600238
Shawn Willden5b53c992015-02-02 08:05:25 -0700239 size_t len;
240 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600241 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700242 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700243 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700244 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600245
Shawn Willden0cb69422015-05-26 08:31:37 -0600246 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600247 device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700248 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700249 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600250
Shawn Willden0cb69422015-05-26 08:31:37 -0600251 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700252 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600253 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700254 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700255
Shawn Willden0cb69422015-05-26 08:31:37 -0600256 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700257 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600258 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700259 free(formats);
260
Shawn Willden0cb69422015-05-26 08:31:37 -0600261 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700262 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600263 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700264 free(formats);
Shawn Willden2beb6282015-05-20 16:36:24 -0600265
Shawn Willden6270aca2015-05-26 13:12:24 -0600266 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600267}
268
Shawn Willden58427c42015-05-20 13:00:42 -0600269class NewKeyGeneration : public Keymaster1Test {
Shawn Willdend0772312014-09-18 12:27:57 -0600270 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700271 void CheckBaseParams() {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700272 AuthorizationSet auths = sw_enforced();
273 EXPECT_GT(auths.SerializedSize(), 12U);
274
Shawn Willden5b53c992015-02-02 08:05:25 -0700275 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
276 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
277 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600278 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700279 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600280
281 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700282 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
283 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
284 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600285
286 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700287 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
288 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
289 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600290
291 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600292 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700293 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600294 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700295};
Shawn Willden58427c42015-05-20 13:00:42 -0600296INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, NewKeyGeneration, test_params);
297
298TEST_P(NewKeyGeneration, Rsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600299 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
300 .RsaSigningKey(256, 3)
301 .Digest(KM_DIGEST_NONE)
302 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700303 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600304
Shawn Willden2beb6282015-05-20 16:36:24 -0600305 // Check specified tags are all present, and in the right set.
306 AuthorizationSet crypto_params;
307 AuthorizationSet non_crypto_params;
Shawn Willden6270aca2015-05-26 13:12:24 -0600308 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA)) {
Shawn Willden2beb6282015-05-20 16:36:24 -0600309 EXPECT_NE(0U, hw_enforced().size());
310 EXPECT_NE(0U, sw_enforced().size());
311 crypto_params.push_back(hw_enforced());
312 non_crypto_params.push_back(sw_enforced());
313 } else {
314 EXPECT_EQ(0U, hw_enforced().size());
315 EXPECT_NE(0U, sw_enforced().size());
316 crypto_params.push_back(sw_enforced());
317 }
318
319 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
320 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
321 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 256));
322 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 256));
323 EXPECT_TRUE(contains(crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
324 EXPECT_FALSE(contains(non_crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
325
Shawn Willden6270aca2015-05-26 13:12:24 -0600326 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600327 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600328}
329
Shawn Willden58427c42015-05-20 13:00:42 -0600330TEST_P(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700331 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
332 GenerateKey(AuthorizationSetBuilder()
333 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
334 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
335 .SigningKey()));
Shawn Willden2beb6282015-05-20 16:36:24 -0600336
Shawn Willden6270aca2015-05-26 13:12:24 -0600337 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600338}
339
Shawn Willden58427c42015-05-20 13:00:42 -0600340TEST_P(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600341 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600342 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700343 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600344
Shawn Willden6270aca2015-05-26 13:12:24 -0600345 // Check specified tags are all present, and in the right set.
346 AuthorizationSet crypto_params;
347 AuthorizationSet non_crypto_params;
348 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC)) {
349 EXPECT_NE(0U, hw_enforced().size());
350 EXPECT_NE(0U, sw_enforced().size());
351 crypto_params.push_back(hw_enforced());
352 non_crypto_params.push_back(sw_enforced());
353 } else {
354 EXPECT_EQ(0U, hw_enforced().size());
355 EXPECT_NE(0U, sw_enforced().size());
356 crypto_params.push_back(sw_enforced());
357 }
Shawn Willden2beb6282015-05-20 16:36:24 -0600358
Shawn Willden6270aca2015-05-26 13:12:24 -0600359 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC));
360 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC));
361 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 224));
362 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 224));
363
364 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
365 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600366}
367
Shawn Willden58427c42015-05-20 13:00:42 -0600368TEST_P(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden4f83b892015-05-26 12:52:54 -0600369 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
370 GenerateKey(AuthorizationSetBuilder()
371 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_EC)
372 .SigningKey()
373 .Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600374
Shawn Willden6270aca2015-05-26 13:12:24 -0600375 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600376}
377
Shawn Willden58427c42015-05-20 13:00:42 -0600378TEST_P(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden6270aca2015-05-26 13:12:24 -0600379 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
380 ASSERT_EQ(
381 KM_ERROR_UNKNOWN_ERROR,
382 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
383 else
384 ASSERT_EQ(
385 KM_ERROR_UNSUPPORTED_KEY_SIZE,
386 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600387
Shawn Willden6270aca2015-05-26 13:12:24 -0600388 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
389 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600390}
391
Shawn Willden58427c42015-05-20 13:00:42 -0600392TEST_P(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600393 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600394 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600395 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
396 KM_DIGEST_NONE)))
Shawn Willden58427c42015-05-20 13:00:42 -0600397 << "Failed to generate size: "
398 << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600399 }
Shawn Willden2beb6282015-05-20 16:36:24 -0600400
Shawn Willden6270aca2015-05-26 13:12:24 -0600401 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
402 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600403}
404
Shawn Willden58427c42015-05-20 13:00:42 -0600405TEST_P(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700406 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600407 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600408
Shawn Willden6270aca2015-05-26 13:12:24 -0600409 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700410}
411
Shawn Willden58427c42015-05-20 13:00:42 -0600412typedef Keymaster1Test GetKeyCharacteristics;
413INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, GetKeyCharacteristics, test_params);
414
415TEST_P(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600416 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
417 .RsaSigningKey(256, 3)
418 .Digest(KM_DIGEST_NONE)
419 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700420 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600421
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700422 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
423 EXPECT_EQ(original, sw_enforced());
Shawn Willden2beb6282015-05-20 16:36:24 -0600424
Shawn Willden6270aca2015-05-26 13:12:24 -0600425 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600426 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden76364712014-08-11 17:48:04 -0600427}
428
Shawn Willden58427c42015-05-20 13:00:42 -0600429typedef Keymaster1Test SigningOperationsTest;
430INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, SigningOperationsTest, test_params);
431
432TEST_P(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600433 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
434 .RsaSigningKey(256, 3)
435 .Digest(KM_DIGEST_NONE)
436 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700437 string message = "12345678901234567890123456789012";
438 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600439 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600440
Shawn Willden6270aca2015-05-26 13:12:24 -0600441 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600442 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600443}
444
Shawn Willden58427c42015-05-20 13:00:42 -0600445TEST_P(SigningOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600446 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600447 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600448 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600449 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700450 string message(1024, 'a');
451 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600452 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600453
Shawn Willden6270aca2015-05-26 13:12:24 -0600454 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600455 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700456}
457
Shawn Willden58427c42015-05-20 13:00:42 -0600458TEST_P(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600459 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
460 .RsaSigningKey(512, 3)
461 .Digest(KM_DIGEST_SHA_2_256)
462 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700463 // Use large message, which won't work without digesting.
464 string message(1024, 'a');
465 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600466 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600467
Shawn Willden6270aca2015-05-26 13:12:24 -0600468 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600469 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -0700470}
471
Shawn Willden58427c42015-05-20 13:00:42 -0600472TEST_P(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600473 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
474 .RsaSigningKey(512, 3)
475 .Digest(KM_DIGEST_SHA_2_256)
476 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700477 string message(1024, 'a');
478 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600479 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -0600480
Shawn Willden6270aca2015-05-26 13:12:24 -0600481 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600482 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700483}
484
Shawn Willden58427c42015-05-20 13:00:42 -0600485TEST_P(SigningOperationsTest, RsaPssSha256TooSmallKey) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700486 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
487 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600488 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
489 .RsaSigningKey(256 + 9 * 8, 3)
490 .Digest(KM_DIGEST_SHA_2_256)
491 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700492 string message(1024, 'a');
493 string signature;
494
Shawn Willden226746b2015-05-08 11:36:56 -0600495 AuthorizationSet begin_params(client_params());
496 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600497 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600498 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700499
500 string result;
501 size_t input_consumed;
502 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
503 EXPECT_EQ(message.size(), input_consumed);
504 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -0600505
Shawn Willden6270aca2015-05-26 13:12:24 -0600506 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600507 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700508}
509
Shawn Willden58427c42015-05-20 13:00:42 -0600510TEST_P(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600511 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
512 .RsaSigningKey(256, 3)
513 .Digest(KM_DIGEST_NONE)
514 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600515 AuthorizationSet begin_params(client_params());
516 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600517 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600518 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700519 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
520 // Another abort should fail
521 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden2beb6282015-05-20 16:36:24 -0600522
Shawn Willden6270aca2015-05-26 13:12:24 -0600523 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600524 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600525}
526
Shawn Willden58427c42015-05-20 13:00:42 -0600527TEST_P(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600528 GenerateKey(AuthorizationSetBuilder()
529 .RsaSigningKey(256, 3)
530 .Digest(KM_DIGEST_MD5)
531 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700532 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden2beb6282015-05-20 16:36:24 -0600533
Shawn Willden6270aca2015-05-26 13:12:24 -0600534 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600535 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600536}
537
Shawn Willden58427c42015-05-20 13:00:42 -0600538TEST_P(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600539 GenerateKey(AuthorizationSetBuilder()
540 .RsaSigningKey(256, 3)
541 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
542 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600543 AuthorizationSet begin_params(client_params());
544 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
545 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600546
Shawn Willden6270aca2015-05-26 13:12:24 -0600547 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600548 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600549}
550
Shawn Willden58427c42015-05-20 13:00:42 -0600551TEST_P(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700552 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600553 GenerateKey(AuthorizationSetBuilder()
554 .RsaSigningKey(256, 3)
555 .Digest(KM_DIGEST_NONE)
556 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600557 AuthorizationSet begin_params(client_params());
558 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600559 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600560 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600561
Shawn Willden6270aca2015-05-26 13:12:24 -0600562 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600563 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600564}
565
Shawn Willden58427c42015-05-20 13:00:42 -0600566TEST_P(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700567 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600568 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
569 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600570 AuthorizationSet begin_params(client_params());
571 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
572 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600573
Shawn Willden6270aca2015-05-26 13:12:24 -0600574 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600575 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600576}
577
Shawn Willden58427c42015-05-20 13:00:42 -0600578TEST_P(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600579 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
580 .RsaSigningKey(256, 3)
581 .Digest(KM_DIGEST_NONE)
582 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600583 AuthorizationSet begin_params(client_params());
584 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600585 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600586 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600587
588 string message = "1234567890123456789012345678901";
589 string result;
590 size_t input_consumed;
591 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
592 EXPECT_EQ(0U, result.size());
593 EXPECT_EQ(31U, input_consumed);
594
595 string signature;
596 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
597 EXPECT_EQ(0U, signature.length());
Shawn Willden2beb6282015-05-20 16:36:24 -0600598
Shawn Willden6270aca2015-05-26 13:12:24 -0600599 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600600 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600601}
602
Shawn Willden58427c42015-05-20 13:00:42 -0600603TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600604 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
605 .RsaEncryptionKey(256, 3)
606 .Digest(KM_DIGEST_NONE)
607 .Padding(KM_PAD_NONE)));
608 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
609 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600610
Shawn Willden6270aca2015-05-26 13:12:24 -0600611 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600612 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600613}
614
Shawn Willden58427c42015-05-20 13:00:42 -0600615TEST_P(SigningOperationsTest, EcdsaSuccess) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600616 ASSERT_EQ(KM_ERROR_OK,
617 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
618 string message = "123456789012345678901234567890123456789012345678";
619 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600620 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600621
Shawn Willden6270aca2015-05-26 13:12:24 -0600622 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
623 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600624}
625
Shawn Willdenefbd7e42015-06-01 07:07:33 -0600626TEST_P(SigningOperationsTest, EcdsaSha256Success) {
627 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(
628 KM_DIGEST_SHA_2_256)));
629 string message(1024, 'a');
630 string signature;
631 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
632
633 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
634 EXPECT_EQ(3, GetParam()->keymaster0_calls());
635}
636
Shawn Willden58427c42015-05-20 13:00:42 -0600637TEST_P(SigningOperationsTest, AesEcbSign) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600638 ASSERT_EQ(KM_ERROR_OK,
639 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
640 TAG_BLOCK_MODE, KM_MODE_ECB)));
641 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
642 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600643
Shawn Willden6270aca2015-05-26 13:12:24 -0600644 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600645}
646
Shawn Willden58427c42015-05-20 13:00:42 -0600647TEST_P(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600648 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700649 string message = "12345678901234567890123456789012";
650 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600651 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600652 ASSERT_EQ(20U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600653
Shawn Willden6270aca2015-05-26 13:12:24 -0600654 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700655}
656
Shawn Willden58427c42015-05-20 13:00:42 -0600657TEST_P(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600658 ASSERT_EQ(KM_ERROR_OK,
659 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700660 string message = "12345678901234567890123456789012";
661 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600662 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600663 ASSERT_EQ(28U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600664
Shawn Willden6270aca2015-05-26 13:12:24 -0600665 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700666}
667
Shawn Willden58427c42015-05-20 13:00:42 -0600668TEST_P(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600669 ASSERT_EQ(KM_ERROR_OK,
670 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700671 string message = "12345678901234567890123456789012";
672 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600673 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600674 ASSERT_EQ(32U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600675
Shawn Willden6270aca2015-05-26 13:12:24 -0600676 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700677}
678
Shawn Willden58427c42015-05-20 13:00:42 -0600679TEST_P(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600680 ASSERT_EQ(KM_ERROR_OK,
681 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
682
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700683 string message = "12345678901234567890123456789012";
684 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600685 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600686 ASSERT_EQ(48U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600687
Shawn Willden6270aca2015-05-26 13:12:24 -0600688 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700689}
690
Shawn Willden58427c42015-05-20 13:00:42 -0600691TEST_P(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600692 ASSERT_EQ(KM_ERROR_OK,
693 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700694 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700695 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600696 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600697 ASSERT_EQ(64U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600698
Shawn Willden6270aca2015-05-26 13:12:24 -0600699 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700700}
701
Shawn Willden58427c42015-05-20 13:00:42 -0600702TEST_P(SigningOperationsTest, HmacLengthInKey) {
Shawn Willden09f25272015-04-15 13:49:49 -0600703 // TODO(swillden): unified API should generate an error on key generation.
704 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
705 .HmacKey(128)
706 .Digest(KM_DIGEST_SHA_2_256)
707 .Authorization(TAG_MAC_LENGTH, 20)));
708 string message = "12345678901234567890123456789012";
709 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600710 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600711 // Size in key was ignored.
712 ASSERT_EQ(30U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600713
Shawn Willden6270aca2015-05-26 13:12:24 -0600714 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden09f25272015-04-15 13:49:49 -0600715}
716
Shawn Willden58427c42015-05-20 13:00:42 -0600717TEST_P(SigningOperationsTest, HmacRfc4231TestCase1) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700718 uint8_t key_data[] = {
719 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
720 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
721 };
722 string message = "Hi There";
723 uint8_t sha_224_expected[] = {
724 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
725 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
726 };
727 uint8_t sha_256_expected[] = {
728 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
729 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
730 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
731 };
732 uint8_t sha_384_expected[] = {
733 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
734 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
735 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
736 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
737 };
738 uint8_t sha_512_expected[] = {
739 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
740 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
741 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
742 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
743 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
744 };
745
746 string key = make_string(key_data);
747
748 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
749 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
750 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
751 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600752
Shawn Willden6270aca2015-05-26 13:12:24 -0600753 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700754}
755
Shawn Willden58427c42015-05-20 13:00:42 -0600756TEST_P(SigningOperationsTest, HmacRfc4231TestCase2) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700757 string key = "Jefe";
758 string message = "what do ya want for nothing?";
759 uint8_t sha_224_expected[] = {
760 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
761 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
762 };
763 uint8_t sha_256_expected[] = {
764 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
765 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
766 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
767 };
768 uint8_t sha_384_expected[] = {
769 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
770 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
771 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
772 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
773 };
774 uint8_t sha_512_expected[] = {
775 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
776 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
777 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
778 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
779 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
780 };
781
782 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
783 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
784 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
785 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600786
Shawn Willden6270aca2015-05-26 13:12:24 -0600787 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700788}
789
Shawn Willden58427c42015-05-20 13:00:42 -0600790TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700791 string key(20, 0xaa);
792 string message(50, 0xdd);
793 uint8_t sha_224_expected[] = {
794 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
795 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
796 };
797 uint8_t sha_256_expected[] = {
798 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
799 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
800 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
801 };
802 uint8_t sha_384_expected[] = {
803 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
804 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
805 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
806 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
807 };
808 uint8_t sha_512_expected[] = {
809 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
810 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
811 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
812 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
813 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
814 };
815
816 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
817 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
818 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
819 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600820
Shawn Willden6270aca2015-05-26 13:12:24 -0600821 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700822}
823
Shawn Willden58427c42015-05-20 13:00:42 -0600824TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700825 uint8_t key_data[25] = {
826 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
827 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
828 };
829 string key = make_string(key_data);
830 string message(50, 0xcd);
831 uint8_t sha_224_expected[] = {
832 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
833 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
834 };
835 uint8_t sha_256_expected[] = {
836 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
837 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
838 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
839 };
840 uint8_t sha_384_expected[] = {
841 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
842 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
843 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
844 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
845 };
846 uint8_t sha_512_expected[] = {
847 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
848 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
849 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
850 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
851 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
852 };
853
854 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
855 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
856 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
857 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600858
Shawn Willden6270aca2015-05-26 13:12:24 -0600859 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700860}
861
Shawn Willden58427c42015-05-20 13:00:42 -0600862TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700863 string key(20, 0x0c);
864 string message = "Test With Truncation";
865
866 uint8_t sha_224_expected[] = {
867 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
868 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
869 };
870 uint8_t sha_256_expected[] = {
871 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
872 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
873 };
874 uint8_t sha_384_expected[] = {
875 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
876 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
877 };
878 uint8_t sha_512_expected[] = {
879 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
880 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
881 };
882
883 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
884 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
885 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
886 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600887
Shawn Willden6270aca2015-05-26 13:12:24 -0600888 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700889}
890
Shawn Willden58427c42015-05-20 13:00:42 -0600891TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700892 string key(131, 0xaa);
893 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
894
895 uint8_t sha_224_expected[] = {
896 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
897 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
898 };
899 uint8_t sha_256_expected[] = {
900 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
901 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
902 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
903 };
904 uint8_t sha_384_expected[] = {
905 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
906 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
907 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
908 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
909 };
910 uint8_t sha_512_expected[] = {
911 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
912 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
913 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
914 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
915 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
916 };
917
918 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
919 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
920 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
921 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600922
Shawn Willden6270aca2015-05-26 13:12:24 -0600923 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700924}
925
Shawn Willden58427c42015-05-20 13:00:42 -0600926TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700927 string key(131, 0xaa);
928 string message = "This is a test using a larger than block-size key and a larger than "
929 "block-size data. The key needs to be hashed before being used by the HMAC "
930 "algorithm.";
931
932 uint8_t sha_224_expected[] = {
933 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
934 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
935 };
936 uint8_t sha_256_expected[] = {
937 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
938 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
939 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
940 };
941 uint8_t sha_384_expected[] = {
942 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
943 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
944 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
945 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
946 };
947 uint8_t sha_512_expected[] = {
948 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
949 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
950 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
951 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
952 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
953 };
954
955 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
956 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
957 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
958 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600959
Shawn Willden6270aca2015-05-26 13:12:24 -0600960 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700961}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700962
Shawn Willden58427c42015-05-20 13:00:42 -0600963TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600964 ASSERT_EQ(KM_ERROR_OK,
965 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
966 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600967 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600968 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600969 ASSERT_EQ(KM_ERROR_OK,
970 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
971 string message = "1234567890123456789012345678901";
972 string result;
973 size_t input_consumed;
974 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
975 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden2beb6282015-05-20 16:36:24 -0600976
Shawn Willden6270aca2015-05-26 13:12:24 -0600977 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700978}
979
Shawn Willden61902362014-12-18 10:33:24 -0700980// TODO(swillden): Add more verification failure tests.
981
Shawn Willden58427c42015-05-20 13:00:42 -0600982typedef Keymaster1Test VerificationOperationsTest;
983INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params);
984
985TEST_P(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600986 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
987 .RsaSigningKey(256, 3)
988 .Digest(KM_DIGEST_NONE)
989 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700990 string message = "12345678901234567890123456789012";
991 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600992 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
993 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
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 Willden1615f2e2014-08-13 10:37:40 -0600997}
998
Shawn Willden58427c42015-05-20 13:00:42 -0600999TEST_P(VerificationOperationsTest, RsaSha256DigestSuccess) {
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);
1007 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -06001008
Shawn Willden6270aca2015-05-26 13:12:24 -06001009 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001010 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001011}
1012
Shawn Willden58427c42015-05-20 13:00:42 -06001013TEST_P(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001014 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -06001015 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -06001016 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001017 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -07001018 string message(1024, 'a');
1019 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001020 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -07001021 ++signature[signature.size() / 2];
1022
Shawn Willden226746b2015-05-08 11:36:56 -06001023 AuthorizationSet begin_params(client_params());
1024 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001025 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001026 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001027
1028 string result;
1029 size_t input_consumed;
1030 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1031 EXPECT_EQ(message.size(), input_consumed);
1032 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001033
Shawn Willden6270aca2015-05-26 13:12:24 -06001034 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001035 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001036}
1037
Shawn Willden58427c42015-05-20 13:00:42 -06001038TEST_P(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001039 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1040 .RsaSigningKey(512, 3)
1041 .Digest(KM_DIGEST_SHA_2_256)
1042 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001043 // Use large message, which won't work without digesting.
1044 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);
1047 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -06001048
Shawn Willden6270aca2015-05-26 13:12:24 -06001049 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001050 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001051}
1052
Shawn Willden58427c42015-05-20 13:00:42 -06001053TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001054 GenerateKey(AuthorizationSetBuilder()
1055 .RsaSigningKey(512, 3)
1056 .Digest(KM_DIGEST_SHA_2_256)
1057 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001058 string message(1024, 'a');
1059 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001060 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001061 ++signature[signature.size() / 2];
1062
Shawn Willden226746b2015-05-08 11:36:56 -06001063 AuthorizationSet begin_params(client_params());
1064 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001065 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001066 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001067
1068 string result;
1069 size_t input_consumed;
1070 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1071 EXPECT_EQ(message.size(), input_consumed);
1072 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001073
Shawn Willden6270aca2015-05-26 13:12:24 -06001074 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001075 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001076}
1077
Shawn Willden58427c42015-05-20 13:00:42 -06001078TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001079 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1080 .RsaSigningKey(512, 3)
1081 .Digest(KM_DIGEST_SHA_2_256)
1082 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001083 // Use large message, which won't work without digesting.
1084 string message(1024, 'a');
1085 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001086 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -07001087 ++message[message.size() / 2];
1088
Shawn Willden226746b2015-05-08 11:36:56 -06001089 AuthorizationSet begin_params(client_params());
1090 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001091 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001092 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001093
1094 string result;
1095 size_t input_consumed;
1096 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1097 EXPECT_EQ(message.size(), input_consumed);
1098 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
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 Willden61902362014-12-18 10:33:24 -07001102}
1103
Shawn Willden58427c42015-05-20 13:00:42 -06001104TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) {
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);
1112 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -06001113
Shawn Willden6270aca2015-05-26 13:12:24 -06001114 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001115 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001116}
1117
Shawn Willden58427c42015-05-20 13:00:42 -06001118TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001119 GenerateKey(AuthorizationSetBuilder()
1120 .RsaSigningKey(512, 3)
1121 .Digest(KM_DIGEST_SHA_2_256)
1122 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001123 string message(1024, 'a');
1124 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001125 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001126 ++signature[signature.size() / 2];
1127
Shawn Willden226746b2015-05-08 11:36:56 -06001128 AuthorizationSet begin_params(client_params());
1129 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001130 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001131 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001132
1133 string result;
1134 size_t input_consumed;
1135 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1136 EXPECT_EQ(message.size(), input_consumed);
1137 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001138
Shawn Willden6270aca2015-05-26 13:12:24 -06001139 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001140 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001141}
1142
Shawn Willden58427c42015-05-20 13:00:42 -06001143TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001144 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1145 .RsaSigningKey(512, 3)
1146 .Digest(KM_DIGEST_SHA_2_256)
1147 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001148 // Use large message, which won't work without digesting.
1149 string message(1024, 'a');
1150 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001151 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001152 ++message[message.size() / 2];
1153
Shawn Willden226746b2015-05-08 11:36:56 -06001154 AuthorizationSet begin_params(client_params());
1155 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001156 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001157 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001158
1159 string result;
1160 size_t input_consumed;
1161 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1162 EXPECT_EQ(message.size(), input_consumed);
1163 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001164
Shawn Willden6270aca2015-05-26 13:12:24 -06001165 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001166 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001167}
1168
1169template <typename T> vector<T> make_vector(const T* array, size_t len) {
1170 return vector<T>(array, array + len);
1171}
1172
Shawn Willden58427c42015-05-20 13:00:42 -06001173TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001174 // Get all supported digests and padding modes.
1175 size_t digests_len;
1176 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -06001177 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001178 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1179 &digests_len));
1180
1181 size_t padding_modes_len;
1182 keymaster_padding_t* padding_modes;
Shawn Willden0cb69422015-05-26 08:31:37 -06001183 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001184 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1185 &padding_modes, &padding_modes_len));
1186
1187 // Try them.
1188 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1189 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
1190 // Compute key & message size that will work.
1191 size_t key_bits = 256;
1192 size_t message_len = 1000;
1193 switch (digest) {
1194 case KM_DIGEST_NONE:
1195 switch (padding_mode) {
1196 case KM_PAD_NONE:
1197 // Match key size.
1198 message_len = key_bits / 8;
1199 break;
1200 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1201 message_len = key_bits / 8 - 11;
1202 break;
1203 case KM_PAD_RSA_PSS:
1204 // PSS requires a digest.
1205 continue;
1206 default:
1207 FAIL() << "Missing padding";
1208 break;
1209 }
1210 break;
1211
1212 case KM_DIGEST_SHA_2_256:
1213 switch (padding_mode) {
1214 case KM_PAD_NONE:
Shawn Willden3ad5f052015-05-08 14:05:13 -06001215 // Digesting requires padding
1216 continue;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001217 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1218 key_bits += 8 * 11;
1219 break;
1220 case KM_PAD_RSA_PSS:
1221 key_bits += 8 * 10;
1222 break;
1223 default:
1224 FAIL() << "Missing padding";
1225 break;
1226 }
1227 break;
1228 default:
1229 FAIL() << "Missing digest";
1230 }
1231
Shawn Willdenaf533992015-04-15 13:48:28 -06001232 GenerateKey(AuthorizationSetBuilder()
1233 .RsaSigningKey(key_bits, 3)
1234 .Digest(digest)
1235 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001236 string message(message_len, 'a');
1237 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001238 SignMessage(message, &signature, digest, padding_mode);
1239 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001240 }
1241 }
1242
1243 free(padding_modes);
1244 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -06001245
Shawn Willden6270aca2015-05-26 13:12:24 -06001246 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001247 EXPECT_EQ(16, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001248}
1249
Shawn Willden58427c42015-05-20 13:00:42 -06001250TEST_P(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001251 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001252 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001253 string message = "123456789012345678901234567890123456789012345678";
1254 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001255 SignMessage(message, &signature, KM_DIGEST_NONE);
1256 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001257
Shawn Willden6270aca2015-05-26 13:12:24 -06001258 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1259 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001260}
1261
Shawn Willdenefbd7e42015-06-01 07:07:33 -06001262TEST_P(VerificationOperationsTest, EcdsaSha256Success) {
1263 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1264 .EcdsaSigningKey(256)
1265 .Digest(KM_DIGEST_SHA_2_256)
1266 .Digest(KM_DIGEST_NONE)));
1267 string message = "123456789012345678901234567890123456789012345678";
1268 string signature;
1269 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
1270 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
1271
1272 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1273 EXPECT_EQ(4, GetParam()->keymaster0_calls());
1274
1275 // Just for giggles, try verifying with the wrong digest.
1276 AuthorizationSet begin_params(client_params());
1277 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
1278 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1279
1280 string result;
1281 size_t input_consumed;
1282 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1283 EXPECT_EQ(message.size(), input_consumed);
1284 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1285}
1286
Shawn Willden58427c42015-05-20 13:00:42 -06001287TEST_P(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001288 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001289 string message = "123456789012345678901234567890123456789012345678";
1290 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001291 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1292 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden2beb6282015-05-20 16:36:24 -06001293
Shawn Willden6270aca2015-05-26 13:12:24 -06001294 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001295}
1296
Shawn Willden58427c42015-05-20 13:00:42 -06001297TEST_P(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001298 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001299 string message = "123456789012345678901234567890123456789012345678";
1300 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001301 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1302 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden2beb6282015-05-20 16:36:24 -06001303
Shawn Willden6270aca2015-05-26 13:12:24 -06001304 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001305}
1306
Shawn Willden58427c42015-05-20 13:00:42 -06001307TEST_P(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001308 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001309 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001310 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001311 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1312 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001313
Shawn Willden6270aca2015-05-26 13:12:24 -06001314 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -07001315}
1316
Shawn Willden58427c42015-05-20 13:00:42 -06001317TEST_P(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001318 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001319 string message = "123456789012345678901234567890123456789012345678";
1320 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001321 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1322 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden2beb6282015-05-20 16:36:24 -06001323
Shawn Willden6270aca2015-05-26 13:12:24 -06001324 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001325}
1326
Shawn Willden58427c42015-05-20 13:00:42 -06001327TEST_P(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001328 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001329 string message = "123456789012345678901234567890123456789012345678";
1330 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001331 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1332 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden2beb6282015-05-20 16:36:24 -06001333
Shawn Willden6270aca2015-05-26 13:12:24 -06001334 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001335}
1336
Shawn Willden58427c42015-05-20 13:00:42 -06001337typedef Keymaster1Test ExportKeyTest;
1338INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params);
1339
1340TEST_P(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001341 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1342 .RsaSigningKey(256, 3)
1343 .Digest(KM_DIGEST_NONE)
1344 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001345 string export_data;
1346 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001347 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001348
1349 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001350
Shawn Willden6270aca2015-05-26 13:12:24 -06001351 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001352 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenffd790c2014-08-18 21:20:06 -06001353}
1354
Shawn Willden58427c42015-05-20 13:00:42 -06001355TEST_P(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001356 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001357 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001358 string export_data;
1359 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001360 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001361
1362 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001363
Shawn Willden6270aca2015-05-26 13:12:24 -06001364 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1365 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001366}
1367
Shawn Willden58427c42015-05-20 13:00:42 -06001368TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001369 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1370 .RsaSigningKey(256, 3)
1371 .Digest(KM_DIGEST_NONE)
1372 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001373 string export_data;
1374 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001375
Shawn Willden6270aca2015-05-26 13:12:24 -06001376 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001377 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001378}
1379
Shawn Willden58427c42015-05-20 13:00:42 -06001380TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001381 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1382 .RsaSigningKey(256, 3)
1383 .Digest(KM_DIGEST_NONE)
1384 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001385 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001386 string export_data;
1387 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001388
Shawn Willden6270aca2015-05-26 13:12:24 -06001389 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001390 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001391}
1392
Shawn Willden58427c42015-05-20 13:00:42 -06001393TEST_P(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001394 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001395 string export_data;
1396
1397 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1398 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1399 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001400
Shawn Willden6270aca2015-05-26 13:12:24 -06001401 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden7dad93b2015-02-05 10:20:47 -07001402}
1403
Shawn Willden437fbd12014-08-20 11:59:49 -06001404static string read_file(const string& file_name) {
1405 ifstream file_stream(file_name, std::ios::binary);
1406 istreambuf_iterator<char> file_begin(file_stream);
1407 istreambuf_iterator<char> file_end;
1408 return string(file_begin, file_end);
1409}
1410
Shawn Willden58427c42015-05-20 13:00:42 -06001411typedef Keymaster1Test ImportKeyTest;
1412INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params);
1413
1414TEST_P(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001415 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001416 ASSERT_EQ(633U, pk8_key.size());
1417
Shawn Willdenaf533992015-04-15 13:48:28 -06001418 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1419 .RsaSigningKey(1024, 65537)
1420 .Digest(KM_DIGEST_NONE)
1421 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001422 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001423
1424 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001425 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1426 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001427 TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6270aca2015-05-26 13:12:24 -06001428 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1429 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001430 TAG_KEY_SIZE, 1024));
Shawn Willden6270aca2015-05-26 13:12:24 -06001431 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1432 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001433 TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001434
Shawn Willdenb6837e72015-05-16 09:20:59 -06001435 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001436 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1437 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001438
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001439 string message(1024 / 8, 'a');
1440 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001441 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1442 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001443
Shawn Willden6270aca2015-05-26 13:12:24 -06001444 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001445 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden437fbd12014-08-20 11:59:49 -06001446}
1447
Shawn Willden58427c42015-05-20 13:00:42 -06001448TEST_P(ImportKeyTest, OldApiRsaSuccess) {
Shawn Willdend7a5c712015-04-09 16:33:52 -06001449 string pk8_key = read_file("rsa_privkey_pk8.der");
1450 ASSERT_EQ(633U, pk8_key.size());
1451
1452 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1453 // point softkeymaster will no longer support keymaster0 APIs anyway.
1454 uint8_t* key_blob;
1455 size_t key_blob_length;
1456 ASSERT_EQ(0,
1457 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1458 pk8_key.size(), &key_blob, &key_blob_length));
1459 set_key_blob(key_blob, key_blob_length);
1460
1461 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001462 AuthorizationSet begin_params; // Don't use client data.
1463 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001464 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001465 AuthorizationSet update_params;
1466 AuthorizationSet output_params;
1467 string signature =
1468 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1469 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1470 &output_params);
Shawn Willden2beb6282015-05-20 16:36:24 -06001471
Shawn Willden6270aca2015-05-26 13:12:24 -06001472 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001473 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdend7a5c712015-04-09 16:33:52 -06001474}
1475
Shawn Willden58427c42015-05-20 13:00:42 -06001476TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001477 string pk8_key = read_file("rsa_privkey_pk8.der");
1478 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001479 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001480 ImportKey(AuthorizationSetBuilder()
1481 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1482 .Digest(KM_DIGEST_NONE)
1483 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001484 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001485
Shawn Willden6270aca2015-05-26 13:12:24 -06001486 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001487}
1488
Shawn Willden58427c42015-05-20 13:00:42 -06001489TEST_P(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001490 string pk8_key = read_file("rsa_privkey_pk8.der");
1491 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001492 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001493 ImportKey(AuthorizationSetBuilder()
1494 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1495 .Digest(KM_DIGEST_NONE)
1496 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001497 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001498
Shawn Willden6270aca2015-05-26 13:12:24 -06001499 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001500}
1501
Shawn Willden58427c42015-05-20 13:00:42 -06001502TEST_P(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001503 string pk8_key = read_file("ec_privkey_pk8.der");
1504 ASSERT_EQ(138U, pk8_key.size());
1505
Shawn Willdenaf533992015-04-15 13:48:28 -06001506 ASSERT_EQ(KM_ERROR_OK,
1507 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1508 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001509
1510 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001511 EXPECT_TRUE(
1512 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1513 TAG_ALGORITHM, KM_ALGORITHM_EC));
1514 EXPECT_TRUE(
1515 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1516 TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001517
Shawn Willdenb6837e72015-05-16 09:20:59 -06001518 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001519 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1520 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001521
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001522 string message(1024 / 8, 'a');
1523 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001524 SignMessage(message, &signature, KM_DIGEST_NONE);
1525 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001526
Shawn Willden6270aca2015-05-26 13:12:24 -06001527 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1528 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden81effc62014-08-27 10:08:46 -06001529}
1530
Shawn Willden58427c42015-05-20 13:00:42 -06001531TEST_P(ImportKeyTest, EcdsaSizeSpecified) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001532 string pk8_key = read_file("ec_privkey_pk8.der");
1533 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001534
Shawn Willdenaf533992015-04-15 13:48:28 -06001535 ASSERT_EQ(KM_ERROR_OK,
1536 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1537 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001538
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001539 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001540 EXPECT_TRUE(
1541 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1542 TAG_ALGORITHM, KM_ALGORITHM_EC));
1543 EXPECT_TRUE(
1544 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1545 TAG_KEY_SIZE, 256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001546
Shawn Willdenb6837e72015-05-16 09:20:59 -06001547 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001548 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1549 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1550
1551 string message(1024 / 8, 'a');
1552 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001553 SignMessage(message, &signature, KM_DIGEST_NONE);
1554 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001555
Shawn Willden6270aca2015-05-26 13:12:24 -06001556 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1557 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001558}
1559
Shawn Willden58427c42015-05-20 13:00:42 -06001560TEST_P(ImportKeyTest, EcdsaSizeMismatch) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001561 string pk8_key = read_file("ec_privkey_pk8.der");
1562 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001563 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001564 ImportKey(AuthorizationSetBuilder()
1565 .EcdsaSigningKey(224 /* Doesn't match key */)
1566 .Digest(KM_DIGEST_NONE),
1567 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001568
Shawn Willden6270aca2015-05-26 13:12:24 -06001569 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001570}
1571
Shawn Willden58427c42015-05-20 13:00:42 -06001572TEST_P(ImportKeyTest, AesKeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001573 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1574 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001575 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001576 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1577 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001578 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001579
1580 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1581 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1582
1583 string message = "Hello World!";
Shawn Willdenc4424672015-05-11 11:56:02 -06001584 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1585 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willden3b702e22015-02-05 10:26:47 -07001586 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001587
Shawn Willden6270aca2015-05-26 13:12:24 -06001588 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001589}
1590
Shawn Willden58427c42015-05-20 13:00:42 -06001591TEST_P(ImportKeyTest, HmacSha256KeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001592 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1593 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001594 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1595 .HmacKey(sizeof(key_data) * 8)
1596 .Digest(KM_DIGEST_SHA_2_256)
1597 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001598 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001599
1600 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1601 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1602
1603 string message = "Hello World!";
1604 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001605 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1606 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001607
Shawn Willden6270aca2015-05-26 13:12:24 -06001608 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001609}
1610
Shawn Willden58427c42015-05-20 13:00:42 -06001611typedef Keymaster1Test EncryptionOperationsTest;
1612INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params);
1613
1614TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001615 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1616 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001617
1618 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001619 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001620 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001621
Shawn Willden3ad5f052015-05-08 14:05:13 -06001622 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001623 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001624
1625 // OAEP randomizes padding so every result should be different.
1626 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001627
Shawn Willden6270aca2015-05-26 13:12:24 -06001628 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001629 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001630}
1631
Shawn Willden58427c42015-05-20 13:00:42 -06001632TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001633 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1634 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001635 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001636 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001637 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001638
Shawn Willden3ad5f052015-05-08 14:05:13 -06001639 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001640 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001641
Shawn Willden6270aca2015-05-26 13:12:24 -06001642 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001643 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001644}
1645
Shawn Willden58427c42015-05-20 13:00:42 -06001646TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001647 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1648 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001649 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001650 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001651 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001652
Shawn Willden3ad5f052015-05-08 14:05:13 -06001653 AuthorizationSet begin_params(client_params());
1654 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1655 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001656 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001657 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001658 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001659
Shawn Willden6270aca2015-05-26 13:12:24 -06001660 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001661 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001662}
1663
Shawn Willden58427c42015-05-20 13:00:42 -06001664TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001665 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1666 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001667 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001668 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001669 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001670
1671 // Corrupt the ciphertext
1672 ciphertext[512 / 8 / 2]++;
1673
Shawn Willden4200f212014-12-02 07:01:21 -07001674 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001675 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001676 AuthorizationSet begin_params(client_params());
1677 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1678 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001679 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001680 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001681 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001682
Shawn Willden6270aca2015-05-26 13:12:24 -06001683 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001684 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001685}
1686
Shawn Willden58427c42015-05-20 13:00:42 -06001687TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001688 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1689 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001690 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001691 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001692 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001693
Shawn Willden3ad5f052015-05-08 14:05:13 -06001694 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001695 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001696
1697 // PKCS1 v1.5 randomizes padding so every result should be different.
1698 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001699
Shawn Willden6270aca2015-05-26 13:12:24 -06001700 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001701 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001702}
1703
Shawn Willden58427c42015-05-20 13:00:42 -06001704TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001705 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1706 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001707 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001708 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001709 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001710
Shawn Willden3ad5f052015-05-08 14:05:13 -06001711 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001712 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001713
Shawn Willden6270aca2015-05-26 13:12:24 -06001714 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001715 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001716}
1717
Shawn Willden58427c42015-05-20 13:00:42 -06001718TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001719 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1720 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willden7bae1322015-05-26 10:16:49 -06001721 string message = "123456789012345678901234567890123456789012345678901234";
Shawn Willden4200f212014-12-02 07:01:21 -07001722 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001723 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001724
Shawn Willden3ad5f052015-05-08 14:05:13 -06001725 AuthorizationSet begin_params(client_params());
1726 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1727 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001728 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001729 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001730 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001731
Shawn Willden6270aca2015-05-26 13:12:24 -06001732 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001733 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001734}
1735
Shawn Willden58427c42015-05-20 13:00:42 -06001736TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001737 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1738 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001739 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001740 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001741 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001742
1743 // Corrupt the ciphertext
1744 ciphertext[512 / 8 / 2]++;
1745
Shawn Willden4200f212014-12-02 07:01:21 -07001746 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001747 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001748 AuthorizationSet begin_params(client_params());
1749 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1750 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001751 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001752 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001753 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001754
Shawn Willden6270aca2015-05-26 13:12:24 -06001755 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001756 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001757}
1758
Shawn Willden58427c42015-05-20 13:00:42 -06001759TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001760 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1761 .RsaSigningKey(256, 3)
1762 .Digest(KM_DIGEST_NONE)
1763 .Padding(KM_PAD_NONE)));
1764 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1765 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001766
Shawn Willden6270aca2015-05-26 13:12:24 -06001767 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001768 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001769}
1770
Shawn Willden58427c42015-05-20 13:00:42 -06001771TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001772 ASSERT_EQ(KM_ERROR_OK,
1773 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1774 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1775 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001776
Shawn Willden6270aca2015-05-26 13:12:24 -06001777 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1778 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001779}
1780
Shawn Willden58427c42015-05-20 13:00:42 -06001781TEST_P(EncryptionOperationsTest, HmacEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001782 ASSERT_EQ(
1783 KM_ERROR_OK,
1784 GenerateKey(
1785 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1786 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1787 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001788
Shawn Willden6270aca2015-05-26 13:12:24 -06001789 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001790}
1791
Shawn Willden58427c42015-05-20 13:00:42 -06001792TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001793 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1794 .AesEncryptionKey(128)
1795 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1796 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001797 // Two-block message.
1798 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001799 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001800 EXPECT_EQ(message.size(), ciphertext1.size());
1801
Shawn Willden31e063f2015-05-08 14:31:22 -06001802 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001803 EXPECT_EQ(message.size(), ciphertext2.size());
1804
1805 // ECB is deterministic.
1806 EXPECT_EQ(ciphertext1, ciphertext2);
1807
Shawn Willden31e063f2015-05-08 14:31:22 -06001808 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001809 EXPECT_EQ(message, plaintext);
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, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001815 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1816 .AesEncryptionKey(128)
1817 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1818 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001819 // Message is slightly shorter than two blocks.
1820 string message = "1234567890123456789012345678901";
1821
Shawn Willden31e063f2015-05-08 14:31:22 -06001822 AuthorizationSet begin_params(client_params());
1823 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001824 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001825 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001826 string ciphertext;
1827 size_t input_consumed;
1828 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1829 EXPECT_EQ(message.size(), input_consumed);
1830 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001831
Shawn Willden6270aca2015-05-26 13:12:24 -06001832 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001833}
1834
Shawn Willden58427c42015-05-20 13:00:42 -06001835TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001836 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001837 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001838 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1839 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001840
1841 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001842 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001843 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001844 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001845 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001846 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001847 EXPECT_EQ(message, plaintext);
1848 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001849
Shawn Willden6270aca2015-05-26 13:12:24 -06001850 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001851}
1852
Shawn Willden58427c42015-05-20 13:00:42 -06001853TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001854 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001855 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001856 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1857 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001858
1859 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001860 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001861 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001862 EXPECT_NE(ciphertext, message);
1863 ++ciphertext[ciphertext.size() / 2];
1864
Shawn Willden31e063f2015-05-08 14:31:22 -06001865 AuthorizationSet begin_params(client_params());
1866 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001867 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
Shawn Willden31e063f2015-05-08 14:31:22 -06001868 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001869 string plaintext;
1870 size_t input_consumed;
1871 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1872 EXPECT_EQ(ciphertext.size(), input_consumed);
1873 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001874
Shawn Willden6270aca2015-05-26 13:12:24 -06001875 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001876}
1877
Shawn Willden58427c42015-05-20 13:00:42 -06001878TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001879 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1880 .AesEncryptionKey(128)
1881 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1882 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001883 string message = "123";
1884 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001885 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001886 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001887 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001888
1889 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001890 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001891 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001892 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001893
1894 // IVs should be random, so ciphertexts should differ.
1895 EXPECT_NE(iv1, iv2);
1896 EXPECT_NE(ciphertext1, ciphertext2);
1897
Shawn Willden31e063f2015-05-08 14:31:22 -06001898 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001899 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001900
Shawn Willden6270aca2015-05-26 13:12:24 -06001901 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001902}
1903
Shawn Willden58427c42015-05-20 13:00:42 -06001904TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001905 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1906 .AesEncryptionKey(128)
1907 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1908 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001909
1910 int increment = 15;
1911 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001912 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001913 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001914 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001915 AuthorizationSet output_params;
1916 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1917
1918 string ciphertext;
1919 size_t input_consumed;
1920 for (size_t i = 0; i < message.size(); i += increment)
1921 EXPECT_EQ(KM_ERROR_OK,
1922 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1923 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1924 EXPECT_EQ(message.size(), ciphertext.size());
1925
1926 // Move TAG_NONCE into input_params
1927 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001928 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001929 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001930 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001931 output_params.Clear();
1932
1933 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1934 string plaintext;
1935 for (size_t i = 0; i < ciphertext.size(); i += increment)
1936 EXPECT_EQ(KM_ERROR_OK,
1937 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1938 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1939 EXPECT_EQ(ciphertext.size(), plaintext.size());
1940 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001941
Shawn Willden6270aca2015-05-26 13:12:24 -06001942 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001943}
1944
1945struct AesCtrSp80038aTestVector {
1946 const char* key;
1947 const char* nonce;
1948 const char* plaintext;
1949 const char* ciphertext;
1950};
1951
1952// These test vectors are taken from
1953// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1954static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1955 // AES-128
1956 {
1957 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1958 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1959 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1960 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1961 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1962 },
1963 // AES-192
1964 {
1965 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1966 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1967 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1968 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1969 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1970 },
1971 // AES-256
1972 {
1973 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1974 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1975 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1976 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1977 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1978 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1979 },
1980};
1981
Shawn Willden58427c42015-05-20 13:00:42 -06001982TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
Thai Duong20d725d2015-03-24 17:49:58 -07001983 for (size_t i = 0; i < 3; i++) {
1984 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1985 const string key = hex2str(test.key);
1986 const string nonce = hex2str(test.nonce);
1987 const string plaintext = hex2str(test.plaintext);
1988 const string ciphertext = hex2str(test.ciphertext);
1989 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1990 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001991
Shawn Willden6270aca2015-05-26 13:12:24 -06001992 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001993}
1994
Shawn Willden58427c42015-05-20 13:00:42 -06001995TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
Thai Duong20d725d2015-03-24 17:49:58 -07001996 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1997 .AesEncryptionKey(128)
1998 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1999 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06002000 AuthorizationSet begin_params(client_params());
2001 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002002 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06002003 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002004
Shawn Willden6270aca2015-05-26 13:12:24 -06002005 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002006}
2007
Shawn Willden58427c42015-05-20 13:00:42 -06002008TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
Thai Duong20d725d2015-03-24 17:49:58 -07002009 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2010 .AesEncryptionKey(128)
2011 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002012 .Authorization(TAG_CALLER_NONCE)
2013 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07002014
Shawn Willden09f25272015-04-15 13:49:49 -06002015 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002016 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002017 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07002018 input_params.push_back(TAG_NONCE, "123", 3);
2019 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002020
Shawn Willden6270aca2015-05-26 13:12:24 -06002021 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002022}
2023
Shawn Willden58427c42015-05-20 13:00:42 -06002024TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002025 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2026 .AesEncryptionKey(128)
2027 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2028 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002029 // Two-block message.
2030 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002031 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06002032 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002033 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002034
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002035 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06002036 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002037 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002038
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002039 // IVs should be random, so ciphertexts should differ.
2040 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002041 EXPECT_NE(ciphertext1, ciphertext2);
2042
Shawn Willden31e063f2015-05-08 14:31:22 -06002043 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002044 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002045
Shawn Willden6270aca2015-05-26 13:12:24 -06002046 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002047}
2048
Shawn Willden58427c42015-05-20 13:00:42 -06002049TEST_P(EncryptionOperationsTest, AesCallerNonce) {
Shawn Willden969aa382015-04-15 17:05:53 -07002050 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2051 .AesEncryptionKey(128)
2052 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002053 .Authorization(TAG_CALLER_NONCE)
2054 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07002055 string message = "12345678901234567890123456789012";
2056 string iv1;
2057 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002058 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002059 EXPECT_EQ(message.size(), ciphertext1.size());
2060 EXPECT_EQ(16U, iv1.size());
2061
Shawn Willden31e063f2015-05-08 14:31:22 -06002062 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002063 EXPECT_EQ(message, plaintext);
2064
2065 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06002066 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07002067 AuthorizationSet update_params;
2068 AuthorizationSet output_params;
2069 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002070 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002071 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002072 string ciphertext2 =
2073 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
2074
2075 // Decrypt with correct nonce.
2076 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2077 &output_params);
2078 EXPECT_EQ(message, plaintext);
2079
2080 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06002081 input_params.Reinitialize(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002082 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002083 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002084 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
2085 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2086 &output_params);
2087 EXPECT_NE(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002088
Shawn Willden6270aca2015-05-26 13:12:24 -06002089 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden969aa382015-04-15 17:05:53 -07002090}
2091
Shawn Willden58427c42015-05-20 13:00:42 -06002092TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002093 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2094 .AesEncryptionKey(128)
2095 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2096 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06002097
2098 string message = "12345678901234567890123456789012";
2099 string iv1;
2100 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002101 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002102 EXPECT_EQ(message.size(), ciphertext1.size());
2103 EXPECT_EQ(16U, iv1.size());
2104
Shawn Willden31e063f2015-05-08 14:31:22 -06002105 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002106 EXPECT_EQ(message, plaintext);
2107
2108 // Now specify a nonce, should fail.
2109 AuthorizationSet input_params(client_params());
2110 AuthorizationSet update_params;
2111 AuthorizationSet output_params;
2112 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002113 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002114 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden67706352015-04-28 00:43:19 -06002115
2116 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
2117 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002118
Shawn Willden6270aca2015-05-26 13:12:24 -06002119 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden67706352015-04-28 00:43:19 -06002120}
2121
Shawn Willden58427c42015-05-20 13:00:42 -06002122TEST_P(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002123 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2124 .AesEncryptionKey(128)
2125 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2126 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002127
2128 int increment = 15;
2129 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06002130 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002131 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002132 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002133 AuthorizationSet output_params;
2134 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2135
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002136 string ciphertext;
2137 size_t input_consumed;
2138 for (size_t i = 0; i < message.size(); i += increment)
2139 EXPECT_EQ(KM_ERROR_OK,
2140 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2141 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002142 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002143
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002144 // Move TAG_NONCE into input_params
2145 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06002146 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002147 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002148 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002149 output_params.Clear();
2150
2151 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002152 string plaintext;
2153 for (size_t i = 0; i < ciphertext.size(); i += increment)
2154 EXPECT_EQ(KM_ERROR_OK,
2155 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2156 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002157 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002158 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002159
Shawn Willden6270aca2015-05-26 13:12:24 -06002160 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002161}
2162
Shawn Willden58427c42015-05-20 13:00:42 -06002163TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002164 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002165 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002166 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2167 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002168
2169 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06002170 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002171 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002172 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06002173 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002174 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06002175 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002176 EXPECT_EQ(message, plaintext);
2177 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002178
Shawn Willden6270aca2015-05-26 13:12:24 -06002179 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002180}
2181
Shawn Willden58427c42015-05-20 13:00:42 -06002182typedef Keymaster1Test AddEntropyTest;
2183INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params);
2184
2185TEST_P(AddEntropyTest, AddEntropy) {
Shawn Willdencd695822015-01-26 14:06:32 -07002186 // There's no obvious way to test that entropy is actually added, but we can test that the API
2187 // doesn't blow up or return an error.
2188 EXPECT_EQ(KM_ERROR_OK,
2189 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
Shawn Willden2beb6282015-05-20 16:36:24 -06002190
Shawn Willden6270aca2015-05-26 13:12:24 -06002191 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden2beb6282015-05-20 16:36:24 -06002192}
2193
2194typedef Keymaster1Test Keymaster0AdapterTest;
2195INSTANTIATE_TEST_CASE_P(
2196 AndroidKeymasterTest, Keymaster0AdapterTest,
Shawn Willden6270aca2015-05-26 13:12:24 -06002197 ::testing::Values(
2198 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(true /* support_ec */)),
2199 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(false /* support_ec */))));
Shawn Willden2beb6282015-05-20 16:36:24 -06002200
Shawn Willden6270aca2015-05-26 13:12:24 -06002201TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002202 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2203 // key data.
2204 string km1_sw = read_file("km1_sw_rsa_512.blob");
2205 EXPECT_EQ(486U, km1_sw.length());
2206
2207 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2208 memcpy(key_data, km1_sw.data(), km1_sw.length());
2209 set_key_blob(key_data, km1_sw.length());
2210
2211 string message(64, 'a');
2212 string signature;
2213 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2214
2215 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2216}
2217
Shawn Willden6270aca2015-05-26 13:12:24 -06002218TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1EcdsaBlob) {
2219 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2220 // key data.
2221 string km1_sw = read_file("km1_sw_ecdsa_256.blob");
2222 EXPECT_EQ(270U, km1_sw.length());
2223
2224 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2225 memcpy(key_data, km1_sw.data(), km1_sw.length());
2226 set_key_blob(key_data, km1_sw.length());
2227
2228 string message(64, 'a');
2229 string signature;
2230 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2231
2232 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2233}
2234
Shawn Willden2beb6282015-05-20 16:36:24 -06002235struct Malloc_Delete {
2236 void operator()(void* p) { free(p); }
2237};
2238
Shawn Willden6270aca2015-05-26 13:12:24 -06002239TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster0RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002240 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2241 string km0_sw = read_file("km0_sw_rsa_512.blob");
2242 EXPECT_EQ(333U, km0_sw.length());
2243
2244 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2245 memcpy(key_data, km0_sw.data(), km0_sw.length());
2246 set_key_blob(key_data, km0_sw.length());
2247
2248 string message(64, 'a');
2249 string signature;
2250 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2251
2252 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdencd695822015-01-26 14:06:32 -07002253}
2254
Shawn Willden128ffe02014-08-06 12:31:33 -06002255} // namespace test
2256} // namespace keymaster