blob: 2005e467348418c91814966fca9cae53216b5a8b [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 Willdend5303052015-06-22 05:25:59 -0600488TEST_P(SigningOperationsTest, RsaPkcs1NoDigestSuccess) {
489 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
490 .RsaSigningKey(512, 3)
491 .Digest(KM_DIGEST_NONE)
492 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
493 string message(53, 'a');
494 string signature;
495 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN);
496
497 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
498 EXPECT_EQ(3, GetParam()->keymaster0_calls());
499}
500
501TEST_P(SigningOperationsTest, RsaPkcs1NoDigestTooLarge) {
502 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
503 .RsaSigningKey(512, 3)
504 .Digest(KM_DIGEST_NONE)
505 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
506 string message(54, 'a');
507
508 AuthorizationSet begin_params(client_params());
509 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
510 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
511 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
512 string result;
513 size_t input_consumed;
514 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
515 string signature;
516 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&signature));
517
518 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
519 EXPECT_EQ(2, GetParam()->keymaster0_calls());
520}
521
Shawn Willden58427c42015-05-20 13:00:42 -0600522TEST_P(SigningOperationsTest, RsaPssSha256TooSmallKey) {
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600523 // Key must be at least 10 bytes larger than hash, to provide eight bytes of random salt, so
524 // verify that nine bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600525 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
526 .RsaSigningKey(256 + 9 * 8, 3)
527 .Digest(KM_DIGEST_SHA_2_256)
528 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700529 string message(1024, 'a');
530 string signature;
531
Shawn Willden226746b2015-05-08 11:36:56 -0600532 AuthorizationSet begin_params(client_params());
533 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600534 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden2bf4ad32015-06-01 07:33:51 -0600535 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700536}
537
Shawn Willdend5303052015-06-22 05:25:59 -0600538TEST_P(SigningOperationsTest, RsaNoPaddingHugeData) {
539 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
540 .RsaSigningKey(256, 3)
541 .Digest(KM_DIGEST_NONE)
542 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
543 string message(64 * 1024, 'a');
544 string signature;
545 AuthorizationSet begin_params(client_params());
546 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
547 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
548 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
549 string result;
550 size_t input_consumed;
551 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &result, &input_consumed));
552
553 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
554 EXPECT_EQ(2, GetParam()->keymaster0_calls());
555}
556
Shawn Willden58427c42015-05-20 13:00:42 -0600557TEST_P(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600558 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
559 .RsaSigningKey(256, 3)
560 .Digest(KM_DIGEST_NONE)
561 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600562 AuthorizationSet begin_params(client_params());
563 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600564 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600565 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700566 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
567 // Another abort should fail
568 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden2beb6282015-05-20 16:36:24 -0600569
Shawn Willden6270aca2015-05-26 13:12:24 -0600570 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600571 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600572}
573
Shawn Willden58427c42015-05-20 13:00:42 -0600574TEST_P(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600575 GenerateKey(AuthorizationSetBuilder()
576 .RsaSigningKey(256, 3)
577 .Digest(KM_DIGEST_MD5)
578 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700579 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden2beb6282015-05-20 16:36:24 -0600580
Shawn Willden6270aca2015-05-26 13:12:24 -0600581 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600582 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600583}
584
Shawn Willden58427c42015-05-20 13:00:42 -0600585TEST_P(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600586 GenerateKey(AuthorizationSetBuilder()
587 .RsaSigningKey(256, 3)
588 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
589 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600590 AuthorizationSet begin_params(client_params());
591 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
592 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600593
Shawn Willden6270aca2015-05-26 13:12:24 -0600594 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600595 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600596}
597
Shawn Willden58427c42015-05-20 13:00:42 -0600598TEST_P(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700599 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600600 GenerateKey(AuthorizationSetBuilder()
601 .RsaSigningKey(256, 3)
602 .Digest(KM_DIGEST_NONE)
603 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600604 AuthorizationSet begin_params(client_params());
605 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600606 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600607 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600608
Shawn Willden6270aca2015-05-26 13:12:24 -0600609 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600610 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600611}
612
Shawn Willden58427c42015-05-20 13:00:42 -0600613TEST_P(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700614 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600615 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
616 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600617 AuthorizationSet begin_params(client_params());
618 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
619 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600620
Shawn Willden6270aca2015-05-26 13:12:24 -0600621 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600622 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600623}
624
Shawn Willden58427c42015-05-20 13:00:42 -0600625TEST_P(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600626 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
627 .RsaSigningKey(256, 3)
628 .Digest(KM_DIGEST_NONE)
629 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600630 AuthorizationSet begin_params(client_params());
631 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600632 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600633 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600634
635 string message = "1234567890123456789012345678901";
636 string result;
637 size_t input_consumed;
638 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
639 EXPECT_EQ(0U, result.size());
640 EXPECT_EQ(31U, input_consumed);
641
642 string signature;
Shawn Willdend5303052015-06-22 05:25:59 -0600643 ASSERT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&signature));
Shawn Willdenedb79942015-05-08 06:46:44 -0600644 EXPECT_EQ(0U, signature.length());
Shawn Willden2beb6282015-05-20 16:36:24 -0600645
Shawn Willden6270aca2015-05-26 13:12:24 -0600646 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600647 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600648}
649
Shawn Willden58427c42015-05-20 13:00:42 -0600650TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600651 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
652 .RsaEncryptionKey(256, 3)
653 .Digest(KM_DIGEST_NONE)
654 .Padding(KM_PAD_NONE)));
655 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden2beb6282015-05-20 16:36:24 -0600656
Shawn Willden6270aca2015-05-26 13:12:24 -0600657 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden294a2db2015-06-17 11:20:56 -0600658 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600659}
660
Shawn Willden58427c42015-05-20 13:00:42 -0600661TEST_P(SigningOperationsTest, EcdsaSuccess) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600662 ASSERT_EQ(KM_ERROR_OK,
663 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdend5303052015-06-22 05:25:59 -0600664 string message(224 / 8, 'a');
Shawn Willdenedb79942015-05-08 06:46:44 -0600665 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600666 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600667
Shawn Willden6270aca2015-05-26 13:12:24 -0600668 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
669 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600670}
671
Shawn Willdenefbd7e42015-06-01 07:07:33 -0600672TEST_P(SigningOperationsTest, EcdsaSha256Success) {
673 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(
674 KM_DIGEST_SHA_2_256)));
675 string message(1024, 'a');
676 string signature;
677 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
678
679 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
680 EXPECT_EQ(3, GetParam()->keymaster0_calls());
681}
682
Shawn Willdend5303052015-06-22 05:25:59 -0600683TEST_P(SigningOperationsTest, EcdsaNoPaddingHugeData) {
684 ASSERT_EQ(KM_ERROR_OK,
685 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
686 string message(64 * 1024, 'a');
687 string signature;
688 AuthorizationSet begin_params(client_params());
689 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
690 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
691 string result;
692 size_t input_consumed;
693 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &result, &input_consumed));
694
695 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
696 EXPECT_EQ(2, GetParam()->keymaster0_calls());
697}
698
Shawn Willden58427c42015-05-20 13:00:42 -0600699TEST_P(SigningOperationsTest, AesEcbSign) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600700 ASSERT_EQ(KM_ERROR_OK,
701 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
702 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willden294a2db2015-06-17 11:20:56 -0600703 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
704 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600705
Shawn Willden6270aca2015-05-26 13:12:24 -0600706 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600707}
708
Shawn Willden58427c42015-05-20 13:00:42 -0600709TEST_P(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600710 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700711 string message = "12345678901234567890123456789012";
712 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600713 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600714 ASSERT_EQ(20U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600715
Shawn Willden6270aca2015-05-26 13:12:24 -0600716 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700717}
718
Shawn Willden58427c42015-05-20 13:00:42 -0600719TEST_P(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600720 ASSERT_EQ(KM_ERROR_OK,
721 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700722 string message = "12345678901234567890123456789012";
723 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600724 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600725 ASSERT_EQ(28U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600726
Shawn Willden6270aca2015-05-26 13:12:24 -0600727 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700728}
729
Shawn Willden58427c42015-05-20 13:00:42 -0600730TEST_P(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600731 ASSERT_EQ(KM_ERROR_OK,
732 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700733 string message = "12345678901234567890123456789012";
734 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600735 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600736 ASSERT_EQ(32U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600737
Shawn Willden6270aca2015-05-26 13:12:24 -0600738 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700739}
740
Shawn Willden58427c42015-05-20 13:00:42 -0600741TEST_P(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600742 ASSERT_EQ(KM_ERROR_OK,
743 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
744
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700745 string message = "12345678901234567890123456789012";
746 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600747 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600748 ASSERT_EQ(48U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600749
Shawn Willden6270aca2015-05-26 13:12:24 -0600750 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700751}
752
Shawn Willden58427c42015-05-20 13:00:42 -0600753TEST_P(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600754 ASSERT_EQ(KM_ERROR_OK,
755 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700756 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700757 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600758 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600759 ASSERT_EQ(64U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600760
Shawn Willden6270aca2015-05-26 13:12:24 -0600761 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700762}
763
Shawn Willden58427c42015-05-20 13:00:42 -0600764TEST_P(SigningOperationsTest, HmacLengthInKey) {
Shawn Willden09f25272015-04-15 13:49:49 -0600765 // TODO(swillden): unified API should generate an error on key generation.
766 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
767 .HmacKey(128)
768 .Digest(KM_DIGEST_SHA_2_256)
769 .Authorization(TAG_MAC_LENGTH, 20)));
770 string message = "12345678901234567890123456789012";
771 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600772 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600773 // Size in key was ignored.
774 ASSERT_EQ(30U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600775
Shawn Willden6270aca2015-05-26 13:12:24 -0600776 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden09f25272015-04-15 13:49:49 -0600777}
778
Shawn Willden58427c42015-05-20 13:00:42 -0600779TEST_P(SigningOperationsTest, HmacRfc4231TestCase1) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700780 uint8_t key_data[] = {
781 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
782 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
783 };
784 string message = "Hi There";
785 uint8_t sha_224_expected[] = {
786 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
787 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
788 };
789 uint8_t sha_256_expected[] = {
790 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
791 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
792 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
793 };
794 uint8_t sha_384_expected[] = {
795 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
796 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
797 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
798 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
799 };
800 uint8_t sha_512_expected[] = {
801 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
802 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
803 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
804 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
805 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
806 };
807
808 string key = make_string(key_data);
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, HmacRfc4231TestCase2) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700819 string key = "Jefe";
820 string message = "what do ya want for nothing?";
821 uint8_t sha_224_expected[] = {
822 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
823 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
824 };
825 uint8_t sha_256_expected[] = {
826 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
827 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
828 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
829 };
830 uint8_t sha_384_expected[] = {
831 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
832 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
833 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
834 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
835 };
836 uint8_t sha_512_expected[] = {
837 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
838 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
839 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
840 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
841 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
842 };
843
844 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
845 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
846 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
847 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600848
Shawn Willden6270aca2015-05-26 13:12:24 -0600849 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700850}
851
Shawn Willden58427c42015-05-20 13:00:42 -0600852TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700853 string key(20, 0xaa);
854 string message(50, 0xdd);
855 uint8_t sha_224_expected[] = {
856 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
857 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
858 };
859 uint8_t sha_256_expected[] = {
860 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
861 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
862 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
863 };
864 uint8_t sha_384_expected[] = {
865 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
866 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
867 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
868 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
869 };
870 uint8_t sha_512_expected[] = {
871 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
872 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
873 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
874 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
875 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
876 };
877
878 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
879 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
880 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
881 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600882
Shawn Willden6270aca2015-05-26 13:12:24 -0600883 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700884}
885
Shawn Willden58427c42015-05-20 13:00:42 -0600886TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700887 uint8_t key_data[25] = {
888 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
889 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
890 };
891 string key = make_string(key_data);
892 string message(50, 0xcd);
893 uint8_t sha_224_expected[] = {
894 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
895 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
896 };
897 uint8_t sha_256_expected[] = {
898 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
899 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
900 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
901 };
902 uint8_t sha_384_expected[] = {
903 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
904 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
905 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
906 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
907 };
908 uint8_t sha_512_expected[] = {
909 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
910 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
911 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
912 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
913 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
914 };
915
916 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
917 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
918 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
919 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600920
Shawn Willden6270aca2015-05-26 13:12:24 -0600921 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700922}
923
Shawn Willden58427c42015-05-20 13:00:42 -0600924TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700925 string key(20, 0x0c);
926 string message = "Test With Truncation";
927
928 uint8_t sha_224_expected[] = {
929 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
930 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
931 };
932 uint8_t sha_256_expected[] = {
933 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
934 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
935 };
936 uint8_t sha_384_expected[] = {
937 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
938 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
939 };
940 uint8_t sha_512_expected[] = {
941 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
942 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
943 };
944
945 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
946 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
947 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
948 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600949
Shawn Willden6270aca2015-05-26 13:12:24 -0600950 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700951}
952
Shawn Willden58427c42015-05-20 13:00:42 -0600953TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700954 string key(131, 0xaa);
955 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
956
957 uint8_t sha_224_expected[] = {
958 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
959 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
960 };
961 uint8_t sha_256_expected[] = {
962 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
963 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
964 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
965 };
966 uint8_t sha_384_expected[] = {
967 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
968 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
969 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
970 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
971 };
972 uint8_t sha_512_expected[] = {
973 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
974 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
975 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
976 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
977 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
978 };
979
980 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
981 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
982 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
983 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600984
Shawn Willden6270aca2015-05-26 13:12:24 -0600985 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700986}
987
Shawn Willden58427c42015-05-20 13:00:42 -0600988TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700989 string key(131, 0xaa);
990 string message = "This is a test using a larger than block-size key and a larger than "
991 "block-size data. The key needs to be hashed before being used by the HMAC "
992 "algorithm.";
993
994 uint8_t sha_224_expected[] = {
995 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
996 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
997 };
998 uint8_t sha_256_expected[] = {
999 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
1000 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
1001 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
1002 };
1003 uint8_t sha_384_expected[] = {
1004 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
1005 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
1006 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
1007 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
1008 };
1009 uint8_t sha_512_expected[] = {
1010 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
1011 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
1012 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
1013 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
1014 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
1015 };
1016
1017 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1018 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1019 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1020 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -06001021
Shawn Willden6270aca2015-05-26 13:12:24 -06001022 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001023}
Shawn Willden0d560bf2014-12-15 17:44:02 -07001024
Shawn Willden58427c42015-05-20 13:00:42 -06001025TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -06001026 ASSERT_EQ(KM_ERROR_OK,
1027 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
1028 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -06001029 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -06001030 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -06001031 ASSERT_EQ(KM_ERROR_OK,
1032 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
1033 string message = "1234567890123456789012345678901";
1034 string result;
1035 size_t input_consumed;
1036 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1037 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001038
Shawn Willden6270aca2015-05-26 13:12:24 -06001039 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -07001040}
1041
Shawn Willden61902362014-12-18 10:33:24 -07001042// TODO(swillden): Add more verification failure tests.
1043
Shawn Willden58427c42015-05-20 13:00:42 -06001044typedef Keymaster1Test VerificationOperationsTest;
1045INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params);
1046
1047TEST_P(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001048 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1049 .RsaSigningKey(256, 3)
1050 .Digest(KM_DIGEST_NONE)
1051 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001052 string message = "12345678901234567890123456789012";
1053 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001054 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1055 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001056
Shawn Willden6270aca2015-05-26 13:12:24 -06001057 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001058 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -06001059}
1060
Shawn Willden58427c42015-05-20 13:00:42 -06001061TEST_P(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001062 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1063 .RsaSigningKey(512, 3)
1064 .Digest(KM_DIGEST_SHA_2_256)
1065 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001066 // Use large message, which won't work without digesting.
1067 string message(1024, 'a');
1068 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001069 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
1070 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -06001071
Shawn Willden6270aca2015-05-26 13:12:24 -06001072 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001073 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001074}
1075
Shawn Willden58427c42015-05-20 13:00:42 -06001076TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001077 GenerateKey(AuthorizationSetBuilder()
1078 .RsaSigningKey(512, 3)
1079 .Digest(KM_DIGEST_SHA_2_256)
1080 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001081 string message(1024, 'a');
1082 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001083 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001084 ++signature[signature.size() / 2];
1085
Shawn Willden226746b2015-05-08 11:36:56 -06001086 AuthorizationSet begin_params(client_params());
1087 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001088 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001089 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001090
1091 string result;
1092 size_t input_consumed;
1093 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1094 EXPECT_EQ(message.size(), input_consumed);
1095 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001096
Shawn Willden6270aca2015-05-26 13:12:24 -06001097 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001098 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001099}
1100
Shawn Willden58427c42015-05-20 13:00:42 -06001101TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001102 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1103 .RsaSigningKey(512, 3)
1104 .Digest(KM_DIGEST_SHA_2_256)
1105 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001106 // Use large message, which won't work without digesting.
1107 string message(1024, 'a');
1108 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001109 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -07001110 ++message[message.size() / 2];
1111
Shawn Willden226746b2015-05-08 11:36:56 -06001112 AuthorizationSet begin_params(client_params());
1113 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001114 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001115 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001116
1117 string result;
1118 size_t input_consumed;
1119 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1120 EXPECT_EQ(message.size(), input_consumed);
1121 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001122
Shawn Willden6270aca2015-05-26 13:12:24 -06001123 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001124 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001125}
1126
Shawn Willden58427c42015-05-20 13:00:42 -06001127TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001128 GenerateKey(AuthorizationSetBuilder()
1129 .RsaSigningKey(512, 3)
1130 .Digest(KM_DIGEST_SHA_2_256)
1131 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001132 string message(1024, 'a');
1133 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001134 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1135 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -06001136
Shawn Willden6270aca2015-05-26 13:12:24 -06001137 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001138 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001139}
1140
Shawn Willden58427c42015-05-20 13:00:42 -06001141TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001142 GenerateKey(AuthorizationSetBuilder()
1143 .RsaSigningKey(512, 3)
1144 .Digest(KM_DIGEST_SHA_2_256)
1145 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001146 string message(1024, 'a');
1147 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001148 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001149 ++signature[signature.size() / 2];
1150
Shawn Willden226746b2015-05-08 11:36:56 -06001151 AuthorizationSet begin_params(client_params());
1152 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001153 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001154 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001155
1156 string result;
1157 size_t input_consumed;
1158 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1159 EXPECT_EQ(message.size(), input_consumed);
1160 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001161
Shawn Willden6270aca2015-05-26 13:12:24 -06001162 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001163 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001164}
1165
Shawn Willden58427c42015-05-20 13:00:42 -06001166TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001167 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1168 .RsaSigningKey(512, 3)
1169 .Digest(KM_DIGEST_SHA_2_256)
1170 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001171 // Use large message, which won't work without digesting.
1172 string message(1024, 'a');
1173 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001174 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001175 ++message[message.size() / 2];
1176
Shawn Willden226746b2015-05-08 11:36:56 -06001177 AuthorizationSet begin_params(client_params());
1178 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001179 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001180 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001181
1182 string result;
1183 size_t input_consumed;
1184 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1185 EXPECT_EQ(message.size(), input_consumed);
1186 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001187
Shawn Willden6270aca2015-05-26 13:12:24 -06001188 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001189 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001190}
1191
1192template <typename T> vector<T> make_vector(const T* array, size_t len) {
1193 return vector<T>(array, array + len);
1194}
1195
Shawn Willden58427c42015-05-20 13:00:42 -06001196TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001197 // Get all supported digests and padding modes.
1198 size_t digests_len;
1199 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -06001200 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001201 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1202 &digests_len));
1203
1204 size_t padding_modes_len;
1205 keymaster_padding_t* padding_modes;
Shawn Willden0cb69422015-05-26 08:31:37 -06001206 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001207 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1208 &padding_modes, &padding_modes_len));
1209
1210 // Try them.
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001211 int trial_count = 0;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001212 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1213 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001214 if (digest != KM_DIGEST_NONE && padding_mode == KM_PAD_NONE)
1215 // Digesting requires padding
1216 continue;
1217
Shawn Willdenf90f2352014-12-18 23:01:15 -07001218 // Compute key & message size that will work.
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001219 size_t key_bits = 0;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001220 size_t message_len = 1000;
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001221
1222 if (digest == KM_DIGEST_NONE) {
1223 key_bits = 256;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001224 switch (padding_mode) {
1225 case KM_PAD_NONE:
1226 // Match key size.
1227 message_len = key_bits / 8;
1228 break;
1229 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1230 message_len = key_bits / 8 - 11;
1231 break;
1232 case KM_PAD_RSA_PSS:
1233 // PSS requires a digest.
1234 continue;
1235 default:
1236 FAIL() << "Missing padding";
1237 break;
1238 }
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001239 } else {
1240 size_t digest_bits;
1241 switch (digest) {
1242 case KM_DIGEST_MD5:
1243 digest_bits = 128;
1244 break;
1245 case KM_DIGEST_SHA1:
1246 digest_bits = 160;
1247 break;
1248 case KM_DIGEST_SHA_2_224:
1249 digest_bits = 224;
1250 break;
1251 case KM_DIGEST_SHA_2_256:
1252 digest_bits = 256;
1253 break;
1254 case KM_DIGEST_SHA_2_384:
1255 digest_bits = 384;
1256 break;
1257 case KM_DIGEST_SHA_2_512:
1258 digest_bits = 512;
1259 break;
1260 default:
1261 FAIL() << "Missing digest";
1262 }
Shawn Willdenf90f2352014-12-18 23:01:15 -07001263
Shawn Willdenf90f2352014-12-18 23:01:15 -07001264 switch (padding_mode) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001265 case KM_PAD_RSA_PKCS1_1_5_SIGN:
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001266 key_bits = digest_bits + 8 * (11 + 19);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001267 break;
1268 case KM_PAD_RSA_PSS:
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001269 key_bits = digest_bits + 8 * 10;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001270 break;
1271 default:
1272 FAIL() << "Missing padding";
1273 break;
1274 }
Shawn Willdenf90f2352014-12-18 23:01:15 -07001275 }
1276
Shawn Willdenaf533992015-04-15 13:48:28 -06001277 GenerateKey(AuthorizationSetBuilder()
1278 .RsaSigningKey(key_bits, 3)
1279 .Digest(digest)
1280 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001281 string message(message_len, 'a');
1282 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001283 SignMessage(message, &signature, digest, padding_mode);
1284 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001285 ++trial_count;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001286 }
1287 }
1288
1289 free(padding_modes);
1290 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -06001291
Shawn Willden6270aca2015-05-26 13:12:24 -06001292 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001293 EXPECT_EQ(trial_count * 4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001294}
1295
Shawn Willden58427c42015-05-20 13:00:42 -06001296TEST_P(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001297 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001298 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdend5303052015-06-22 05:25:59 -06001299 string message = "12345678901234567890123456789012";
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001300 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001301 SignMessage(message, &signature, KM_DIGEST_NONE);
1302 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001303
Shawn Willden6270aca2015-05-26 13:12:24 -06001304 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1305 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001306}
1307
Shawn Willdenefbd7e42015-06-01 07:07:33 -06001308TEST_P(VerificationOperationsTest, EcdsaSha256Success) {
1309 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1310 .EcdsaSigningKey(256)
1311 .Digest(KM_DIGEST_SHA_2_256)
1312 .Digest(KM_DIGEST_NONE)));
Shawn Willdend5303052015-06-22 05:25:59 -06001313 string message = "12345678901234567890123456789012";
Shawn Willdenefbd7e42015-06-01 07:07:33 -06001314 string signature;
1315 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
1316 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
1317
1318 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1319 EXPECT_EQ(4, GetParam()->keymaster0_calls());
1320
1321 // Just for giggles, try verifying with the wrong digest.
1322 AuthorizationSet begin_params(client_params());
1323 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
1324 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1325
1326 string result;
1327 size_t input_consumed;
1328 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1329 EXPECT_EQ(message.size(), input_consumed);
1330 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1331}
1332
Shawn Willden58427c42015-05-20 13:00:42 -06001333TEST_P(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001334 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001335 string message = "123456789012345678901234567890123456789012345678";
1336 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001337 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1338 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden2beb6282015-05-20 16:36:24 -06001339
Shawn Willden6270aca2015-05-26 13:12:24 -06001340 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001341}
1342
Shawn Willden58427c42015-05-20 13:00:42 -06001343TEST_P(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001344 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001345 string message = "123456789012345678901234567890123456789012345678";
1346 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001347 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1348 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden2beb6282015-05-20 16:36:24 -06001349
Shawn Willden6270aca2015-05-26 13:12:24 -06001350 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001351}
1352
Shawn Willden58427c42015-05-20 13:00:42 -06001353TEST_P(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001354 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001355 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001356 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001357 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1358 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001359
Shawn Willden6270aca2015-05-26 13:12:24 -06001360 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -07001361}
1362
Shawn Willden58427c42015-05-20 13:00:42 -06001363TEST_P(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001364 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001365 string message = "123456789012345678901234567890123456789012345678";
1366 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001367 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1368 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden2beb6282015-05-20 16:36:24 -06001369
Shawn Willden6270aca2015-05-26 13:12:24 -06001370 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001371}
1372
Shawn Willden58427c42015-05-20 13:00:42 -06001373TEST_P(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001374 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001375 string message = "123456789012345678901234567890123456789012345678";
1376 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001377 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1378 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden2beb6282015-05-20 16:36:24 -06001379
Shawn Willden6270aca2015-05-26 13:12:24 -06001380 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001381}
1382
Shawn Willden58427c42015-05-20 13:00:42 -06001383typedef Keymaster1Test ExportKeyTest;
1384INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params);
1385
1386TEST_P(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001387 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1388 .RsaSigningKey(256, 3)
1389 .Digest(KM_DIGEST_NONE)
1390 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001391 string export_data;
1392 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001393 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001394
1395 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001396
Shawn Willden6270aca2015-05-26 13:12:24 -06001397 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001398 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenffd790c2014-08-18 21:20:06 -06001399}
1400
Shawn Willden58427c42015-05-20 13:00:42 -06001401TEST_P(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001402 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001403 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001404 string export_data;
1405 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001406 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001407
1408 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001409
Shawn Willden6270aca2015-05-26 13:12:24 -06001410 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1411 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001412}
1413
Shawn Willden58427c42015-05-20 13:00:42 -06001414TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001415 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1416 .RsaSigningKey(256, 3)
1417 .Digest(KM_DIGEST_NONE)
1418 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001419 string export_data;
1420 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
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(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001424}
1425
Shawn Willden58427c42015-05-20 13:00:42 -06001426TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001427 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1428 .RsaSigningKey(256, 3)
1429 .Digest(KM_DIGEST_NONE)
1430 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001431 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001432 string export_data;
1433 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001434
Shawn Willden6270aca2015-05-26 13:12:24 -06001435 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001436 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001437}
1438
Shawn Willden58427c42015-05-20 13:00:42 -06001439TEST_P(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001440 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001441 string export_data;
1442
1443 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1444 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1445 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001446
Shawn Willden6270aca2015-05-26 13:12:24 -06001447 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden7dad93b2015-02-05 10:20:47 -07001448}
1449
Shawn Willden437fbd12014-08-20 11:59:49 -06001450static string read_file(const string& file_name) {
1451 ifstream file_stream(file_name, std::ios::binary);
1452 istreambuf_iterator<char> file_begin(file_stream);
1453 istreambuf_iterator<char> file_end;
1454 return string(file_begin, file_end);
1455}
1456
Shawn Willden58427c42015-05-20 13:00:42 -06001457typedef Keymaster1Test ImportKeyTest;
1458INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params);
1459
1460TEST_P(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001461 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001462 ASSERT_EQ(633U, pk8_key.size());
1463
Shawn Willdenaf533992015-04-15 13:48:28 -06001464 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1465 .RsaSigningKey(1024, 65537)
1466 .Digest(KM_DIGEST_NONE)
1467 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001468 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001469
1470 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001471 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1472 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001473 TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6270aca2015-05-26 13:12:24 -06001474 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1475 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001476 TAG_KEY_SIZE, 1024));
Shawn Willden6270aca2015-05-26 13:12:24 -06001477 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1478 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001479 TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001480
Shawn Willdenb6837e72015-05-16 09:20:59 -06001481 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001482 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1483 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001484
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001485 string message(1024 / 8, 'a');
1486 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001487 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1488 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001489
Shawn Willden6270aca2015-05-26 13:12:24 -06001490 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001491 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden437fbd12014-08-20 11:59:49 -06001492}
1493
Shawn Willden58427c42015-05-20 13:00:42 -06001494TEST_P(ImportKeyTest, OldApiRsaSuccess) {
Shawn Willdend7a5c712015-04-09 16:33:52 -06001495 string pk8_key = read_file("rsa_privkey_pk8.der");
1496 ASSERT_EQ(633U, pk8_key.size());
1497
1498 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1499 // point softkeymaster will no longer support keymaster0 APIs anyway.
1500 uint8_t* key_blob;
1501 size_t key_blob_length;
1502 ASSERT_EQ(0,
1503 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1504 pk8_key.size(), &key_blob, &key_blob_length));
1505 set_key_blob(key_blob, key_blob_length);
1506
1507 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001508 AuthorizationSet begin_params; // Don't use client data.
1509 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001510 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001511 AuthorizationSet update_params;
1512 AuthorizationSet output_params;
1513 string signature =
1514 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1515 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1516 &output_params);
Shawn Willden2beb6282015-05-20 16:36:24 -06001517
Shawn Willden6270aca2015-05-26 13:12:24 -06001518 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001519 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdend7a5c712015-04-09 16:33:52 -06001520}
1521
Shawn Willden58427c42015-05-20 13:00:42 -06001522TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001523 string pk8_key = read_file("rsa_privkey_pk8.der");
1524 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001525 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001526 ImportKey(AuthorizationSetBuilder()
1527 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1528 .Digest(KM_DIGEST_NONE)
1529 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001530 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001531
Shawn Willden6270aca2015-05-26 13:12:24 -06001532 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001533}
1534
Shawn Willden58427c42015-05-20 13:00:42 -06001535TEST_P(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001536 string pk8_key = read_file("rsa_privkey_pk8.der");
1537 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001538 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001539 ImportKey(AuthorizationSetBuilder()
1540 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1541 .Digest(KM_DIGEST_NONE)
1542 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001543 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001544
Shawn Willden6270aca2015-05-26 13:12:24 -06001545 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001546}
1547
Shawn Willden58427c42015-05-20 13:00:42 -06001548TEST_P(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001549 string pk8_key = read_file("ec_privkey_pk8.der");
1550 ASSERT_EQ(138U, pk8_key.size());
1551
Shawn Willdenaf533992015-04-15 13:48:28 -06001552 ASSERT_EQ(KM_ERROR_OK,
1553 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1554 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001555
1556 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001557 EXPECT_TRUE(
1558 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1559 TAG_ALGORITHM, KM_ALGORITHM_EC));
1560 EXPECT_TRUE(
1561 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1562 TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001563
Shawn Willdenb6837e72015-05-16 09:20:59 -06001564 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001565 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1566 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001567
Shawn Willdend5303052015-06-22 05:25:59 -06001568 string message(32, 'a');
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001569 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001570 SignMessage(message, &signature, KM_DIGEST_NONE);
1571 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001572
Shawn Willden6270aca2015-05-26 13:12:24 -06001573 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1574 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden81effc62014-08-27 10:08:46 -06001575}
1576
Shawn Willden58427c42015-05-20 13:00:42 -06001577TEST_P(ImportKeyTest, EcdsaSizeSpecified) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001578 string pk8_key = read_file("ec_privkey_pk8.der");
1579 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001580
Shawn Willdenaf533992015-04-15 13:48:28 -06001581 ASSERT_EQ(KM_ERROR_OK,
1582 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1583 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001584
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001585 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001586 EXPECT_TRUE(
1587 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1588 TAG_ALGORITHM, KM_ALGORITHM_EC));
1589 EXPECT_TRUE(
1590 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1591 TAG_KEY_SIZE, 256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001592
Shawn Willdenb6837e72015-05-16 09:20:59 -06001593 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001594 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1595 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1596
Shawn Willdend5303052015-06-22 05:25:59 -06001597 string message(32, 'a');
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001598 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001599 SignMessage(message, &signature, KM_DIGEST_NONE);
1600 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001601
Shawn Willden6270aca2015-05-26 13:12:24 -06001602 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1603 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001604}
1605
Shawn Willden58427c42015-05-20 13:00:42 -06001606TEST_P(ImportKeyTest, EcdsaSizeMismatch) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001607 string pk8_key = read_file("ec_privkey_pk8.der");
1608 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001609 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001610 ImportKey(AuthorizationSetBuilder()
1611 .EcdsaSigningKey(224 /* Doesn't match key */)
1612 .Digest(KM_DIGEST_NONE),
1613 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001614
Shawn Willden6270aca2015-05-26 13:12:24 -06001615 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001616}
1617
Shawn Willden58427c42015-05-20 13:00:42 -06001618TEST_P(ImportKeyTest, AesKeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001619 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1620 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001621 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001622 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1623 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001624 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001625
1626 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1627 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1628
1629 string message = "Hello World!";
Shawn Willdenc4424672015-05-11 11:56:02 -06001630 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1631 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willden3b702e22015-02-05 10:26:47 -07001632 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001633
Shawn Willden6270aca2015-05-26 13:12:24 -06001634 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001635}
1636
Shawn Willden58427c42015-05-20 13:00:42 -06001637TEST_P(ImportKeyTest, HmacSha256KeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001638 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1639 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001640 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1641 .HmacKey(sizeof(key_data) * 8)
1642 .Digest(KM_DIGEST_SHA_2_256)
1643 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001644 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001645
1646 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1647 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1648
1649 string message = "Hello World!";
1650 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001651 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1652 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001653
Shawn Willden6270aca2015-05-26 13:12:24 -06001654 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001655}
1656
Shawn Willden58427c42015-05-20 13:00:42 -06001657typedef Keymaster1Test EncryptionOperationsTest;
1658INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params);
1659
Shawn Willden30160842015-06-01 08:31:00 -06001660TEST_P(EncryptionOperationsTest, RsaNoPaddingSuccess) {
1661 ASSERT_EQ(KM_ERROR_OK,
1662 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1663
1664 string message = "12345678901234567890123456789012";
1665 string ciphertext1 = EncryptMessage(string(message), KM_PAD_NONE);
1666 EXPECT_EQ(256U / 8, ciphertext1.size());
1667
1668 string ciphertext2 = EncryptMessage(string(message), KM_PAD_NONE);
1669 EXPECT_EQ(256U / 8, ciphertext2.size());
1670
1671 // Unpadded RSA is deterministic
1672 EXPECT_EQ(ciphertext1, ciphertext2);
1673
1674 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1675 EXPECT_EQ(3, GetParam()->keymaster0_calls());
1676}
1677
1678TEST_P(EncryptionOperationsTest, RsaNoPaddingTooShort) {
1679 ASSERT_EQ(KM_ERROR_OK,
1680 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1681
1682 string message = "1234567890123456789012345678901";
1683
1684 AuthorizationSet begin_params(client_params());
1685 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
1686 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1687
1688 string result;
1689 size_t input_consumed;
1690 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1691 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
1692 EXPECT_EQ(0U, result.size());
1693
1694 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1695 EXPECT_EQ(2, GetParam()->keymaster0_calls());
1696}
1697
1698TEST_P(EncryptionOperationsTest, RsaNoPaddingTooLong) {
1699 ASSERT_EQ(KM_ERROR_OK,
1700 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1701
1702 string message = "123456789012345678901234567890123";
1703
1704 AuthorizationSet begin_params(client_params());
1705 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
1706 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1707
1708 string result;
1709 size_t input_consumed;
Shawn Willdend5303052015-06-22 05:25:59 -06001710 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &result, &input_consumed));
Shawn Willden30160842015-06-01 08:31:00 -06001711
1712 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1713 EXPECT_EQ(2, GetParam()->keymaster0_calls());
1714}
1715
Shawn Willden58427c42015-05-20 13:00:42 -06001716TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001717 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1718 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001719
1720 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001721 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001722 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001723
Shawn Willden3ad5f052015-05-08 14:05:13 -06001724 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001725 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001726
1727 // OAEP randomizes padding so every result should be different.
1728 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001729
Shawn Willden6270aca2015-05-26 13:12:24 -06001730 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001731 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001732}
1733
Shawn Willden58427c42015-05-20 13:00:42 -06001734TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001735 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1736 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001737 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001738 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001739 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001740
Shawn Willden3ad5f052015-05-08 14:05:13 -06001741 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001742 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001743
Shawn Willden6270aca2015-05-26 13:12:24 -06001744 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001745 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001746}
1747
Shawn Willden58427c42015-05-20 13:00:42 -06001748TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001749 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1750 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001751 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001752 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001753 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001754
Shawn Willden3ad5f052015-05-08 14:05:13 -06001755 AuthorizationSet begin_params(client_params());
1756 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1757 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001758 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001759 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001760 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001761
Shawn Willden6270aca2015-05-26 13:12:24 -06001762 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001763 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001764}
1765
Shawn Willden58427c42015-05-20 13:00:42 -06001766TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001767 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1768 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001769 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001770 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001771 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001772
1773 // Corrupt the ciphertext
1774 ciphertext[512 / 8 / 2]++;
1775
Shawn Willden4200f212014-12-02 07:01:21 -07001776 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001777 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001778 AuthorizationSet begin_params(client_params());
1779 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1780 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001781 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001782 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001783 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001784
Shawn Willden6270aca2015-05-26 13:12:24 -06001785 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001786 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001787}
1788
Shawn Willden58427c42015-05-20 13:00:42 -06001789TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001790 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1791 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001792 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001793 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001794 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001795
Shawn Willden3ad5f052015-05-08 14:05:13 -06001796 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001797 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001798
1799 // PKCS1 v1.5 randomizes padding so every result should be different.
1800 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001801
Shawn Willden6270aca2015-05-26 13:12:24 -06001802 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001803 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001804}
1805
Shawn Willden58427c42015-05-20 13:00:42 -06001806TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001807 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1808 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001809 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001810 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001811 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001812
Shawn Willden3ad5f052015-05-08 14:05:13 -06001813 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001814 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001815
Shawn Willden6270aca2015-05-26 13:12:24 -06001816 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001817 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001818}
1819
Shawn Willden58427c42015-05-20 13:00:42 -06001820TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001821 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1822 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willden7bae1322015-05-26 10:16:49 -06001823 string message = "123456789012345678901234567890123456789012345678901234";
Shawn Willden4200f212014-12-02 07:01:21 -07001824 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001825 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001826
Shawn Willden3ad5f052015-05-08 14:05:13 -06001827 AuthorizationSet begin_params(client_params());
1828 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1829 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001830 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001831 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001832 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001833
Shawn Willden6270aca2015-05-26 13:12:24 -06001834 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001835 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001836}
1837
Shawn Willden58427c42015-05-20 13:00:42 -06001838TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001839 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1840 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001841 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001842 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001843 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001844
1845 // Corrupt the ciphertext
1846 ciphertext[512 / 8 / 2]++;
1847
Shawn Willden4200f212014-12-02 07:01:21 -07001848 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001849 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001850 AuthorizationSet begin_params(client_params());
1851 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1852 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001853 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001854 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001855 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001856
Shawn Willden6270aca2015-05-26 13:12:24 -06001857 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001858 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001859}
1860
Shawn Willden58427c42015-05-20 13:00:42 -06001861TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001862 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1863 .RsaSigningKey(256, 3)
1864 .Digest(KM_DIGEST_NONE)
1865 .Padding(KM_PAD_NONE)));
Shawn Willdenedb79942015-05-08 06:46:44 -06001866 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001867
Shawn Willden6270aca2015-05-26 13:12:24 -06001868 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden294a2db2015-06-17 11:20:56 -06001869 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001870}
1871
Shawn Willden58427c42015-05-20 13:00:42 -06001872TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001873 ASSERT_EQ(KM_ERROR_OK,
1874 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willden294a2db2015-06-17 11:20:56 -06001875 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1876 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001877
Shawn Willden6270aca2015-05-26 13:12:24 -06001878 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1879 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001880}
1881
Shawn Willden58427c42015-05-20 13:00:42 -06001882TEST_P(EncryptionOperationsTest, HmacEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001883 ASSERT_EQ(
1884 KM_ERROR_OK,
1885 GenerateKey(
1886 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
Shawn Willden294a2db2015-06-17 11:20:56 -06001887 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1888 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001889
Shawn Willden6270aca2015-05-26 13:12:24 -06001890 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001891}
1892
Shawn Willden58427c42015-05-20 13:00:42 -06001893TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001894 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1895 .AesEncryptionKey(128)
1896 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1897 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001898 // Two-block message.
1899 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001900 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001901 EXPECT_EQ(message.size(), ciphertext1.size());
1902
Shawn Willden31e063f2015-05-08 14:31:22 -06001903 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001904 EXPECT_EQ(message.size(), ciphertext2.size());
1905
1906 // ECB is deterministic.
1907 EXPECT_EQ(ciphertext1, ciphertext2);
1908
Shawn Willden31e063f2015-05-08 14:31:22 -06001909 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001910 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001911
Shawn Willden6270aca2015-05-26 13:12:24 -06001912 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001913}
1914
Shawn Willden58427c42015-05-20 13:00:42 -06001915TEST_P(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001916 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1917 .AesEncryptionKey(128)
1918 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1919 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001920 // Message is slightly shorter than two blocks.
1921 string message = "1234567890123456789012345678901";
1922
Shawn Willden31e063f2015-05-08 14:31:22 -06001923 AuthorizationSet begin_params(client_params());
1924 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001925 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001926 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001927 string ciphertext;
1928 size_t input_consumed;
1929 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1930 EXPECT_EQ(message.size(), input_consumed);
1931 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001932
Shawn Willden6270aca2015-05-26 13:12:24 -06001933 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001934}
1935
Shawn Willden58427c42015-05-20 13:00:42 -06001936TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001937 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001938 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001939 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1940 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001941
1942 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001943 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001944 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001945 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001946 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001947 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001948 EXPECT_EQ(message, plaintext);
1949 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001950
Shawn Willden6270aca2015-05-26 13:12:24 -06001951 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001952}
1953
Shawn Willden58427c42015-05-20 13:00:42 -06001954TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001955 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001956 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001957 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1958 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001959
1960 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001961 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001962 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001963 EXPECT_NE(ciphertext, message);
1964 ++ciphertext[ciphertext.size() / 2];
1965
Shawn Willden31e063f2015-05-08 14:31:22 -06001966 AuthorizationSet begin_params(client_params());
1967 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001968 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
Shawn Willden31e063f2015-05-08 14:31:22 -06001969 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001970 string plaintext;
1971 size_t input_consumed;
1972 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1973 EXPECT_EQ(ciphertext.size(), input_consumed);
1974 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001975
Shawn Willden6270aca2015-05-26 13:12:24 -06001976 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001977}
1978
Shawn Willden58427c42015-05-20 13:00:42 -06001979TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001980 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1981 .AesEncryptionKey(128)
1982 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1983 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001984 string message = "123";
1985 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001986 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001987 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001988 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001989
1990 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001991 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001992 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001993 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001994
1995 // IVs should be random, so ciphertexts should differ.
1996 EXPECT_NE(iv1, iv2);
1997 EXPECT_NE(ciphertext1, ciphertext2);
1998
Shawn Willden31e063f2015-05-08 14:31:22 -06001999 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07002000 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002001
Shawn Willden6270aca2015-05-26 13:12:24 -06002002 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002003}
2004
Shawn Willden58427c42015-05-20 13:00:42 -06002005TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002006 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2007 .AesEncryptionKey(128)
2008 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
2009 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07002010
2011 int increment = 15;
2012 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06002013 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002014 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002015 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07002016 AuthorizationSet output_params;
2017 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2018
2019 string ciphertext;
2020 size_t input_consumed;
2021 for (size_t i = 0; i < message.size(); i += increment)
2022 EXPECT_EQ(KM_ERROR_OK,
2023 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2024 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2025 EXPECT_EQ(message.size(), ciphertext.size());
2026
2027 // Move TAG_NONCE into input_params
2028 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06002029 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002030 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002031 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07002032 output_params.Clear();
2033
2034 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
2035 string plaintext;
2036 for (size_t i = 0; i < ciphertext.size(); i += increment)
2037 EXPECT_EQ(KM_ERROR_OK,
2038 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2039 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2040 EXPECT_EQ(ciphertext.size(), plaintext.size());
2041 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002042
Shawn Willden6270aca2015-05-26 13:12:24 -06002043 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002044}
2045
2046struct AesCtrSp80038aTestVector {
2047 const char* key;
2048 const char* nonce;
2049 const char* plaintext;
2050 const char* ciphertext;
2051};
2052
2053// These test vectors are taken from
2054// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
2055static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
2056 // AES-128
2057 {
2058 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2059 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2060 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2061 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
2062 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
2063 },
2064 // AES-192
2065 {
2066 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2067 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2068 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2069 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
2070 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
2071 },
2072 // AES-256
2073 {
2074 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
2075 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2076 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2077 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2078 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
2079 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
2080 },
2081};
2082
Shawn Willden58427c42015-05-20 13:00:42 -06002083TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
Thai Duong20d725d2015-03-24 17:49:58 -07002084 for (size_t i = 0; i < 3; i++) {
2085 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
2086 const string key = hex2str(test.key);
2087 const string nonce = hex2str(test.nonce);
2088 const string plaintext = hex2str(test.plaintext);
2089 const string ciphertext = hex2str(test.ciphertext);
2090 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
2091 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002092
Shawn Willden6270aca2015-05-26 13:12:24 -06002093 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002094}
2095
Shawn Willden58427c42015-05-20 13:00:42 -06002096TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
Thai Duong20d725d2015-03-24 17:49:58 -07002097 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2098 .AesEncryptionKey(128)
2099 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
2100 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06002101 AuthorizationSet begin_params(client_params());
2102 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002103 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06002104 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002105
Shawn Willden6270aca2015-05-26 13:12:24 -06002106 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002107}
2108
Shawn Willden58427c42015-05-20 13:00:42 -06002109TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
Thai Duong20d725d2015-03-24 17:49:58 -07002110 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2111 .AesEncryptionKey(128)
2112 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002113 .Authorization(TAG_CALLER_NONCE)
2114 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07002115
Shawn Willden09f25272015-04-15 13:49:49 -06002116 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002117 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002118 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07002119 input_params.push_back(TAG_NONCE, "123", 3);
2120 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002121
Shawn Willden6270aca2015-05-26 13:12:24 -06002122 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002123}
2124
Shawn Willden58427c42015-05-20 13:00:42 -06002125TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002126 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2127 .AesEncryptionKey(128)
2128 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2129 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002130 // Two-block message.
2131 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002132 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06002133 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002134 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002135
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002136 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06002137 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002138 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002139
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002140 // IVs should be random, so ciphertexts should differ.
2141 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002142 EXPECT_NE(ciphertext1, ciphertext2);
2143
Shawn Willden31e063f2015-05-08 14:31:22 -06002144 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002145 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002146
Shawn Willden6270aca2015-05-26 13:12:24 -06002147 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002148}
2149
Shawn Willden58427c42015-05-20 13:00:42 -06002150TEST_P(EncryptionOperationsTest, AesCallerNonce) {
Shawn Willden969aa382015-04-15 17:05:53 -07002151 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2152 .AesEncryptionKey(128)
2153 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002154 .Authorization(TAG_CALLER_NONCE)
2155 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07002156 string message = "12345678901234567890123456789012";
2157 string iv1;
2158 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002159 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002160 EXPECT_EQ(message.size(), ciphertext1.size());
2161 EXPECT_EQ(16U, iv1.size());
2162
Shawn Willden31e063f2015-05-08 14:31:22 -06002163 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002164 EXPECT_EQ(message, plaintext);
2165
2166 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06002167 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07002168 AuthorizationSet update_params;
2169 AuthorizationSet output_params;
2170 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002171 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002172 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002173 string ciphertext2 =
2174 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
2175
2176 // Decrypt with correct nonce.
2177 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2178 &output_params);
2179 EXPECT_EQ(message, plaintext);
2180
2181 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06002182 input_params.Reinitialize(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 Willden969aa382015-04-15 17:05:53 -07002185 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
2186 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2187 &output_params);
2188 EXPECT_NE(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002189
Shawn Willden6270aca2015-05-26 13:12:24 -06002190 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden969aa382015-04-15 17:05:53 -07002191}
2192
Shawn Willden58427c42015-05-20 13:00:42 -06002193TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002194 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2195 .AesEncryptionKey(128)
2196 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2197 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06002198
2199 string message = "12345678901234567890123456789012";
2200 string iv1;
2201 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002202 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002203 EXPECT_EQ(message.size(), ciphertext1.size());
2204 EXPECT_EQ(16U, iv1.size());
2205
Shawn Willden31e063f2015-05-08 14:31:22 -06002206 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002207 EXPECT_EQ(message, plaintext);
2208
2209 // Now specify a nonce, should fail.
2210 AuthorizationSet input_params(client_params());
2211 AuthorizationSet update_params;
2212 AuthorizationSet output_params;
2213 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002214 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002215 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden67706352015-04-28 00:43:19 -06002216
2217 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
2218 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002219
Shawn Willden6270aca2015-05-26 13:12:24 -06002220 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden67706352015-04-28 00:43:19 -06002221}
2222
Shawn Willden58427c42015-05-20 13:00:42 -06002223TEST_P(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002224 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2225 .AesEncryptionKey(128)
2226 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2227 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002228
2229 int increment = 15;
2230 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06002231 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002232 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002233 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002234 AuthorizationSet output_params;
2235 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2236
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002237 string ciphertext;
2238 size_t input_consumed;
2239 for (size_t i = 0; i < message.size(); i += increment)
2240 EXPECT_EQ(KM_ERROR_OK,
2241 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2242 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002243 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002244
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002245 // Move TAG_NONCE into input_params
2246 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06002247 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002248 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002249 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002250 output_params.Clear();
2251
2252 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002253 string plaintext;
2254 for (size_t i = 0; i < ciphertext.size(); i += increment)
2255 EXPECT_EQ(KM_ERROR_OK,
2256 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2257 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002258 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002259 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002260
Shawn Willden6270aca2015-05-26 13:12:24 -06002261 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002262}
2263
Shawn Willden58427c42015-05-20 13:00:42 -06002264TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002265 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002266 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002267 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2268 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002269
2270 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06002271 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002272 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002273 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06002274 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002275 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06002276 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002277 EXPECT_EQ(message, plaintext);
2278 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002279
Shawn Willden6270aca2015-05-26 13:12:24 -06002280 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002281}
2282
Shawn Willden0f392562015-06-02 09:00:52 -06002283TEST_P(EncryptionOperationsTest, AesGcmRoundTripSuccess) {
2284 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2285 .AesEncryptionKey(128)
2286 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2287 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2288 string aad = "foobar";
2289 string message = "123456789012345678901234567890123456";
2290 AuthorizationSet begin_params(client_params());
2291 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2292 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2293 begin_params.push_back(TAG_MAC_LENGTH, 128);
Shawn Willden0f392562015-06-02 09:00:52 -06002294
2295 AuthorizationSet update_params;
2296 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
Shawn Willden0f392562015-06-02 09:00:52 -06002297
2298 // Encrypt
Shawn Willden34419132015-06-08 23:10:44 -06002299 AuthorizationSet begin_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002300 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002301 string ciphertext;
2302 size_t input_consumed;
2303 AuthorizationSet update_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002304 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2305 &input_consumed));
2306 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002307 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002308
Shawn Willden34419132015-06-08 23:10:44 -06002309 // Grab nonce
Shawn Willden0f392562015-06-02 09:00:52 -06002310 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
Shawn Willden0f392562015-06-02 09:00:52 -06002311 begin_params.push_back(begin_out_params);
Shawn Willden0f392562015-06-02 09:00:52 -06002312
2313 // Decrypt.
Shawn Willden34419132015-06-08 23:10:44 -06002314 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2315 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002316 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2317 &plaintext, &input_consumed));
2318 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002319 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002320
2321 EXPECT_EQ(message, plaintext);
2322 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2323}
2324
Shawn Willden34419132015-06-08 23:10:44 -06002325TEST_P(EncryptionOperationsTest, AesGcmCorruptKey) {
2326 uint8_t nonce[] = {
2327 0xb7, 0x94, 0x37, 0xae, 0x08, 0xff, 0x35, 0x5d, 0x7d, 0x8a, 0x4d, 0x0f,
2328 };
2329 uint8_t ciphertext[] = {
2330 0xb3, 0xf6, 0x79, 0x9e, 0x8f, 0x93, 0x26, 0xf2, 0xdf, 0x1e, 0x80, 0xfc, 0xd2, 0xcb, 0x16,
2331 0xd7, 0x8c, 0x9d, 0xc7, 0xcc, 0x14, 0xbb, 0x67, 0x78, 0x62, 0xdc, 0x6c, 0x63, 0x9b, 0x3a,
2332 0x63, 0x38, 0xd2, 0x4b, 0x31, 0x2d, 0x39, 0x89, 0xe5, 0x92, 0x0b, 0x5d, 0xbf, 0xc9, 0x76,
2333 0x76, 0x5e, 0xfb, 0xfe, 0x57, 0xbb, 0x38, 0x59, 0x40, 0xa7, 0xa4, 0x3b, 0xdf, 0x05, 0xbd,
2334 0xda, 0xe3, 0xc9, 0xd6, 0xa2, 0xfb, 0xbd, 0xfc, 0xc0, 0xcb, 0xa0,
2335 };
2336 string ciphertext_str(reinterpret_cast<char*>(ciphertext), sizeof(ciphertext));
2337
2338 AuthorizationSet begin_params(client_params());
2339 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2340 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2341 begin_params.push_back(TAG_MAC_LENGTH, 128);
2342 begin_params.push_back(TAG_NONCE, nonce, sizeof(nonce));
2343
2344 string plaintext;
2345 size_t input_consumed;
2346
2347 // Import correct key and decrypt
2348 uint8_t good_key[] = {
2349 0xba, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d,
2350 0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb,
2351 };
2352 string good_key_str(reinterpret_cast<char*>(good_key), sizeof(good_key));
2353 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
2354 .AesEncryptionKey(128)
2355 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2356 .Authorization(TAG_PADDING, KM_PAD_NONE)
2357 .Authorization(TAG_CALLER_NONCE),
2358 KM_KEY_FORMAT_RAW, good_key_str));
2359 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2360 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext_str, &plaintext, &input_consumed));
2361 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2362
2363 // Import bad key and decrypt
2364 uint8_t bad_key[] = {
2365 0xbb, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d,
2366 0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb,
2367 };
2368 string bad_key_str(reinterpret_cast<char*>(bad_key), sizeof(bad_key));
2369 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
2370 .AesEncryptionKey(128)
2371 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2372 .Authorization(TAG_PADDING, KM_PAD_NONE),
2373 KM_KEY_FORMAT_RAW, bad_key_str));
2374 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2375 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext_str, &plaintext, &input_consumed));
2376 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
2377
2378 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2379}
2380
2381TEST_P(EncryptionOperationsTest, AesGcmAadNoData) {
2382 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2383 .AesEncryptionKey(128)
2384 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2385 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2386 string aad = "123456789012345678";
2387 string empty_message;
2388 AuthorizationSet begin_params(client_params());
2389 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2390 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2391 begin_params.push_back(TAG_MAC_LENGTH, 128);
2392
2393 AuthorizationSet update_params;
2394 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
2395
2396 // Encrypt
2397 AuthorizationSet begin_out_params;
2398 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2399 string ciphertext;
2400 size_t input_consumed;
2401 AuthorizationSet update_out_params;
2402 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, empty_message, &update_out_params,
2403 &ciphertext, &input_consumed));
2404 EXPECT_EQ(0U, input_consumed);
2405 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2406
2407 // Grab nonce
2408 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2409 begin_params.push_back(begin_out_params);
2410
2411 // Decrypt.
2412 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2413 string plaintext;
2414 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2415 &plaintext, &input_consumed));
2416 EXPECT_EQ(ciphertext.size(), input_consumed);
2417 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2418
2419 EXPECT_EQ(empty_message, plaintext);
2420 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2421}
2422
2423TEST_P(EncryptionOperationsTest, AesGcmIncremental) {
2424 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2425 .AesEncryptionKey(128)
2426 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2427 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2428 AuthorizationSet begin_params(client_params());
2429 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2430 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2431 begin_params.push_back(TAG_MAC_LENGTH, 128);
2432
2433 AuthorizationSet update_params;
2434 update_params.push_back(TAG_ASSOCIATED_DATA, "b", 1);
2435
2436 // Encrypt
2437 AuthorizationSet begin_out_params;
2438 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2439 string ciphertext;
2440 size_t input_consumed;
2441 AuthorizationSet update_out_params;
2442
2443 // Send AAD, incrementally
2444 for (int i = 0; i < 1000; ++i) {
2445 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "", &update_out_params, &ciphertext,
2446 &input_consumed));
2447 EXPECT_EQ(0U, input_consumed);
2448 EXPECT_EQ(0U, ciphertext.size());
2449 }
2450
2451 // Now send data, incrementally, no data.
2452 AuthorizationSet empty_params;
2453 for (int i = 0; i < 1000; ++i) {
2454 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(empty_params, "a", &update_out_params, &ciphertext,
2455 &input_consumed));
2456 EXPECT_EQ(1U, input_consumed);
2457 }
2458 EXPECT_EQ(1000U, ciphertext.size());
2459
2460 // And finish.
2461 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2462 EXPECT_EQ(1016U, ciphertext.size());
2463
2464 // Grab nonce
2465 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2466 begin_params.push_back(begin_out_params);
2467
2468 // Decrypt.
2469 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2470 string plaintext;
2471
2472 // Send AAD, incrementally, no data
2473 for (int i = 0; i < 1000; ++i) {
2474 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "", &update_out_params, &plaintext,
2475 &input_consumed));
2476 EXPECT_EQ(0U, input_consumed);
2477 EXPECT_EQ(0U, plaintext.size());
2478 }
2479
2480 // Now send data, incrementally.
2481 for (size_t i = 0; i < ciphertext.length(); ++i) {
2482 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(empty_params, string(ciphertext.data() + i, 1),
2483 &update_out_params, &plaintext, &input_consumed));
2484 EXPECT_EQ(1U, input_consumed);
2485 }
2486 EXPECT_EQ(1000U, plaintext.size());
2487 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2488
2489 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2490}
2491
Shawn Willden0f392562015-06-02 09:00:52 -06002492TEST_P(EncryptionOperationsTest, AesGcmMultiPartAad) {
2493 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2494 .AesEncryptionKey(128)
2495 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2496 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2497 string message = "123456789012345678901234567890123456";
2498 AuthorizationSet begin_params(client_params());
2499 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2500 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2501 begin_params.push_back(TAG_MAC_LENGTH, 128);
2502 AuthorizationSet begin_out_params;
2503
2504 AuthorizationSet update_params;
2505 update_params.push_back(TAG_ASSOCIATED_DATA, "foo", 3);
Shawn Willden0f392562015-06-02 09:00:52 -06002506
2507 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2508
2509 // No data, AAD only.
Shawn Willden34419132015-06-08 23:10:44 -06002510 string ciphertext;
2511 size_t input_consumed;
2512 AuthorizationSet update_out_params;
2513 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "" /* message */, &update_out_params,
2514 &ciphertext, &input_consumed));
2515 EXPECT_EQ(0U, input_consumed);
Shawn Willden0f392562015-06-02 09:00:52 -06002516
2517 // AAD and data.
2518 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2519 &input_consumed));
2520 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002521 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002522
Shawn Willden34419132015-06-08 23:10:44 -06002523 // Grab nonce.
Shawn Willden0f392562015-06-02 09:00:52 -06002524 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2525 begin_params.push_back(begin_out_params);
2526
Shawn Willden34419132015-06-08 23:10:44 -06002527 // Decrypt
2528 update_params.Clear();
2529 update_params.push_back(TAG_ASSOCIATED_DATA, "foofoo", 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002530
Shawn Willden34419132015-06-08 23:10:44 -06002531 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2532 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002533 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2534 &plaintext, &input_consumed));
2535 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002536 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002537
2538 EXPECT_EQ(message, plaintext);
2539 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2540}
2541
2542TEST_P(EncryptionOperationsTest, AesGcmBadAad) {
2543 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2544 .AesEncryptionKey(128)
2545 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2546 .Authorization(TAG_PADDING, KM_PAD_NONE)));
Shawn Willden0f392562015-06-02 09:00:52 -06002547 string message = "12345678901234567890123456789012";
2548 AuthorizationSet begin_params(client_params());
2549 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2550 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2551 begin_params.push_back(TAG_MAC_LENGTH, 128);
Shawn Willden0f392562015-06-02 09:00:52 -06002552
2553 AuthorizationSet update_params;
Shawn Willden34419132015-06-08 23:10:44 -06002554 update_params.push_back(TAG_ASSOCIATED_DATA, "foobar", 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002555
2556 AuthorizationSet finish_params;
2557 AuthorizationSet finish_out_params;
2558
Shawn Willden0f392562015-06-02 09:00:52 -06002559 // Encrypt
Shawn Willden34419132015-06-08 23:10:44 -06002560 AuthorizationSet begin_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002561 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002562 AuthorizationSet update_out_params;
2563 string ciphertext;
2564 size_t input_consumed;
Shawn Willden0f392562015-06-02 09:00:52 -06002565 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2566 &input_consumed));
2567 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002568 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002569
Shawn Willden34419132015-06-08 23:10:44 -06002570 // Grab nonce
Shawn Willden0f392562015-06-02 09:00:52 -06002571 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
Shawn Willden0f392562015-06-02 09:00:52 -06002572 begin_params.push_back(begin_out_params);
Shawn Willden34419132015-06-08 23:10:44 -06002573
Shawn Willden0f392562015-06-02 09:00:52 -06002574 update_params.Clear();
2575 update_params.push_back(TAG_ASSOCIATED_DATA, "barfoo" /* Wrong AAD */, 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002576
2577 // Decrypt.
2578 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002579 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002580 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2581 &plaintext, &input_consumed));
2582 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002583 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002584
Shawn Willden0f392562015-06-02 09:00:52 -06002585 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2586}
2587
2588TEST_P(EncryptionOperationsTest, AesGcmWrongNonce) {
2589 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2590 .AesEncryptionKey(128)
2591 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2592 .Authorization(TAG_PADDING, KM_PAD_NONE)));
Shawn Willden0f392562015-06-02 09:00:52 -06002593 string message = "12345678901234567890123456789012";
2594 AuthorizationSet begin_params(client_params());
2595 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2596 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2597 begin_params.push_back(TAG_MAC_LENGTH, 128);
Shawn Willden0f392562015-06-02 09:00:52 -06002598
2599 AuthorizationSet update_params;
Shawn Willden34419132015-06-08 23:10:44 -06002600 update_params.push_back(TAG_ASSOCIATED_DATA, "foobar", 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002601
2602 // Encrypt
Shawn Willden34419132015-06-08 23:10:44 -06002603 AuthorizationSet begin_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002604 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002605 AuthorizationSet update_out_params;
2606 string ciphertext;
2607 size_t input_consumed;
Shawn Willden0f392562015-06-02 09:00:52 -06002608 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2609 &input_consumed));
2610 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002611 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002612
Shawn Willden0f392562015-06-02 09:00:52 -06002613 begin_params.push_back(TAG_NONCE, "123456789012", 12);
2614
Shawn Willden34419132015-06-08 23:10:44 -06002615 // Decrypt
Shawn Willden0f392562015-06-02 09:00:52 -06002616 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002617 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002618 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2619 &plaintext, &input_consumed));
2620 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002621 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002622
2623 // With wrong nonce, should have gotten garbage plaintext.
2624 EXPECT_NE(message, plaintext);
2625 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2626}
2627
2628TEST_P(EncryptionOperationsTest, AesGcmCorruptTag) {
2629 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2630 .AesEncryptionKey(128)
2631 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2632 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2633 string aad = "foobar";
2634 string message = "123456789012345678901234567890123456";
2635 AuthorizationSet begin_params(client_params());
2636 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2637 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2638 begin_params.push_back(TAG_MAC_LENGTH, 128);
2639 AuthorizationSet begin_out_params;
2640
2641 AuthorizationSet update_params;
2642 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
Shawn Willden0f392562015-06-02 09:00:52 -06002643
2644 // Encrypt
2645 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002646 AuthorizationSet update_out_params;
2647 string ciphertext;
2648 size_t input_consumed;
Shawn Willden0f392562015-06-02 09:00:52 -06002649 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2650 &input_consumed));
2651 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002652 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002653
Shawn Willden34419132015-06-08 23:10:44 -06002654 // Corrupt tag
2655 (*ciphertext.rbegin())++;
2656
2657 // Grab nonce.
Shawn Willden0f392562015-06-02 09:00:52 -06002658 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2659 begin_params.push_back(begin_out_params);
Shawn Willden0f392562015-06-02 09:00:52 -06002660
2661 // Decrypt.
2662 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002663 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002664 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2665 &plaintext, &input_consumed));
2666 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002667 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002668
2669 EXPECT_EQ(message, plaintext);
2670 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2671}
2672
Shawn Willden58427c42015-05-20 13:00:42 -06002673typedef Keymaster1Test AddEntropyTest;
2674INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params);
2675
2676TEST_P(AddEntropyTest, AddEntropy) {
Shawn Willdencd695822015-01-26 14:06:32 -07002677 // There's no obvious way to test that entropy is actually added, but we can test that the API
2678 // doesn't blow up or return an error.
2679 EXPECT_EQ(KM_ERROR_OK,
2680 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
Shawn Willden2beb6282015-05-20 16:36:24 -06002681
Shawn Willden6270aca2015-05-26 13:12:24 -06002682 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden2beb6282015-05-20 16:36:24 -06002683}
2684
2685typedef Keymaster1Test Keymaster0AdapterTest;
2686INSTANTIATE_TEST_CASE_P(
2687 AndroidKeymasterTest, Keymaster0AdapterTest,
Shawn Willden6270aca2015-05-26 13:12:24 -06002688 ::testing::Values(
2689 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(true /* support_ec */)),
2690 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(false /* support_ec */))));
Shawn Willden2beb6282015-05-20 16:36:24 -06002691
Shawn Willden6270aca2015-05-26 13:12:24 -06002692TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002693 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2694 // key data.
2695 string km1_sw = read_file("km1_sw_rsa_512.blob");
2696 EXPECT_EQ(486U, km1_sw.length());
2697
2698 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2699 memcpy(key_data, km1_sw.data(), km1_sw.length());
2700 set_key_blob(key_data, km1_sw.length());
2701
2702 string message(64, 'a');
2703 string signature;
2704 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2705
2706 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2707}
2708
Shawn Willdenc7fe06d2015-06-11 15:50:04 -06002709TEST_P(Keymaster0AdapterTest, UnversionedSoftwareKeymaster1RsaBlob) {
2710 // Load and use an old-style Keymaster1 software key blob, without the version byte. These
2711 // blobs contain OCB-encrypted key data.
2712 string km1_sw = read_file("km1_sw_rsa_512_unversioned.blob");
2713 EXPECT_EQ(477U, km1_sw.length());
2714
2715 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2716 memcpy(key_data, km1_sw.data(), km1_sw.length());
2717 set_key_blob(key_data, km1_sw.length());
2718
2719 string message(64, 'a');
2720 string signature;
2721 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2722
2723 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2724}
2725
Shawn Willden6270aca2015-05-26 13:12:24 -06002726TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1EcdsaBlob) {
2727 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2728 // key data.
2729 string km1_sw = read_file("km1_sw_ecdsa_256.blob");
2730 EXPECT_EQ(270U, km1_sw.length());
2731
2732 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2733 memcpy(key_data, km1_sw.data(), km1_sw.length());
2734 set_key_blob(key_data, km1_sw.length());
2735
Shawn Willdend5303052015-06-22 05:25:59 -06002736 string message(32, static_cast<char>(0xFF));
Shawn Willden6270aca2015-05-26 13:12:24 -06002737 string signature;
2738 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2739
2740 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2741}
2742
Shawn Willden2beb6282015-05-20 16:36:24 -06002743struct Malloc_Delete {
2744 void operator()(void* p) { free(p); }
2745};
2746
Shawn Willden6270aca2015-05-26 13:12:24 -06002747TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster0RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002748 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2749 string km0_sw = read_file("km0_sw_rsa_512.blob");
2750 EXPECT_EQ(333U, km0_sw.length());
2751
2752 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2753 memcpy(key_data, km0_sw.data(), km0_sw.length());
2754 set_key_blob(key_data, km0_sw.length());
2755
2756 string message(64, 'a');
2757 string signature;
2758 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2759
2760 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdencd695822015-01-26 14:06:32 -07002761}
2762
Shawn Willdenccb84e92015-06-02 19:44:54 -06002763TEST_P(Keymaster0AdapterTest, OldSwKeymaster0RsaBlobGetCharacteristics) {
2764 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2765 string km0_sw = read_file("km0_sw_rsa_512.blob");
2766 EXPECT_EQ(333U, km0_sw.length());
2767
2768 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2769 memcpy(key_data, km0_sw.data(), km0_sw.length());
2770 set_key_blob(key_data, km0_sw.length());
2771
2772 EXPECT_EQ(KM_ERROR_OK, GetCharacteristics());
2773 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
2774 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 512));
2775 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
2776 EXPECT_TRUE(contains(sw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
2777 EXPECT_TRUE(contains(sw_enforced(), TAG_PADDING, KM_PAD_NONE));
2778 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
2779 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
2780 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_ALL_USERS));
2781 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_NO_AUTH_REQUIRED));
2782
2783 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2784}
2785
2786TEST_P(Keymaster0AdapterTest, OldHwKeymaster0RsaBlob) {
2787 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2788 string km0_sw = read_file("km0_sw_rsa_512.blob");
2789 EXPECT_EQ(333U, km0_sw.length());
2790
2791 // The keymaster0 wrapper swaps the old softkeymaster leading 'P' for a 'Q' to make the key not
2792 // be recognized as a software key. Do the same here to pretend this is a hardware key.
2793 EXPECT_EQ('P', km0_sw[0]);
2794 km0_sw[0] = 'Q';
2795
2796 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2797 memcpy(key_data, km0_sw.data(), km0_sw.length());
2798 set_key_blob(key_data, km0_sw.length());
2799
2800 string message(64, 'a');
2801 string signature;
2802 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2803 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
2804
2805 EXPECT_EQ(5, GetParam()->keymaster0_calls());
2806}
2807
2808TEST_P(Keymaster0AdapterTest, OldHwKeymaster0RsaBlobGetCharacteristics) {
2809 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2810 string km0_sw = read_file("km0_sw_rsa_512.blob");
2811 EXPECT_EQ(333U, km0_sw.length());
2812
2813 // The keymaster0 wrapper swaps the old softkeymaster leading 'P' for a 'Q' to make the key not
2814 // be recognized as a software key. Do the same here to pretend this is a hardware key.
2815 EXPECT_EQ('P', km0_sw[0]);
2816 km0_sw[0] = 'Q';
2817
2818 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2819 memcpy(key_data, km0_sw.data(), km0_sw.length());
2820 set_key_blob(key_data, km0_sw.length());
2821
2822 EXPECT_EQ(KM_ERROR_OK, GetCharacteristics());
2823 EXPECT_TRUE(contains(hw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
2824 EXPECT_TRUE(contains(hw_enforced(), TAG_KEY_SIZE, 512));
2825 EXPECT_TRUE(contains(hw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
2826 EXPECT_TRUE(contains(hw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
2827 EXPECT_TRUE(contains(hw_enforced(), TAG_PADDING, KM_PAD_NONE));
2828 EXPECT_EQ(5U, hw_enforced().size());
2829
2830 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
2831 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
2832 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_ALL_USERS));
2833 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_NO_AUTH_REQUIRED));
2834
2835 EXPECT_FALSE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
2836 EXPECT_FALSE(contains(sw_enforced(), TAG_KEY_SIZE, 512));
2837 EXPECT_FALSE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
2838 EXPECT_FALSE(contains(sw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
2839 EXPECT_FALSE(contains(sw_enforced(), TAG_PADDING, KM_PAD_NONE));
2840
2841 EXPECT_EQ(1, GetParam()->keymaster0_calls());
2842}
2843
Shawn Willden128ffe02014-08-06 12:31:33 -06002844} // namespace test
2845} // namespace keymaster