blob: 9463a57ac6606c641fa91396e7918bf6a50ef986 [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, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600575 GenerateKey(AuthorizationSetBuilder()
576 .RsaSigningKey(256, 3)
577 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
578 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600579 AuthorizationSet begin_params(client_params());
580 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
581 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600582
Shawn Willden6270aca2015-05-26 13:12:24 -0600583 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600584 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600585}
586
Shawn Willden58427c42015-05-20 13:00:42 -0600587TEST_P(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700588 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600589 GenerateKey(AuthorizationSetBuilder()
590 .RsaSigningKey(256, 3)
591 .Digest(KM_DIGEST_NONE)
592 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600593 AuthorizationSet begin_params(client_params());
594 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600595 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600596 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600597
Shawn Willden6270aca2015-05-26 13:12:24 -0600598 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600599 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600600}
601
Shawn Willden58427c42015-05-20 13:00:42 -0600602TEST_P(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700603 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600604 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
605 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600606 AuthorizationSet begin_params(client_params());
607 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
608 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -0600609
Shawn Willden6270aca2015-05-26 13:12:24 -0600610 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600611 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600612}
613
Shawn Willden58427c42015-05-20 13:00:42 -0600614TEST_P(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600615 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
616 .RsaSigningKey(256, 3)
617 .Digest(KM_DIGEST_NONE)
618 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600619 AuthorizationSet begin_params(client_params());
620 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600621 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600622 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600623
624 string message = "1234567890123456789012345678901";
625 string result;
626 size_t input_consumed;
627 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
628 EXPECT_EQ(0U, result.size());
629 EXPECT_EQ(31U, input_consumed);
630
631 string signature;
Shawn Willdend5303052015-06-22 05:25:59 -0600632 ASSERT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&signature));
Shawn Willdenedb79942015-05-08 06:46:44 -0600633 EXPECT_EQ(0U, signature.length());
Shawn Willden2beb6282015-05-20 16:36:24 -0600634
Shawn Willden6270aca2015-05-26 13:12:24 -0600635 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -0600636 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600637}
638
Shawn Willden58427c42015-05-20 13:00:42 -0600639TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600640 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
641 .RsaEncryptionKey(256, 3)
642 .Digest(KM_DIGEST_NONE)
643 .Padding(KM_PAD_NONE)));
644 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
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 Willden294a2db2015-06-17 11:20:56 -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, EcdsaSuccess) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600651 ASSERT_EQ(KM_ERROR_OK,
652 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdend5303052015-06-22 05:25:59 -0600653 string message(224 / 8, 'a');
Shawn Willdenedb79942015-05-08 06:46:44 -0600654 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600655 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -0600656
Shawn Willden6270aca2015-05-26 13:12:24 -0600657 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
658 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600659}
660
Shawn Willdenefbd7e42015-06-01 07:07:33 -0600661TEST_P(SigningOperationsTest, EcdsaSha256Success) {
662 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(
663 KM_DIGEST_SHA_2_256)));
664 string message(1024, 'a');
665 string signature;
666 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
667
668 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
669 EXPECT_EQ(3, GetParam()->keymaster0_calls());
670}
671
Shawn Willdend5303052015-06-22 05:25:59 -0600672TEST_P(SigningOperationsTest, EcdsaNoPaddingHugeData) {
673 ASSERT_EQ(KM_ERROR_OK,
674 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
675 string message(64 * 1024, 'a');
676 string signature;
677 AuthorizationSet begin_params(client_params());
678 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
679 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
680 string result;
681 size_t input_consumed;
682 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &result, &input_consumed));
683
684 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
685 EXPECT_EQ(2, GetParam()->keymaster0_calls());
686}
687
Shawn Willden58427c42015-05-20 13:00:42 -0600688TEST_P(SigningOperationsTest, AesEcbSign) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600689 ASSERT_EQ(KM_ERROR_OK,
690 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
691 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willden294a2db2015-06-17 11:20:56 -0600692 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
693 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
Shawn Willden2beb6282015-05-20 16:36:24 -0600694
Shawn Willden6270aca2015-05-26 13:12:24 -0600695 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -0600696}
697
Shawn Willden58427c42015-05-20 13:00:42 -0600698TEST_P(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600699 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700700 string message = "12345678901234567890123456789012";
701 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600702 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600703 ASSERT_EQ(20U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600704
Shawn Willden6270aca2015-05-26 13:12:24 -0600705 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700706}
707
Shawn Willden58427c42015-05-20 13:00:42 -0600708TEST_P(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600709 ASSERT_EQ(KM_ERROR_OK,
710 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700711 string message = "12345678901234567890123456789012";
712 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600713 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600714 ASSERT_EQ(28U, 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 Willden62c22862014-12-17 08:36:20 -0700717}
718
Shawn Willden58427c42015-05-20 13:00:42 -0600719TEST_P(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600720 ASSERT_EQ(KM_ERROR_OK,
721 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
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_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600725 ASSERT_EQ(32U, 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 Willden0d560bf2014-12-15 17:44:02 -0700728}
729
Shawn Willden58427c42015-05-20 13:00:42 -0600730TEST_P(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600731 ASSERT_EQ(KM_ERROR_OK,
732 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
733
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700734 string message = "12345678901234567890123456789012";
735 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600736 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600737 ASSERT_EQ(48U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600738
Shawn Willden6270aca2015-05-26 13:12:24 -0600739 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden62c22862014-12-17 08:36:20 -0700740}
741
Shawn Willden58427c42015-05-20 13:00:42 -0600742TEST_P(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600743 ASSERT_EQ(KM_ERROR_OK,
744 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700745 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700746 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600747 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600748 ASSERT_EQ(64U, 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, HmacLengthInKey) {
Shawn Willden09f25272015-04-15 13:49:49 -0600754 // TODO(swillden): unified API should generate an error on key generation.
755 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
756 .HmacKey(128)
757 .Digest(KM_DIGEST_SHA_2_256)
758 .Authorization(TAG_MAC_LENGTH, 20)));
759 string message = "12345678901234567890123456789012";
760 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600761 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600762 // Size in key was ignored.
763 ASSERT_EQ(30U, signature.size());
Shawn Willden2beb6282015-05-20 16:36:24 -0600764
Shawn Willden6270aca2015-05-26 13:12:24 -0600765 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden09f25272015-04-15 13:49:49 -0600766}
767
Shawn Willden58427c42015-05-20 13:00:42 -0600768TEST_P(SigningOperationsTest, HmacRfc4231TestCase1) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700769 uint8_t key_data[] = {
770 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
771 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
772 };
773 string message = "Hi There";
774 uint8_t sha_224_expected[] = {
775 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
776 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
777 };
778 uint8_t sha_256_expected[] = {
779 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
780 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
781 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
782 };
783 uint8_t sha_384_expected[] = {
784 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
785 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
786 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
787 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
788 };
789 uint8_t sha_512_expected[] = {
790 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
791 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
792 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
793 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
794 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
795 };
796
797 string key = make_string(key_data);
798
799 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
800 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
801 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
802 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600803
Shawn Willden6270aca2015-05-26 13:12:24 -0600804 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700805}
806
Shawn Willden58427c42015-05-20 13:00:42 -0600807TEST_P(SigningOperationsTest, HmacRfc4231TestCase2) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700808 string key = "Jefe";
809 string message = "what do ya want for nothing?";
810 uint8_t sha_224_expected[] = {
811 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
812 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
813 };
814 uint8_t sha_256_expected[] = {
815 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
816 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
817 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
818 };
819 uint8_t sha_384_expected[] = {
820 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
821 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
822 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
823 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
824 };
825 uint8_t sha_512_expected[] = {
826 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
827 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
828 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
829 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
830 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
831 };
832
833 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
834 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
835 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
836 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600837
Shawn Willden6270aca2015-05-26 13:12:24 -0600838 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700839}
840
Shawn Willden58427c42015-05-20 13:00:42 -0600841TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700842 string key(20, 0xaa);
843 string message(50, 0xdd);
844 uint8_t sha_224_expected[] = {
845 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
846 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
847 };
848 uint8_t sha_256_expected[] = {
849 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
850 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
851 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
852 };
853 uint8_t sha_384_expected[] = {
854 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
855 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
856 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
857 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
858 };
859 uint8_t sha_512_expected[] = {
860 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
861 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
862 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
863 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
864 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
865 };
866
867 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
868 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
869 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
870 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600871
Shawn Willden6270aca2015-05-26 13:12:24 -0600872 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700873}
874
Shawn Willden58427c42015-05-20 13:00:42 -0600875TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700876 uint8_t key_data[25] = {
877 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
878 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
879 };
880 string key = make_string(key_data);
881 string message(50, 0xcd);
882 uint8_t sha_224_expected[] = {
883 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
884 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
885 };
886 uint8_t sha_256_expected[] = {
887 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
888 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
889 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
890 };
891 uint8_t sha_384_expected[] = {
892 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
893 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
894 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
895 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
896 };
897 uint8_t sha_512_expected[] = {
898 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
899 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
900 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
901 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
902 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
903 };
904
905 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
906 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
907 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
908 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600909
Shawn Willden6270aca2015-05-26 13:12:24 -0600910 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700911}
912
Shawn Willden58427c42015-05-20 13:00:42 -0600913TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700914 string key(20, 0x0c);
915 string message = "Test With Truncation";
916
917 uint8_t sha_224_expected[] = {
918 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
919 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
920 };
921 uint8_t sha_256_expected[] = {
922 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
923 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
924 };
925 uint8_t sha_384_expected[] = {
926 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
927 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
928 };
929 uint8_t sha_512_expected[] = {
930 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
931 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
932 };
933
934 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
935 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
936 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
937 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600938
Shawn Willden6270aca2015-05-26 13:12:24 -0600939 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700940}
941
Shawn Willden58427c42015-05-20 13:00:42 -0600942TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700943 string key(131, 0xaa);
944 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
945
946 uint8_t sha_224_expected[] = {
947 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
948 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
949 };
950 uint8_t sha_256_expected[] = {
951 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
952 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
953 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
954 };
955 uint8_t sha_384_expected[] = {
956 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
957 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
958 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
959 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
960 };
961 uint8_t sha_512_expected[] = {
962 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
963 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
964 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
965 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
966 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
967 };
968
969 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
970 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
971 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
972 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -0600973
Shawn Willden6270aca2015-05-26 13:12:24 -0600974 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -0700975}
976
Shawn Willden58427c42015-05-20 13:00:42 -0600977TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700978 string key(131, 0xaa);
979 string message = "This is a test using a larger than block-size key and a larger than "
980 "block-size data. The key needs to be hashed before being used by the HMAC "
981 "algorithm.";
982
983 uint8_t sha_224_expected[] = {
984 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
985 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
986 };
987 uint8_t sha_256_expected[] = {
988 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
989 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
990 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
991 };
992 uint8_t sha_384_expected[] = {
993 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
994 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
995 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
996 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
997 };
998 uint8_t sha_512_expected[] = {
999 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
1000 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
1001 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
1002 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
1003 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
1004 };
1005
1006 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1007 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1008 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1009 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
Shawn Willden2beb6282015-05-20 16:36:24 -06001010
Shawn Willden6270aca2015-05-26 13:12:24 -06001011 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001012}
Shawn Willden0d560bf2014-12-15 17:44:02 -07001013
Shawn Willden58427c42015-05-20 13:00:42 -06001014TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -06001015 ASSERT_EQ(KM_ERROR_OK,
1016 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
1017 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -06001018 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -06001019 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -06001020 ASSERT_EQ(KM_ERROR_OK,
1021 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
1022 string message = "1234567890123456789012345678901";
1023 string result;
1024 size_t input_consumed;
1025 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1026 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001027
Shawn Willden6270aca2015-05-26 13:12:24 -06001028 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -07001029}
1030
Shawn Willden61902362014-12-18 10:33:24 -07001031// TODO(swillden): Add more verification failure tests.
1032
Shawn Willden58427c42015-05-20 13:00:42 -06001033typedef Keymaster1Test VerificationOperationsTest;
1034INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params);
1035
1036TEST_P(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001037 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1038 .RsaSigningKey(256, 3)
1039 .Digest(KM_DIGEST_NONE)
1040 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001041 string message = "12345678901234567890123456789012";
1042 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001043 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1044 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001045
Shawn Willden6270aca2015-05-26 13:12:24 -06001046 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001047 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden1615f2e2014-08-13 10:37:40 -06001048}
1049
Shawn Willden58427c42015-05-20 13:00:42 -06001050TEST_P(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001051 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1052 .RsaSigningKey(512, 3)
1053 .Digest(KM_DIGEST_SHA_2_256)
1054 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001055 // Use large message, which won't work without digesting.
1056 string message(1024, 'a');
1057 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001058 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
1059 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden2beb6282015-05-20 16:36:24 -06001060
Shawn Willden6270aca2015-05-26 13:12:24 -06001061 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001062 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001063}
1064
Shawn Willden58427c42015-05-20 13:00:42 -06001065TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001066 GenerateKey(AuthorizationSetBuilder()
1067 .RsaSigningKey(512, 3)
1068 .Digest(KM_DIGEST_SHA_2_256)
1069 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001070 string message(1024, 'a');
1071 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001072 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001073 ++signature[signature.size() / 2];
1074
Shawn Willden226746b2015-05-08 11:36:56 -06001075 AuthorizationSet begin_params(client_params());
1076 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001077 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001078 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001079
1080 string result;
1081 size_t input_consumed;
1082 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1083 EXPECT_EQ(message.size(), input_consumed);
1084 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001085
Shawn Willden6270aca2015-05-26 13:12:24 -06001086 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001087 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001088}
1089
Shawn Willden58427c42015-05-20 13:00:42 -06001090TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001091 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1092 .RsaSigningKey(512, 3)
1093 .Digest(KM_DIGEST_SHA_2_256)
1094 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -07001095 // Use large message, which won't work without digesting.
1096 string message(1024, 'a');
1097 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001098 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -07001099 ++message[message.size() / 2];
1100
Shawn Willden226746b2015-05-08 11:36:56 -06001101 AuthorizationSet begin_params(client_params());
1102 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001103 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -06001104 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -07001105
1106 string result;
1107 size_t input_consumed;
1108 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1109 EXPECT_EQ(message.size(), input_consumed);
1110 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001111
Shawn Willden6270aca2015-05-26 13:12:24 -06001112 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001113 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden61902362014-12-18 10:33:24 -07001114}
1115
Shawn Willden58427c42015-05-20 13:00:42 -06001116TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001117 GenerateKey(AuthorizationSetBuilder()
1118 .RsaSigningKey(512, 3)
1119 .Digest(KM_DIGEST_SHA_2_256)
1120 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001121 string message(1024, 'a');
1122 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001123 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1124 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden2beb6282015-05-20 16:36:24 -06001125
Shawn Willden6270aca2015-05-26 13:12:24 -06001126 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001127 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001128}
1129
Shawn Willden58427c42015-05-20 13:00:42 -06001130TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001131 GenerateKey(AuthorizationSetBuilder()
1132 .RsaSigningKey(512, 3)
1133 .Digest(KM_DIGEST_SHA_2_256)
1134 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001135 string message(1024, 'a');
1136 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001137 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001138 ++signature[signature.size() / 2];
1139
Shawn Willden226746b2015-05-08 11:36:56 -06001140 AuthorizationSet begin_params(client_params());
1141 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001142 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001143 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001144
1145 string result;
1146 size_t input_consumed;
1147 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1148 EXPECT_EQ(message.size(), input_consumed);
1149 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001150
Shawn Willden6270aca2015-05-26 13:12:24 -06001151 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001152 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001153}
1154
Shawn Willden58427c42015-05-20 13:00:42 -06001155TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001156 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1157 .RsaSigningKey(512, 3)
1158 .Digest(KM_DIGEST_SHA_2_256)
1159 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001160 // Use large message, which won't work without digesting.
1161 string message(1024, 'a');
1162 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001163 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001164 ++message[message.size() / 2];
1165
Shawn Willden226746b2015-05-08 11:36:56 -06001166 AuthorizationSet begin_params(client_params());
1167 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001168 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -06001169 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001170
1171 string result;
1172 size_t input_consumed;
1173 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1174 EXPECT_EQ(message.size(), input_consumed);
1175 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
Shawn Willden2beb6282015-05-20 16:36:24 -06001176
Shawn Willden6270aca2015-05-26 13:12:24 -06001177 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001178 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001179}
1180
1181template <typename T> vector<T> make_vector(const T* array, size_t len) {
1182 return vector<T>(array, array + len);
1183}
1184
Shawn Willden58427c42015-05-20 13:00:42 -06001185TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001186 // Get all supported digests and padding modes.
1187 size_t digests_len;
1188 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -06001189 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001190 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1191 &digests_len));
1192
1193 size_t padding_modes_len;
1194 keymaster_padding_t* padding_modes;
Shawn Willden0cb69422015-05-26 08:31:37 -06001195 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -07001196 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1197 &padding_modes, &padding_modes_len));
1198
1199 // Try them.
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001200 int trial_count = 0;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001201 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1202 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001203 if (digest != KM_DIGEST_NONE && padding_mode == KM_PAD_NONE)
1204 // Digesting requires padding
1205 continue;
1206
Shawn Willdenf90f2352014-12-18 23:01:15 -07001207 // Compute key & message size that will work.
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001208 size_t key_bits = 0;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001209 size_t message_len = 1000;
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001210
1211 if (digest == KM_DIGEST_NONE) {
1212 key_bits = 256;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001213 switch (padding_mode) {
1214 case KM_PAD_NONE:
1215 // Match key size.
1216 message_len = key_bits / 8;
1217 break;
1218 case KM_PAD_RSA_PKCS1_1_5_SIGN:
1219 message_len = key_bits / 8 - 11;
1220 break;
1221 case KM_PAD_RSA_PSS:
1222 // PSS requires a digest.
1223 continue;
1224 default:
1225 FAIL() << "Missing padding";
1226 break;
1227 }
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001228 } else {
1229 size_t digest_bits;
1230 switch (digest) {
1231 case KM_DIGEST_MD5:
1232 digest_bits = 128;
1233 break;
1234 case KM_DIGEST_SHA1:
1235 digest_bits = 160;
1236 break;
1237 case KM_DIGEST_SHA_2_224:
1238 digest_bits = 224;
1239 break;
1240 case KM_DIGEST_SHA_2_256:
1241 digest_bits = 256;
1242 break;
1243 case KM_DIGEST_SHA_2_384:
1244 digest_bits = 384;
1245 break;
1246 case KM_DIGEST_SHA_2_512:
1247 digest_bits = 512;
1248 break;
1249 default:
1250 FAIL() << "Missing digest";
1251 }
Shawn Willdenf90f2352014-12-18 23:01:15 -07001252
Shawn Willdenf90f2352014-12-18 23:01:15 -07001253 switch (padding_mode) {
Shawn Willdenf90f2352014-12-18 23:01:15 -07001254 case KM_PAD_RSA_PKCS1_1_5_SIGN:
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001255 key_bits = digest_bits + 8 * (11 + 19);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001256 break;
1257 case KM_PAD_RSA_PSS:
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001258 key_bits = digest_bits + 8 * 10;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001259 break;
1260 default:
1261 FAIL() << "Missing padding";
1262 break;
1263 }
Shawn Willdenf90f2352014-12-18 23:01:15 -07001264 }
1265
Shawn Willdenaf533992015-04-15 13:48:28 -06001266 GenerateKey(AuthorizationSetBuilder()
1267 .RsaSigningKey(key_bits, 3)
1268 .Digest(digest)
1269 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001270 string message(message_len, 'a');
1271 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001272 SignMessage(message, &signature, digest, padding_mode);
1273 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001274 ++trial_count;
Shawn Willdenf90f2352014-12-18 23:01:15 -07001275 }
1276 }
1277
1278 free(padding_modes);
1279 free(digests);
Shawn Willden2beb6282015-05-20 16:36:24 -06001280
Shawn Willden6270aca2015-05-26 13:12:24 -06001281 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2bf4ad32015-06-01 07:33:51 -06001282 EXPECT_EQ(trial_count * 4, GetParam()->keymaster0_calls());
Shawn Willdenf90f2352014-12-18 23:01:15 -07001283}
1284
Shawn Willden58427c42015-05-20 13:00:42 -06001285TEST_P(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001286 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001287 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdend5303052015-06-22 05:25:59 -06001288 string message = "12345678901234567890123456789012";
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001289 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001290 SignMessage(message, &signature, KM_DIGEST_NONE);
1291 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001292
Shawn Willden6270aca2015-05-26 13:12:24 -06001293 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1294 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001295}
1296
Shawn Willdenefbd7e42015-06-01 07:07:33 -06001297TEST_P(VerificationOperationsTest, EcdsaSha256Success) {
1298 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1299 .EcdsaSigningKey(256)
1300 .Digest(KM_DIGEST_SHA_2_256)
1301 .Digest(KM_DIGEST_NONE)));
Shawn Willdend5303052015-06-22 05:25:59 -06001302 string message = "12345678901234567890123456789012";
Shawn Willdenefbd7e42015-06-01 07:07:33 -06001303 string signature;
1304 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
1305 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
1306
1307 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1308 EXPECT_EQ(4, GetParam()->keymaster0_calls());
1309
1310 // Just for giggles, try verifying with the wrong digest.
1311 AuthorizationSet begin_params(client_params());
1312 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
1313 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1314
1315 string result;
1316 size_t input_consumed;
1317 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1318 EXPECT_EQ(message.size(), input_consumed);
1319 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1320}
1321
Shawn Willden58427c42015-05-20 13:00:42 -06001322TEST_P(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001323 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001324 string message = "123456789012345678901234567890123456789012345678";
1325 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001326 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1327 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden2beb6282015-05-20 16:36:24 -06001328
Shawn Willden6270aca2015-05-26 13:12:24 -06001329 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001330}
1331
Shawn Willden58427c42015-05-20 13:00:42 -06001332TEST_P(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001333 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001334 string message = "123456789012345678901234567890123456789012345678";
1335 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001336 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1337 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden2beb6282015-05-20 16:36:24 -06001338
Shawn Willden6270aca2015-05-26 13:12:24 -06001339 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001340}
1341
Shawn Willden58427c42015-05-20 13:00:42 -06001342TEST_P(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001343 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001344 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001345 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001346 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1347 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001348
Shawn Willden6270aca2015-05-26 13:12:24 -06001349 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden0d560bf2014-12-15 17:44:02 -07001350}
1351
Shawn Willden58427c42015-05-20 13:00:42 -06001352TEST_P(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001353 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001354 string message = "123456789012345678901234567890123456789012345678";
1355 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001356 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1357 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden2beb6282015-05-20 16:36:24 -06001358
Shawn Willden6270aca2015-05-26 13:12:24 -06001359 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001360}
1361
Shawn Willden58427c42015-05-20 13:00:42 -06001362TEST_P(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001363 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001364 string message = "123456789012345678901234567890123456789012345678";
1365 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001366 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1367 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden2beb6282015-05-20 16:36:24 -06001368
Shawn Willden6270aca2015-05-26 13:12:24 -06001369 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001370}
1371
Shawn Willden58427c42015-05-20 13:00:42 -06001372typedef Keymaster1Test ExportKeyTest;
1373INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params);
1374
1375TEST_P(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001376 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1377 .RsaSigningKey(256, 3)
1378 .Digest(KM_DIGEST_NONE)
1379 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001380 string export_data;
1381 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001382 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001383
1384 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001385
Shawn Willden6270aca2015-05-26 13:12:24 -06001386 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001387 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenffd790c2014-08-18 21:20:06 -06001388}
1389
Shawn Willden58427c42015-05-20 13:00:42 -06001390TEST_P(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001391 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001392 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001393 string export_data;
1394 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001395 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001396
1397 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willden2beb6282015-05-20 16:36:24 -06001398
Shawn Willden6270aca2015-05-26 13:12:24 -06001399 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1400 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001401}
1402
Shawn Willden58427c42015-05-20 13:00:42 -06001403TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001404 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1405 .RsaSigningKey(256, 3)
1406 .Digest(KM_DIGEST_NONE)
1407 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001408 string export_data;
1409 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001410
Shawn Willden6270aca2015-05-26 13:12:24 -06001411 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001412 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001413}
1414
Shawn Willden58427c42015-05-20 13:00:42 -06001415TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001416 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1417 .RsaSigningKey(256, 3)
1418 .Digest(KM_DIGEST_NONE)
1419 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001420 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001421 string export_data;
1422 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001423
Shawn Willden6270aca2015-05-26 13:12:24 -06001424 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001425 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenf268d742014-08-19 15:36:26 -06001426}
1427
Shawn Willden58427c42015-05-20 13:00:42 -06001428TEST_P(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001429 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001430 string export_data;
1431
1432 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1433 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1434 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
Shawn Willden2beb6282015-05-20 16:36:24 -06001435
Shawn Willden6270aca2015-05-26 13:12:24 -06001436 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden7dad93b2015-02-05 10:20:47 -07001437}
1438
Shawn Willden437fbd12014-08-20 11:59:49 -06001439static string read_file(const string& file_name) {
1440 ifstream file_stream(file_name, std::ios::binary);
1441 istreambuf_iterator<char> file_begin(file_stream);
1442 istreambuf_iterator<char> file_end;
1443 return string(file_begin, file_end);
1444}
1445
Shawn Willden58427c42015-05-20 13:00:42 -06001446typedef Keymaster1Test ImportKeyTest;
1447INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params);
1448
1449TEST_P(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001450 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001451 ASSERT_EQ(633U, pk8_key.size());
1452
Shawn Willdenaf533992015-04-15 13:48:28 -06001453 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1454 .RsaSigningKey(1024, 65537)
1455 .Digest(KM_DIGEST_NONE)
1456 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001457 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001458
1459 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001460 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1461 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001462 TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6270aca2015-05-26 13:12:24 -06001463 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1464 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001465 TAG_KEY_SIZE, 1024));
Shawn Willden6270aca2015-05-26 13:12:24 -06001466 EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1467 : sw_enforced(),
Shawn Willden2beb6282015-05-20 16:36:24 -06001468 TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001469
Shawn Willdenb6837e72015-05-16 09:20:59 -06001470 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001471 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1472 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001473
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001474 string message(1024 / 8, 'a');
1475 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001476 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1477 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001478
Shawn Willden6270aca2015-05-26 13:12:24 -06001479 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001480 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden437fbd12014-08-20 11:59:49 -06001481}
1482
Shawn Willden58427c42015-05-20 13:00:42 -06001483TEST_P(ImportKeyTest, OldApiRsaSuccess) {
Shawn Willdend7a5c712015-04-09 16:33:52 -06001484 string pk8_key = read_file("rsa_privkey_pk8.der");
1485 ASSERT_EQ(633U, pk8_key.size());
1486
1487 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1488 // point softkeymaster will no longer support keymaster0 APIs anyway.
1489 uint8_t* key_blob;
1490 size_t key_blob_length;
1491 ASSERT_EQ(0,
1492 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1493 pk8_key.size(), &key_blob, &key_blob_length));
1494 set_key_blob(key_blob, key_blob_length);
1495
1496 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001497 AuthorizationSet begin_params; // Don't use client data.
1498 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001499 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001500 AuthorizationSet update_params;
1501 AuthorizationSet output_params;
1502 string signature =
1503 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1504 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1505 &output_params);
Shawn Willden2beb6282015-05-20 16:36:24 -06001506
Shawn Willden6270aca2015-05-26 13:12:24 -06001507 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001508 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdend7a5c712015-04-09 16:33:52 -06001509}
1510
Shawn Willden58427c42015-05-20 13:00:42 -06001511TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001512 string pk8_key = read_file("rsa_privkey_pk8.der");
1513 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001514 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001515 ImportKey(AuthorizationSetBuilder()
1516 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1517 .Digest(KM_DIGEST_NONE)
1518 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001519 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001520
Shawn Willden6270aca2015-05-26 13:12:24 -06001521 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001522}
1523
Shawn Willden58427c42015-05-20 13:00:42 -06001524TEST_P(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001525 string pk8_key = read_file("rsa_privkey_pk8.der");
1526 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001527 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001528 ImportKey(AuthorizationSetBuilder()
1529 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1530 .Digest(KM_DIGEST_NONE)
1531 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001532 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001533
Shawn Willden6270aca2015-05-26 13:12:24 -06001534 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001535}
1536
Shawn Willden58427c42015-05-20 13:00:42 -06001537TEST_P(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001538 string pk8_key = read_file("ec_privkey_pk8.der");
1539 ASSERT_EQ(138U, pk8_key.size());
1540
Shawn Willdenaf533992015-04-15 13:48:28 -06001541 ASSERT_EQ(KM_ERROR_OK,
1542 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1543 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001544
1545 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001546 EXPECT_TRUE(
1547 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1548 TAG_ALGORITHM, KM_ALGORITHM_EC));
1549 EXPECT_TRUE(
1550 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1551 TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001552
Shawn Willdenb6837e72015-05-16 09:20:59 -06001553 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001554 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1555 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001556
Shawn Willdend5303052015-06-22 05:25:59 -06001557 string message(32, 'a');
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001558 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001559 SignMessage(message, &signature, KM_DIGEST_NONE);
1560 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001561
Shawn Willden6270aca2015-05-26 13:12:24 -06001562 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1563 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden81effc62014-08-27 10:08:46 -06001564}
1565
Shawn Willden58427c42015-05-20 13:00:42 -06001566TEST_P(ImportKeyTest, EcdsaSizeSpecified) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001567 string pk8_key = read_file("ec_privkey_pk8.der");
1568 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001569
Shawn Willdenaf533992015-04-15 13:48:28 -06001570 ASSERT_EQ(KM_ERROR_OK,
1571 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1572 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001573
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001574 // Check values derived from the key.
Shawn Willden6270aca2015-05-26 13:12:24 -06001575 EXPECT_TRUE(
1576 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1577 TAG_ALGORITHM, KM_ALGORITHM_EC));
1578 EXPECT_TRUE(
1579 contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1580 TAG_KEY_SIZE, 256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001581
Shawn Willdenb6837e72015-05-16 09:20:59 -06001582 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001583 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1584 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1585
Shawn Willdend5303052015-06-22 05:25:59 -06001586 string message(32, 'a');
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001587 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001588 SignMessage(message, &signature, KM_DIGEST_NONE);
1589 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden2beb6282015-05-20 16:36:24 -06001590
Shawn Willden6270aca2015-05-26 13:12:24 -06001591 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1592 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001593}
1594
Shawn Willden58427c42015-05-20 13:00:42 -06001595TEST_P(ImportKeyTest, EcdsaSizeMismatch) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001596 string pk8_key = read_file("ec_privkey_pk8.der");
1597 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001598 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001599 ImportKey(AuthorizationSetBuilder()
1600 .EcdsaSigningKey(224 /* Doesn't match key */)
1601 .Digest(KM_DIGEST_NONE),
1602 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden2beb6282015-05-20 16:36:24 -06001603
Shawn Willden6270aca2015-05-26 13:12:24 -06001604 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001605}
1606
Shawn Willden58427c42015-05-20 13:00:42 -06001607TEST_P(ImportKeyTest, AesKeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001608 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1609 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001610 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001611 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1612 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001613 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001614
1615 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1616 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1617
1618 string message = "Hello World!";
Shawn Willdenc4424672015-05-11 11:56:02 -06001619 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1620 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willden3b702e22015-02-05 10:26:47 -07001621 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001622
Shawn Willden6270aca2015-05-26 13:12:24 -06001623 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001624}
1625
Shawn Willden58427c42015-05-20 13:00:42 -06001626TEST_P(ImportKeyTest, HmacSha256KeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001627 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1628 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001629 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1630 .HmacKey(sizeof(key_data) * 8)
1631 .Digest(KM_DIGEST_SHA_2_256)
1632 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001633 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001634
1635 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1636 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1637
1638 string message = "Hello World!";
1639 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001640 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1641 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden2beb6282015-05-20 16:36:24 -06001642
Shawn Willden6270aca2015-05-26 13:12:24 -06001643 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden3b702e22015-02-05 10:26:47 -07001644}
1645
Shawn Willden58427c42015-05-20 13:00:42 -06001646typedef Keymaster1Test EncryptionOperationsTest;
1647INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params);
1648
Shawn Willden30160842015-06-01 08:31:00 -06001649TEST_P(EncryptionOperationsTest, RsaNoPaddingSuccess) {
1650 ASSERT_EQ(KM_ERROR_OK,
1651 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1652
1653 string message = "12345678901234567890123456789012";
1654 string ciphertext1 = EncryptMessage(string(message), KM_PAD_NONE);
1655 EXPECT_EQ(256U / 8, ciphertext1.size());
1656
1657 string ciphertext2 = EncryptMessage(string(message), KM_PAD_NONE);
1658 EXPECT_EQ(256U / 8, ciphertext2.size());
1659
1660 // Unpadded RSA is deterministic
1661 EXPECT_EQ(ciphertext1, ciphertext2);
1662
1663 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1664 EXPECT_EQ(3, GetParam()->keymaster0_calls());
1665}
1666
1667TEST_P(EncryptionOperationsTest, RsaNoPaddingTooShort) {
1668 ASSERT_EQ(KM_ERROR_OK,
1669 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1670
1671 string message = "1234567890123456789012345678901";
1672
1673 AuthorizationSet begin_params(client_params());
1674 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
1675 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1676
1677 string result;
1678 size_t input_consumed;
1679 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1680 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
1681 EXPECT_EQ(0U, result.size());
1682
1683 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1684 EXPECT_EQ(2, GetParam()->keymaster0_calls());
1685}
1686
1687TEST_P(EncryptionOperationsTest, RsaNoPaddingTooLong) {
1688 ASSERT_EQ(KM_ERROR_OK,
1689 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1690
1691 string message = "123456789012345678901234567890123";
1692
1693 AuthorizationSet begin_params(client_params());
1694 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
1695 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1696
1697 string result;
1698 size_t input_consumed;
Shawn Willdend5303052015-06-22 05:25:59 -06001699 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &result, &input_consumed));
Shawn Willden30160842015-06-01 08:31:00 -06001700
1701 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1702 EXPECT_EQ(2, GetParam()->keymaster0_calls());
1703}
1704
Shawn Willden58427c42015-05-20 13:00:42 -06001705TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willden0afa3c82015-06-22 10:39:21 -06001706 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1707 .RsaEncryptionKey(512, 3)
1708 .Padding(KM_PAD_RSA_OAEP)
1709 .Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001710
1711 string message = "Hello World!";
Shawn Willden0afa3c82015-06-22 10:39:21 -06001712 string ciphertext1 = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001713 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001714
Shawn Willden0afa3c82015-06-22 10:39:21 -06001715 string ciphertext2 = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001716 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001717
1718 // OAEP randomizes padding so every result should be different.
1719 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001720
Shawn Willden6270aca2015-05-26 13:12:24 -06001721 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001722 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001723}
1724
Shawn Willden58427c42015-05-20 13:00:42 -06001725TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willden0afa3c82015-06-22 10:39:21 -06001726 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1727 .RsaEncryptionKey(512, 3)
1728 .Padding(KM_PAD_RSA_OAEP)
1729 .Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001730 string message = "Hello World!";
Shawn Willden0afa3c82015-06-22 10:39:21 -06001731 string ciphertext = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001732 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001733
Shawn Willden0afa3c82015-06-22 10:39:21 -06001734 string plaintext = DecryptMessage(ciphertext, KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001735 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001736
Shawn Willden6270aca2015-05-26 13:12:24 -06001737 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001738 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001739}
1740
Shawn Willden0afa3c82015-06-22 10:39:21 -06001741TEST_P(EncryptionOperationsTest, RsaOaepInvalidDigest) {
1742 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1743 .RsaEncryptionKey(512, 3)
1744 .Padding(KM_PAD_RSA_OAEP)
1745 .Digest(KM_DIGEST_NONE)));
1746 string message = "Hello World!";
1747
1748 AuthorizationSet begin_params(client_params());
1749 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1750 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
1751 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1752
1753 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1754 EXPECT_EQ(2, GetParam()->keymaster0_calls());
1755}
1756
Shawn Willden58427c42015-05-20 13:00:42 -06001757TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willden0afa3c82015-06-22 10:39:21 -06001758 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1759 .RsaEncryptionKey(512, 3)
1760 .Padding(KM_PAD_RSA_OAEP)
1761 .Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001762 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001763 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001764 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001765
Shawn Willden3ad5f052015-05-08 14:05:13 -06001766 AuthorizationSet begin_params(client_params());
1767 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
Shawn Willden0afa3c82015-06-22 10:39:21 -06001768 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001769 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001770 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001771 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001772 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001773
Shawn Willden6270aca2015-05-26 13:12:24 -06001774 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001775 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001776}
1777
Shawn Willden58427c42015-05-20 13:00:42 -06001778TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willden0afa3c82015-06-22 10:39:21 -06001779 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1780 .RsaEncryptionKey(512, 3)
1781 .Padding(KM_PAD_RSA_OAEP)
1782 .Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001783 string message = "Hello World!";
Shawn Willden0afa3c82015-06-22 10:39:21 -06001784 string ciphertext = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001785 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001786
1787 // Corrupt the ciphertext
1788 ciphertext[512 / 8 / 2]++;
1789
Shawn Willden4200f212014-12-02 07:01:21 -07001790 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001791 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001792 AuthorizationSet begin_params(client_params());
1793 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
Shawn Willden0afa3c82015-06-22 10:39:21 -06001794 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001795 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001796 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001797 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001798 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001799
Shawn Willden6270aca2015-05-26 13:12:24 -06001800 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001801 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001802}
1803
Shawn Willden58427c42015-05-20 13:00:42 -06001804TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001805 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1806 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001807 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001808 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001809 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001810
Shawn Willden3ad5f052015-05-08 14:05:13 -06001811 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001812 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001813
1814 // PKCS1 v1.5 randomizes padding so every result should be different.
1815 EXPECT_NE(ciphertext1, ciphertext2);
Shawn Willden2beb6282015-05-20 16:36:24 -06001816
Shawn Willden6270aca2015-05-26 13:12:24 -06001817 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001818 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001819}
1820
Shawn Willden58427c42015-05-20 13:00:42 -06001821TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001822 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1823 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001824 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001825 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001826 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001827
Shawn Willden3ad5f052015-05-08 14:05:13 -06001828 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001829 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001830
Shawn Willden6270aca2015-05-26 13:12:24 -06001831 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001832 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001833}
1834
Shawn Willden58427c42015-05-20 13:00:42 -06001835TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001836 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1837 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willden7bae1322015-05-26 10:16:49 -06001838 string message = "123456789012345678901234567890123456789012345678901234";
Shawn Willden4200f212014-12-02 07:01:21 -07001839 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001840 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001841
Shawn Willden3ad5f052015-05-08 14:05:13 -06001842 AuthorizationSet begin_params(client_params());
1843 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1844 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001845 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001846 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001847 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001848
Shawn Willden6270aca2015-05-26 13:12:24 -06001849 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001850 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001851}
1852
Shawn Willden0afa3c82015-06-22 10:39:21 -06001853TEST_P(EncryptionOperationsTest, RsaPkcs1InvalidDigest) {
1854 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1855 .RsaEncryptionKey(512, 3)
1856 .Padding(KM_PAD_RSA_PKCS1_1_5_ENCRYPT)
1857 .Digest(KM_DIGEST_NONE)));
1858 string message = "Hello World!";
1859 string result;
1860
1861 AuthorizationSet begin_params(client_params());
1862 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1863 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); // Any digest is invalid
1864 EXPECT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1865
1866 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1867 EXPECT_EQ(2, GetParam()->keymaster0_calls());
1868}
1869
Shawn Willden58427c42015-05-20 13:00:42 -06001870TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001871 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1872 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001873 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001874 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001875 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001876
1877 // Corrupt the ciphertext
1878 ciphertext[512 / 8 / 2]++;
1879
Shawn Willden4200f212014-12-02 07:01:21 -07001880 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001881 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001882 AuthorizationSet begin_params(client_params());
1883 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1884 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001885 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001886 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001887 EXPECT_EQ(0U, result.size());
Shawn Willden2beb6282015-05-20 16:36:24 -06001888
Shawn Willden6270aca2015-05-26 13:12:24 -06001889 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden2beb6282015-05-20 16:36:24 -06001890 EXPECT_EQ(4, GetParam()->keymaster0_calls());
Shawn Willden4200f212014-12-02 07:01:21 -07001891}
1892
Shawn Willden58427c42015-05-20 13:00:42 -06001893TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
Shawn Willden0afa3c82015-06-22 10:39:21 -06001894 ASSERT_EQ(KM_ERROR_OK,
1895 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3).Padding(KM_PAD_NONE)));
Shawn Willdenedb79942015-05-08 06:46:44 -06001896 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001897
Shawn Willden6270aca2015-05-26 13:12:24 -06001898 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
Shawn Willden294a2db2015-06-17 11:20:56 -06001899 EXPECT_EQ(2, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001900}
1901
Shawn Willden58427c42015-05-20 13:00:42 -06001902TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001903 ASSERT_EQ(KM_ERROR_OK,
1904 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willden294a2db2015-06-17 11:20:56 -06001905 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1906 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001907
Shawn Willden6270aca2015-05-26 13:12:24 -06001908 if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1909 EXPECT_EQ(3, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001910}
1911
Shawn Willden58427c42015-05-20 13:00:42 -06001912TEST_P(EncryptionOperationsTest, HmacEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001913 ASSERT_EQ(
1914 KM_ERROR_OK,
1915 GenerateKey(
1916 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
Shawn Willden294a2db2015-06-17 11:20:56 -06001917 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1918 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
Shawn Willden2beb6282015-05-20 16:36:24 -06001919
Shawn Willden6270aca2015-05-26 13:12:24 -06001920 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenedb79942015-05-08 06:46:44 -06001921}
1922
Shawn Willden58427c42015-05-20 13:00:42 -06001923TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001924 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1925 .AesEncryptionKey(128)
1926 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1927 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001928 // Two-block message.
1929 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001930 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001931 EXPECT_EQ(message.size(), ciphertext1.size());
1932
Shawn Willden31e063f2015-05-08 14:31:22 -06001933 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001934 EXPECT_EQ(message.size(), ciphertext2.size());
1935
1936 // ECB is deterministic.
1937 EXPECT_EQ(ciphertext1, ciphertext2);
1938
Shawn Willden31e063f2015-05-08 14:31:22 -06001939 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001940 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06001941
Shawn Willden6270aca2015-05-26 13:12:24 -06001942 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001943}
1944
Shawn Willden58427c42015-05-20 13:00:42 -06001945TEST_P(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001946 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1947 .AesEncryptionKey(128)
1948 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1949 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001950 // Message is slightly shorter than two blocks.
1951 string message = "1234567890123456789012345678901";
1952
Shawn Willden31e063f2015-05-08 14:31:22 -06001953 AuthorizationSet begin_params(client_params());
1954 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001955 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001956 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001957 string ciphertext;
1958 size_t input_consumed;
1959 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1960 EXPECT_EQ(message.size(), input_consumed);
1961 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
Shawn Willden2beb6282015-05-20 16:36:24 -06001962
Shawn Willden6270aca2015-05-26 13:12:24 -06001963 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001964}
1965
Shawn Willden58427c42015-05-20 13:00:42 -06001966TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001967 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001968 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001969 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1970 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001971
1972 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001973 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001974 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001975 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001976 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001977 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001978 EXPECT_EQ(message, plaintext);
1979 }
Shawn Willden2beb6282015-05-20 16:36:24 -06001980
Shawn Willden6270aca2015-05-26 13:12:24 -06001981 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001982}
1983
Shawn Willden58427c42015-05-20 13:00:42 -06001984TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001985 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001986 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001987 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1988 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001989
1990 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001991 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001992 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001993 EXPECT_NE(ciphertext, message);
1994 ++ciphertext[ciphertext.size() / 2];
1995
Shawn Willden31e063f2015-05-08 14:31:22 -06001996 AuthorizationSet begin_params(client_params());
1997 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001998 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
Shawn Willden31e063f2015-05-08 14:31:22 -06001999 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002000 string plaintext;
2001 size_t input_consumed;
2002 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
2003 EXPECT_EQ(ciphertext.size(), input_consumed);
2004 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
Shawn Willden2beb6282015-05-20 16:36:24 -06002005
Shawn Willden6270aca2015-05-26 13:12:24 -06002006 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002007}
2008
Shawn Willden58427c42015-05-20 13:00:42 -06002009TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002010 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2011 .AesEncryptionKey(128)
2012 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
2013 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07002014 string message = "123";
2015 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06002016 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07002017 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06002018 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07002019
2020 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06002021 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07002022 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06002023 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07002024
2025 // IVs should be random, so ciphertexts should differ.
2026 EXPECT_NE(iv1, iv2);
2027 EXPECT_NE(ciphertext1, ciphertext2);
2028
Shawn Willden31e063f2015-05-08 14:31:22 -06002029 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07002030 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002031
Shawn Willden6270aca2015-05-26 13:12:24 -06002032 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002033}
2034
Shawn Willden58427c42015-05-20 13:00:42 -06002035TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002036 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2037 .AesEncryptionKey(128)
2038 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
2039 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07002040
2041 int increment = 15;
2042 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06002043 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002044 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002045 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07002046 AuthorizationSet output_params;
2047 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2048
2049 string ciphertext;
2050 size_t input_consumed;
2051 for (size_t i = 0; i < message.size(); i += increment)
2052 EXPECT_EQ(KM_ERROR_OK,
2053 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2054 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2055 EXPECT_EQ(message.size(), ciphertext.size());
2056
2057 // Move TAG_NONCE into input_params
2058 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06002059 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002060 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002061 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07002062 output_params.Clear();
2063
2064 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
2065 string plaintext;
2066 for (size_t i = 0; i < ciphertext.size(); i += increment)
2067 EXPECT_EQ(KM_ERROR_OK,
2068 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2069 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2070 EXPECT_EQ(ciphertext.size(), plaintext.size());
2071 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002072
Shawn Willden6270aca2015-05-26 13:12:24 -06002073 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002074}
2075
2076struct AesCtrSp80038aTestVector {
2077 const char* key;
2078 const char* nonce;
2079 const char* plaintext;
2080 const char* ciphertext;
2081};
2082
2083// These test vectors are taken from
2084// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
2085static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
2086 // AES-128
2087 {
2088 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2089 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2090 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2091 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
2092 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
2093 },
2094 // AES-192
2095 {
2096 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2097 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2098 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2099 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
2100 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
2101 },
2102 // AES-256
2103 {
2104 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
2105 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2106 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2107 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2108 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
2109 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
2110 },
2111};
2112
Shawn Willden58427c42015-05-20 13:00:42 -06002113TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
Thai Duong20d725d2015-03-24 17:49:58 -07002114 for (size_t i = 0; i < 3; i++) {
2115 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
2116 const string key = hex2str(test.key);
2117 const string nonce = hex2str(test.nonce);
2118 const string plaintext = hex2str(test.plaintext);
2119 const string ciphertext = hex2str(test.ciphertext);
2120 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
2121 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002122
Shawn Willden6270aca2015-05-26 13:12:24 -06002123 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002124}
2125
Shawn Willden58427c42015-05-20 13:00:42 -06002126TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
Thai Duong20d725d2015-03-24 17:49:58 -07002127 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2128 .AesEncryptionKey(128)
2129 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
2130 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06002131 AuthorizationSet begin_params(client_params());
2132 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002133 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06002134 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002135
Shawn Willden6270aca2015-05-26 13:12:24 -06002136 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002137}
2138
Shawn Willden58427c42015-05-20 13:00:42 -06002139TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
Thai Duong20d725d2015-03-24 17:49:58 -07002140 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2141 .AesEncryptionKey(128)
2142 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002143 .Authorization(TAG_CALLER_NONCE)
2144 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07002145
Shawn Willden09f25272015-04-15 13:49:49 -06002146 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002147 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06002148 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07002149 input_params.push_back(TAG_NONCE, "123", 3);
2150 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002151
Shawn Willden6270aca2015-05-26 13:12:24 -06002152 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Thai Duong20d725d2015-03-24 17:49:58 -07002153}
2154
Shawn Willden58427c42015-05-20 13:00:42 -06002155TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002156 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2157 .AesEncryptionKey(128)
2158 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2159 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002160 // Two-block message.
2161 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002162 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06002163 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002164 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002165
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002166 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06002167 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002168 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002169
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002170 // IVs should be random, so ciphertexts should differ.
2171 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002172 EXPECT_NE(ciphertext1, ciphertext2);
2173
Shawn Willden31e063f2015-05-08 14:31:22 -06002174 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002175 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002176
Shawn Willden6270aca2015-05-26 13:12:24 -06002177 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002178}
2179
Shawn Willden58427c42015-05-20 13:00:42 -06002180TEST_P(EncryptionOperationsTest, AesCallerNonce) {
Shawn Willden969aa382015-04-15 17:05:53 -07002181 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2182 .AesEncryptionKey(128)
2183 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06002184 .Authorization(TAG_CALLER_NONCE)
2185 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07002186 string message = "12345678901234567890123456789012";
2187 string iv1;
2188 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002189 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002190 EXPECT_EQ(message.size(), ciphertext1.size());
2191 EXPECT_EQ(16U, iv1.size());
2192
Shawn Willden31e063f2015-05-08 14:31:22 -06002193 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07002194 EXPECT_EQ(message, plaintext);
2195
2196 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06002197 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07002198 AuthorizationSet update_params;
2199 AuthorizationSet output_params;
2200 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002201 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002202 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002203 string ciphertext2 =
2204 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
2205
2206 // Decrypt with correct nonce.
2207 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2208 &output_params);
2209 EXPECT_EQ(message, plaintext);
2210
2211 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06002212 input_params.Reinitialize(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002213 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002214 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07002215 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
2216 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2217 &output_params);
2218 EXPECT_NE(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002219
Shawn Willden6270aca2015-05-26 13:12:24 -06002220 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden969aa382015-04-15 17:05:53 -07002221}
2222
Shawn Willden58427c42015-05-20 13:00:42 -06002223TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
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 Willden67706352015-04-28 00:43:19 -06002228
2229 string message = "12345678901234567890123456789012";
2230 string iv1;
2231 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06002232 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002233 EXPECT_EQ(message.size(), ciphertext1.size());
2234 EXPECT_EQ(16U, iv1.size());
2235
Shawn Willden31e063f2015-05-08 14:31:22 -06002236 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06002237 EXPECT_EQ(message, plaintext);
2238
2239 // Now specify a nonce, should fail.
2240 AuthorizationSet input_params(client_params());
2241 AuthorizationSet update_params;
2242 AuthorizationSet output_params;
2243 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06002244 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002245 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden67706352015-04-28 00:43:19 -06002246
2247 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
2248 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
Shawn Willden2beb6282015-05-20 16:36:24 -06002249
Shawn Willden6270aca2015-05-26 13:12:24 -06002250 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden67706352015-04-28 00:43:19 -06002251}
2252
Shawn Willden58427c42015-05-20 13:00:42 -06002253TEST_P(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06002254 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2255 .AesEncryptionKey(128)
2256 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2257 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002258
2259 int increment = 15;
2260 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06002261 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002262 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002263 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002264 AuthorizationSet output_params;
2265 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2266
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002267 string ciphertext;
2268 size_t input_consumed;
2269 for (size_t i = 0; i < message.size(); i += increment)
2270 EXPECT_EQ(KM_ERROR_OK,
2271 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2272 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002273 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002274
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002275 // Move TAG_NONCE into input_params
2276 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06002277 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06002278 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06002279 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002280 output_params.Clear();
2281
2282 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002283 string plaintext;
2284 for (size_t i = 0; i < ciphertext.size(); i += increment)
2285 EXPECT_EQ(KM_ERROR_OK,
2286 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2287 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002288 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002289 EXPECT_EQ(message, plaintext);
Shawn Willden2beb6282015-05-20 16:36:24 -06002290
Shawn Willden6270aca2015-05-26 13:12:24 -06002291 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002292}
2293
Shawn Willden58427c42015-05-20 13:00:42 -06002294TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002295 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002296 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002297 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2298 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002299
2300 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06002301 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002302 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002303 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06002304 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002305 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06002306 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002307 EXPECT_EQ(message, plaintext);
2308 }
Shawn Willden2beb6282015-05-20 16:36:24 -06002309
Shawn Willden6270aca2015-05-26 13:12:24 -06002310 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002311}
2312
Shawn Willden0f392562015-06-02 09:00:52 -06002313TEST_P(EncryptionOperationsTest, AesGcmRoundTripSuccess) {
2314 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2315 .AesEncryptionKey(128)
2316 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2317 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2318 string aad = "foobar";
2319 string message = "123456789012345678901234567890123456";
2320 AuthorizationSet begin_params(client_params());
2321 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2322 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2323 begin_params.push_back(TAG_MAC_LENGTH, 128);
Shawn Willden0f392562015-06-02 09:00:52 -06002324
2325 AuthorizationSet update_params;
2326 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
Shawn Willden0f392562015-06-02 09:00:52 -06002327
2328 // Encrypt
Shawn Willden34419132015-06-08 23:10:44 -06002329 AuthorizationSet begin_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002330 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002331 string ciphertext;
2332 size_t input_consumed;
2333 AuthorizationSet update_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002334 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2335 &input_consumed));
2336 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002337 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002338
Shawn Willden34419132015-06-08 23:10:44 -06002339 // Grab nonce
Shawn Willden0f392562015-06-02 09:00:52 -06002340 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
Shawn Willden0f392562015-06-02 09:00:52 -06002341 begin_params.push_back(begin_out_params);
Shawn Willden0f392562015-06-02 09:00:52 -06002342
2343 // Decrypt.
Shawn Willden34419132015-06-08 23:10:44 -06002344 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2345 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002346 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2347 &plaintext, &input_consumed));
2348 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002349 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002350
2351 EXPECT_EQ(message, plaintext);
2352 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2353}
2354
Shawn Willden34419132015-06-08 23:10:44 -06002355TEST_P(EncryptionOperationsTest, AesGcmCorruptKey) {
2356 uint8_t nonce[] = {
2357 0xb7, 0x94, 0x37, 0xae, 0x08, 0xff, 0x35, 0x5d, 0x7d, 0x8a, 0x4d, 0x0f,
2358 };
2359 uint8_t ciphertext[] = {
2360 0xb3, 0xf6, 0x79, 0x9e, 0x8f, 0x93, 0x26, 0xf2, 0xdf, 0x1e, 0x80, 0xfc, 0xd2, 0xcb, 0x16,
2361 0xd7, 0x8c, 0x9d, 0xc7, 0xcc, 0x14, 0xbb, 0x67, 0x78, 0x62, 0xdc, 0x6c, 0x63, 0x9b, 0x3a,
2362 0x63, 0x38, 0xd2, 0x4b, 0x31, 0x2d, 0x39, 0x89, 0xe5, 0x92, 0x0b, 0x5d, 0xbf, 0xc9, 0x76,
2363 0x76, 0x5e, 0xfb, 0xfe, 0x57, 0xbb, 0x38, 0x59, 0x40, 0xa7, 0xa4, 0x3b, 0xdf, 0x05, 0xbd,
2364 0xda, 0xe3, 0xc9, 0xd6, 0xa2, 0xfb, 0xbd, 0xfc, 0xc0, 0xcb, 0xa0,
2365 };
2366 string ciphertext_str(reinterpret_cast<char*>(ciphertext), sizeof(ciphertext));
2367
2368 AuthorizationSet begin_params(client_params());
2369 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2370 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2371 begin_params.push_back(TAG_MAC_LENGTH, 128);
2372 begin_params.push_back(TAG_NONCE, nonce, sizeof(nonce));
2373
2374 string plaintext;
2375 size_t input_consumed;
2376
2377 // Import correct key and decrypt
2378 uint8_t good_key[] = {
2379 0xba, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d,
2380 0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb,
2381 };
2382 string good_key_str(reinterpret_cast<char*>(good_key), sizeof(good_key));
2383 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
2384 .AesEncryptionKey(128)
2385 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2386 .Authorization(TAG_PADDING, KM_PAD_NONE)
2387 .Authorization(TAG_CALLER_NONCE),
2388 KM_KEY_FORMAT_RAW, good_key_str));
2389 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2390 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext_str, &plaintext, &input_consumed));
2391 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2392
2393 // Import bad key and decrypt
2394 uint8_t bad_key[] = {
2395 0xbb, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d,
2396 0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb,
2397 };
2398 string bad_key_str(reinterpret_cast<char*>(bad_key), sizeof(bad_key));
2399 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
2400 .AesEncryptionKey(128)
2401 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2402 .Authorization(TAG_PADDING, KM_PAD_NONE),
2403 KM_KEY_FORMAT_RAW, bad_key_str));
2404 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2405 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext_str, &plaintext, &input_consumed));
2406 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
2407
2408 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2409}
2410
2411TEST_P(EncryptionOperationsTest, AesGcmAadNoData) {
2412 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2413 .AesEncryptionKey(128)
2414 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2415 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2416 string aad = "123456789012345678";
2417 string empty_message;
2418 AuthorizationSet begin_params(client_params());
2419 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2420 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2421 begin_params.push_back(TAG_MAC_LENGTH, 128);
2422
2423 AuthorizationSet update_params;
2424 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
2425
2426 // Encrypt
2427 AuthorizationSet begin_out_params;
2428 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2429 string ciphertext;
2430 size_t input_consumed;
2431 AuthorizationSet update_out_params;
2432 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, empty_message, &update_out_params,
2433 &ciphertext, &input_consumed));
2434 EXPECT_EQ(0U, input_consumed);
2435 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2436
2437 // Grab nonce
2438 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2439 begin_params.push_back(begin_out_params);
2440
2441 // Decrypt.
2442 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2443 string plaintext;
2444 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2445 &plaintext, &input_consumed));
2446 EXPECT_EQ(ciphertext.size(), input_consumed);
2447 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2448
2449 EXPECT_EQ(empty_message, plaintext);
2450 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2451}
2452
2453TEST_P(EncryptionOperationsTest, AesGcmIncremental) {
2454 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2455 .AesEncryptionKey(128)
2456 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2457 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2458 AuthorizationSet begin_params(client_params());
2459 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2460 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2461 begin_params.push_back(TAG_MAC_LENGTH, 128);
2462
2463 AuthorizationSet update_params;
2464 update_params.push_back(TAG_ASSOCIATED_DATA, "b", 1);
2465
2466 // Encrypt
2467 AuthorizationSet begin_out_params;
2468 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2469 string ciphertext;
2470 size_t input_consumed;
2471 AuthorizationSet update_out_params;
2472
2473 // Send AAD, incrementally
2474 for (int i = 0; i < 1000; ++i) {
2475 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "", &update_out_params, &ciphertext,
2476 &input_consumed));
2477 EXPECT_EQ(0U, input_consumed);
2478 EXPECT_EQ(0U, ciphertext.size());
2479 }
2480
2481 // Now send data, incrementally, no data.
2482 AuthorizationSet empty_params;
2483 for (int i = 0; i < 1000; ++i) {
2484 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(empty_params, "a", &update_out_params, &ciphertext,
2485 &input_consumed));
2486 EXPECT_EQ(1U, input_consumed);
2487 }
2488 EXPECT_EQ(1000U, ciphertext.size());
2489
2490 // And finish.
2491 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2492 EXPECT_EQ(1016U, ciphertext.size());
2493
2494 // Grab nonce
2495 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2496 begin_params.push_back(begin_out_params);
2497
2498 // Decrypt.
2499 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2500 string plaintext;
2501
2502 // Send AAD, incrementally, no data
2503 for (int i = 0; i < 1000; ++i) {
2504 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "", &update_out_params, &plaintext,
2505 &input_consumed));
2506 EXPECT_EQ(0U, input_consumed);
2507 EXPECT_EQ(0U, plaintext.size());
2508 }
2509
2510 // Now send data, incrementally.
2511 for (size_t i = 0; i < ciphertext.length(); ++i) {
2512 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(empty_params, string(ciphertext.data() + i, 1),
2513 &update_out_params, &plaintext, &input_consumed));
2514 EXPECT_EQ(1U, input_consumed);
2515 }
2516 EXPECT_EQ(1000U, plaintext.size());
2517 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2518
2519 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2520}
2521
Shawn Willden0f392562015-06-02 09:00:52 -06002522TEST_P(EncryptionOperationsTest, AesGcmMultiPartAad) {
2523 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2524 .AesEncryptionKey(128)
2525 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2526 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2527 string message = "123456789012345678901234567890123456";
2528 AuthorizationSet begin_params(client_params());
2529 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2530 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2531 begin_params.push_back(TAG_MAC_LENGTH, 128);
2532 AuthorizationSet begin_out_params;
2533
2534 AuthorizationSet update_params;
2535 update_params.push_back(TAG_ASSOCIATED_DATA, "foo", 3);
Shawn Willden0f392562015-06-02 09:00:52 -06002536
2537 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2538
2539 // No data, AAD only.
Shawn Willden34419132015-06-08 23:10:44 -06002540 string ciphertext;
2541 size_t input_consumed;
2542 AuthorizationSet update_out_params;
2543 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "" /* message */, &update_out_params,
2544 &ciphertext, &input_consumed));
2545 EXPECT_EQ(0U, input_consumed);
Shawn Willden0f392562015-06-02 09:00:52 -06002546
2547 // AAD and data.
2548 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2549 &input_consumed));
2550 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002551 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002552
Shawn Willden34419132015-06-08 23:10:44 -06002553 // Grab nonce.
Shawn Willden0f392562015-06-02 09:00:52 -06002554 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2555 begin_params.push_back(begin_out_params);
2556
Shawn Willden34419132015-06-08 23:10:44 -06002557 // Decrypt
2558 update_params.Clear();
2559 update_params.push_back(TAG_ASSOCIATED_DATA, "foofoo", 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002560
Shawn Willden34419132015-06-08 23:10:44 -06002561 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2562 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002563 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2564 &plaintext, &input_consumed));
2565 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002566 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002567
2568 EXPECT_EQ(message, plaintext);
2569 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2570}
2571
2572TEST_P(EncryptionOperationsTest, AesGcmBadAad) {
2573 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2574 .AesEncryptionKey(128)
2575 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2576 .Authorization(TAG_PADDING, KM_PAD_NONE)));
Shawn Willden0f392562015-06-02 09:00:52 -06002577 string message = "12345678901234567890123456789012";
2578 AuthorizationSet begin_params(client_params());
2579 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2580 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2581 begin_params.push_back(TAG_MAC_LENGTH, 128);
Shawn Willden0f392562015-06-02 09:00:52 -06002582
2583 AuthorizationSet update_params;
Shawn Willden34419132015-06-08 23:10:44 -06002584 update_params.push_back(TAG_ASSOCIATED_DATA, "foobar", 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002585
2586 AuthorizationSet finish_params;
2587 AuthorizationSet finish_out_params;
2588
Shawn Willden0f392562015-06-02 09:00:52 -06002589 // Encrypt
Shawn Willden34419132015-06-08 23:10:44 -06002590 AuthorizationSet begin_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002591 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002592 AuthorizationSet update_out_params;
2593 string ciphertext;
2594 size_t input_consumed;
Shawn Willden0f392562015-06-02 09:00:52 -06002595 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2596 &input_consumed));
2597 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002598 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002599
Shawn Willden34419132015-06-08 23:10:44 -06002600 // Grab nonce
Shawn Willden0f392562015-06-02 09:00:52 -06002601 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
Shawn Willden0f392562015-06-02 09:00:52 -06002602 begin_params.push_back(begin_out_params);
Shawn Willden34419132015-06-08 23:10:44 -06002603
Shawn Willden0f392562015-06-02 09:00:52 -06002604 update_params.Clear();
2605 update_params.push_back(TAG_ASSOCIATED_DATA, "barfoo" /* Wrong AAD */, 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002606
2607 // Decrypt.
2608 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002609 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002610 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2611 &plaintext, &input_consumed));
2612 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002613 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002614
Shawn Willden0f392562015-06-02 09:00:52 -06002615 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2616}
2617
2618TEST_P(EncryptionOperationsTest, AesGcmWrongNonce) {
2619 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2620 .AesEncryptionKey(128)
2621 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2622 .Authorization(TAG_PADDING, KM_PAD_NONE)));
Shawn Willden0f392562015-06-02 09:00:52 -06002623 string message = "12345678901234567890123456789012";
2624 AuthorizationSet begin_params(client_params());
2625 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2626 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2627 begin_params.push_back(TAG_MAC_LENGTH, 128);
Shawn Willden0f392562015-06-02 09:00:52 -06002628
2629 AuthorizationSet update_params;
Shawn Willden34419132015-06-08 23:10:44 -06002630 update_params.push_back(TAG_ASSOCIATED_DATA, "foobar", 6);
Shawn Willden0f392562015-06-02 09:00:52 -06002631
2632 // Encrypt
Shawn Willden34419132015-06-08 23:10:44 -06002633 AuthorizationSet begin_out_params;
Shawn Willden0f392562015-06-02 09:00:52 -06002634 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002635 AuthorizationSet update_out_params;
2636 string ciphertext;
2637 size_t input_consumed;
Shawn Willden0f392562015-06-02 09:00:52 -06002638 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2639 &input_consumed));
2640 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002641 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002642
Shawn Willden0f392562015-06-02 09:00:52 -06002643 begin_params.push_back(TAG_NONCE, "123456789012", 12);
2644
Shawn Willden34419132015-06-08 23:10:44 -06002645 // Decrypt
Shawn Willden0f392562015-06-02 09:00:52 -06002646 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002647 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002648 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2649 &plaintext, &input_consumed));
2650 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002651 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002652
2653 // With wrong nonce, should have gotten garbage plaintext.
2654 EXPECT_NE(message, plaintext);
2655 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2656}
2657
2658TEST_P(EncryptionOperationsTest, AesGcmCorruptTag) {
2659 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2660 .AesEncryptionKey(128)
2661 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2662 .Authorization(TAG_PADDING, KM_PAD_NONE)));
2663 string aad = "foobar";
2664 string message = "123456789012345678901234567890123456";
2665 AuthorizationSet begin_params(client_params());
2666 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2667 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2668 begin_params.push_back(TAG_MAC_LENGTH, 128);
2669 AuthorizationSet begin_out_params;
2670
2671 AuthorizationSet update_params;
2672 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
Shawn Willden0f392562015-06-02 09:00:52 -06002673
2674 // Encrypt
2675 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002676 AuthorizationSet update_out_params;
2677 string ciphertext;
2678 size_t input_consumed;
Shawn Willden0f392562015-06-02 09:00:52 -06002679 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2680 &input_consumed));
2681 EXPECT_EQ(message.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002682 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden0f392562015-06-02 09:00:52 -06002683
Shawn Willden34419132015-06-08 23:10:44 -06002684 // Corrupt tag
2685 (*ciphertext.rbegin())++;
2686
2687 // Grab nonce.
Shawn Willden0f392562015-06-02 09:00:52 -06002688 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2689 begin_params.push_back(begin_out_params);
Shawn Willden0f392562015-06-02 09:00:52 -06002690
2691 // Decrypt.
2692 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
Shawn Willden34419132015-06-08 23:10:44 -06002693 string plaintext;
Shawn Willden0f392562015-06-02 09:00:52 -06002694 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2695 &plaintext, &input_consumed));
2696 EXPECT_EQ(ciphertext.size(), input_consumed);
Shawn Willden34419132015-06-08 23:10:44 -06002697 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
Shawn Willden0f392562015-06-02 09:00:52 -06002698
2699 EXPECT_EQ(message, plaintext);
2700 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2701}
2702
Shawn Willden58427c42015-05-20 13:00:42 -06002703typedef Keymaster1Test AddEntropyTest;
2704INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params);
2705
2706TEST_P(AddEntropyTest, AddEntropy) {
Shawn Willdencd695822015-01-26 14:06:32 -07002707 // There's no obvious way to test that entropy is actually added, but we can test that the API
2708 // doesn't blow up or return an error.
2709 EXPECT_EQ(KM_ERROR_OK,
2710 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
Shawn Willden2beb6282015-05-20 16:36:24 -06002711
Shawn Willden6270aca2015-05-26 13:12:24 -06002712 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willden2beb6282015-05-20 16:36:24 -06002713}
2714
2715typedef Keymaster1Test Keymaster0AdapterTest;
2716INSTANTIATE_TEST_CASE_P(
2717 AndroidKeymasterTest, Keymaster0AdapterTest,
Shawn Willden6270aca2015-05-26 13:12:24 -06002718 ::testing::Values(
2719 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(true /* support_ec */)),
2720 InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(false /* support_ec */))));
Shawn Willden2beb6282015-05-20 16:36:24 -06002721
Shawn Willden6270aca2015-05-26 13:12:24 -06002722TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002723 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2724 // key data.
2725 string km1_sw = read_file("km1_sw_rsa_512.blob");
2726 EXPECT_EQ(486U, km1_sw.length());
2727
2728 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2729 memcpy(key_data, km1_sw.data(), km1_sw.length());
2730 set_key_blob(key_data, km1_sw.length());
2731
2732 string message(64, 'a');
2733 string signature;
2734 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2735
2736 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2737}
2738
Shawn Willdenc7fe06d2015-06-11 15:50:04 -06002739TEST_P(Keymaster0AdapterTest, UnversionedSoftwareKeymaster1RsaBlob) {
2740 // Load and use an old-style Keymaster1 software key blob, without the version byte. These
2741 // blobs contain OCB-encrypted key data.
2742 string km1_sw = read_file("km1_sw_rsa_512_unversioned.blob");
2743 EXPECT_EQ(477U, km1_sw.length());
2744
2745 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2746 memcpy(key_data, km1_sw.data(), km1_sw.length());
2747 set_key_blob(key_data, km1_sw.length());
2748
2749 string message(64, 'a');
2750 string signature;
2751 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2752
2753 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2754}
2755
Shawn Willden6270aca2015-05-26 13:12:24 -06002756TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1EcdsaBlob) {
2757 // Load and use an old-style Keymaster1 software key blob. These blobs contain OCB-encrypted
2758 // key data.
2759 string km1_sw = read_file("km1_sw_ecdsa_256.blob");
2760 EXPECT_EQ(270U, km1_sw.length());
2761
2762 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
2763 memcpy(key_data, km1_sw.data(), km1_sw.length());
2764 set_key_blob(key_data, km1_sw.length());
2765
Shawn Willdend5303052015-06-22 05:25:59 -06002766 string message(32, static_cast<char>(0xFF));
Shawn Willden6270aca2015-05-26 13:12:24 -06002767 string signature;
2768 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2769
2770 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2771}
2772
Shawn Willden2beb6282015-05-20 16:36:24 -06002773struct Malloc_Delete {
2774 void operator()(void* p) { free(p); }
2775};
2776
Shawn Willden6270aca2015-05-26 13:12:24 -06002777TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster0RsaBlob) {
Shawn Willden2beb6282015-05-20 16:36:24 -06002778 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2779 string km0_sw = read_file("km0_sw_rsa_512.blob");
2780 EXPECT_EQ(333U, km0_sw.length());
2781
2782 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2783 memcpy(key_data, km0_sw.data(), km0_sw.length());
2784 set_key_blob(key_data, km0_sw.length());
2785
2786 string message(64, 'a');
2787 string signature;
2788 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2789
2790 EXPECT_EQ(0, GetParam()->keymaster0_calls());
Shawn Willdencd695822015-01-26 14:06:32 -07002791}
2792
Shawn Willdenccb84e92015-06-02 19:44:54 -06002793TEST_P(Keymaster0AdapterTest, OldSwKeymaster0RsaBlobGetCharacteristics) {
2794 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2795 string km0_sw = read_file("km0_sw_rsa_512.blob");
2796 EXPECT_EQ(333U, km0_sw.length());
2797
2798 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2799 memcpy(key_data, km0_sw.data(), km0_sw.length());
2800 set_key_blob(key_data, km0_sw.length());
2801
2802 EXPECT_EQ(KM_ERROR_OK, GetCharacteristics());
2803 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
2804 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 512));
2805 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
2806 EXPECT_TRUE(contains(sw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
2807 EXPECT_TRUE(contains(sw_enforced(), TAG_PADDING, KM_PAD_NONE));
2808 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
2809 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
2810 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_ALL_USERS));
2811 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_NO_AUTH_REQUIRED));
2812
2813 EXPECT_EQ(0, GetParam()->keymaster0_calls());
2814}
2815
2816TEST_P(Keymaster0AdapterTest, OldHwKeymaster0RsaBlob) {
2817 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2818 string km0_sw = read_file("km0_sw_rsa_512.blob");
2819 EXPECT_EQ(333U, km0_sw.length());
2820
2821 // The keymaster0 wrapper swaps the old softkeymaster leading 'P' for a 'Q' to make the key not
2822 // be recognized as a software key. Do the same here to pretend this is a hardware key.
2823 EXPECT_EQ('P', km0_sw[0]);
2824 km0_sw[0] = 'Q';
2825
2826 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2827 memcpy(key_data, km0_sw.data(), km0_sw.length());
2828 set_key_blob(key_data, km0_sw.length());
2829
2830 string message(64, 'a');
2831 string signature;
2832 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
2833 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
2834
2835 EXPECT_EQ(5, GetParam()->keymaster0_calls());
2836}
2837
2838TEST_P(Keymaster0AdapterTest, OldHwKeymaster0RsaBlobGetCharacteristics) {
2839 // Load and use an old softkeymaster blob. These blobs contain PKCS#8 key data.
2840 string km0_sw = read_file("km0_sw_rsa_512.blob");
2841 EXPECT_EQ(333U, km0_sw.length());
2842
2843 // The keymaster0 wrapper swaps the old softkeymaster leading 'P' for a 'Q' to make the key not
2844 // be recognized as a software key. Do the same here to pretend this is a hardware key.
2845 EXPECT_EQ('P', km0_sw[0]);
2846 km0_sw[0] = 'Q';
2847
2848 uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
2849 memcpy(key_data, km0_sw.data(), km0_sw.length());
2850 set_key_blob(key_data, km0_sw.length());
2851
2852 EXPECT_EQ(KM_ERROR_OK, GetCharacteristics());
2853 EXPECT_TRUE(contains(hw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
2854 EXPECT_TRUE(contains(hw_enforced(), TAG_KEY_SIZE, 512));
2855 EXPECT_TRUE(contains(hw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
2856 EXPECT_TRUE(contains(hw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
2857 EXPECT_TRUE(contains(hw_enforced(), TAG_PADDING, KM_PAD_NONE));
2858 EXPECT_EQ(5U, hw_enforced().size());
2859
2860 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
2861 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
2862 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_ALL_USERS));
2863 EXPECT_TRUE(sw_enforced().GetTagValue(TAG_NO_AUTH_REQUIRED));
2864
2865 EXPECT_FALSE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
2866 EXPECT_FALSE(contains(sw_enforced(), TAG_KEY_SIZE, 512));
2867 EXPECT_FALSE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
2868 EXPECT_FALSE(contains(sw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
2869 EXPECT_FALSE(contains(sw_enforced(), TAG_PADDING, KM_PAD_NONE));
2870
2871 EXPECT_EQ(1, GetParam()->keymaster0_calls());
2872}
2873
Shawn Willden128ffe02014-08-06 12:31:33 -06002874} // namespace test
2875} // namespace keymaster