blob: e5af55566d7933a7d6facfc6685f5578b9e8cc15 [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) {
Chad Brubaker3e37f0a2015-06-03 10:39:00 -070036 (void)prio, (void)tag, (void)fmt;
Shawn Willden2beb6282015-05-20 16:36:24 -060037 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 Willden0f392562015-06-02 09:00:52 -0600141 EXPECT_TRUE(ResponseContains({KM_MODE_ECB, KM_MODE_CBC, KM_MODE_CTR, KM_MODE_GCM}, 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));
Shawn Willden30160842015-06-01 08:31:00 -0600162 EXPECT_TRUE(
163 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700164 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600165
Shawn Willden0cb69422015-05-26 08:31:37 -0600166 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700167 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600168 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700169 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700170
171 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
172 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
173 &modes, &len));
Shawn Willden2beb6282015-05-20 16:36:24 -0600174
Shawn Willden6270aca2015-05-26 13:12:24 -0600175 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600176}
177
Shawn Willden58427c42015-05-20 13:00:42 -0600178TEST_P(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700179 EXPECT_EQ(
180 KM_ERROR_OUTPUT_PARAMETER_NULL,
181 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600182
Shawn Willden5b53c992015-02-02 08:05:25 -0700183 size_t len;
184 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -0600185 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
Shawn Willden5b53c992015-02-02 08:05:25 -0700186 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600187 EXPECT_TRUE(
188 ResponseContains({KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224,
189 KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512},
190 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700191 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600192
Shawn Willden0cb69422015-05-26 08:31:37 -0600193 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700194 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willdenefbd7e42015-06-01 07:07:33 -0600195 EXPECT_TRUE(
196 ResponseContains({KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224,
197 KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512},
198 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700199 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600200
Shawn Willden63ac0432014-12-29 14:07:08 -0700201 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
202 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
203 &len));
204
Shawn Willden0cb69422015-05-26 08:31:37 -0600205 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700206 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700207 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
208 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
209 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700210 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -0600211
Shawn Willden6270aca2015-05-26 13:12:24 -0600212 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600213}
214
Shawn Willden58427c42015-05-20 13:00:42 -0600215TEST_P(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700216 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
217 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600218
Shawn Willden5b53c992015-02-02 08:05:25 -0700219 size_t len;
220 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600221 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700222 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700223 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700224 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700225
Shawn Willden0cb69422015-05-26 08:31:37 -0600226 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700227 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
228 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
229 free(formats);
230
Shawn Willden0cb69422015-05-26 08:31:37 -0600231 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700232 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
233 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
234 free(formats);
Shawn Willden2beb6282015-05-20 16:36:24 -0600235
Shawn Willden6270aca2015-05-26 13:12:24 -0600236 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600237}
238
Shawn Willden58427c42015-05-20 13:00:42 -0600239TEST_P(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700240 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
241 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600242
Shawn Willden5b53c992015-02-02 08:05:25 -0700243 size_t len;
244 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600245 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700246 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700247 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700248 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600249
Shawn Willden0cb69422015-05-26 08:31:37 -0600250 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600251 device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700252 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700253 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600254
Shawn Willden0cb69422015-05-26 08:31:37 -0600255 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700256 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600257 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700258 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700259
Shawn Willden0cb69422015-05-26 08:31:37 -0600260 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700261 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600262 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700263 free(formats);
264
Shawn Willden0cb69422015-05-26 08:31:37 -0600265 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700266 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600267 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700268 free(formats);
Shawn Willden2beb6282015-05-20 16:36:24 -0600269
Shawn Willden6270aca2015-05-26 13:12:24 -0600270 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600271}
272
Shawn Willden58427c42015-05-20 13:00:42 -0600273class NewKeyGeneration : public Keymaster1Test {
Shawn Willdend0772312014-09-18 12:27:57 -0600274 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700275 void CheckBaseParams() {
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700276 AuthorizationSet auths = sw_enforced();
277 EXPECT_GT(auths.SerializedSize(), 12U);
278
Shawn Willden5b53c992015-02-02 08:05:25 -0700279 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
280 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
281 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600282 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700283 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600284
285 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700286 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
287 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
288 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600289
290 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700291 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
292 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
293 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600294
295 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600296 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700297 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600298 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700299};
Shawn Willden58427c42015-05-20 13:00:42 -0600300INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, NewKeyGeneration, test_params);
301
302TEST_P(NewKeyGeneration, Rsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600303 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
304 .RsaSigningKey(256, 3)
305 .Digest(KM_DIGEST_NONE)
306 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700307 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600308
Shawn Willden2beb6282015-05-20 16:36:24 -0600309 // Check specified tags are all present, and in the right set.
310 AuthorizationSet crypto_params;
311 AuthorizationSet non_crypto_params;
Shawn Willden6270aca2015-05-26 13:12:24 -0600312 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA)) {
Shawn Willden2beb6282015-05-20 16:36:24 -0600313 EXPECT_NE(0U, hw_enforced().size());
314 EXPECT_NE(0U, sw_enforced().size());
315 crypto_params.push_back(hw_enforced());
316 non_crypto_params.push_back(sw_enforced());
317 } else {
318 EXPECT_EQ(0U, hw_enforced().size());
319 EXPECT_NE(0U, sw_enforced().size());
320 crypto_params.push_back(sw_enforced());
321 }
322
323 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
324 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
325 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 256));
326 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 256));
327 EXPECT_TRUE(contains(crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
328 EXPECT_FALSE(contains(non_crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
329
Shawn Willden6270aca2015-05-26 13:12:24 -0600330 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600331 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden128ffe02014-08-06 12:31:33 -0600332}
333
Shawn Willden58427c42015-05-20 13:00:42 -0600334TEST_P(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700335 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
336 GenerateKey(AuthorizationSetBuilder()
337 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
338 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
339 .SigningKey()));
Shawn Willden2beb6282015-05-20 16:36:24 -0600340
Shawn Willden6270aca2015-05-26 13:12:24 -0600341 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600342}
343
Shawn Willden58427c42015-05-20 13:00:42 -0600344TEST_P(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600345 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600346 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700347 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600348
Shawn Willden6270aca2015-05-26 13:12:24 -0600349 // Check specified tags are all present, and in the right set.
350 AuthorizationSet crypto_params;
351 AuthorizationSet non_crypto_params;
352 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC)) {
353 EXPECT_NE(0U, hw_enforced().size());
354 EXPECT_NE(0U, sw_enforced().size());
355 crypto_params.push_back(hw_enforced());
356 non_crypto_params.push_back(sw_enforced());
357 } else {
358 EXPECT_EQ(0U, hw_enforced().size());
359 EXPECT_NE(0U, sw_enforced().size());
360 crypto_params.push_back(sw_enforced());
361 }
Shawn Willden2beb6282015-05-20 16:36:24 -0600362
Shawn Willden6270aca2015-05-26 13:12:24 -0600363 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC));
364 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC));
365 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 224));
366 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 224));
367
368 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
369 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600370}
371
Shawn Willden58427c42015-05-20 13:00:42 -0600372TEST_P(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden4f83b892015-05-26 12:52:54 -0600373 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
374 GenerateKey(AuthorizationSetBuilder()
375 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_EC)
376 .SigningKey()
377 .Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600378
Shawn Willden6270aca2015-05-26 13:12:24 -0600379 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600380}
381
Shawn Willden58427c42015-05-20 13:00:42 -0600382TEST_P(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden6270aca2015-05-26 13:12:24 -0600383 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
384 ASSERT_EQ(
385 KM_ERROR_UNKNOWN_ERROR,
386 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
387 else
388 ASSERT_EQ(
389 KM_ERROR_UNSUPPORTED_KEY_SIZE,
390 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600391
Shawn Willden6270aca2015-05-26 13:12:24 -0600392 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
393 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600394}
395
Shawn Willden58427c42015-05-20 13:00:42 -0600396TEST_P(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600397 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600398 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600399 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
400 KM_DIGEST_NONE)))
Shawn Willden34419132015-06-08 23:10:44 -0600401 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600402 }
Shawn Willden2beb6282015-05-20 16:36:24 -0600403
Shawn Willden6270aca2015-05-26 13:12:24 -0600404 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
405 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -0600406}
407
Shawn Willden58427c42015-05-20 13:00:42 -0600408TEST_P(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700409 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600410 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden2beb6282015-05-20 16:36:24 -0600411
Shawn Willden6270aca2015-05-26 13:12:24 -0600412 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700413}
414
Shawn Willden58427c42015-05-20 13:00:42 -0600415typedef Keymaster1Test GetKeyCharacteristics;
416INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, GetKeyCharacteristics, test_params);
417
418TEST_P(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600419 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
420 .RsaSigningKey(256, 3)
421 .Digest(KM_DIGEST_NONE)
422 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700423 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600424
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700425 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
426 EXPECT_EQ(original, sw_enforced());
Shawn Willden2beb6282015-05-20 16:36:24 -0600427
Shawn Willden6270aca2015-05-26 13:12:24 -0600428 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600429 EXPECT_EQ(1, GetParam()->keymaster0_calls());
Shawn Willden76364712014-08-11 17:48:04 -0600430}
431
Shawn Willden58427c42015-05-20 13:00:42 -0600432typedef Keymaster1Test SigningOperationsTest;
433INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, SigningOperationsTest, test_params);
434
435TEST_P(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600436 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
437 .RsaSigningKey(256, 3)
438 .Digest(KM_DIGEST_NONE)
439 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700440 string message = "12345678901234567890123456789012";
441 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600442 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600443
Shawn Willden6270aca2015-05-26 13:12:24 -0600444 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600445 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600446}
447
Shawn Willden58427c42015-05-20 13:00:42 -0600448TEST_P(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600449 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
450 .RsaSigningKey(512, 3)
451 .Digest(KM_DIGEST_SHA_2_256)
452 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700453 // Use large message, which won't work without digesting.
454 string message(1024, 'a');
455 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600456 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -0600457
Shawn Willden6270aca2015-05-26 13:12:24 -0600458 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600459 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -0700460}
461
Shawn Willdenbfd9ed72015-06-11 10:51:12 -0600462TEST_P(SigningOperationsTest, RsaPaddingNoneAllowsOther) {
463 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
464 .RsaSigningKey(512, 3)
465 .Digest(KM_DIGEST_NONE)
466 .Padding(KM_PAD_NONE)));
467 string message = "12345678901234567890123456789012";
468 string signature;
469 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
470
471 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
472 EXPECT_EQ(3, GetParam()->keymaster0_calls());
473}
474
Shawn Willden58427c42015-05-20 13:00:42 -0600475TEST_P(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600476 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
477 .RsaSigningKey(512, 3)
478 .Digest(KM_DIGEST_SHA_2_256)
479 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700480 string message(1024, 'a');
481 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600482 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -0600483
Shawn Willden6270aca2015-05-26 13:12:24 -0600484 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600485 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -0700486}
487
Shawn Willden58427c42015-05-20 13:00:42 -0600488TEST_P(SigningOperationsTest, RsaPssSha256TooSmallKey) {
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600489 // Key must be at least 10 bytes larger than hash, to provide eight bytes of random salt, so
490 // verify that nine bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600491 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
492 .RsaSigningKey(256 + 9 * 8, 3)
493 .Digest(KM_DIGEST_SHA_2_256)
494 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700495 string message(1024, 'a');
496 string signature;
497
Shawn Willden226746b2015-05-08 11:36:56 -0600498 AuthorizationSet begin_params(client_params());
499 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600500 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600501 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700502}
503
Shawn Willden58427c42015-05-20 13:00:42 -0600504TEST_P(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600505 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
506 .RsaSigningKey(256, 3)
507 .Digest(KM_DIGEST_NONE)
508 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600509 AuthorizationSet begin_params(client_params());
510 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600511 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600512 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700513 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
514 // Another abort should fail
515 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden2beb6282015-05-20 16:36:24 -0600516
Shawn Willden6270aca2015-05-26 13:12:24 -0600517 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600518 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600519}
520
Shawn Willden58427c42015-05-20 13:00:42 -0600521TEST_P(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600522 GenerateKey(AuthorizationSetBuilder()
523 .RsaSigningKey(256, 3)
524 .Digest(KM_DIGEST_MD5)
525 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700526 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden2beb6282015-05-20 16:36:24 -0600527
Shawn Willden6270aca2015-05-26 13:12:24 -0600528 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600529 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600530}
531
Shawn Willden58427c42015-05-20 13:00:42 -0600532TEST_P(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600533 GenerateKey(AuthorizationSetBuilder()
534 .RsaSigningKey(256, 3)
535 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
536 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600537 AuthorizationSet begin_params(client_params());
538 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
539 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600540
Shawn Willden6270aca2015-05-26 13:12:24 -0600541 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600542 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600543}
544
Shawn Willden58427c42015-05-20 13:00:42 -0600545TEST_P(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700546 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600547 GenerateKey(AuthorizationSetBuilder()
548 .RsaSigningKey(256, 3)
549 .Digest(KM_DIGEST_NONE)
550 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600551 AuthorizationSet begin_params(client_params());
552 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600553 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600554 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600555
Shawn Willden6270aca2015-05-26 13:12:24 -0600556 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600557 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600558}
559
Shawn Willden58427c42015-05-20 13:00:42 -0600560TEST_P(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700561 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600562 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
563 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600564 AuthorizationSet begin_params(client_params());
565 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
566 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600567
Shawn Willden6270aca2015-05-26 13:12:24 -0600568 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600569 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600570}
571
Shawn Willden58427c42015-05-20 13:00:42 -0600572TEST_P(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600573 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
574 .RsaSigningKey(256, 3)
575 .Digest(KM_DIGEST_NONE)
576 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600577 AuthorizationSet begin_params(client_params());
578 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600579 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600580 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600581
582 string message = "1234567890123456789012345678901";
583 string result;
584 size_t input_consumed;
585 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
586 EXPECT_EQ(0U, result.size());
587 EXPECT_EQ(31U, input_consumed);
588
589 string signature;
590 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
591 EXPECT_EQ(0U, signature.length());
Shawn Willden2beb6282015-05-20 16:36:24 -0600592
Shawn Willden6270aca2015-05-26 13:12:24 -0600593 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600594 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600595}
596
Shawn Willden58427c42015-05-20 13:00:42 -0600597TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600598 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
599 .RsaEncryptionKey(256, 3)
600 .Digest(KM_DIGEST_NONE)
601 .Padding(KM_PAD_NONE)));
602 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
603 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600604
Shawn Willden6270aca2015-05-26 13:12:24 -0600605 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600606 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600607}
608
Shawn Willden58427c42015-05-20 13:00:42 -0600609TEST_P(SigningOperationsTest, EcdsaSuccess) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600610 ASSERT_EQ(KM_ERROR_OK,
611 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600612 string message(1024, 'a');
Shawn Willdenedb79942015-05-08 06:46:44 -0600613 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600614 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600615
Shawn Willden6270aca2015-05-26 13:12:24 -0600616 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
617 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600618}
619
Shawn Willdenefbd7e42015-06-01 07:07:33 -0600620TEST_P(SigningOperationsTest, EcdsaSha256Success) {
621 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(
622 KM_DIGEST_SHA_2_256)));
623 string message(1024, 'a');
624 string signature;
625 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
626
627 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
628 EXPECT_EQ(3, GetParam()->keymaster0_calls());
629}
630
Shawn Willden58427c42015-05-20 13:00:42 -0600631TEST_P(SigningOperationsTest, AesEcbSign) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600632 ASSERT_EQ(KM_ERROR_OK,
633 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
634 TAG_BLOCK_MODE, KM_MODE_ECB)));
635 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
636 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600637
Shawn Willden6270aca2015-05-26 13:12:24 -0600638 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600639}
640
Shawn Willden58427c42015-05-20 13:00:42 -0600641TEST_P(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600642 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700643 string message = "12345678901234567890123456789012";
644 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600645 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600646 ASSERT_EQ(20U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600647
Shawn Willden6270aca2015-05-26 13:12:24 -0600648 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700649}
650
Shawn Willden58427c42015-05-20 13:00:42 -0600651TEST_P(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600652 ASSERT_EQ(KM_ERROR_OK,
653 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700654 string message = "12345678901234567890123456789012";
655 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600656 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600657 ASSERT_EQ(28U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600658
Shawn Willden6270aca2015-05-26 13:12:24 -0600659 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700660}
661
Shawn Willden58427c42015-05-20 13:00:42 -0600662TEST_P(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600663 ASSERT_EQ(KM_ERROR_OK,
664 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700665 string message = "12345678901234567890123456789012";
666 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600667 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600668 ASSERT_EQ(32U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600669
Shawn Willden6270aca2015-05-26 13:12:24 -0600670 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700671}
672
Shawn Willden58427c42015-05-20 13:00:42 -0600673TEST_P(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600674 ASSERT_EQ(KM_ERROR_OK,
675 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
676
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700677 string message = "12345678901234567890123456789012";
678 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600679 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600680 ASSERT_EQ(48U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600681
Shawn Willden6270aca2015-05-26 13:12:24 -0600682 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700683}
684
Shawn Willden58427c42015-05-20 13:00:42 -0600685TEST_P(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600686 ASSERT_EQ(KM_ERROR_OK,
687 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700688 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700689 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600690 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600691 ASSERT_EQ(64U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600692
Shawn Willden6270aca2015-05-26 13:12:24 -0600693 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700694}
695
Shawn Willden58427c42015-05-20 13:00:42 -0600696TEST_P(SigningOperationsTest, HmacLengthInKey) {
Shawn Willden09f25272015-04-15 13:49:49 -0600697 // TODO(swillden): unified API should generate an error on key generation.
698 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
699 .HmacKey(128)
700 .Digest(KM_DIGEST_SHA_2_256)
701 .Authorization(TAG_MAC_LENGTH, 20)));
702 string message = "12345678901234567890123456789012";
703 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600704 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600705 // Size in key was ignored.
706 ASSERT_EQ(30U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600707
Shawn Willden6270aca2015-05-26 13:12:24 -0600708 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden09f25272015-04-15 13:49:49 -0600709}
710
Shawn Willden58427c42015-05-20 13:00:42 -0600711TEST_P(SigningOperationsTest, HmacRfc4231TestCase1) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700712 uint8_t key_data[] = {
713 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
714 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
715 };
716 string message = "Hi There";
717 uint8_t sha_224_expected[] = {
718 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
719 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
720 };
721 uint8_t sha_256_expected[] = {
722 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
723 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
724 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
725 };
726 uint8_t sha_384_expected[] = {
727 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
728 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
729 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
730 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
731 };
732 uint8_t sha_512_expected[] = {
733 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
734 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
735 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
736 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
737 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
738 };
739
740 string key = make_string(key_data);
741
742 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
743 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
744 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
745 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600746
Shawn Willden6270aca2015-05-26 13:12:24 -0600747 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700748}
749
Shawn Willden58427c42015-05-20 13:00:42 -0600750TEST_P(SigningOperationsTest, HmacRfc4231TestCase2) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700751 string key = "Jefe";
752 string message = "what do ya want for nothing?";
753 uint8_t sha_224_expected[] = {
754 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
755 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
756 };
757 uint8_t sha_256_expected[] = {
758 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
759 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
760 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
761 };
762 uint8_t sha_384_expected[] = {
763 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
764 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
765 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
766 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
767 };
768 uint8_t sha_512_expected[] = {
769 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
770 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
771 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
772 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
773 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
774 };
775
776 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
777 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
778 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
779 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600780
Shawn Willden6270aca2015-05-26 13:12:24 -0600781 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700782}
783
Shawn Willden58427c42015-05-20 13:00:42 -0600784TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700785 string key(20, 0xaa);
786 string message(50, 0xdd);
787 uint8_t sha_224_expected[] = {
788 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
789 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
790 };
791 uint8_t sha_256_expected[] = {
792 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
793 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
794 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
795 };
796 uint8_t sha_384_expected[] = {
797 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
798 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
799 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
800 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
801 };
802 uint8_t sha_512_expected[] = {
803 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
804 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
805 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
806 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
807 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
808 };
809
810 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
811 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
812 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
813 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600814
Shawn Willden6270aca2015-05-26 13:12:24 -0600815 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700816}
817
Shawn Willden58427c42015-05-20 13:00:42 -0600818TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700819 uint8_t key_data[25] = {
820 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
821 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
822 };
823 string key = make_string(key_data);
824 string message(50, 0xcd);
825 uint8_t sha_224_expected[] = {
826 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
827 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
828 };
829 uint8_t sha_256_expected[] = {
830 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
831 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
832 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
833 };
834 uint8_t sha_384_expected[] = {
835 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
836 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
837 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
838 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
839 };
840 uint8_t sha_512_expected[] = {
841 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
842 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
843 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
844 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
845 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
846 };
847
848 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
849 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
850 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
851 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600852
Shawn Willden6270aca2015-05-26 13:12:24 -0600853 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700854}
855
Shawn Willden58427c42015-05-20 13:00:42 -0600856TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700857 string key(20, 0x0c);
858 string message = "Test With Truncation";
859
860 uint8_t sha_224_expected[] = {
861 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
862 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
863 };
864 uint8_t sha_256_expected[] = {
865 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
866 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
867 };
868 uint8_t sha_384_expected[] = {
869 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
870 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
871 };
872 uint8_t sha_512_expected[] = {
873 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
874 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
875 };
876
877 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
878 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
879 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
880 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600881
Shawn Willden6270aca2015-05-26 13:12:24 -0600882 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700883}
884
Shawn Willden58427c42015-05-20 13:00:42 -0600885TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700886 string key(131, 0xaa);
887 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
888
889 uint8_t sha_224_expected[] = {
890 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
891 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
892 };
893 uint8_t sha_256_expected[] = {
894 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
895 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
896 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
897 };
898 uint8_t sha_384_expected[] = {
899 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
900 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
901 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
902 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
903 };
904 uint8_t sha_512_expected[] = {
905 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
906 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
907 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
908 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
909 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
910 };
911
912 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
913 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
914 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
915 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600916
Shawn Willden6270aca2015-05-26 13:12:24 -0600917 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700918}
919
Shawn Willden58427c42015-05-20 13:00:42 -0600920TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700921 string key(131, 0xaa);
922 string message = "This is a test using a larger than block-size key and a larger than "
923 "block-size data. The key needs to be hashed before being used by the HMAC "
924 "algorithm.";
925
926 uint8_t sha_224_expected[] = {
927 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
928 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
929 };
930 uint8_t sha_256_expected[] = {
931 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
932 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
933 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
934 };
935 uint8_t sha_384_expected[] = {
936 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
937 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
938 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
939 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
940 };
941 uint8_t sha_512_expected[] = {
942 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
943 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
944 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
945 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
946 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
947 };
948
949 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
950 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
951 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
952 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600953
Shawn Willden6270aca2015-05-26 13:12:24 -0600954 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700955}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700956
Shawn Willden58427c42015-05-20 13:00:42 -0600957TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600958 ASSERT_EQ(KM_ERROR_OK,
959 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
960 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600961 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600962 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600963 ASSERT_EQ(KM_ERROR_OK,
964 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
965 string message = "1234567890123456789012345678901";
966 string result;
967 size_t input_consumed;
968 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
969 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden2beb6282015-05-20 16:36:24 -0600970
Shawn Willden6270aca2015-05-26 13:12:24 -0600971 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700972}
973
Shawn Willden61902362014-12-18 10:33:24 -0700974// TODO(swillden): Add more verification failure tests.
975
Shawn Willden58427c42015-05-20 13:00:42 -0600976typedef Keymaster1Test VerificationOperationsTest;
977INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params);
978
979TEST_P(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600980 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
981 .RsaSigningKey(256, 3)
982 .Digest(KM_DIGEST_NONE)
983 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700984 string message = "12345678901234567890123456789012";
985 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600986 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
987 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600988
Shawn Willden6270aca2015-05-26 13:12:24 -0600989 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600990 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600991}
992
Shawn Willden58427c42015-05-20 13:00:42 -0600993TEST_P(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600994 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
995 .RsaSigningKey(512, 3)
996 .Digest(KM_DIGEST_SHA_2_256)
997 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700998 // Use large message, which won't work without digesting.
999 string message(1024, 'a');
1000 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001001 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
1002 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -06001003
Shawn Willden6270aca2015-05-26 13:12:24 -06001004 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001005 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001006}
1007
Shawn Willden58427c42015-05-20 13:00:42 -06001008TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001009 GenerateKey(AuthorizationSetBuilder()
1010 .RsaSigningKey(512, 3)
1011 .Digest(KM_DIGEST_SHA_2_256)
1012 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001013 string message(1024, 'a');
1014 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001015 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001016 ++signature[signature.size() / 2];
1017
Shawn Willden226746b2015-05-08 11:36:56 -06001018 AuthorizationSet begin_params(client_params());
1019 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001020 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001021 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001022
1023 string result;
1024 size_t input_consumed;
1025 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1026 EXPECT_EQ(message.size(), input_consumed);
1027 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001028
Shawn Willden6270aca2015-05-26 13:12:24 -06001029 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001030 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001031}
1032
Shawn Willden58427c42015-05-20 13:00:42 -06001033TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001034 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1035 .RsaSigningKey(512, 3)
1036 .Digest(KM_DIGEST_SHA_2_256)
1037 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001038 // Use large message, which won't work without digesting.
1039 string message(1024, 'a');
1040 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001041 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -07001042 ++message[message.size() / 2];
1043
Shawn Willden226746b2015-05-08 11:36:56 -06001044 AuthorizationSet begin_params(client_params());
1045 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001046 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001047 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001048
1049 string result;
1050 size_t input_consumed;
1051 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1052 EXPECT_EQ(message.size(), input_consumed);
1053 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001054
Shawn Willden6270aca2015-05-26 13:12:24 -06001055 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001056 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001057}
1058
Shawn Willden58427c42015-05-20 13:00:42 -06001059TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001060 GenerateKey(AuthorizationSetBuilder()
1061 .RsaSigningKey(512, 3)
1062 .Digest(KM_DIGEST_SHA_2_256)
1063 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001064 string message(1024, 'a');
1065 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001066 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1067 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -06001068
Shawn Willden6270aca2015-05-26 13:12:24 -06001069 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001070 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001071}
1072
Shawn Willden58427c42015-05-20 13:00:42 -06001073TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001074 GenerateKey(AuthorizationSetBuilder()
1075 .RsaSigningKey(512, 3)
1076 .Digest(KM_DIGEST_SHA_2_256)
1077 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001078 string message(1024, 'a');
1079 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001080 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001081 ++signature[signature.size() / 2];
1082
Shawn Willden226746b2015-05-08 11:36:56 -06001083 AuthorizationSet begin_params(client_params());
1084 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001085 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001086 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001087
1088 string result;
1089 size_t input_consumed;
1090 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1091 EXPECT_EQ(message.size(), input_consumed);
1092 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001093
Shawn Willden6270aca2015-05-26 13:12:24 -06001094 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001095 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001096}
1097
Shawn Willden58427c42015-05-20 13:00:42 -06001098TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001099 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1100 .RsaSigningKey(512, 3)
1101 .Digest(KM_DIGEST_SHA_2_256)
1102 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001103 // Use large message, which won't work without digesting.
1104 string message(1024, 'a');
1105 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001106 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001107 ++message[message.size() / 2];
1108
Shawn Willden226746b2015-05-08 11:36:56 -06001109 AuthorizationSet begin_params(client_params());
1110 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001111 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001112 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001113
1114 string result;
1115 size_t input_consumed;
1116 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1117 EXPECT_EQ(message.size(), input_consumed);
1118 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001119
Shawn Willden6270aca2015-05-26 13:12:24 -06001120 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001121 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001122}
1123
1124template <typename T> vector<T> make_vector(const T* array, size_t len) {
1125 return vector<T>(array, array + len);
1126}
1127
Shawn Willden58427c42015-05-20 13:00:42 -06001128TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001129 // Get all supported digests and padding modes.
1130 size_t digests_len;
1131 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -06001132 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001133 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1134 &digests_len));
1135
1136 size_t padding_modes_len;
1137 keymaster_padding_t* padding_modes;
Shawn Willden0cb69422015-05-26 08:31:37 -06001138 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001139 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1140 &padding_modes, &padding_modes_len));
1141
1142 // Try them.
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001143 int trial_count = 0;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001144 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1145 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001146 if (digest != KM_DIGEST_NONE && padding_mode == KM_PAD_NONE)
1147 // Digesting requires padding
1148 continue;
1149
Shawn Willdenf90f2352014-12-18 23:01:15 -07001150 // Compute key & message size that will work.
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001151 size_t key_bits = 0;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001152 size_t message_len = 1000;
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001153
1154 if (digest == KM_DIGEST_NONE) {
1155 key_bits = 256;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001156 switch (padding_mode) {
1157 case KM_PAD_NONE:
1158 // Match key size.
1159 message_len = key_bits / 8;
1160 break;
1161 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1162 message_len = key_bits / 8 - 11;
1163 break;
1164 case KM_PAD_RSA_PSS:
1165 // PSS requires a digest.
1166 continue;
1167 default:
1168 FAIL() << "Missing padding";
1169 break;
1170 }
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001171 } else {
1172 size_t digest_bits;
1173 switch (digest) {
1174 case KM_DIGEST_MD5:
1175 digest_bits = 128;
1176 break;
1177 case KM_DIGEST_SHA1:
1178 digest_bits = 160;
1179 break;
1180 case KM_DIGEST_SHA_2_224:
1181 digest_bits = 224;
1182 break;
1183 case KM_DIGEST_SHA_2_256:
1184 digest_bits = 256;
1185 break;
1186 case KM_DIGEST_SHA_2_384:
1187 digest_bits = 384;
1188 break;
1189 case KM_DIGEST_SHA_2_512:
1190 digest_bits = 512;
1191 break;
1192 default:
1193 FAIL() << "Missing digest";
1194 }
Shawn Willdenf90f2352014-12-18 23:01:15 -07001195
Shawn Willdenf90f2352014-12-18 23:01:15 -07001196 switch (padding_mode) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001197 case KM_PAD_RSA_PKCS1_1_5_SIGN:
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001198 key_bits = digest_bits + 8 * (11 + 19);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001199 break;
1200 case KM_PAD_RSA_PSS:
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001201 key_bits = digest_bits + 8 * 10;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001202 break;
1203 default:
1204 FAIL() << "Missing padding";
1205 break;
1206 }
Shawn Willdenf90f2352014-12-18 23:01:15 -07001207 }
1208
Shawn Willdenaf533992015-04-15 13:48:28 -06001209 GenerateKey(AuthorizationSetBuilder()
1210 .RsaSigningKey(key_bits, 3)
1211 .Digest(digest)
1212 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001213 string message(message_len, 'a');
1214 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001215 SignMessage(message, &signature, digest, padding_mode);
1216 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001217 ++trial_count;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001218 }
1219 }
1220
1221 free(padding_modes);
1222 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -06001223
Shawn Willden6270aca2015-05-26 13:12:24 -06001224 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001225 EXPECT_EQ(trial_count * 4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001226}
1227
Shawn Willden58427c42015-05-20 13:00:42 -06001228TEST_P(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001229 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001230 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001231 string message = "123456789012345678901234567890123456789012345678";
1232 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001233 SignMessage(message, &signature, KM_DIGEST_NONE);
1234 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001235
Shawn Willden6270aca2015-05-26 13:12:24 -06001236 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1237 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001238}
1239
Shawn Willdenefbd7e42015-06-01 07:07:33 -06001240TEST_P(VerificationOperationsTest, EcdsaSha256Success) {
1241 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1242 .EcdsaSigningKey(256)
1243 .Digest(KM_DIGEST_SHA_2_256)
1244 .Digest(KM_DIGEST_NONE)));
1245 string message = "123456789012345678901234567890123456789012345678";
1246 string signature;
1247 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
1248 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
1249
1250 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1251 EXPECT_EQ(4, GetParam()->keymaster0_calls());
1252
1253 // Just for giggles, try verifying with the wrong digest.
1254 AuthorizationSet begin_params(client_params());
1255 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
1256 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1257
1258 string result;
1259 size_t input_consumed;
1260 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1261 EXPECT_EQ(message.size(), input_consumed);
1262 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1263}
1264
Shawn Willden58427c42015-05-20 13:00:42 -06001265TEST_P(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001266 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001267 string message = "123456789012345678901234567890123456789012345678";
1268 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001269 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1270 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden2beb6282015-05-20 16:36:24 -06001271
Shawn Willden6270aca2015-05-26 13:12:24 -06001272 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001273}
1274
Shawn Willden58427c42015-05-20 13:00:42 -06001275TEST_P(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001276 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001277 string message = "123456789012345678901234567890123456789012345678";
1278 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001279 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1280 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden2beb6282015-05-20 16:36:24 -06001281
Shawn Willden6270aca2015-05-26 13:12:24 -06001282 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001283}
1284
Shawn Willden58427c42015-05-20 13:00:42 -06001285TEST_P(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001286 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001287 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001288 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001289 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1290 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001291
Shawn Willden6270aca2015-05-26 13:12:24 -06001292 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -07001293}
1294
Shawn Willden58427c42015-05-20 13:00:42 -06001295TEST_P(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001296 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001297 string message = "123456789012345678901234567890123456789012345678";
1298 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001299 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1300 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden2beb6282015-05-20 16:36:24 -06001301
Shawn Willden6270aca2015-05-26 13:12:24 -06001302 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001303}
1304
Shawn Willden58427c42015-05-20 13:00:42 -06001305TEST_P(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001306 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001307 string message = "123456789012345678901234567890123456789012345678";
1308 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001309 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1310 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden2beb6282015-05-20 16:36:24 -06001311
Shawn Willden6270aca2015-05-26 13:12:24 -06001312 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001313}
1314
Shawn Willden58427c42015-05-20 13:00:42 -06001315typedef Keymaster1Test ExportKeyTest;
1316INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params);
1317
1318TEST_P(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001319 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1320 .RsaSigningKey(256, 3)
1321 .Digest(KM_DIGEST_NONE)
1322 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001323 string export_data;
1324 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001325 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001326
1327 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001328
Shawn Willden6270aca2015-05-26 13:12:24 -06001329 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001330 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenffd790c2014-08-18 21:20:06 -06001331}
1332
Shawn Willden58427c42015-05-20 13:00:42 -06001333TEST_P(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001334 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001335 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001336 string export_data;
1337 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001338 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001339
1340 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001341
Shawn Willden6270aca2015-05-26 13:12:24 -06001342 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1343 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001344}
1345
Shawn Willden58427c42015-05-20 13:00:42 -06001346TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001347 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1348 .RsaSigningKey(256, 3)
1349 .Digest(KM_DIGEST_NONE)
1350 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001351 string export_data;
1352 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001353
Shawn Willden6270aca2015-05-26 13:12:24 -06001354 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001355 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001356}
1357
Shawn Willden58427c42015-05-20 13:00:42 -06001358TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001359 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1360 .RsaSigningKey(256, 3)
1361 .Digest(KM_DIGEST_NONE)
1362 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001363 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001364 string export_data;
1365 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001366
Shawn Willden6270aca2015-05-26 13:12:24 -06001367 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001368 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001369}
1370
Shawn Willden58427c42015-05-20 13:00:42 -06001371TEST_P(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001372 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001373 string export_data;
1374
1375 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1376 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1377 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001378
Shawn Willden6270aca2015-05-26 13:12:24 -06001379 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden7dad93b2015-02-05 10:20:47 -07001380}
1381
Shawn Willden437fbd12014-08-20 11:59:49 -06001382static string read_file(const string& file_name) {
1383 ifstream file_stream(file_name, std::ios::binary);
1384 istreambuf_iterator<char> file_begin(file_stream);
1385 istreambuf_iterator<char> file_end;
1386 return string(file_begin, file_end);
1387}
1388
Shawn Willden58427c42015-05-20 13:00:42 -06001389typedef Keymaster1Test ImportKeyTest;
1390INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params);
1391
1392TEST_P(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001393 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001394 ASSERT_EQ(633U, pk8_key.size());
1395
Shawn Willdenaf533992015-04-15 13:48:28 -06001396 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1397 .RsaSigningKey(1024, 65537)
1398 .Digest(KM_DIGEST_NONE)
1399 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001400 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001401
1402 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001403 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1404 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001405 TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6270aca2015-05-26 13:12:24 -06001406 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1407 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001408 TAG_KEY_SIZE, 1024));
Shawn Willden6270aca2015-05-26 13:12:24 -06001409 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1410 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001411 TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001412
Shawn Willdenb6837e72015-05-16 09:20:59 -06001413 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001414 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1415 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001416
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001417 string message(1024 / 8, 'a');
1418 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001419 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1420 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001421
Shawn Willden6270aca2015-05-26 13:12:24 -06001422 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001423 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden437fbd12014-08-20 11:59:49 -06001424}
1425
Shawn Willden58427c42015-05-20 13:00:42 -06001426TEST_P(ImportKeyTest, OldApiRsaSuccess) {
Shawn Willdend7a5c712015-04-09 16:33:52 -06001427 string pk8_key = read_file("rsa_privkey_pk8.der");
1428 ASSERT_EQ(633U, pk8_key.size());
1429
1430 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1431 // point softkeymaster will no longer support keymaster0 APIs anyway.
1432 uint8_t* key_blob;
1433 size_t key_blob_length;
1434 ASSERT_EQ(0,
1435 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1436 pk8_key.size(), &key_blob, &key_blob_length));
1437 set_key_blob(key_blob, key_blob_length);
1438
1439 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001440 AuthorizationSet begin_params; // Don't use client data.
1441 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001442 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001443 AuthorizationSet update_params;
1444 AuthorizationSet output_params;
1445 string signature =
1446 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1447 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1448 &output_params);
Shawn Willden2beb6282015-05-20 16:36:24 -06001449
Shawn Willden6270aca2015-05-26 13:12:24 -06001450 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001451 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdend7a5c712015-04-09 16:33:52 -06001452}
1453
Shawn Willden58427c42015-05-20 13:00:42 -06001454TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001455 string pk8_key = read_file("rsa_privkey_pk8.der");
1456 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001457 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001458 ImportKey(AuthorizationSetBuilder()
1459 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1460 .Digest(KM_DIGEST_NONE)
1461 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001462 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001463
Shawn Willden6270aca2015-05-26 13:12:24 -06001464 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001465}
1466
Shawn Willden58427c42015-05-20 13:00:42 -06001467TEST_P(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001468 string pk8_key = read_file("rsa_privkey_pk8.der");
1469 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001470 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001471 ImportKey(AuthorizationSetBuilder()
1472 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1473 .Digest(KM_DIGEST_NONE)
1474 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001475 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001476
Shawn Willden6270aca2015-05-26 13:12:24 -06001477 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001478}
1479
Shawn Willden58427c42015-05-20 13:00:42 -06001480TEST_P(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001481 string pk8_key = read_file("ec_privkey_pk8.der");
1482 ASSERT_EQ(138U, pk8_key.size());
1483
Shawn Willdenaf533992015-04-15 13:48:28 -06001484 ASSERT_EQ(KM_ERROR_OK,
1485 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1486 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001487
1488 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001489 EXPECT_TRUE(
1490 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1491 TAG_ALGORITHM, KM_ALGORITHM_EC));
1492 EXPECT_TRUE(
1493 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1494 TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001495
Shawn Willdenb6837e72015-05-16 09:20:59 -06001496 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001497 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1498 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001499
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001500 string message(1024 / 8, 'a');
1501 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001502 SignMessage(message, &signature, KM_DIGEST_NONE);
1503 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001504
Shawn Willden6270aca2015-05-26 13:12:24 -06001505 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1506 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden81effc62014-08-27 10:08:46 -06001507}
1508
Shawn Willden58427c42015-05-20 13:00:42 -06001509TEST_P(ImportKeyTest, EcdsaSizeSpecified) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001510 string pk8_key = read_file("ec_privkey_pk8.der");
1511 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001512
Shawn Willdenaf533992015-04-15 13:48:28 -06001513 ASSERT_EQ(KM_ERROR_OK,
1514 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1515 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001516
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001517 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001518 EXPECT_TRUE(
1519 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1520 TAG_ALGORITHM, KM_ALGORITHM_EC));
1521 EXPECT_TRUE(
1522 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1523 TAG_KEY_SIZE, 256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001524
Shawn Willdenb6837e72015-05-16 09:20:59 -06001525 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001526 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1527 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1528
1529 string message(1024 / 8, 'a');
1530 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001531 SignMessage(message, &signature, KM_DIGEST_NONE);
1532 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001533
Shawn Willden6270aca2015-05-26 13:12:24 -06001534 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1535 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001536}
1537
Shawn Willden58427c42015-05-20 13:00:42 -06001538TEST_P(ImportKeyTest, EcdsaSizeMismatch) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001539 string pk8_key = read_file("ec_privkey_pk8.der");
1540 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001541 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001542 ImportKey(AuthorizationSetBuilder()
1543 .EcdsaSigningKey(224 /* Doesn't match key */)
1544 .Digest(KM_DIGEST_NONE),
1545 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001546
Shawn Willden6270aca2015-05-26 13:12:24 -06001547 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001548}
1549
Shawn Willden58427c42015-05-20 13:00:42 -06001550TEST_P(ImportKeyTest, AesKeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001551 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1552 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001553 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001554 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1555 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001556 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001557
1558 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1559 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1560
1561 string message = "Hello World!";
Shawn Willdenc4424672015-05-11 11:56:02 -06001562 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1563 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willden3b702e22015-02-05 10:26:47 -07001564 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001565
Shawn Willden6270aca2015-05-26 13:12:24 -06001566 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001567}
1568
Shawn Willden58427c42015-05-20 13:00:42 -06001569TEST_P(ImportKeyTest, HmacSha256KeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001570 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1571 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001572 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1573 .HmacKey(sizeof(key_data) * 8)
1574 .Digest(KM_DIGEST_SHA_2_256)
1575 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001576 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001577
1578 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1579 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1580
1581 string message = "Hello World!";
1582 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001583 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1584 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001585
Shawn Willden6270aca2015-05-26 13:12:24 -06001586 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001587}
1588
Shawn Willden58427c42015-05-20 13:00:42 -06001589typedef Keymaster1Test EncryptionOperationsTest;
1590INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params);
1591
Shawn Willden30160842015-06-01 08:31:00 -06001592TEST_P(EncryptionOperationsTest, RsaNoPaddingSuccess) {
1593 ASSERT_EQ(KM_ERROR_OK,
1594 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1595
1596 string message = "12345678901234567890123456789012";
1597 string ciphertext1 = EncryptMessage(string(message), KM_PAD_NONE);
1598 EXPECT_EQ(256U / 8, ciphertext1.size());
1599
1600 string ciphertext2 = EncryptMessage(string(message), KM_PAD_NONE);
1601 EXPECT_EQ(256U / 8, ciphertext2.size());
1602
1603 // Unpadded RSA is deterministic
1604 EXPECT_EQ(ciphertext1, ciphertext2);
1605
1606 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1607 EXPECT_EQ(3, GetParam()->keymaster0_calls());
1608}
1609
1610TEST_P(EncryptionOperationsTest, RsaNoPaddingTooShort) {
1611 ASSERT_EQ(KM_ERROR_OK,
1612 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1613
1614 string message = "1234567890123456789012345678901";
1615
1616 AuthorizationSet begin_params(client_params());
1617 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
1618 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1619
1620 string result;
1621 size_t input_consumed;
1622 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1623 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
1624 EXPECT_EQ(0U, result.size());
1625
1626 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1627 EXPECT_EQ(2, GetParam()->keymaster0_calls());
1628}
1629
1630TEST_P(EncryptionOperationsTest, RsaNoPaddingTooLong) {
1631 ASSERT_EQ(KM_ERROR_OK,
1632 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1633
1634 string message = "123456789012345678901234567890123";
1635
1636 AuthorizationSet begin_params(client_params());
1637 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
1638 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1639
1640 string result;
1641 size_t input_consumed;
1642 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1643 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
1644 EXPECT_EQ(0U, result.size());
1645
1646 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1647 EXPECT_EQ(2, GetParam()->keymaster0_calls());
1648}
1649
Shawn Willden58427c42015-05-20 13:00:42 -06001650TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001651 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1652 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001653
1654 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001655 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001656 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001657
Shawn Willden3ad5f052015-05-08 14:05:13 -06001658 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001659 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001660
1661 // OAEP randomizes padding so every result should be different.
1662 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001663
Shawn Willden6270aca2015-05-26 13:12:24 -06001664 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001665 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001666}
1667
Shawn Willden58427c42015-05-20 13:00:42 -06001668TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001669 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1670 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001671 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001672 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001673 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001674
Shawn Willden3ad5f052015-05-08 14:05:13 -06001675 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001676 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001677
Shawn Willden6270aca2015-05-26 13:12:24 -06001678 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001679 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001680}
1681
Shawn Willden58427c42015-05-20 13:00:42 -06001682TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001683 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1684 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001685 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001686 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001687 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001688
Shawn Willden3ad5f052015-05-08 14:05:13 -06001689 AuthorizationSet begin_params(client_params());
1690 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1691 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001692 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001693 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001694 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001695
Shawn Willden6270aca2015-05-26 13:12:24 -06001696 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001697 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001698}
1699
Shawn Willden58427c42015-05-20 13:00:42 -06001700TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001701 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1702 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001703 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001704 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001705 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001706
1707 // Corrupt the ciphertext
1708 ciphertext[512 / 8 / 2]++;
1709
Shawn Willden4200f212014-12-02 07:01:21 -07001710 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001711 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001712 AuthorizationSet begin_params(client_params());
1713 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1714 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001715 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001716 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001717 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001718
Shawn Willden6270aca2015-05-26 13:12:24 -06001719 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001720 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001721}
1722
Shawn Willden58427c42015-05-20 13:00:42 -06001723TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001724 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1725 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001726 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001727 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001728 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001729
Shawn Willden3ad5f052015-05-08 14:05:13 -06001730 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001731 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001732
1733 // PKCS1 v1.5 randomizes padding so every result should be different.
1734 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001735
Shawn Willden6270aca2015-05-26 13:12:24 -06001736 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001737 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001738}
1739
Shawn Willden58427c42015-05-20 13:00:42 -06001740TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001741 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1742 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001743 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001744 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001745 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001746
Shawn Willden3ad5f052015-05-08 14:05:13 -06001747 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001748 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001749
Shawn Willden6270aca2015-05-26 13:12:24 -06001750 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001751 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001752}
1753
Shawn Willden58427c42015-05-20 13:00:42 -06001754TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001755 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1756 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willden7bae1322015-05-26 10:16:49 -06001757 string message = "123456789012345678901234567890123456789012345678901234";
Shawn Willden4200f212014-12-02 07:01:21 -07001758 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001759 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001760
Shawn Willden3ad5f052015-05-08 14:05:13 -06001761 AuthorizationSet begin_params(client_params());
1762 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1763 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001764 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001765 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001766 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001767
Shawn Willden6270aca2015-05-26 13:12:24 -06001768 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001769 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001770}
1771
Shawn Willden58427c42015-05-20 13:00:42 -06001772TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001773 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1774 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001775 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001776 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001777 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001778
1779 // Corrupt the ciphertext
1780 ciphertext[512 / 8 / 2]++;
1781
Shawn Willden4200f212014-12-02 07:01:21 -07001782 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001783 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001784 AuthorizationSet begin_params(client_params());
1785 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1786 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001787 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001788 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001789 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001790
Shawn Willden6270aca2015-05-26 13:12:24 -06001791 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001792 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001793}
1794
Shawn Willden58427c42015-05-20 13:00:42 -06001795TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001796 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1797 .RsaSigningKey(256, 3)
1798 .Digest(KM_DIGEST_NONE)
1799 .Padding(KM_PAD_NONE)));
1800 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1801 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001802
Shawn Willden6270aca2015-05-26 13:12:24 -06001803 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001804 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001805}
1806
Shawn Willden58427c42015-05-20 13:00:42 -06001807TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001808 ASSERT_EQ(KM_ERROR_OK,
1809 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1810 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1811 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001812
Shawn Willden6270aca2015-05-26 13:12:24 -06001813 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1814 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001815}
1816
Shawn Willden58427c42015-05-20 13:00:42 -06001817TEST_P(EncryptionOperationsTest, HmacEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001818 ASSERT_EQ(
1819 KM_ERROR_OK,
1820 GenerateKey(
1821 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1822 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1823 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001824
Shawn Willden6270aca2015-05-26 13:12:24 -06001825 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001826}
1827
Shawn Willden58427c42015-05-20 13:00:42 -06001828TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001829 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1830 .AesEncryptionKey(128)
1831 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1832 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001833 // Two-block message.
1834 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001835 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001836 EXPECT_EQ(message.size(), ciphertext1.size());
1837
Shawn Willden31e063f2015-05-08 14:31:22 -06001838 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001839 EXPECT_EQ(message.size(), ciphertext2.size());
1840
1841 // ECB is deterministic.
1842 EXPECT_EQ(ciphertext1, ciphertext2);
1843
Shawn Willden31e063f2015-05-08 14:31:22 -06001844 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001845 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001846
Shawn Willden6270aca2015-05-26 13:12:24 -06001847 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001848}
1849
Shawn Willden58427c42015-05-20 13:00:42 -06001850TEST_P(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001851 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1852 .AesEncryptionKey(128)
1853 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1854 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001855 // Message is slightly shorter than two blocks.
1856 string message = "1234567890123456789012345678901";
1857
Shawn Willden31e063f2015-05-08 14:31:22 -06001858 AuthorizationSet begin_params(client_params());
1859 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001860 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001861 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001862 string ciphertext;
1863 size_t input_consumed;
1864 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1865 EXPECT_EQ(message.size(), input_consumed);
1866 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001867
Shawn Willden6270aca2015-05-26 13:12:24 -06001868 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001869}
1870
Shawn Willden58427c42015-05-20 13:00:42 -06001871TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001872 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001873 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001874 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1875 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001876
1877 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001878 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001879 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001880 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001881 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001882 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001883 EXPECT_EQ(message, plaintext);
1884 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001885
Shawn Willden6270aca2015-05-26 13:12:24 -06001886 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001887}
1888
Shawn Willden58427c42015-05-20 13:00:42 -06001889TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001890 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001891 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001892 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1893 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001894
1895 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001896 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001897 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001898 EXPECT_NE(ciphertext, message);
1899 ++ciphertext[ciphertext.size() / 2];
1900
Shawn Willden31e063f2015-05-08 14:31:22 -06001901 AuthorizationSet begin_params(client_params());
1902 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001903 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
Shawn Willden31e063f2015-05-08 14:31:22 -06001904 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001905 string plaintext;
1906 size_t input_consumed;
1907 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1908 EXPECT_EQ(ciphertext.size(), input_consumed);
1909 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001910
Shawn Willden6270aca2015-05-26 13:12:24 -06001911 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001912}
1913
Shawn Willden58427c42015-05-20 13:00:42 -06001914TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001915 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1916 .AesEncryptionKey(128)
1917 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1918 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001919 string message = "123";
1920 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001921 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001922 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001923 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001924
1925 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001926 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001927 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001928 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001929
1930 // IVs should be random, so ciphertexts should differ.
1931 EXPECT_NE(iv1, iv2);
1932 EXPECT_NE(ciphertext1, ciphertext2);
1933
Shawn Willden31e063f2015-05-08 14:31:22 -06001934 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001935 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001936
Shawn Willden6270aca2015-05-26 13:12:24 -06001937 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001938}
1939
Shawn Willden58427c42015-05-20 13:00:42 -06001940TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001941 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1942 .AesEncryptionKey(128)
1943 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1944 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001945
1946 int increment = 15;
1947 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001948 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001949 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001950 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001951 AuthorizationSet output_params;
1952 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1953
1954 string ciphertext;
1955 size_t input_consumed;
1956 for (size_t i = 0; i < message.size(); i += increment)
1957 EXPECT_EQ(KM_ERROR_OK,
1958 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1959 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1960 EXPECT_EQ(message.size(), ciphertext.size());
1961
1962 // Move TAG_NONCE into input_params
1963 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001964 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001965 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001966 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001967 output_params.Clear();
1968
1969 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1970 string plaintext;
1971 for (size_t i = 0; i < ciphertext.size(); i += increment)
1972 EXPECT_EQ(KM_ERROR_OK,
1973 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1974 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1975 EXPECT_EQ(ciphertext.size(), plaintext.size());
1976 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001977
Shawn Willden6270aca2015-05-26 13:12:24 -06001978 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07001979}
1980
1981struct AesCtrSp80038aTestVector {
1982 const char* key;
1983 const char* nonce;
1984 const char* plaintext;
1985 const char* ciphertext;
1986};
1987
1988// These test vectors are taken from
1989// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1990static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1991 // AES-128
1992 {
1993 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1994 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1995 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1996 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1997 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1998 },
1999 // AES-192
2000 {
2001 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2002 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2003 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2004 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
2005 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
2006 },
2007 // AES-256
2008 {
2009 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
2010 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2011 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2012 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2013 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
2014 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
2015 },
2016};
2017
Shawn Willden58427c42015-05-20 13:00:42 -06002018TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
Thai Duong20d725d2015-03-24 17:49:58 -07002019 for (size_t i = 0; i < 3; i++) {
2020 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
2021 const string key = hex2str(test.key);
2022 const string nonce = hex2str(test.nonce);
2023 const string plaintext = hex2str(test.plaintext);
2024 const string ciphertext = hex2str(test.ciphertext);
2025 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
2026 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002027
Shawn Willden6270aca2015-05-26 13:12:24 -06002028 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002029}
2030
Shawn Willden58427c42015-05-20 13:00:42 -06002031TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
Thai Duong20d725d2015-03-24 17:49:58 -07002032 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2033 .AesEncryptionKey(128)
2034 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
2035 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06002036 AuthorizationSet begin_params(client_params());
2037 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002038 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06002039 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002040
Shawn Willden6270aca2015-05-26 13:12:24 -06002041 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002042}
2043
Shawn Willden58427c42015-05-20 13:00:42 -06002044TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
Thai Duong20d725d2015-03-24 17:49:58 -07002045 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2046 .AesEncryptionKey(128)
2047 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002048 .Authorization(TAG_CALLER_NONCE)
2049 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07002050
Shawn Willden09f25272015-04-15 13:49:49 -06002051 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002052 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002053 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07002054 input_params.push_back(TAG_NONCE, "123", 3);
2055 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002056
Shawn Willden6270aca2015-05-26 13:12:24 -06002057 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002058}
2059
Shawn Willden58427c42015-05-20 13:00:42 -06002060TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002061 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2062 .AesEncryptionKey(128)
2063 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2064 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002065 // Two-block message.
2066 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002067 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06002068 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002069 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002070
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002071 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06002072 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002073 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002074
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002075 // IVs should be random, so ciphertexts should differ.
2076 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002077 EXPECT_NE(ciphertext1, ciphertext2);
2078
Shawn Willden31e063f2015-05-08 14:31:22 -06002079 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002080 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002081
Shawn Willden6270aca2015-05-26 13:12:24 -06002082 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002083}
2084
Shawn Willden58427c42015-05-20 13:00:42 -06002085TEST_P(EncryptionOperationsTest, AesCallerNonce) {
Shawn Willden969aa382015-04-15 17:05:53 -07002086 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2087 .AesEncryptionKey(128)
2088 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002089 .Authorization(TAG_CALLER_NONCE)
2090 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07002091 string message = "12345678901234567890123456789012";
2092 string iv1;
2093 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002094 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002095 EXPECT_EQ(message.size(), ciphertext1.size());
2096 EXPECT_EQ(16U, iv1.size());
2097
Shawn Willden31e063f2015-05-08 14:31:22 -06002098 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002099 EXPECT_EQ(message, plaintext);
2100
2101 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06002102 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07002103 AuthorizationSet update_params;
2104 AuthorizationSet output_params;
2105 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002106 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002107 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002108 string ciphertext2 =
2109 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
2110
2111 // Decrypt with correct nonce.
2112 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2113 &output_params);
2114 EXPECT_EQ(message, plaintext);
2115
2116 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06002117 input_params.Reinitialize(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002118 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002119 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002120 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
2121 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2122 &output_params);
2123 EXPECT_NE(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002124
Shawn Willden6270aca2015-05-26 13:12:24 -06002125 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden969aa382015-04-15 17:05:53 -07002126}
2127
Shawn Willden58427c42015-05-20 13:00:42 -06002128TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002129 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2130 .AesEncryptionKey(128)
2131 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2132 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06002133
2134 string message = "12345678901234567890123456789012";
2135 string iv1;
2136 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002137 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002138 EXPECT_EQ(message.size(), ciphertext1.size());
2139 EXPECT_EQ(16U, iv1.size());
2140
Shawn Willden31e063f2015-05-08 14:31:22 -06002141 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002142 EXPECT_EQ(message, plaintext);
2143
2144 // Now specify a nonce, should fail.
2145 AuthorizationSet input_params(client_params());
2146 AuthorizationSet update_params;
2147 AuthorizationSet output_params;
2148 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002149 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002150 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden67706352015-04-28 00:43:19 -06002151
2152 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
2153 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002154
Shawn Willden6270aca2015-05-26 13:12:24 -06002155 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden67706352015-04-28 00:43:19 -06002156}
2157
Shawn Willden58427c42015-05-20 13:00:42 -06002158TEST_P(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002159 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2160 .AesEncryptionKey(128)
2161 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2162 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002163
2164 int increment = 15;
2165 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06002166 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002167 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002168 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002169 AuthorizationSet output_params;
2170 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2171
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002172 string ciphertext;
2173 size_t input_consumed;
2174 for (size_t i = 0; i < message.size(); i += increment)
2175 EXPECT_EQ(KM_ERROR_OK,
2176 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2177 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002178 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002179
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002180 // Move TAG_NONCE into input_params
2181 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06002182 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002183 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002184 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002185 output_params.Clear();
2186
2187 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002188 string plaintext;
2189 for (size_t i = 0; i < ciphertext.size(); i += increment)
2190 EXPECT_EQ(KM_ERROR_OK,
2191 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2192 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002193 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002194 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002195
Shawn Willden6270aca2015-05-26 13:12:24 -06002196 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002197}
2198
Shawn Willden58427c42015-05-20 13:00:42 -06002199TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002200 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002201 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002202 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2203 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002204
2205 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06002206 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002207 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002208 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06002209 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002210 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06002211 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002212 EXPECT_EQ(message, plaintext);
2213 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002214
Shawn Willden6270aca2015-05-26 13:12:24 -06002215 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002216}
2217
Shawn Willden0f392562015-06-02 09:00:52 -06002218TEST_P(EncryptionOperationsTest, AesGcmRoundTripSuccess) {
2219 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2220 .AesEncryptionKey(128)
2221 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2222 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2223 string aad = "foobar";
2224 string message = "123456789012345678901234567890123456";
2225 AuthorizationSet begin_params(client_params());
2226 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2227 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2228 begin_params.push_back(TAG_MAC_LENGTH, 128);
Shawn Willden0f392562015-06-02 09:00:52 -06002229
2230 AuthorizationSet update_params;
2231 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
Shawn Willden0f392562015-06-02 09:00:52 -06002232
2233 // Encrypt
Shawn Willden34419132015-06-08 23:10:44 -06002234 AuthorizationSet begin_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002235 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002236 string ciphertext;
2237 size_t input_consumed;
2238 AuthorizationSet update_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002239 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2240 &input_consumed));
2241 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002242 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002243
Shawn Willden34419132015-06-08 23:10:44 -06002244 // Grab nonce
Shawn Willden0f392562015-06-02 09:00:52 -06002245 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
Shawn Willden0f392562015-06-02 09:00:52 -06002246 begin_params.push_back(begin_out_params);
Shawn Willden0f392562015-06-02 09:00:52 -06002247
2248 // Decrypt.
Shawn Willden34419132015-06-08 23:10:44 -06002249 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2250 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002251 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2252 &plaintext, &input_consumed));
2253 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002254 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002255
2256 EXPECT_EQ(message, plaintext);
2257 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2258}
2259
Shawn Willden34419132015-06-08 23:10:44 -06002260TEST_P(EncryptionOperationsTest, AesGcmCorruptKey) {
2261 uint8_t nonce[] = {
2262 0xb7, 0x94, 0x37, 0xae, 0x08, 0xff, 0x35, 0x5d, 0x7d, 0x8a, 0x4d, 0x0f,
2263 };
2264 uint8_t ciphertext[] = {
2265 0xb3, 0xf6, 0x79, 0x9e, 0x8f, 0x93, 0x26, 0xf2, 0xdf, 0x1e, 0x80, 0xfc, 0xd2, 0xcb, 0x16,
2266 0xd7, 0x8c, 0x9d, 0xc7, 0xcc, 0x14, 0xbb, 0x67, 0x78, 0x62, 0xdc, 0x6c, 0x63, 0x9b, 0x3a,
2267 0x63, 0x38, 0xd2, 0x4b, 0x31, 0x2d, 0x39, 0x89, 0xe5, 0x92, 0x0b, 0x5d, 0xbf, 0xc9, 0x76,
2268 0x76, 0x5e, 0xfb, 0xfe, 0x57, 0xbb, 0x38, 0x59, 0x40, 0xa7, 0xa4, 0x3b, 0xdf, 0x05, 0xbd,
2269 0xda, 0xe3, 0xc9, 0xd6, 0xa2, 0xfb, 0xbd, 0xfc, 0xc0, 0xcb, 0xa0,
2270 };
2271 string ciphertext_str(reinterpret_cast<char*>(ciphertext), sizeof(ciphertext));
2272
2273 AuthorizationSet begin_params(client_params());
2274 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2275 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2276 begin_params.push_back(TAG_MAC_LENGTH, 128);
2277 begin_params.push_back(TAG_NONCE, nonce, sizeof(nonce));
2278
2279 string plaintext;
2280 size_t input_consumed;
2281
2282 // Import correct key and decrypt
2283 uint8_t good_key[] = {
2284 0xba, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d,
2285 0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb,
2286 };
2287 string good_key_str(reinterpret_cast<char*>(good_key), sizeof(good_key));
2288 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
2289 .AesEncryptionKey(128)
2290 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2291 .Authorization(TAG_PADDING, KM_PAD_NONE)
2292 .Authorization(TAG_CALLER_NONCE),
2293 KM_KEY_FORMAT_RAW, good_key_str));
2294 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2295 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext_str, &plaintext, &input_consumed));
2296 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2297
2298 // Import bad key and decrypt
2299 uint8_t bad_key[] = {
2300 0xbb, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d,
2301 0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb,
2302 };
2303 string bad_key_str(reinterpret_cast<char*>(bad_key), sizeof(bad_key));
2304 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
2305 .AesEncryptionKey(128)
2306 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2307 .Authorization(TAG_PADDING, KM_PAD_NONE),
2308 KM_KEY_FORMAT_RAW, bad_key_str));
2309 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2310 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext_str, &plaintext, &input_consumed));
2311 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
2312
2313 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2314}
2315
2316TEST_P(EncryptionOperationsTest, AesGcmAadNoData) {
2317 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2318 .AesEncryptionKey(128)
2319 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2320 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2321 string aad = "123456789012345678";
2322 string empty_message;
2323 AuthorizationSet begin_params(client_params());
2324 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2325 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2326 begin_params.push_back(TAG_MAC_LENGTH, 128);
2327
2328 AuthorizationSet update_params;
2329 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
2330
2331 // Encrypt
2332 AuthorizationSet begin_out_params;
2333 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2334 string ciphertext;
2335 size_t input_consumed;
2336 AuthorizationSet update_out_params;
2337 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, empty_message, &update_out_params,
2338 &ciphertext, &input_consumed));
2339 EXPECT_EQ(0U, input_consumed);
2340 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2341
2342 // Grab nonce
2343 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2344 begin_params.push_back(begin_out_params);
2345
2346 // Decrypt.
2347 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2348 string plaintext;
2349 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2350 &plaintext, &input_consumed));
2351 EXPECT_EQ(ciphertext.size(), input_consumed);
2352 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2353
2354 EXPECT_EQ(empty_message, plaintext);
2355 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2356}
2357
2358TEST_P(EncryptionOperationsTest, AesGcmIncremental) {
2359 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2360 .AesEncryptionKey(128)
2361 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2362 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2363 AuthorizationSet begin_params(client_params());
2364 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2365 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2366 begin_params.push_back(TAG_MAC_LENGTH, 128);
2367
2368 AuthorizationSet update_params;
2369 update_params.push_back(TAG_ASSOCIATED_DATA, "b", 1);
2370
2371 // Encrypt
2372 AuthorizationSet begin_out_params;
2373 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2374 string ciphertext;
2375 size_t input_consumed;
2376 AuthorizationSet update_out_params;
2377
2378 // Send AAD, incrementally
2379 for (int i = 0; i < 1000; ++i) {
2380 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "", &update_out_params, &ciphertext,
2381 &input_consumed));
2382 EXPECT_EQ(0U, input_consumed);
2383 EXPECT_EQ(0U, ciphertext.size());
2384 }
2385
2386 // Now send data, incrementally, no data.
2387 AuthorizationSet empty_params;
2388 for (int i = 0; i < 1000; ++i) {
2389 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(empty_params, "a", &update_out_params, &ciphertext,
2390 &input_consumed));
2391 EXPECT_EQ(1U, input_consumed);
2392 }
2393 EXPECT_EQ(1000U, ciphertext.size());
2394
2395 // And finish.
2396 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2397 EXPECT_EQ(1016U, ciphertext.size());
2398
2399 // Grab nonce
2400 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2401 begin_params.push_back(begin_out_params);
2402
2403 // Decrypt.
2404 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2405 string plaintext;
2406
2407 // Send AAD, incrementally, no data
2408 for (int i = 0; i < 1000; ++i) {
2409 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "", &update_out_params, &plaintext,
2410 &input_consumed));
2411 EXPECT_EQ(0U, input_consumed);
2412 EXPECT_EQ(0U, plaintext.size());
2413 }
2414
2415 // Now send data, incrementally.
2416 for (size_t i = 0; i < ciphertext.length(); ++i) {
2417 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(empty_params, string(ciphertext.data() + i, 1),
2418 &update_out_params, &plaintext, &input_consumed));
2419 EXPECT_EQ(1U, input_consumed);
2420 }
2421 EXPECT_EQ(1000U, plaintext.size());
2422 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2423
2424 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2425}
2426
Shawn Willden0f392562015-06-02 09:00:52 -06002427TEST_P(EncryptionOperationsTest, AesGcmMultiPartAad) {
2428 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2429 .AesEncryptionKey(128)
2430 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2431 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2432 string message = "123456789012345678901234567890123456";
2433 AuthorizationSet begin_params(client_params());
2434 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2435 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2436 begin_params.push_back(TAG_MAC_LENGTH, 128);
2437 AuthorizationSet begin_out_params;
2438
2439 AuthorizationSet update_params;
2440 update_params.push_back(TAG_ASSOCIATED_DATA, "foo", 3);
Shawn Willden0f392562015-06-02 09:00:52 -06002441
2442 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2443
2444 // No data, AAD only.
Shawn Willden34419132015-06-08 23:10:44 -06002445 string ciphertext;
2446 size_t input_consumed;
2447 AuthorizationSet update_out_params;
2448 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "" /* message */, &update_out_params,
2449 &ciphertext, &input_consumed));
2450 EXPECT_EQ(0U, input_consumed);
Shawn Willden0f392562015-06-02 09:00:52 -06002451
2452 // AAD and data.
2453 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2454 &input_consumed));
2455 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002456 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002457
Shawn Willden34419132015-06-08 23:10:44 -06002458 // Grab nonce.
Shawn Willden0f392562015-06-02 09:00:52 -06002459 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2460 begin_params.push_back(begin_out_params);
2461
Shawn Willden34419132015-06-08 23:10:44 -06002462 // Decrypt
2463 update_params.Clear();
2464 update_params.push_back(TAG_ASSOCIATED_DATA, "foofoo", 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002465
Shawn Willden34419132015-06-08 23:10:44 -06002466 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2467 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002468 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2469 &plaintext, &input_consumed));
2470 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002471 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002472
2473 EXPECT_EQ(message, plaintext);
2474 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2475}
2476
2477TEST_P(EncryptionOperationsTest, AesGcmBadAad) {
2478 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2479 .AesEncryptionKey(128)
2480 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2481 .Authorization(TAG_PADDING, KM_PAD_NONE)));
Shawn Willden0f392562015-06-02 09:00:52 -06002482 string message = "12345678901234567890123456789012";
2483 AuthorizationSet begin_params(client_params());
2484 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2485 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2486 begin_params.push_back(TAG_MAC_LENGTH, 128);
Shawn Willden0f392562015-06-02 09:00:52 -06002487
2488 AuthorizationSet update_params;
Shawn Willden34419132015-06-08 23:10:44 -06002489 update_params.push_back(TAG_ASSOCIATED_DATA, "foobar", 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002490
2491 AuthorizationSet finish_params;
2492 AuthorizationSet finish_out_params;
2493
Shawn Willden0f392562015-06-02 09:00:52 -06002494 // Encrypt
Shawn Willden34419132015-06-08 23:10:44 -06002495 AuthorizationSet begin_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002496 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002497 AuthorizationSet update_out_params;
2498 string ciphertext;
2499 size_t input_consumed;
Shawn Willden0f392562015-06-02 09:00:52 -06002500 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2501 &input_consumed));
2502 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002503 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002504
Shawn Willden34419132015-06-08 23:10:44 -06002505 // Grab nonce
Shawn Willden0f392562015-06-02 09:00:52 -06002506 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
Shawn Willden0f392562015-06-02 09:00:52 -06002507 begin_params.push_back(begin_out_params);
Shawn Willden34419132015-06-08 23:10:44 -06002508
Shawn Willden0f392562015-06-02 09:00:52 -06002509 update_params.Clear();
2510 update_params.push_back(TAG_ASSOCIATED_DATA, "barfoo" /* Wrong AAD */, 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002511
2512 // Decrypt.
2513 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002514 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002515 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2516 &plaintext, &input_consumed));
2517 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002518 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002519
Shawn Willden0f392562015-06-02 09:00:52 -06002520 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2521}
2522
2523TEST_P(EncryptionOperationsTest, AesGcmWrongNonce) {
2524 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2525 .AesEncryptionKey(128)
2526 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2527 .Authorization(TAG_PADDING, KM_PAD_NONE)));
Shawn Willden0f392562015-06-02 09:00:52 -06002528 string message = "12345678901234567890123456789012";
2529 AuthorizationSet begin_params(client_params());
2530 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2531 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2532 begin_params.push_back(TAG_MAC_LENGTH, 128);
Shawn Willden0f392562015-06-02 09:00:52 -06002533
2534 AuthorizationSet update_params;
Shawn Willden34419132015-06-08 23:10:44 -06002535 update_params.push_back(TAG_ASSOCIATED_DATA, "foobar", 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002536
2537 // Encrypt
Shawn Willden34419132015-06-08 23:10:44 -06002538 AuthorizationSet begin_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002539 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002540 AuthorizationSet update_out_params;
2541 string ciphertext;
2542 size_t input_consumed;
Shawn Willden0f392562015-06-02 09:00:52 -06002543 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2544 &input_consumed));
2545 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002546 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002547
Shawn Willden0f392562015-06-02 09:00:52 -06002548 begin_params.push_back(TAG_NONCE, "123456789012", 12);
2549
Shawn Willden34419132015-06-08 23:10:44 -06002550 // Decrypt
Shawn Willden0f392562015-06-02 09:00:52 -06002551 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002552 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002553 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2554 &plaintext, &input_consumed));
2555 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002556 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002557
2558 // With wrong nonce, should have gotten garbage plaintext.
2559 EXPECT_NE(message, plaintext);
2560 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2561}
2562
2563TEST_P(EncryptionOperationsTest, AesGcmCorruptTag) {
2564 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2565 .AesEncryptionKey(128)
2566 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2567 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2568 string aad = "foobar";
2569 string message = "123456789012345678901234567890123456";
2570 AuthorizationSet begin_params(client_params());
2571 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2572 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2573 begin_params.push_back(TAG_MAC_LENGTH, 128);
2574 AuthorizationSet begin_out_params;
2575
2576 AuthorizationSet update_params;
2577 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
Shawn Willden0f392562015-06-02 09:00:52 -06002578
2579 // Encrypt
2580 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002581 AuthorizationSet update_out_params;
2582 string ciphertext;
2583 size_t input_consumed;
Shawn Willden0f392562015-06-02 09:00:52 -06002584 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2585 &input_consumed));
2586 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002587 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002588
Shawn Willden34419132015-06-08 23:10:44 -06002589 // Corrupt tag
2590 (*ciphertext.rbegin())++;
2591
2592 // Grab nonce.
Shawn Willden0f392562015-06-02 09:00:52 -06002593 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2594 begin_params.push_back(begin_out_params);
Shawn Willden0f392562015-06-02 09:00:52 -06002595
2596 // Decrypt.
2597 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002598 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002599 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2600 &plaintext, &input_consumed));
2601 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002602 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002603
2604 EXPECT_EQ(message, plaintext);
2605 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2606}
2607
Shawn Willden58427c42015-05-20 13:00:42 -06002608typedef Keymaster1Test AddEntropyTest;
2609INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params);
2610
2611TEST_P(AddEntropyTest, AddEntropy) {
Shawn Willdencd695822015-01-26 14:06:32 -07002612 // There's no obvious way to test that entropy is actually added, but we can test that the API
2613 // doesn't blow up or return an error.
2614 EXPECT_EQ(KM_ERROR_OK,
2615 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
Shawn Willden2beb6282015-05-20 16:36:24 -06002616
Shawn Willden6270aca2015-05-26 13:12:24 -06002617 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden2beb6282015-05-20 16:36:24 -06002618}
2619
2620typedef Keymaster1Test Keymaster0AdapterTest;
2621INSTANTIATE_TEST_CASE_P(
2622 AndroidKeymasterTest, Keymaster0AdapterTest,
Shawn Willden6270aca2015-05-26 13:12:24 -06002623 ::testing::Values(
2624 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(true /* support_ec */)),
2625 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(false /* support_ec */))));
Shawn Willden2beb6282015-05-20 16:36:24 -06002626
Shawn Willden6270aca2015-05-26 13:12:24 -06002627TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002628 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2629 // key data.
2630 string km1_sw = read_file("km1_sw_rsa_512.blob");
2631 EXPECT_EQ(486U, km1_sw.length());
2632
2633 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2634 memcpy(key_data, km1_sw.data(), km1_sw.length());
2635 set_key_blob(key_data, km1_sw.length());
2636
2637 string message(64, 'a');
2638 string signature;
2639 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2640
2641 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2642}
2643
Shawn Willdenc7fe06d2015-06-11 15:50:04 -06002644TEST_P(Keymaster0AdapterTest, UnversionedSoftwareKeymaster1RsaBlob) {
2645 // Load and use an old-style Keymaster1 software key blob, without the version byte. These
2646 // blobs contain OCB-encrypted key data.
2647 string km1_sw = read_file("km1_sw_rsa_512_unversioned.blob");
2648 EXPECT_EQ(477U, km1_sw.length());
2649
2650 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2651 memcpy(key_data, km1_sw.data(), km1_sw.length());
2652 set_key_blob(key_data, km1_sw.length());
2653
2654 string message(64, 'a');
2655 string signature;
2656 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2657
2658 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2659}
2660
Shawn Willden6270aca2015-05-26 13:12:24 -06002661TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1EcdsaBlob) {
2662 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2663 // key data.
2664 string km1_sw = read_file("km1_sw_ecdsa_256.blob");
2665 EXPECT_EQ(270U, km1_sw.length());
2666
2667 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2668 memcpy(key_data, km1_sw.data(), km1_sw.length());
2669 set_key_blob(key_data, km1_sw.length());
2670
2671 string message(64, 'a');
2672 string signature;
2673 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2674
2675 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2676}
2677
Shawn Willden2beb6282015-05-20 16:36:24 -06002678struct Malloc_Delete {
2679 void operator()(void* p) { free(p); }
2680};
2681
Shawn Willden6270aca2015-05-26 13:12:24 -06002682TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster0RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002683 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2684 string km0_sw = read_file("km0_sw_rsa_512.blob");
2685 EXPECT_EQ(333U, km0_sw.length());
2686
2687 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2688 memcpy(key_data, km0_sw.data(), km0_sw.length());
2689 set_key_blob(key_data, km0_sw.length());
2690
2691 string message(64, 'a');
2692 string signature;
2693 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2694
2695 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdencd695822015-01-26 14:06:32 -07002696}
2697
Shawn Willdenccb84e92015-06-02 19:44:54 -06002698TEST_P(Keymaster0AdapterTest, OldSwKeymaster0RsaBlobGetCharacteristics) {
2699 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2700 string km0_sw = read_file("km0_sw_rsa_512.blob");
2701 EXPECT_EQ(333U, km0_sw.length());
2702
2703 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2704 memcpy(key_data, km0_sw.data(), km0_sw.length());
2705 set_key_blob(key_data, km0_sw.length());
2706
2707 EXPECT_EQ(KM_ERROR_OK, GetCharacteristics());
2708 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
2709 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 512));
2710 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
2711 EXPECT_TRUE(contains(sw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
2712 EXPECT_TRUE(contains(sw_enforced(), TAG_PADDING, KM_PAD_NONE));
2713 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
2714 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
2715 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_ALL_USERS));
2716 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_NO_AUTH_REQUIRED));
2717
2718 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2719}
2720
2721TEST_P(Keymaster0AdapterTest, OldHwKeymaster0RsaBlob) {
2722 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2723 string km0_sw = read_file("km0_sw_rsa_512.blob");
2724 EXPECT_EQ(333U, km0_sw.length());
2725
2726 // The keymaster0 wrapper swaps the old softkeymaster leading 'P' for a 'Q' to make the key not
2727 // be recognized as a software key. Do the same here to pretend this is a hardware key.
2728 EXPECT_EQ('P', km0_sw[0]);
2729 km0_sw[0] = 'Q';
2730
2731 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2732 memcpy(key_data, km0_sw.data(), km0_sw.length());
2733 set_key_blob(key_data, km0_sw.length());
2734
2735 string message(64, 'a');
2736 string signature;
2737 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2738 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
2739
2740 EXPECT_EQ(5, GetParam()->keymaster0_calls());
2741}
2742
2743TEST_P(Keymaster0AdapterTest, OldHwKeymaster0RsaBlobGetCharacteristics) {
2744 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2745 string km0_sw = read_file("km0_sw_rsa_512.blob");
2746 EXPECT_EQ(333U, km0_sw.length());
2747
2748 // The keymaster0 wrapper swaps the old softkeymaster leading 'P' for a 'Q' to make the key not
2749 // be recognized as a software key. Do the same here to pretend this is a hardware key.
2750 EXPECT_EQ('P', km0_sw[0]);
2751 km0_sw[0] = 'Q';
2752
2753 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2754 memcpy(key_data, km0_sw.data(), km0_sw.length());
2755 set_key_blob(key_data, km0_sw.length());
2756
2757 EXPECT_EQ(KM_ERROR_OK, GetCharacteristics());
2758 EXPECT_TRUE(contains(hw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
2759 EXPECT_TRUE(contains(hw_enforced(), TAG_KEY_SIZE, 512));
2760 EXPECT_TRUE(contains(hw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
2761 EXPECT_TRUE(contains(hw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
2762 EXPECT_TRUE(contains(hw_enforced(), TAG_PADDING, KM_PAD_NONE));
2763 EXPECT_EQ(5U, hw_enforced().size());
2764
2765 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
2766 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
2767 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_ALL_USERS));
2768 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_NO_AUTH_REQUIRED));
2769
2770 EXPECT_FALSE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
2771 EXPECT_FALSE(contains(sw_enforced(), TAG_KEY_SIZE, 512));
2772 EXPECT_FALSE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
2773 EXPECT_FALSE(contains(sw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
2774 EXPECT_FALSE(contains(sw_enforced(), TAG_PADDING, KM_PAD_NONE));
2775
2776 EXPECT_EQ(1, GetParam()->keymaster0_calls());
2777}
2778
Shawn Willden128ffe02014-08-06 12:31:33 -06002779} // namespace test
2780} // namespace keymaster