blob: c83e6590380e84ff1c553fcee7a6d00baa81ffe8 [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 Willdenb7510332015-02-06 19:58:29 -070021#include <keymaster/soft_keymaster_device.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060022
Shawn Willdenb6837e72015-05-16 09:20:59 -060023#include "android_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060024
Shawn Willden437fbd12014-08-20 11:59:49 -060025using std::ifstream;
26using std::istreambuf_iterator;
Shawn Willden76076ab2014-12-18 08:36:35 -070027using std::string;
28using std::vector;
Shawn Willden437fbd12014-08-20 11:59:49 -060029
Shawn Willden128ffe02014-08-06 12:31:33 -060030namespace keymaster {
31namespace test {
32
Shawn Willden567a4a02014-12-31 12:14:46 -070033StdoutLogger logger;
34
Shawn Willden58427c42015-05-20 13:00:42 -060035class SoftKeymasterTestInstanceCreator : public Keymaster1TestInstanceCreator {
36 public:
37 keymaster1_device_t* CreateDevice() const override {
38 std::cerr << "Creating SoftKeymasterDevice" << std::endl;
Shawn Willden95dda362015-02-27 10:58:37 -070039 SoftKeymasterDevice* device = new SoftKeymasterDevice;
Shawn Willden58427c42015-05-20 13:00:42 -060040 return device->keymaster_device();
Shawn Willden5b53c992015-02-02 08:05:25 -070041 }
Shawn Willden128ffe02014-08-06 12:31:33 -060042};
43
Shawn Willden58427c42015-05-20 13:00:42 -060044static auto test_params = testing::Values(InstanceCreatorPtr(new SoftKeymasterTestInstanceCreator));
45
46typedef Keymaster1Test CheckSupported;
47INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, CheckSupported, test_params);
48
49TEST_P(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -070050 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
51 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060052
Shawn Willden5b53c992015-02-02 08:05:25 -070053 size_t len;
54 keymaster_algorithm_t* algorithms;
55 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -070056 EXPECT_TRUE(ResponseContains(
Shawn Willden9c65b2b2015-04-07 17:01:10 -060057 {KM_ALGORITHM_RSA, KM_ALGORITHM_EC, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms, len));
Shawn Willden5b53c992015-02-02 08:05:25 -070058 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -060059}
60
Shawn Willden58427c42015-05-20 13:00:42 -060061TEST_P(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070062 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
63 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
64 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060065
Shawn Willden5b53c992015-02-02 08:05:25 -070066 size_t len;
67 keymaster_block_mode_t* modes;
Shawn Willden0cb69422015-05-26 08:31:37 -060068 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden63ac0432014-12-29 14:07:08 -070069 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -060070 EXPECT_EQ(0U, len);
Shawn Willden63ac0432014-12-29 14:07:08 -070071 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060072
Shawn Willden63ac0432014-12-29 14:07:08 -070073 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden9c65b2b2015-04-07 17:01:10 -060074 device()->get_supported_block_modes(device(), KM_ALGORITHM_EC, KM_PURPOSE_ENCRYPT,
Shawn Willden5b53c992015-02-02 08:05:25 -070075 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -060076
Shawn Willden0cb69422015-05-26 08:31:37 -060077 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
Shawn Willden63ac0432014-12-29 14:07:08 -070078 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc47c88f2015-04-07 17:23:27 -060079 EXPECT_TRUE(ResponseContains({KM_MODE_ECB, KM_MODE_CBC, KM_MODE_CTR}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -070080 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060081}
82
Shawn Willden58427c42015-05-20 13:00:42 -060083TEST_P(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070084 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
85 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
86 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060087
Shawn Willden5b53c992015-02-02 08:05:25 -070088 size_t len;
89 keymaster_padding_t* modes;
Shawn Willden0cb69422015-05-26 08:31:37 -060090 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden5b53c992015-02-02 08:05:25 -070091 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -070092 EXPECT_TRUE(
93 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -070094 free(modes);
95
Shawn Willden0cb69422015-05-26 08:31:37 -060096 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden63ac0432014-12-29 14:07:08 -070097 KM_PURPOSE_ENCRYPT, &modes, &len));
98 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -070099 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600100
Shawn Willden0cb69422015-05-26 08:31:37 -0600101 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700102 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600103 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700104 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700105
106 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
107 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
108 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600109}
110
Shawn Willden58427c42015-05-20 13:00:42 -0600111TEST_P(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700112 EXPECT_EQ(
113 KM_ERROR_OUTPUT_PARAMETER_NULL,
114 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600115
Shawn Willden5b53c992015-02-02 08:05:25 -0700116 size_t len;
117 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -0600118 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
Shawn Willden5b53c992015-02-02 08:05:25 -0700119 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700120 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700121 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600122
Shawn Willden0cb69422015-05-26 08:31:37 -0600123 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700124 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willdene998c132015-04-14 14:41:46 -0600125 EXPECT_TRUE(ResponseContains(KM_DIGEST_NONE, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700126 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600127
Shawn Willden63ac0432014-12-29 14:07:08 -0700128 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
129 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
130 &len));
131
Shawn Willden0cb69422015-05-26 08:31:37 -0600132 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700133 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700134 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
135 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
136 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700137 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600138}
139
Shawn Willden58427c42015-05-20 13:00:42 -0600140TEST_P(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700141 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
142 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600143
Shawn Willden5b53c992015-02-02 08:05:25 -0700144 size_t len;
145 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600146 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700147 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700148 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700149 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700150
Shawn Willden0cb69422015-05-26 08:31:37 -0600151 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700152 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
153 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
154 free(formats);
155
Shawn Willden0cb69422015-05-26 08:31:37 -0600156 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700157 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
158 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
159 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600160}
161
Shawn Willden58427c42015-05-20 13:00:42 -0600162TEST_P(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700163 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
164 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600165
Shawn Willden5b53c992015-02-02 08:05:25 -0700166 size_t len;
167 keymaster_key_format_t* formats;
Shawn Willden0cb69422015-05-26 08:31:37 -0600168 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700169 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700170 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700171 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600172
Shawn Willden0cb69422015-05-26 08:31:37 -0600173 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600174 device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700175 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700176 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600177
Shawn Willden0cb69422015-05-26 08:31:37 -0600178 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700179 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600180 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700181 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700182
Shawn Willden0cb69422015-05-26 08:31:37 -0600183 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700184 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600185 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700186 free(formats);
187
Shawn Willden0cb69422015-05-26 08:31:37 -0600188 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700189 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600190 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700191 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600192}
193
Shawn Willden58427c42015-05-20 13:00:42 -0600194class NewKeyGeneration : public Keymaster1Test {
Shawn Willdend0772312014-09-18 12:27:57 -0600195 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700196 void CheckBaseParams() {
197 EXPECT_EQ(0U, hw_enforced().size());
198 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600199
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700200 AuthorizationSet auths = sw_enforced();
201 EXPECT_GT(auths.SerializedSize(), 12U);
202
Shawn Willden5b53c992015-02-02 08:05:25 -0700203 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
204 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
205 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600206 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700207 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600208
209 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700210 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
211 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
212 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600213
214 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700215 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
216 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
217 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600218
219 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600220 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700221 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600222 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700223};
224
Shawn Willden58427c42015-05-20 13:00:42 -0600225INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, NewKeyGeneration, test_params);
226
227TEST_P(NewKeyGeneration, Rsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600228 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
229 .RsaSigningKey(256, 3)
230 .Digest(KM_DIGEST_NONE)
231 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700232 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600233
Shawn Willden5b53c992015-02-02 08:05:25 -0700234 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700235 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700236 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
237 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
238 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600239}
240
Shawn Willden58427c42015-05-20 13:00:42 -0600241TEST_P(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700242 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
243 GenerateKey(AuthorizationSetBuilder()
244 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
245 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
246 .SigningKey()));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600247}
248
Shawn Willden58427c42015-05-20 13:00:42 -0600249TEST_P(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600250 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600251 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700252 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600253
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700254 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600255 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700256 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600257}
258
Shawn Willden58427c42015-05-20 13:00:42 -0600259TEST_P(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600260 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600261 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700262 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600263
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700264 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600265 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600266
267 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700268 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600269}
270
Shawn Willden58427c42015-05-20 13:00:42 -0600271TEST_P(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700272 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willdenaf533992015-04-15 13:48:28 -0600273 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600274}
275
Shawn Willden58427c42015-05-20 13:00:42 -0600276TEST_P(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600277 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600278 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600279 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
280 KM_DIGEST_NONE)))
Shawn Willden58427c42015-05-20 13:00:42 -0600281 << "Failed to generate size: "
282 << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600283 }
284}
285
Shawn Willden58427c42015-05-20 13:00:42 -0600286TEST_P(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700287 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600288 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700289}
290
Shawn Willden58427c42015-05-20 13:00:42 -0600291typedef Keymaster1Test GetKeyCharacteristics;
292INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, GetKeyCharacteristics, test_params);
293
294TEST_P(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600295 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
296 .RsaSigningKey(256, 3)
297 .Digest(KM_DIGEST_NONE)
298 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700299 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600300
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700301 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
302 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600303}
304
Shawn Willden58427c42015-05-20 13:00:42 -0600305typedef Keymaster1Test SigningOperationsTest;
306INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, SigningOperationsTest, test_params);
307
308TEST_P(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600309 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
310 .RsaSigningKey(256, 3)
311 .Digest(KM_DIGEST_NONE)
312 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700313 string message = "12345678901234567890123456789012";
314 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600315 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600316}
317
Shawn Willden58427c42015-05-20 13:00:42 -0600318TEST_P(SigningOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600319 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600320 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600321 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600322 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700323 string message(1024, 'a');
324 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600325 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700326}
327
Shawn Willden58427c42015-05-20 13:00:42 -0600328TEST_P(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600329 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
330 .RsaSigningKey(512, 3)
331 .Digest(KM_DIGEST_SHA_2_256)
332 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700333 // Use large message, which won't work without digesting.
334 string message(1024, 'a');
335 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600336 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700337}
338
Shawn Willden58427c42015-05-20 13:00:42 -0600339TEST_P(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600340 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
341 .RsaSigningKey(512, 3)
342 .Digest(KM_DIGEST_SHA_2_256)
343 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700344 string message(1024, 'a');
345 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600346 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700347}
348
Shawn Willden58427c42015-05-20 13:00:42 -0600349TEST_P(SigningOperationsTest, RsaPssSha256TooSmallKey) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700350 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
351 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600352 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
353 .RsaSigningKey(256 + 9 * 8, 3)
354 .Digest(KM_DIGEST_SHA_2_256)
355 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700356 string message(1024, 'a');
357 string signature;
358
Shawn Willden226746b2015-05-08 11:36:56 -0600359 AuthorizationSet begin_params(client_params());
360 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600361 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600362 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700363
364 string result;
365 size_t input_consumed;
366 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
367 EXPECT_EQ(message.size(), input_consumed);
368 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
369}
370
Shawn Willden58427c42015-05-20 13:00:42 -0600371TEST_P(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600372 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
373 .RsaSigningKey(256, 3)
374 .Digest(KM_DIGEST_NONE)
375 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600376 AuthorizationSet begin_params(client_params());
377 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600378 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600379 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700380 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
381 // Another abort should fail
382 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600383}
384
Shawn Willden58427c42015-05-20 13:00:42 -0600385TEST_P(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600386 GenerateKey(AuthorizationSetBuilder()
387 .RsaSigningKey(256, 3)
388 .Digest(KM_DIGEST_MD5)
389 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700390 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600391}
392
Shawn Willden58427c42015-05-20 13:00:42 -0600393TEST_P(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600394 GenerateKey(AuthorizationSetBuilder()
395 .RsaSigningKey(256, 3)
396 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
397 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600398 AuthorizationSet begin_params(client_params());
399 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
400 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600401}
402
Shawn Willden58427c42015-05-20 13:00:42 -0600403TEST_P(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700404 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700405 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700406 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700407 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600408 GenerateKey(AuthorizationSetBuilder()
409 .RsaSigningKey(256, 3)
410 .Digest(KM_DIGEST_NONE)
411 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600412 AuthorizationSet begin_params(client_params());
413 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600414 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600415 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600416}
417
Shawn Willden58427c42015-05-20 13:00:42 -0600418TEST_P(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700419 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600420 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
421 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600422 AuthorizationSet begin_params(client_params());
423 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
424 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600425}
426
Shawn Willden58427c42015-05-20 13:00:42 -0600427TEST_P(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600428 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
429 .RsaSigningKey(256, 3)
430 .Digest(KM_DIGEST_NONE)
431 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600432 AuthorizationSet begin_params(client_params());
433 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600434 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600435 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600436
437 string message = "1234567890123456789012345678901";
438 string result;
439 size_t input_consumed;
440 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
441 EXPECT_EQ(0U, result.size());
442 EXPECT_EQ(31U, input_consumed);
443
444 string signature;
445 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
446 EXPECT_EQ(0U, signature.length());
447}
448
Shawn Willden58427c42015-05-20 13:00:42 -0600449TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600450 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
451 .RsaEncryptionKey(256, 3)
452 .Digest(KM_DIGEST_NONE)
453 .Padding(KM_PAD_NONE)));
454 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
455 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
456}
457
Shawn Willden58427c42015-05-20 13:00:42 -0600458TEST_P(SigningOperationsTest, EcdsaSuccess) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600459 ASSERT_EQ(KM_ERROR_OK,
460 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
461 string message = "123456789012345678901234567890123456789012345678";
462 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600463 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willdenedb79942015-05-08 06:46:44 -0600464}
465
Shawn Willden58427c42015-05-20 13:00:42 -0600466TEST_P(SigningOperationsTest, AesEcbSign) {
Shawn Willdenedb79942015-05-08 06:46:44 -0600467 ASSERT_EQ(KM_ERROR_OK,
468 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
469 TAG_BLOCK_MODE, KM_MODE_ECB)));
470 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
471 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
472}
473
Shawn Willden58427c42015-05-20 13:00:42 -0600474TEST_P(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600475 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700476 string message = "12345678901234567890123456789012";
477 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600478 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600479 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700480}
481
Shawn Willden58427c42015-05-20 13:00:42 -0600482TEST_P(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600483 ASSERT_EQ(KM_ERROR_OK,
484 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700485 string message = "12345678901234567890123456789012";
486 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600487 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600488 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700489}
490
Shawn Willden58427c42015-05-20 13:00:42 -0600491TEST_P(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600492 ASSERT_EQ(KM_ERROR_OK,
493 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700494 string message = "12345678901234567890123456789012";
495 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600496 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600497 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700498}
499
Shawn Willden58427c42015-05-20 13:00:42 -0600500TEST_P(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600501 ASSERT_EQ(KM_ERROR_OK,
502 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
503
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700504 string message = "12345678901234567890123456789012";
505 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600506 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600507 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700508}
509
Shawn Willden58427c42015-05-20 13:00:42 -0600510TEST_P(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600511 ASSERT_EQ(KM_ERROR_OK,
512 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700513 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700514 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600515 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600516 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700517}
518
Shawn Willden58427c42015-05-20 13:00:42 -0600519TEST_P(SigningOperationsTest, HmacLengthInKey) {
Shawn Willden09f25272015-04-15 13:49:49 -0600520 // TODO(swillden): unified API should generate an error on key generation.
521 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
522 .HmacKey(128)
523 .Digest(KM_DIGEST_SHA_2_256)
524 .Authorization(TAG_MAC_LENGTH, 20)));
525 string message = "12345678901234567890123456789012";
526 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600527 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600528 // Size in key was ignored.
529 ASSERT_EQ(30U, signature.size());
530}
531
Shawn Willden58427c42015-05-20 13:00:42 -0600532TEST_P(SigningOperationsTest, HmacRfc4231TestCase1) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700533 uint8_t key_data[] = {
534 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
535 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
536 };
537 string message = "Hi There";
538 uint8_t sha_224_expected[] = {
539 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
540 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
541 };
542 uint8_t sha_256_expected[] = {
543 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
544 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
545 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
546 };
547 uint8_t sha_384_expected[] = {
548 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
549 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
550 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
551 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
552 };
553 uint8_t sha_512_expected[] = {
554 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
555 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
556 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
557 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
558 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
559 };
560
561 string key = make_string(key_data);
562
563 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
564 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
565 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
566 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
567}
568
Shawn Willden58427c42015-05-20 13:00:42 -0600569TEST_P(SigningOperationsTest, HmacRfc4231TestCase2) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700570 string key = "Jefe";
571 string message = "what do ya want for nothing?";
572 uint8_t sha_224_expected[] = {
573 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
574 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
575 };
576 uint8_t sha_256_expected[] = {
577 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
578 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
579 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
580 };
581 uint8_t sha_384_expected[] = {
582 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
583 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
584 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
585 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
586 };
587 uint8_t sha_512_expected[] = {
588 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
589 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
590 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
591 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
592 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
593 };
594
595 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
596 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
597 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
598 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
599}
600
Shawn Willden58427c42015-05-20 13:00:42 -0600601TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700602 string key(20, 0xaa);
603 string message(50, 0xdd);
604 uint8_t sha_224_expected[] = {
605 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
606 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
607 };
608 uint8_t sha_256_expected[] = {
609 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
610 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
611 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
612 };
613 uint8_t sha_384_expected[] = {
614 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
615 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
616 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
617 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
618 };
619 uint8_t sha_512_expected[] = {
620 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
621 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
622 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
623 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
624 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
625 };
626
627 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
628 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
629 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
630 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
631}
632
Shawn Willden58427c42015-05-20 13:00:42 -0600633TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700634 uint8_t key_data[25] = {
635 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
636 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
637 };
638 string key = make_string(key_data);
639 string message(50, 0xcd);
640 uint8_t sha_224_expected[] = {
641 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
642 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
643 };
644 uint8_t sha_256_expected[] = {
645 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
646 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
647 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
648 };
649 uint8_t sha_384_expected[] = {
650 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
651 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
652 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
653 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
654 };
655 uint8_t sha_512_expected[] = {
656 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
657 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
658 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
659 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
660 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
661 };
662
663 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
664 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
665 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
666 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
667}
668
Shawn Willden58427c42015-05-20 13:00:42 -0600669TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700670 string key(20, 0x0c);
671 string message = "Test With Truncation";
672
673 uint8_t sha_224_expected[] = {
674 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
675 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
676 };
677 uint8_t sha_256_expected[] = {
678 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
679 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
680 };
681 uint8_t sha_384_expected[] = {
682 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
683 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
684 };
685 uint8_t sha_512_expected[] = {
686 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
687 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
688 };
689
690 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
691 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
692 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
693 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
694}
695
Shawn Willden58427c42015-05-20 13:00:42 -0600696TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700697 string key(131, 0xaa);
698 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
699
700 uint8_t sha_224_expected[] = {
701 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
702 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
703 };
704 uint8_t sha_256_expected[] = {
705 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
706 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
707 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
708 };
709 uint8_t sha_384_expected[] = {
710 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
711 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
712 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
713 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
714 };
715 uint8_t sha_512_expected[] = {
716 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
717 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
718 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
719 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
720 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
721 };
722
723 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
724 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
725 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
726 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
727}
728
Shawn Willden58427c42015-05-20 13:00:42 -0600729TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) {
Shawn Willden3b702e22015-02-05 10:26:47 -0700730 string key(131, 0xaa);
731 string message = "This is a test using a larger than block-size key and a larger than "
732 "block-size data. The key needs to be hashed before being used by the HMAC "
733 "algorithm.";
734
735 uint8_t sha_224_expected[] = {
736 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
737 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
738 };
739 uint8_t sha_256_expected[] = {
740 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
741 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
742 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
743 };
744 uint8_t sha_384_expected[] = {
745 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
746 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
747 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
748 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
749 };
750 uint8_t sha_512_expected[] = {
751 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
752 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
753 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
754 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
755 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
756 };
757
758 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
759 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
760 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
761 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
762}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700763
Shawn Willden58427c42015-05-20 13:00:42 -0600764TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600765 ASSERT_EQ(KM_ERROR_OK,
766 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
767 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600768 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600769 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600770 ASSERT_EQ(KM_ERROR_OK,
771 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
772 string message = "1234567890123456789012345678901";
773 string result;
774 size_t input_consumed;
775 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
776 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700777}
778
Shawn Willden61902362014-12-18 10:33:24 -0700779// TODO(swillden): Add more verification failure tests.
780
Shawn Willden58427c42015-05-20 13:00:42 -0600781typedef Keymaster1Test VerificationOperationsTest;
782INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params);
783
784TEST_P(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600785 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
786 .RsaSigningKey(256, 3)
787 .Digest(KM_DIGEST_NONE)
788 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700789 string message = "12345678901234567890123456789012";
790 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600791 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
792 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600793}
794
Shawn Willden58427c42015-05-20 13:00:42 -0600795TEST_P(VerificationOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600796 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600797 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600798 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600799 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700800 string message(1024, 'a');
801 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600802 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
803 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700804}
805
Shawn Willden58427c42015-05-20 13:00:42 -0600806TEST_P(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600807 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600808 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600809 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600810 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700811 string message(1024, 'a');
812 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600813 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700814 ++signature[signature.size() / 2];
815
Shawn Willden226746b2015-05-08 11:36:56 -0600816 AuthorizationSet begin_params(client_params());
817 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600818 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600819 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -0700820
821 string result;
822 size_t input_consumed;
823 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
824 EXPECT_EQ(message.size(), input_consumed);
825 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
826}
827
Shawn Willden58427c42015-05-20 13:00:42 -0600828TEST_P(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600829 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
830 .RsaSigningKey(512, 3)
831 .Digest(KM_DIGEST_SHA_2_256)
832 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700833 // Use large message, which won't work without digesting.
834 string message(1024, 'a');
835 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600836 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
837 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700838}
839
Shawn Willden58427c42015-05-20 13:00:42 -0600840TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600841 GenerateKey(AuthorizationSetBuilder()
842 .RsaSigningKey(512, 3)
843 .Digest(KM_DIGEST_SHA_2_256)
844 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700845 string message(1024, 'a');
846 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600847 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700848 ++signature[signature.size() / 2];
849
Shawn Willden226746b2015-05-08 11:36:56 -0600850 AuthorizationSet begin_params(client_params());
851 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600852 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600853 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700854
855 string result;
856 size_t input_consumed;
857 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
858 EXPECT_EQ(message.size(), input_consumed);
859 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
860}
861
Shawn Willden58427c42015-05-20 13:00:42 -0600862TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600863 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
864 .RsaSigningKey(512, 3)
865 .Digest(KM_DIGEST_SHA_2_256)
866 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700867 // Use large message, which won't work without digesting.
868 string message(1024, 'a');
869 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600870 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700871 ++message[message.size() / 2];
872
Shawn Willden226746b2015-05-08 11:36:56 -0600873 AuthorizationSet begin_params(client_params());
874 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600875 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600876 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -0700877
878 string result;
879 size_t input_consumed;
880 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
881 EXPECT_EQ(message.size(), input_consumed);
882 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
883}
884
Shawn Willden58427c42015-05-20 13:00:42 -0600885TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600886 GenerateKey(AuthorizationSetBuilder()
887 .RsaSigningKey(512, 3)
888 .Digest(KM_DIGEST_SHA_2_256)
889 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700890 string message(1024, 'a');
891 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600892 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
893 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700894}
895
Shawn Willden58427c42015-05-20 13:00:42 -0600896TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600897 GenerateKey(AuthorizationSetBuilder()
898 .RsaSigningKey(512, 3)
899 .Digest(KM_DIGEST_SHA_2_256)
900 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700901 string message(1024, 'a');
902 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600903 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700904 ++signature[signature.size() / 2];
905
Shawn Willden226746b2015-05-08 11:36:56 -0600906 AuthorizationSet begin_params(client_params());
907 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600908 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -0600909 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700910
911 string result;
912 size_t input_consumed;
913 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
914 EXPECT_EQ(message.size(), input_consumed);
915 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
916}
917
Shawn Willden58427c42015-05-20 13:00:42 -0600918TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600919 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
920 .RsaSigningKey(512, 3)
921 .Digest(KM_DIGEST_SHA_2_256)
922 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700923 // Use large message, which won't work without digesting.
924 string message(1024, 'a');
925 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600926 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700927 ++message[message.size() / 2];
928
Shawn Willden226746b2015-05-08 11:36:56 -0600929 AuthorizationSet begin_params(client_params());
930 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600931 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -0600932 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700933
934 string result;
935 size_t input_consumed;
936 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
937 EXPECT_EQ(message.size(), input_consumed);
938 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
939}
940
941template <typename T> vector<T> make_vector(const T* array, size_t len) {
942 return vector<T>(array, array + len);
943}
944
Shawn Willden58427c42015-05-20 13:00:42 -0600945TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700946 // Get all supported digests and padding modes.
947 size_t digests_len;
948 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -0600949 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -0700950 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
951 &digests_len));
952
953 size_t padding_modes_len;
954 keymaster_padding_t* padding_modes;
Shawn Willden0cb69422015-05-26 08:31:37 -0600955 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -0700956 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
957 &padding_modes, &padding_modes_len));
958
959 // Try them.
960 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
961 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
962 // Compute key & message size that will work.
963 size_t key_bits = 256;
964 size_t message_len = 1000;
965 switch (digest) {
966 case KM_DIGEST_NONE:
967 switch (padding_mode) {
968 case KM_PAD_NONE:
969 // Match key size.
970 message_len = key_bits / 8;
971 break;
972 case KM_PAD_RSA_PKCS1_1_5_SIGN:
973 message_len = key_bits / 8 - 11;
974 break;
975 case KM_PAD_RSA_PSS:
976 // PSS requires a digest.
977 continue;
978 default:
979 FAIL() << "Missing padding";
980 break;
981 }
982 break;
983
984 case KM_DIGEST_SHA_2_256:
985 switch (padding_mode) {
986 case KM_PAD_NONE:
Shawn Willden3ad5f052015-05-08 14:05:13 -0600987 // Digesting requires padding
988 continue;
Shawn Willdenf90f2352014-12-18 23:01:15 -0700989 case KM_PAD_RSA_PKCS1_1_5_SIGN:
990 key_bits += 8 * 11;
991 break;
992 case KM_PAD_RSA_PSS:
993 key_bits += 8 * 10;
994 break;
995 default:
996 FAIL() << "Missing padding";
997 break;
998 }
999 break;
1000 default:
1001 FAIL() << "Missing digest";
1002 }
1003
Shawn Willdenaf533992015-04-15 13:48:28 -06001004 GenerateKey(AuthorizationSetBuilder()
1005 .RsaSigningKey(key_bits, 3)
1006 .Digest(digest)
1007 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001008 string message(message_len, 'a');
1009 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001010 SignMessage(message, &signature, digest, padding_mode);
1011 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001012 }
1013 }
1014
1015 free(padding_modes);
1016 free(digests);
1017}
1018
Shawn Willden58427c42015-05-20 13:00:42 -06001019TEST_P(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001020 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001021 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001022 string message = "123456789012345678901234567890123456789012345678";
1023 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001024 SignMessage(message, &signature, KM_DIGEST_NONE);
1025 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001026}
1027
Shawn Willden58427c42015-05-20 13:00:42 -06001028TEST_P(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001029 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001030 string message = "123456789012345678901234567890123456789012345678";
1031 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001032 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1033 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001034}
1035
Shawn Willden58427c42015-05-20 13:00:42 -06001036TEST_P(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001037 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001038 string message = "123456789012345678901234567890123456789012345678";
1039 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001040 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1041 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001042}
1043
Shawn Willden58427c42015-05-20 13:00:42 -06001044TEST_P(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001045 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001046 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001047 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001048 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1049 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001050}
1051
Shawn Willden58427c42015-05-20 13:00:42 -06001052TEST_P(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001053 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001054 string message = "123456789012345678901234567890123456789012345678";
1055 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001056 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1057 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001058}
1059
Shawn Willden58427c42015-05-20 13:00:42 -06001060TEST_P(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001061 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001062 string message = "123456789012345678901234567890123456789012345678";
1063 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001064 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1065 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001066}
1067
Shawn Willden58427c42015-05-20 13:00:42 -06001068typedef Keymaster1Test ExportKeyTest;
1069INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params);
1070
1071TEST_P(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001072 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1073 .RsaSigningKey(256, 3)
1074 .Digest(KM_DIGEST_NONE)
1075 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001076 string export_data;
1077 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001078 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001079
1080 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001081}
1082
Shawn Willden58427c42015-05-20 13:00:42 -06001083TEST_P(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001084 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001085 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001086 string export_data;
1087 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001088 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001089
1090 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001091}
1092
Shawn Willden58427c42015-05-20 13:00:42 -06001093TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001094 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1095 .RsaSigningKey(256, 3)
1096 .Digest(KM_DIGEST_NONE)
1097 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001098 string export_data;
1099 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001100}
1101
Shawn Willden58427c42015-05-20 13:00:42 -06001102TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001103 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1104 .RsaSigningKey(256, 3)
1105 .Digest(KM_DIGEST_NONE)
1106 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001107 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001108 string export_data;
1109 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001110}
1111
Shawn Willden58427c42015-05-20 13:00:42 -06001112TEST_P(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001113 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001114 string export_data;
1115
1116 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1117 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1118 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1119}
1120
Shawn Willden437fbd12014-08-20 11:59:49 -06001121static string read_file(const string& file_name) {
1122 ifstream file_stream(file_name, std::ios::binary);
1123 istreambuf_iterator<char> file_begin(file_stream);
1124 istreambuf_iterator<char> file_end;
1125 return string(file_begin, file_end);
1126}
1127
Shawn Willden58427c42015-05-20 13:00:42 -06001128typedef Keymaster1Test ImportKeyTest;
1129INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params);
1130
1131TEST_P(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001132 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001133 ASSERT_EQ(633U, pk8_key.size());
1134
Shawn Willdenaf533992015-04-15 13:48:28 -06001135 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1136 .RsaSigningKey(1024, 65537)
1137 .Digest(KM_DIGEST_NONE)
1138 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001139 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001140
1141 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001142 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1143 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1144 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001145
Shawn Willdenb6837e72015-05-16 09:20:59 -06001146 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001147 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1148 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001149
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001150 string message(1024 / 8, 'a');
1151 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001152 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1153 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden437fbd12014-08-20 11:59:49 -06001154}
1155
Shawn Willden58427c42015-05-20 13:00:42 -06001156TEST_P(ImportKeyTest, OldApiRsaSuccess) {
Shawn Willdend7a5c712015-04-09 16:33:52 -06001157 string pk8_key = read_file("rsa_privkey_pk8.der");
1158 ASSERT_EQ(633U, pk8_key.size());
1159
1160 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1161 // point softkeymaster will no longer support keymaster0 APIs anyway.
1162 uint8_t* key_blob;
1163 size_t key_blob_length;
1164 ASSERT_EQ(0,
1165 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1166 pk8_key.size(), &key_blob, &key_blob_length));
1167 set_key_blob(key_blob, key_blob_length);
1168
1169 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001170 AuthorizationSet begin_params; // Don't use client data.
1171 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001172 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001173 AuthorizationSet update_params;
1174 AuthorizationSet output_params;
1175 string signature =
1176 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1177 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1178 &output_params);
Shawn Willdend7a5c712015-04-09 16:33:52 -06001179}
1180
Shawn Willden58427c42015-05-20 13:00:42 -06001181TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001182 string pk8_key = read_file("rsa_privkey_pk8.der");
1183 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001184 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001185 ImportKey(AuthorizationSetBuilder()
1186 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1187 .Digest(KM_DIGEST_NONE)
1188 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001189 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001190}
1191
Shawn Willden58427c42015-05-20 13:00:42 -06001192TEST_P(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001193 string pk8_key = read_file("rsa_privkey_pk8.der");
1194 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001195 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001196 ImportKey(AuthorizationSetBuilder()
1197 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1198 .Digest(KM_DIGEST_NONE)
1199 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001200 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001201}
1202
Shawn Willden58427c42015-05-20 13:00:42 -06001203TEST_P(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001204 string pk8_key = read_file("ec_privkey_pk8.der");
1205 ASSERT_EQ(138U, pk8_key.size());
1206
Shawn Willdenaf533992015-04-15 13:48:28 -06001207 ASSERT_EQ(KM_ERROR_OK,
1208 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1209 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001210
1211 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001212 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001213 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001214
Shawn Willdenb6837e72015-05-16 09:20:59 -06001215 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001216 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1217 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001218
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001219 string message(1024 / 8, 'a');
1220 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001221 SignMessage(message, &signature, KM_DIGEST_NONE);
1222 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden81effc62014-08-27 10:08:46 -06001223}
1224
Shawn Willden58427c42015-05-20 13:00:42 -06001225TEST_P(ImportKeyTest, EcdsaSizeSpecified) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001226 string pk8_key = read_file("ec_privkey_pk8.der");
1227 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001228
Shawn Willdenaf533992015-04-15 13:48:28 -06001229 ASSERT_EQ(KM_ERROR_OK,
1230 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1231 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001232
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001233 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001234 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001235 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1236
Shawn Willdenb6837e72015-05-16 09:20:59 -06001237 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001238 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1239 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1240
1241 string message(1024 / 8, 'a');
1242 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001243 SignMessage(message, &signature, KM_DIGEST_NONE);
1244 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001245}
1246
Shawn Willden58427c42015-05-20 13:00:42 -06001247TEST_P(ImportKeyTest, EcdsaSizeMismatch) {
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001248 string pk8_key = read_file("ec_privkey_pk8.der");
1249 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001250 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001251 ImportKey(AuthorizationSetBuilder()
1252 .EcdsaSigningKey(224 /* Doesn't match key */)
1253 .Digest(KM_DIGEST_NONE),
1254 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001255}
1256
Shawn Willden58427c42015-05-20 13:00:42 -06001257TEST_P(ImportKeyTest, AesKeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001258 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1259 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001260 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001261 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1262 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001263 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001264
1265 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1266 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1267
1268 string message = "Hello World!";
Shawn Willdenc4424672015-05-11 11:56:02 -06001269 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1270 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willden3b702e22015-02-05 10:26:47 -07001271 EXPECT_EQ(message, plaintext);
1272}
1273
Shawn Willden58427c42015-05-20 13:00:42 -06001274TEST_P(ImportKeyTest, HmacSha256KeySuccess) {
Shawn Willden3b702e22015-02-05 10:26:47 -07001275 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1276 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001277 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1278 .HmacKey(sizeof(key_data) * 8)
1279 .Digest(KM_DIGEST_SHA_2_256)
1280 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001281 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001282
1283 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1284 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1285
1286 string message = "Hello World!";
1287 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001288 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1289 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden3b702e22015-02-05 10:26:47 -07001290}
1291
Shawn Willden58427c42015-05-20 13:00:42 -06001292typedef Keymaster1Test EncryptionOperationsTest;
1293INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params);
1294
1295TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001296 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1297 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001298
1299 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001300 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001301 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001302
Shawn Willden3ad5f052015-05-08 14:05:13 -06001303 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001304 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001305
1306 // OAEP randomizes padding so every result should be different.
1307 EXPECT_NE(ciphertext1, ciphertext2);
1308}
1309
Shawn Willden58427c42015-05-20 13:00:42 -06001310TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001311 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1312 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001313 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001314 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001315 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001316
Shawn Willden3ad5f052015-05-08 14:05:13 -06001317 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001318 EXPECT_EQ(message, plaintext);
1319}
1320
Shawn Willden58427c42015-05-20 13:00:42 -06001321TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001322 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1323 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001324 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001325 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001326 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001327
Shawn Willden3ad5f052015-05-08 14:05:13 -06001328 AuthorizationSet begin_params(client_params());
1329 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1330 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001331 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001332 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001333 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001334}
1335
Shawn Willden58427c42015-05-20 13:00:42 -06001336TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001337 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1338 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001339 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001340 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001341 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001342
1343 // Corrupt the ciphertext
1344 ciphertext[512 / 8 / 2]++;
1345
Shawn Willden4200f212014-12-02 07:01:21 -07001346 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001347 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001348 AuthorizationSet begin_params(client_params());
1349 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1350 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001351 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001352 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001353 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001354}
1355
Shawn Willden58427c42015-05-20 13:00:42 -06001356TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001357 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1358 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001359 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001360 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001361 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001362
Shawn Willden3ad5f052015-05-08 14:05:13 -06001363 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001364 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001365
1366 // PKCS1 v1.5 randomizes padding so every result should be different.
1367 EXPECT_NE(ciphertext1, ciphertext2);
1368}
1369
Shawn Willden58427c42015-05-20 13:00:42 -06001370TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001371 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1372 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001373 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001374 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001375 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001376
Shawn Willden3ad5f052015-05-08 14:05:13 -06001377 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001378 EXPECT_EQ(message, plaintext);
1379}
1380
Shawn Willden58427c42015-05-20 13:00:42 -06001381TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001382 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1383 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willden7bae1322015-05-26 10:16:49 -06001384 string message = "123456789012345678901234567890123456789012345678901234";
Shawn Willden4200f212014-12-02 07:01:21 -07001385 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001386 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001387
Shawn Willden3ad5f052015-05-08 14:05:13 -06001388 AuthorizationSet begin_params(client_params());
1389 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1390 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001391 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001392 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001393 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001394}
1395
Shawn Willden58427c42015-05-20 13:00:42 -06001396TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001397 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1398 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001399 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001400 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001401 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001402
1403 // Corrupt the ciphertext
1404 ciphertext[512 / 8 / 2]++;
1405
Shawn Willden4200f212014-12-02 07:01:21 -07001406 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001407 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001408 AuthorizationSet begin_params(client_params());
1409 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1410 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001411 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001412 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001413 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001414}
1415
Shawn Willden58427c42015-05-20 13:00:42 -06001416TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001417 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1418 .RsaSigningKey(256, 3)
1419 .Digest(KM_DIGEST_NONE)
1420 .Padding(KM_PAD_NONE)));
1421 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1422 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1423}
1424
Shawn Willden58427c42015-05-20 13:00:42 -06001425TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001426 ASSERT_EQ(KM_ERROR_OK,
1427 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1428 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1429 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1430}
1431
Shawn Willden58427c42015-05-20 13:00:42 -06001432TEST_P(EncryptionOperationsTest, HmacEncrypt) {
Shawn Willdenedb79942015-05-08 06:46:44 -06001433 ASSERT_EQ(
1434 KM_ERROR_OK,
1435 GenerateKey(
1436 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1437 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1438 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1439}
1440
Shawn Willden58427c42015-05-20 13:00:42 -06001441TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001442 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1443 .AesEncryptionKey(128)
1444 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1445 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001446 // Two-block message.
1447 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001448 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001449 EXPECT_EQ(message.size(), ciphertext1.size());
1450
Shawn Willden31e063f2015-05-08 14:31:22 -06001451 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001452 EXPECT_EQ(message.size(), ciphertext2.size());
1453
1454 // ECB is deterministic.
1455 EXPECT_EQ(ciphertext1, ciphertext2);
1456
Shawn Willden31e063f2015-05-08 14:31:22 -06001457 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001458 EXPECT_EQ(message, plaintext);
1459}
1460
Shawn Willden58427c42015-05-20 13:00:42 -06001461TEST_P(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001462 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1463 .AesEncryptionKey(128)
1464 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1465 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001466 // Message is slightly shorter than two blocks.
1467 string message = "1234567890123456789012345678901";
1468
Shawn Willden31e063f2015-05-08 14:31:22 -06001469 AuthorizationSet begin_params(client_params());
1470 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001471 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001472 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001473 string ciphertext;
1474 size_t input_consumed;
1475 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1476 EXPECT_EQ(message.size(), input_consumed);
1477 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1478}
1479
Shawn Willden58427c42015-05-20 13:00:42 -06001480TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001481 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001482 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001483 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1484 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001485
1486 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001487 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001488 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001489 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001490 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001491 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001492 EXPECT_EQ(message, plaintext);
1493 }
1494}
1495
Shawn Willden58427c42015-05-20 13:00:42 -06001496TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001497 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001498 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001499 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1500 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001501
1502 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001503 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001504 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001505 EXPECT_NE(ciphertext, message);
1506 ++ciphertext[ciphertext.size() / 2];
1507
Shawn Willden31e063f2015-05-08 14:31:22 -06001508 AuthorizationSet begin_params(client_params());
1509 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001510 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
Shawn Willden31e063f2015-05-08 14:31:22 -06001511 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001512 string plaintext;
1513 size_t input_consumed;
1514 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1515 EXPECT_EQ(ciphertext.size(), input_consumed);
1516 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1517}
1518
Shawn Willden58427c42015-05-20 13:00:42 -06001519TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001520 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1521 .AesEncryptionKey(128)
1522 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1523 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001524 string message = "123";
1525 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001526 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001527 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001528 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001529
1530 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001531 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001532 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001533 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001534
1535 // IVs should be random, so ciphertexts should differ.
1536 EXPECT_NE(iv1, iv2);
1537 EXPECT_NE(ciphertext1, ciphertext2);
1538
Shawn Willden31e063f2015-05-08 14:31:22 -06001539 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001540 EXPECT_EQ(message, plaintext);
1541}
1542
Shawn Willden58427c42015-05-20 13:00:42 -06001543TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001544 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1545 .AesEncryptionKey(128)
1546 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1547 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001548
1549 int increment = 15;
1550 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001551 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001552 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001553 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001554 AuthorizationSet output_params;
1555 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1556
1557 string ciphertext;
1558 size_t input_consumed;
1559 for (size_t i = 0; i < message.size(); i += increment)
1560 EXPECT_EQ(KM_ERROR_OK,
1561 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1562 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1563 EXPECT_EQ(message.size(), ciphertext.size());
1564
1565 // Move TAG_NONCE into input_params
1566 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001567 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001568 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001569 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001570 output_params.Clear();
1571
1572 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1573 string plaintext;
1574 for (size_t i = 0; i < ciphertext.size(); i += increment)
1575 EXPECT_EQ(KM_ERROR_OK,
1576 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1577 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1578 EXPECT_EQ(ciphertext.size(), plaintext.size());
1579 EXPECT_EQ(message, plaintext);
1580}
1581
1582struct AesCtrSp80038aTestVector {
1583 const char* key;
1584 const char* nonce;
1585 const char* plaintext;
1586 const char* ciphertext;
1587};
1588
1589// These test vectors are taken from
1590// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1591static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1592 // AES-128
1593 {
1594 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1595 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1596 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1597 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1598 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1599 },
1600 // AES-192
1601 {
1602 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1603 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1604 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1605 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1606 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1607 },
1608 // AES-256
1609 {
1610 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1611 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1612 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1613 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1614 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1615 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1616 },
1617};
1618
Shawn Willden58427c42015-05-20 13:00:42 -06001619TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
Thai Duong20d725d2015-03-24 17:49:58 -07001620 for (size_t i = 0; i < 3; i++) {
1621 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1622 const string key = hex2str(test.key);
1623 const string nonce = hex2str(test.nonce);
1624 const string plaintext = hex2str(test.plaintext);
1625 const string ciphertext = hex2str(test.ciphertext);
1626 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1627 }
1628}
1629
Shawn Willden58427c42015-05-20 13:00:42 -06001630TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
Thai Duong20d725d2015-03-24 17:49:58 -07001631 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1632 .AesEncryptionKey(128)
1633 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1634 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06001635 AuthorizationSet begin_params(client_params());
1636 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001637 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001638 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Thai Duong20d725d2015-03-24 17:49:58 -07001639}
1640
Shawn Willden58427c42015-05-20 13:00:42 -06001641TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
Thai Duong20d725d2015-03-24 17:49:58 -07001642 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1643 .AesEncryptionKey(128)
1644 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001645 .Authorization(TAG_CALLER_NONCE)
1646 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001647
Shawn Willden09f25272015-04-15 13:49:49 -06001648 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001649 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001650 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001651 input_params.push_back(TAG_NONCE, "123", 3);
1652 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1653}
1654
Shawn Willden58427c42015-05-20 13:00:42 -06001655TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001656 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1657 .AesEncryptionKey(128)
1658 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1659 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001660 // Two-block message.
1661 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001662 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001663 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001664 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001665
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001666 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001667 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001668 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001669
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001670 // IVs should be random, so ciphertexts should differ.
1671 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001672 EXPECT_NE(ciphertext1, ciphertext2);
1673
Shawn Willden31e063f2015-05-08 14:31:22 -06001674 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001675 EXPECT_EQ(message, plaintext);
1676}
1677
Shawn Willden58427c42015-05-20 13:00:42 -06001678TEST_P(EncryptionOperationsTest, AesCallerNonce) {
Shawn Willden969aa382015-04-15 17:05:53 -07001679 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1680 .AesEncryptionKey(128)
1681 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001682 .Authorization(TAG_CALLER_NONCE)
1683 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07001684 string message = "12345678901234567890123456789012";
1685 string iv1;
1686 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06001687 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07001688 EXPECT_EQ(message.size(), ciphertext1.size());
1689 EXPECT_EQ(16U, iv1.size());
1690
Shawn Willden31e063f2015-05-08 14:31:22 -06001691 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07001692 EXPECT_EQ(message, plaintext);
1693
1694 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06001695 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001696 AuthorizationSet update_params;
1697 AuthorizationSet output_params;
1698 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06001699 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06001700 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07001701 string ciphertext2 =
1702 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
1703
1704 // Decrypt with correct nonce.
1705 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1706 &output_params);
1707 EXPECT_EQ(message, plaintext);
1708
1709 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06001710 input_params.Reinitialize(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001711 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06001712 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07001713 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
1714 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1715 &output_params);
1716 EXPECT_NE(message, plaintext);
1717}
1718
Shawn Willden58427c42015-05-20 13:00:42 -06001719TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001720 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1721 .AesEncryptionKey(128)
1722 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1723 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06001724
1725 string message = "12345678901234567890123456789012";
1726 string iv1;
1727 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06001728 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06001729 EXPECT_EQ(message.size(), ciphertext1.size());
1730 EXPECT_EQ(16U, iv1.size());
1731
Shawn Willden31e063f2015-05-08 14:31:22 -06001732 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06001733 EXPECT_EQ(message, plaintext);
1734
1735 // Now specify a nonce, should fail.
1736 AuthorizationSet input_params(client_params());
1737 AuthorizationSet update_params;
1738 AuthorizationSet output_params;
1739 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06001740 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06001741 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden67706352015-04-28 00:43:19 -06001742
1743 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
1744 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1745}
1746
Shawn Willden58427c42015-05-20 13:00:42 -06001747TEST_P(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001748 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1749 .AesEncryptionKey(128)
1750 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1751 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001752
1753 int increment = 15;
1754 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001755 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001756 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06001757 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001758 AuthorizationSet output_params;
1759 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1760
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001761 string ciphertext;
1762 size_t input_consumed;
1763 for (size_t i = 0; i < message.size(); i += increment)
1764 EXPECT_EQ(KM_ERROR_OK,
1765 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1766 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001767 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001768
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001769 // Move TAG_NONCE into input_params
1770 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001771 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001772 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06001773 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001774 output_params.Clear();
1775
1776 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001777 string plaintext;
1778 for (size_t i = 0; i < ciphertext.size(); i += increment)
1779 EXPECT_EQ(KM_ERROR_OK,
1780 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1781 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001782 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001783 EXPECT_EQ(message, plaintext);
1784}
1785
Shawn Willden58427c42015-05-20 13:00:42 -06001786TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001787 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001788 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001789 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1790 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001791
1792 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001793 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001794 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001795 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06001796 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001797 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001798 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001799 EXPECT_EQ(message, plaintext);
1800 }
1801}
1802
Shawn Willden58427c42015-05-20 13:00:42 -06001803typedef Keymaster1Test AddEntropyTest;
1804INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params);
1805
1806TEST_P(AddEntropyTest, AddEntropy) {
Shawn Willdencd695822015-01-26 14:06:32 -07001807 // There's no obvious way to test that entropy is actually added, but we can test that the API
1808 // doesn't blow up or return an error.
1809 EXPECT_EQ(KM_ERROR_OK,
1810 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1811}
1812
Shawn Willden128ffe02014-08-06 12:31:33 -06001813} // namespace test
1814} // namespace keymaster