blob: d80c0182f5f5689f60618e4d7b69d7fd71aa7ba6 [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 Willden128ffe02014-08-06 12:31:33 -060021#include <openssl/engine.h>
22
Shawn Willdend7a5c712015-04-09 16:33:52 -060023#include <hardware/keymaster0.h>
24
Shawn Willden98d9b922014-08-26 08:14:10 -060025#include <keymaster/google_keymaster_utils.h>
26#include <keymaster/keymaster_tags.h>
Shawn Willdenb7510332015-02-06 19:58:29 -070027#include <keymaster/soft_keymaster_device.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060028
Shawn Willden76364712014-08-11 17:48:04 -060029#include "google_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060030
Shawn Willden437fbd12014-08-20 11:59:49 -060031using std::ifstream;
32using std::istreambuf_iterator;
Shawn Willden76076ab2014-12-18 08:36:35 -070033using std::string;
34using std::vector;
Shawn Willden437fbd12014-08-20 11:59:49 -060035
Shawn Willden63ac0432014-12-29 14:07:08 -070036template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
37 os << "{ ";
38 bool first = true;
39 for (T t : vec) {
40 os << (first ? "" : ", ") << t;
41 if (first)
42 first = false;
43 }
44 os << " }";
45 return os;
46}
47
Shawn Willden128ffe02014-08-06 12:31:33 -060048namespace keymaster {
49namespace test {
50
Shawn Willden567a4a02014-12-31 12:14:46 -070051StdoutLogger logger;
52
Shawn Willden95dda362015-02-27 10:58:37 -070053class KeymasterTest : public Keymaster1Test {
Shawn Willden128ffe02014-08-06 12:31:33 -060054 protected:
Shawn Willden95dda362015-02-27 10:58:37 -070055 KeymasterTest() {
56 SoftKeymasterDevice* device = new SoftKeymasterDevice;
57 init(device->keymaster_device());
Shawn Willden5b53c992015-02-02 08:05:25 -070058 }
Shawn Willden128ffe02014-08-06 12:31:33 -060059};
60
Shawn Willden128ffe02014-08-06 12:31:33 -060061typedef KeymasterTest CheckSupported;
62TEST_F(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -070063 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
64 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060065
Shawn Willden5b53c992015-02-02 08:05:25 -070066 size_t len;
67 keymaster_algorithm_t* algorithms;
68 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -070069 EXPECT_TRUE(ResponseContains(
Shawn Willden9c65b2b2015-04-07 17:01:10 -060070 {KM_ALGORITHM_RSA, KM_ALGORITHM_EC, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms, len));
Shawn Willden5b53c992015-02-02 08:05:25 -070071 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -060072}
73
74TEST_F(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070075 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
76 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
77 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060078
Shawn Willden5b53c992015-02-02 08:05:25 -070079 size_t len;
80 keymaster_block_mode_t* modes;
Shawn Willden63ac0432014-12-29 14:07:08 -070081 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
82 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -060083 EXPECT_EQ(0U, len);
Shawn Willden63ac0432014-12-29 14:07:08 -070084 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060085
Shawn Willden63ac0432014-12-29 14:07:08 -070086 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden9c65b2b2015-04-07 17:01:10 -060087 device()->get_supported_block_modes(device(), KM_ALGORITHM_EC, KM_PURPOSE_ENCRYPT,
Shawn Willden5b53c992015-02-02 08:05:25 -070088 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -060089
Shawn Willden63ac0432014-12-29 14:07:08 -070090 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
91 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc47c88f2015-04-07 17:23:27 -060092 EXPECT_TRUE(ResponseContains({KM_MODE_ECB, KM_MODE_CBC, KM_MODE_CTR}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -070093 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060094}
95
96TEST_F(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070097 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
98 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
99 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600100
Shawn Willden5b53c992015-02-02 08:05:25 -0700101 size_t len;
102 keymaster_padding_t* modes;
103 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
104 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700105 EXPECT_TRUE(
106 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700107 free(modes);
108
109 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
110 KM_PURPOSE_ENCRYPT, &modes, &len));
111 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700112 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600113
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600114 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700115 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600116 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700117 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700118
119 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
120 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
121 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600122}
123
124TEST_F(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700125 EXPECT_EQ(
126 KM_ERROR_OUTPUT_PARAMETER_NULL,
127 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600128
Shawn Willden5b53c992015-02-02 08:05:25 -0700129 size_t len;
130 keymaster_digest_t* digests;
131 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
132 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700133 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700134 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600135
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600136 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700137 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willdene998c132015-04-14 14:41:46 -0600138 EXPECT_TRUE(ResponseContains(KM_DIGEST_NONE, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700139 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600140
Shawn Willden63ac0432014-12-29 14:07:08 -0700141 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
142 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
143 &len));
144
145 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700146 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700147 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
148 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
149 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700150 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600151}
152
153TEST_F(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700154 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
155 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600156
Shawn Willden5b53c992015-02-02 08:05:25 -0700157 size_t len;
158 keymaster_key_format_t* formats;
159 EXPECT_EQ(KM_ERROR_OK,
160 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700161 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700162 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700163
164 EXPECT_EQ(KM_ERROR_OK,
165 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
166 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
167 free(formats);
168
169 EXPECT_EQ(KM_ERROR_OK,
170 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
171 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
172 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600173}
174
175TEST_F(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700176 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
177 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600178
Shawn Willden5b53c992015-02-02 08:05:25 -0700179 size_t len;
180 keymaster_key_format_t* formats;
181 EXPECT_EQ(KM_ERROR_OK,
182 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700183 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700184 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600185
Shawn Willden5b53c992015-02-02 08:05:25 -0700186 EXPECT_EQ(KM_ERROR_OK,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600187 device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700188 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700189 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600190
Shawn Willden5b53c992015-02-02 08:05:25 -0700191 EXPECT_EQ(KM_ERROR_OK,
192 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600193 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700194 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700195
196 EXPECT_EQ(KM_ERROR_OK,
197 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600198 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700199 free(formats);
200
201 EXPECT_EQ(KM_ERROR_OK,
202 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600203 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700204 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600205}
206
Shawn Willdend0772312014-09-18 12:27:57 -0600207class NewKeyGeneration : public KeymasterTest {
208 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700209 void CheckBaseParams() {
210 EXPECT_EQ(0U, hw_enforced().size());
211 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600212
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700213 AuthorizationSet auths = sw_enforced();
214 EXPECT_GT(auths.SerializedSize(), 12U);
215
Shawn Willden5b53c992015-02-02 08:05:25 -0700216 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
217 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
218 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600219 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700220 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600221
222 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700223 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
224 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
225 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600226
227 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700228 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
229 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
230 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600231
232 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600233 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700234 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600235 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700236};
237
Shawn Willden128ffe02014-08-06 12:31:33 -0600238TEST_F(NewKeyGeneration, Rsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600239 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
240 .RsaSigningKey(256, 3)
241 .Digest(KM_DIGEST_NONE)
242 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700243 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600244
Shawn Willden5b53c992015-02-02 08:05:25 -0700245 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700246 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700247 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
248 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
249 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600250}
251
Shawn Willden6bbe6782014-09-18 11:26:15 -0600252TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700253 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
254 GenerateKey(AuthorizationSetBuilder()
255 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
256 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
257 .SigningKey()));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600258}
259
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600260TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600261 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600262 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700263 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600264
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700265 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600266 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700267 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600268}
269
Shawn Willden6bbe6782014-09-18 11:26:15 -0600270TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600271 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600272 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700273 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600274
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700275 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600276 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600277
278 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700279 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600280}
281
282TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700283 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willdenaf533992015-04-15 13:48:28 -0600284 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600285}
286
287TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600288 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600289 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600290 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
291 KM_DIGEST_NONE)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700292 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600293 }
294}
295
Shawn Willden0d560bf2014-12-15 17:44:02 -0700296TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700297 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600298 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700299}
300
Shawn Willden76364712014-08-11 17:48:04 -0600301typedef KeymasterTest GetKeyCharacteristics;
302TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600303 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
304 .RsaSigningKey(256, 3)
305 .Digest(KM_DIGEST_NONE)
306 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700307 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600308
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700309 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
310 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600311}
312
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700313typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600314TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600315 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
316 .RsaSigningKey(256, 3)
317 .Digest(KM_DIGEST_NONE)
318 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700319 string message = "12345678901234567890123456789012";
320 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600321 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600322}
323
Shawn Willden61902362014-12-18 10:33:24 -0700324TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
325 // Note that without padding, key size must exactly match digest size.
Shawn Willdenaf533992015-04-15 13:48:28 -0600326 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
327 .RsaSigningKey(256, 3)
328 .Digest(KM_DIGEST_SHA_2_256)
329 .Padding(KM_PAD_NONE)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700330 string message(1024, 'a');
331 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600332 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700333}
334
335TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600336 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
337 .RsaSigningKey(512, 3)
338 .Digest(KM_DIGEST_SHA_2_256)
339 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700340 // Use large message, which won't work without digesting.
341 string message(1024, 'a');
342 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600343 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
Shawn Willden61902362014-12-18 10:33:24 -0700344}
345
Shawn Willdenf90f2352014-12-18 23:01:15 -0700346TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600347 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
348 .RsaSigningKey(512, 3)
349 .Digest(KM_DIGEST_SHA_2_256)
350 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700351 string message(1024, 'a');
352 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600353 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700354}
355
356TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
357 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
358 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600359 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
360 .RsaSigningKey(256 + 9 * 8, 3)
361 .Digest(KM_DIGEST_SHA_2_256)
362 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700363 string message(1024, 'a');
364 string signature;
365
Shawn Willden226746b2015-05-08 11:36:56 -0600366 AuthorizationSet begin_params(client_params());
367 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
368 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700369
370 string result;
371 size_t input_consumed;
372 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
373 EXPECT_EQ(message.size(), input_consumed);
374 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
375}
376
Shawn Willden1615f2e2014-08-13 10:37:40 -0600377TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600378 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
379 .RsaSigningKey(256, 3)
380 .Digest(KM_DIGEST_NONE)
381 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600382 AuthorizationSet begin_params(client_params());
383 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
384 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700385 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
386 // Another abort should fail
387 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600388}
389
390TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600391 GenerateKey(AuthorizationSetBuilder()
392 .RsaSigningKey(256, 3)
393 .Digest(KM_DIGEST_MD5)
394 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700395 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600396}
397
398TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600399 GenerateKey(AuthorizationSetBuilder()
400 .RsaSigningKey(256, 3)
401 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
402 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600403 AuthorizationSet begin_params(client_params());
404 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
405 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600406}
407
408TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700409 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700410 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700411 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700412 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600413 GenerateKey(AuthorizationSetBuilder()
414 .RsaSigningKey(256, 3)
415 .Digest(KM_DIGEST_NONE)
416 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600417 AuthorizationSet begin_params(client_params());
418 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
419 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600420}
421
422TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700423 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600424 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
425 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600426 AuthorizationSet begin_params(client_params());
427 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
428 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600429}
430
Shawn Willdenedb79942015-05-08 06:46:44 -0600431TEST_F(SigningOperationsTest, RsaTooShortMessage) {
432 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
433 .RsaSigningKey(256, 3)
434 .Digest(KM_DIGEST_NONE)
435 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600436 AuthorizationSet begin_params(client_params());
437 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
438 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600439
440 string message = "1234567890123456789012345678901";
441 string result;
442 size_t input_consumed;
443 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
444 EXPECT_EQ(0U, result.size());
445 EXPECT_EQ(31U, input_consumed);
446
447 string signature;
448 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
449 EXPECT_EQ(0U, signature.length());
450}
451
452TEST_F(SigningOperationsTest, RsaSignWithEncryptionKey) {
453 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
454 .RsaEncryptionKey(256, 3)
455 .Digest(KM_DIGEST_NONE)
456 .Padding(KM_PAD_NONE)));
457 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
458 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
459}
460
461TEST_F(SigningOperationsTest, EcdsaSuccess) {
462 ASSERT_EQ(KM_ERROR_OK,
463 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
464 string message = "123456789012345678901234567890123456789012345678";
465 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600466 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willdenedb79942015-05-08 06:46:44 -0600467}
468
469TEST_F(SigningOperationsTest, AesEcbSign) {
470 ASSERT_EQ(KM_ERROR_OK,
471 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
472 TAG_BLOCK_MODE, KM_MODE_ECB)));
473 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
474 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
475}
476
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700477TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600478 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700479 string message = "12345678901234567890123456789012";
480 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600481 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600482 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700483}
484
Shawn Willden62c22862014-12-17 08:36:20 -0700485TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600486 ASSERT_EQ(KM_ERROR_OK,
487 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700488 string message = "12345678901234567890123456789012";
489 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600490 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600491 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700492}
493
Shawn Willden0d560bf2014-12-15 17:44:02 -0700494TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600495 ASSERT_EQ(KM_ERROR_OK,
496 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700497 string message = "12345678901234567890123456789012";
498 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600499 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600500 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700501}
502
Shawn Willden62c22862014-12-17 08:36:20 -0700503TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600504 ASSERT_EQ(KM_ERROR_OK,
505 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
506
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700507 string message = "12345678901234567890123456789012";
508 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600509 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600510 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700511}
512
513TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600514 ASSERT_EQ(KM_ERROR_OK,
515 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700516 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700517 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600518 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600519 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700520}
521
Shawn Willden09f25272015-04-15 13:49:49 -0600522TEST_F(SigningOperationsTest, HmacLengthInKey) {
523 // TODO(swillden): unified API should generate an error on key generation.
524 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
525 .HmacKey(128)
526 .Digest(KM_DIGEST_SHA_2_256)
527 .Authorization(TAG_MAC_LENGTH, 20)));
528 string message = "12345678901234567890123456789012";
529 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600530 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600531 // Size in key was ignored.
532 ASSERT_EQ(30U, signature.size());
533}
534
Shawn Willden3b702e22015-02-05 10:26:47 -0700535TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
536 uint8_t key_data[] = {
537 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
538 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
539 };
540 string message = "Hi There";
541 uint8_t sha_224_expected[] = {
542 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
543 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
544 };
545 uint8_t sha_256_expected[] = {
546 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
547 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
548 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
549 };
550 uint8_t sha_384_expected[] = {
551 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
552 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
553 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
554 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
555 };
556 uint8_t sha_512_expected[] = {
557 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
558 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
559 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
560 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
561 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
562 };
563
564 string key = make_string(key_data);
565
566 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
567 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
568 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
569 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
570}
571
572TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
573 string key = "Jefe";
574 string message = "what do ya want for nothing?";
575 uint8_t sha_224_expected[] = {
576 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
577 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
578 };
579 uint8_t sha_256_expected[] = {
580 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
581 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
582 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
583 };
584 uint8_t sha_384_expected[] = {
585 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
586 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
587 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
588 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
589 };
590 uint8_t sha_512_expected[] = {
591 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
592 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
593 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
594 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
595 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
596 };
597
598 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
599 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
600 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
601 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
602}
603
604TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
605 string key(20, 0xaa);
606 string message(50, 0xdd);
607 uint8_t sha_224_expected[] = {
608 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
609 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
610 };
611 uint8_t sha_256_expected[] = {
612 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
613 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
614 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
615 };
616 uint8_t sha_384_expected[] = {
617 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
618 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
619 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
620 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
621 };
622 uint8_t sha_512_expected[] = {
623 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
624 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
625 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
626 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
627 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
628 };
629
630 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
631 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
632 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
633 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
634}
635
636TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
637 uint8_t key_data[25] = {
638 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
639 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
640 };
641 string key = make_string(key_data);
642 string message(50, 0xcd);
643 uint8_t sha_224_expected[] = {
644 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
645 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
646 };
647 uint8_t sha_256_expected[] = {
648 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
649 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
650 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
651 };
652 uint8_t sha_384_expected[] = {
653 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
654 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
655 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
656 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
657 };
658 uint8_t sha_512_expected[] = {
659 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
660 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
661 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
662 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
663 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
664 };
665
666 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
667 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
668 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
669 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
670}
671
672TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
673 string key(20, 0x0c);
674 string message = "Test With Truncation";
675
676 uint8_t sha_224_expected[] = {
677 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
678 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
679 };
680 uint8_t sha_256_expected[] = {
681 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
682 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
683 };
684 uint8_t sha_384_expected[] = {
685 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
686 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
687 };
688 uint8_t sha_512_expected[] = {
689 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
690 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
691 };
692
693 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
694 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
695 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
696 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
697}
698
699TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
700 string key(131, 0xaa);
701 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
702
703 uint8_t sha_224_expected[] = {
704 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
705 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
706 };
707 uint8_t sha_256_expected[] = {
708 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
709 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
710 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
711 };
712 uint8_t sha_384_expected[] = {
713 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
714 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
715 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
716 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
717 };
718 uint8_t sha_512_expected[] = {
719 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
720 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
721 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
722 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
723 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
724 };
725
726 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
727 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
728 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
729 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
730}
731
732TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
733 string key(131, 0xaa);
734 string message = "This is a test using a larger than block-size key and a larger than "
735 "block-size data. The key needs to be hashed before being used by the HMAC "
736 "algorithm.";
737
738 uint8_t sha_224_expected[] = {
739 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
740 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
741 };
742 uint8_t sha_256_expected[] = {
743 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
744 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
745 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
746 };
747 uint8_t sha_384_expected[] = {
748 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
749 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
750 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
751 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
752 };
753 uint8_t sha_512_expected[] = {
754 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
755 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
756 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
757 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
758 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
759 };
760
761 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
762 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
763 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
764 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
765}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700766
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700767TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600768 ASSERT_EQ(KM_ERROR_OK,
769 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
770 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600771 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600772 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600773 ASSERT_EQ(KM_ERROR_OK,
774 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
775 string message = "1234567890123456789012345678901";
776 string result;
777 size_t input_consumed;
778 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
779 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700780}
781
Shawn Willden61902362014-12-18 10:33:24 -0700782// TODO(swillden): Add more verification failure tests.
783
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700784typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600785TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600786 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
787 .RsaSigningKey(256, 3)
788 .Digest(KM_DIGEST_NONE)
789 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700790 string message = "12345678901234567890123456789012";
791 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600792 SignMessage(message, &signature, KM_DIGEST_NONE);
793 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600794}
795
Shawn Willden61902362014-12-18 10:33:24 -0700796TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
797 // Note that without padding, key size must exactly match digest size.
Shawn Willdenaf533992015-04-15 13:48:28 -0600798 GenerateKey(AuthorizationSetBuilder()
799 .RsaSigningKey(256, 3)
800 .Digest(KM_DIGEST_SHA_2_256)
801 .Padding(KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700802 string message(1024, 'a');
803 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600804 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
805 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden61902362014-12-18 10:33:24 -0700806}
807
Shawn Willdenf90f2352014-12-18 23:01:15 -0700808TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600809 GenerateKey(AuthorizationSetBuilder()
810 .RsaSigningKey(256, 3)
811 .Digest(KM_DIGEST_SHA_2_256)
812 .Padding(KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700813 string message(1024, 'a');
814 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600815 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
Shawn Willden61902362014-12-18 10:33:24 -0700816 ++signature[signature.size() / 2];
817
Shawn Willden226746b2015-05-08 11:36:56 -0600818 AuthorizationSet begin_params(client_params());
819 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
820 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -0700821
822 string result;
823 size_t input_consumed;
824 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
825 EXPECT_EQ(message.size(), input_consumed);
826 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
827}
828
Shawn Willdenf90f2352014-12-18 23:01:15 -0700829TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600830 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
831 .RsaSigningKey(512, 3)
832 .Digest(KM_DIGEST_SHA_2_256)
833 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700834 // Use large message, which won't work without digesting.
835 string message(1024, 'a');
836 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600837 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
838 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700839}
840
841TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600842 GenerateKey(AuthorizationSetBuilder()
843 .RsaSigningKey(512, 3)
844 .Digest(KM_DIGEST_SHA_2_256)
845 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700846 string message(1024, 'a');
847 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600848 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700849 ++signature[signature.size() / 2];
850
Shawn Willden226746b2015-05-08 11:36:56 -0600851 AuthorizationSet begin_params(client_params());
852 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
853 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
862TEST_F(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 Willden226746b2015-05-08 11:36:56 -0600870 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
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);
875 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -0700876
877 string result;
878 size_t input_consumed;
879 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
880 EXPECT_EQ(message.size(), input_consumed);
881 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
882}
883
Shawn Willdenf90f2352014-12-18 23:01:15 -0700884TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600885 GenerateKey(AuthorizationSetBuilder()
886 .RsaSigningKey(512, 3)
887 .Digest(KM_DIGEST_SHA_2_256)
888 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700889 string message(1024, 'a');
890 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600891 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
892 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700893}
894
895TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600896 GenerateKey(AuthorizationSetBuilder()
897 .RsaSigningKey(512, 3)
898 .Digest(KM_DIGEST_SHA_2_256)
899 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700900 string message(1024, 'a');
901 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600902 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700903 ++signature[signature.size() / 2];
904
Shawn Willden226746b2015-05-08 11:36:56 -0600905 AuthorizationSet begin_params(client_params());
906 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
907 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700908
909 string result;
910 size_t input_consumed;
911 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
912 EXPECT_EQ(message.size(), input_consumed);
913 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
914}
915
916TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600917 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
918 .RsaSigningKey(512, 3)
919 .Digest(KM_DIGEST_SHA_2_256)
920 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700921 // Use large message, which won't work without digesting.
922 string message(1024, 'a');
923 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600924 SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700925 ++message[message.size() / 2];
926
Shawn Willden226746b2015-05-08 11:36:56 -0600927 AuthorizationSet begin_params(client_params());
928 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
929 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700930
931 string result;
932 size_t input_consumed;
933 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
934 EXPECT_EQ(message.size(), input_consumed);
935 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
936}
937
938template <typename T> vector<T> make_vector(const T* array, size_t len) {
939 return vector<T>(array, array + len);
940}
941
942TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
943 // Get all supported digests and padding modes.
944 size_t digests_len;
945 keymaster_digest_t* digests;
946 EXPECT_EQ(KM_ERROR_OK,
947 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
948 &digests_len));
949
950 size_t padding_modes_len;
951 keymaster_padding_t* padding_modes;
952 EXPECT_EQ(KM_ERROR_OK,
953 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
954 &padding_modes, &padding_modes_len));
955
956 // Try them.
957 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
958 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
959 // Compute key & message size that will work.
960 size_t key_bits = 256;
961 size_t message_len = 1000;
962 switch (digest) {
963 case KM_DIGEST_NONE:
964 switch (padding_mode) {
965 case KM_PAD_NONE:
966 // Match key size.
967 message_len = key_bits / 8;
968 break;
969 case KM_PAD_RSA_PKCS1_1_5_SIGN:
970 message_len = key_bits / 8 - 11;
971 break;
972 case KM_PAD_RSA_PSS:
973 // PSS requires a digest.
974 continue;
975 default:
976 FAIL() << "Missing padding";
977 break;
978 }
979 break;
980
981 case KM_DIGEST_SHA_2_256:
982 switch (padding_mode) {
983 case KM_PAD_NONE:
984 // Key size matches digest size
985 break;
986 case KM_PAD_RSA_PKCS1_1_5_SIGN:
987 key_bits += 8 * 11;
988 break;
989 case KM_PAD_RSA_PSS:
990 key_bits += 8 * 10;
991 break;
992 default:
993 FAIL() << "Missing padding";
994 break;
995 }
996 break;
997 default:
998 FAIL() << "Missing digest";
999 }
1000
Shawn Willdenaf533992015-04-15 13:48:28 -06001001 GenerateKey(AuthorizationSetBuilder()
1002 .RsaSigningKey(key_bits, 3)
1003 .Digest(digest)
1004 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001005 string message(message_len, 'a');
1006 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001007 SignMessage(message, &signature, digest);
1008 VerifyMessage(message, signature, digest);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001009 }
1010 }
1011
1012 free(padding_modes);
1013 free(digests);
1014}
1015
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001016TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001017 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001018 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001019 string message = "123456789012345678901234567890123456789012345678";
1020 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001021 SignMessage(message, &signature, KM_DIGEST_NONE);
1022 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001023}
1024
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001025TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001026 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001027 string message = "123456789012345678901234567890123456789012345678";
1028 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001029 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1030 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001031}
1032
1033TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001034 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001035 string message = "123456789012345678901234567890123456789012345678";
1036 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001037 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1038 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001039}
1040
Shawn Willden0d560bf2014-12-15 17:44:02 -07001041TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001042 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001043 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001044 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001045 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1046 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001047}
1048
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001049TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001050 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001051 string message = "123456789012345678901234567890123456789012345678";
1052 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001053 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1054 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001055}
1056
1057TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001058 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001059 string message = "123456789012345678901234567890123456789012345678";
1060 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001061 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1062 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001063}
1064
Shawn Willden5b53c992015-02-02 08:05:25 -07001065typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001066TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001067 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1068 .RsaSigningKey(256, 3)
1069 .Digest(KM_DIGEST_NONE)
1070 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001071 string export_data;
1072 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001073 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001074
1075 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001076}
1077
Shawn Willdenf268d742014-08-19 15:36:26 -06001078TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001079 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001080 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001081 string export_data;
1082 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001083 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001084
1085 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001086}
1087
1088TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001089 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1090 .RsaSigningKey(256, 3)
1091 .Digest(KM_DIGEST_NONE)
1092 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001093 string export_data;
1094 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001095}
1096
1097TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001098 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1099 .RsaSigningKey(256, 3)
1100 .Digest(KM_DIGEST_NONE)
1101 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001102 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001103 string export_data;
1104 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001105}
1106
Shawn Willden7dad93b2015-02-05 10:20:47 -07001107TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001108 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001109 string export_data;
1110
1111 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1112 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1113 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1114}
1115
Shawn Willden437fbd12014-08-20 11:59:49 -06001116static string read_file(const string& file_name) {
1117 ifstream file_stream(file_name, std::ios::binary);
1118 istreambuf_iterator<char> file_begin(file_stream);
1119 istreambuf_iterator<char> file_end;
1120 return string(file_begin, file_end);
1121}
1122
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001123typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001124TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001125 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001126 ASSERT_EQ(633U, pk8_key.size());
1127
Shawn Willdenaf533992015-04-15 13:48:28 -06001128 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1129 .RsaSigningKey(1024, 65537)
1130 .Digest(KM_DIGEST_NONE)
1131 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001132 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001133
1134 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001135 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1136 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1137 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001138
1139 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001140 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1141 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001142
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001143 string message(1024 / 8, 'a');
1144 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001145 SignMessage(message, &signature, KM_DIGEST_NONE);
1146 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden437fbd12014-08-20 11:59:49 -06001147}
1148
Shawn Willdend7a5c712015-04-09 16:33:52 -06001149TEST_F(ImportKeyTest, OldApiRsaSuccess) {
1150 string pk8_key = read_file("rsa_privkey_pk8.der");
1151 ASSERT_EQ(633U, pk8_key.size());
1152
1153 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1154 // point softkeymaster will no longer support keymaster0 APIs anyway.
1155 uint8_t* key_blob;
1156 size_t key_blob_length;
1157 ASSERT_EQ(0,
1158 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1159 pk8_key.size(), &key_blob, &key_blob_length));
1160 set_key_blob(key_blob, key_blob_length);
1161
1162 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001163 AuthorizationSet begin_params; // Don't use client data.
1164 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
1165 AuthorizationSet update_params;
1166 AuthorizationSet output_params;
1167 string signature =
1168 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1169 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1170 &output_params);
Shawn Willdend7a5c712015-04-09 16:33:52 -06001171}
1172
Shawn Willden6bbe6782014-09-18 11:26:15 -06001173TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001174 string pk8_key = read_file("rsa_privkey_pk8.der");
1175 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001176 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001177 ImportKey(AuthorizationSetBuilder()
1178 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1179 .Digest(KM_DIGEST_NONE)
1180 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001181 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001182}
1183
1184TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001185 string pk8_key = read_file("rsa_privkey_pk8.der");
1186 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001187 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001188 ImportKey(AuthorizationSetBuilder()
1189 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1190 .Digest(KM_DIGEST_NONE)
1191 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001192 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001193}
1194
Shawn Willden81effc62014-08-27 10:08:46 -06001195TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001196 string pk8_key = read_file("ec_privkey_pk8.der");
1197 ASSERT_EQ(138U, pk8_key.size());
1198
Shawn Willdenaf533992015-04-15 13:48:28 -06001199 ASSERT_EQ(KM_ERROR_OK,
1200 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1201 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001202
1203 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001204 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001205 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001206
1207 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001208 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1209 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001210
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001211 string message(1024 / 8, 'a');
1212 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001213 SignMessage(message, &signature, KM_DIGEST_NONE);
1214 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden81effc62014-08-27 10:08:46 -06001215}
1216
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001217TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1218 string pk8_key = read_file("ec_privkey_pk8.der");
1219 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001220
Shawn Willdenaf533992015-04-15 13:48:28 -06001221 ASSERT_EQ(KM_ERROR_OK,
1222 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1223 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001224
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001225 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001226 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001227 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1228
1229 // And values provided by GoogleKeymaster
1230 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1231 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1232
1233 string message(1024 / 8, 'a');
1234 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001235 SignMessage(message, &signature, KM_DIGEST_NONE);
1236 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001237}
1238
1239TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1240 string pk8_key = read_file("ec_privkey_pk8.der");
1241 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001242 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001243 ImportKey(AuthorizationSetBuilder()
1244 .EcdsaSigningKey(224 /* Doesn't match key */)
1245 .Digest(KM_DIGEST_NONE),
1246 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001247}
1248
Shawn Willden3b702e22015-02-05 10:26:47 -07001249TEST_F(ImportKeyTest, AesKeySuccess) {
1250 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1251 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001252 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001253 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1254 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001255 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001256
1257 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1258 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1259
1260 string message = "Hello World!";
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001261 string ciphertext = EncryptMessage(message);
1262 string plaintext = DecryptMessage(ciphertext);
Shawn Willden3b702e22015-02-05 10:26:47 -07001263 EXPECT_EQ(message, plaintext);
1264}
1265
1266TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1267 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1268 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001269 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1270 .HmacKey(sizeof(key_data) * 8)
1271 .Digest(KM_DIGEST_SHA_2_256)
1272 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001273 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001274
1275 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1276 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1277
1278 string message = "Hello World!";
1279 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001280 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1281 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden3b702e22015-02-05 10:26:47 -07001282}
1283
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001284typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001285TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001286 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1287 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001288
1289 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001290 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001291 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001292
Shawn Willden6dde87c2014-12-11 14:08:48 -07001293 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001294 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001295
1296 // OAEP randomizes padding so every result should be different.
1297 EXPECT_NE(ciphertext1, ciphertext2);
1298}
1299
1300TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001301 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1302 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001303 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001304 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001305 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001306
Shawn Willden6dde87c2014-12-11 14:08:48 -07001307 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001308 EXPECT_EQ(message, plaintext);
1309}
1310
1311TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001312 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1313 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001314 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001315 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001316 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001317
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001318 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1319 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001320 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001321 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001322}
1323
1324TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001325 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1326 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001327 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001328 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001329 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001330
1331 // Corrupt the ciphertext
1332 ciphertext[512 / 8 / 2]++;
1333
Shawn Willden4200f212014-12-02 07:01:21 -07001334 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001335 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001336 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1337 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001338 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001339 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001340}
1341
1342TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001343 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1344 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001345 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001346 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001347 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001348
Shawn Willden6dde87c2014-12-11 14:08:48 -07001349 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001350 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001351
1352 // PKCS1 v1.5 randomizes padding so every result should be different.
1353 EXPECT_NE(ciphertext1, ciphertext2);
1354}
1355
1356TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
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 Willden6dde87c2014-12-11 14:08:48 -07001360 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001361 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001362
Shawn Willden6dde87c2014-12-11 14:08:48 -07001363 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001364 EXPECT_EQ(message, plaintext);
1365}
1366
1367TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001368 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1369 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001370 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001371 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001372 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001373
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001374 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1375 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001376 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001377 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001378}
1379
1380TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001381 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1382 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001383 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001384 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001385 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001386
1387 // Corrupt the ciphertext
1388 ciphertext[512 / 8 / 2]++;
1389
Shawn Willden4200f212014-12-02 07:01:21 -07001390 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001391 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001392 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1393 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001394 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001395 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001396}
1397
Shawn Willdenedb79942015-05-08 06:46:44 -06001398TEST_F(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
1399 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1400 .RsaSigningKey(256, 3)
1401 .Digest(KM_DIGEST_NONE)
1402 .Padding(KM_PAD_NONE)));
1403 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1404 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1405}
1406
1407TEST_F(EncryptionOperationsTest, EcdsaEncrypt) {
1408 ASSERT_EQ(KM_ERROR_OK,
1409 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1410 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1411 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1412}
1413
1414TEST_F(EncryptionOperationsTest, HmacEncrypt) {
1415 ASSERT_EQ(
1416 KM_ERROR_OK,
1417 GenerateKey(
1418 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1419 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1420 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1421}
1422
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001423TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001424 ASSERT_EQ(KM_ERROR_OK,
1425 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1426 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001427 // Two-block message.
1428 string message = "12345678901234567890123456789012";
1429 string ciphertext1 = EncryptMessage(message);
1430 EXPECT_EQ(message.size(), ciphertext1.size());
1431
1432 string ciphertext2 = EncryptMessage(string(message));
1433 EXPECT_EQ(message.size(), ciphertext2.size());
1434
1435 // ECB is deterministic.
1436 EXPECT_EQ(ciphertext1, ciphertext2);
1437
1438 string plaintext = DecryptMessage(ciphertext1);
1439 EXPECT_EQ(message, plaintext);
1440}
1441
1442TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07001443 ASSERT_EQ(KM_ERROR_OK,
1444 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1445 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001446 // Message is slightly shorter than two blocks.
1447 string message = "1234567890123456789012345678901";
1448
1449 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1450 string ciphertext;
1451 size_t input_consumed;
1452 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1453 EXPECT_EQ(message.size(), input_consumed);
1454 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1455}
1456
1457TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001458 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001459 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001460 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1461 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001462
1463 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001464 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001465 string message(i, 'a');
1466 string ciphertext = EncryptMessage(message);
1467 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1468 string plaintext = DecryptMessage(ciphertext);
1469 EXPECT_EQ(message, plaintext);
1470 }
1471}
1472
1473TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001474 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001475 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001476 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1477 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001478
1479 string message = "a";
1480 string ciphertext = EncryptMessage(message);
Shawn Willdenc6096592015-03-17 15:53:14 -06001481 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001482 EXPECT_NE(ciphertext, message);
1483 ++ciphertext[ciphertext.size() / 2];
1484
1485 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1486 string plaintext;
1487 size_t input_consumed;
1488 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1489 EXPECT_EQ(ciphertext.size(), input_consumed);
1490 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1491}
1492
Thai Duong20d725d2015-03-24 17:49:58 -07001493TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
1494 ASSERT_EQ(KM_ERROR_OK,
1495 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1496 TAG_BLOCK_MODE, KM_MODE_CTR)));
1497 string message = "123";
1498 string iv1;
1499 string ciphertext1 = EncryptMessage(message, &iv1);
1500 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001501 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001502
1503 string iv2;
1504 string ciphertext2 = EncryptMessage(message, &iv2);
1505 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001506 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001507
1508 // IVs should be random, so ciphertexts should differ.
1509 EXPECT_NE(iv1, iv2);
1510 EXPECT_NE(ciphertext1, ciphertext2);
1511
1512 string plaintext = DecryptMessage(ciphertext1, iv1);
1513 EXPECT_EQ(message, plaintext);
1514}
1515
1516TEST_F(EncryptionOperationsTest, AesCtrIncremental) {
1517 ASSERT_EQ(KM_ERROR_OK,
1518 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1519 TAG_BLOCK_MODE, KM_MODE_CTR)));
1520
1521 int increment = 15;
1522 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001523 AuthorizationSet input_params(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001524 AuthorizationSet output_params;
1525 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1526
1527 string ciphertext;
1528 size_t input_consumed;
1529 for (size_t i = 0; i < message.size(); i += increment)
1530 EXPECT_EQ(KM_ERROR_OK,
1531 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1532 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1533 EXPECT_EQ(message.size(), ciphertext.size());
1534
1535 // Move TAG_NONCE into input_params
1536 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001537 input_params.push_back(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001538 output_params.Clear();
1539
1540 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1541 string plaintext;
1542 for (size_t i = 0; i < ciphertext.size(); i += increment)
1543 EXPECT_EQ(KM_ERROR_OK,
1544 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1545 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1546 EXPECT_EQ(ciphertext.size(), plaintext.size());
1547 EXPECT_EQ(message, plaintext);
1548}
1549
1550struct AesCtrSp80038aTestVector {
1551 const char* key;
1552 const char* nonce;
1553 const char* plaintext;
1554 const char* ciphertext;
1555};
1556
1557// These test vectors are taken from
1558// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1559static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1560 // AES-128
1561 {
1562 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1563 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1564 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1565 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1566 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1567 },
1568 // AES-192
1569 {
1570 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1571 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1572 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1573 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1574 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1575 },
1576 // AES-256
1577 {
1578 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1579 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1580 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1581 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1582 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1583 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1584 },
1585};
1586
1587TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
1588 for (size_t i = 0; i < 3; i++) {
1589 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1590 const string key = hex2str(test.key);
1591 const string nonce = hex2str(test.nonce);
1592 const string plaintext = hex2str(test.plaintext);
1593 const string ciphertext = hex2str(test.ciphertext);
1594 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1595 }
1596}
1597
1598TEST_F(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
1599 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1600 .AesEncryptionKey(128)
1601 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1602 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
1603
1604 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
1605}
1606
1607TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
1608 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1609 .AesEncryptionKey(128)
1610 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1611 .Authorization(TAG_CALLER_NONCE)));
1612
Shawn Willden09f25272015-04-15 13:49:49 -06001613 AuthorizationSet input_params(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001614 input_params.push_back(TAG_NONCE, "123", 3);
1615 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1616}
1617
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001618TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001619 ASSERT_EQ(KM_ERROR_OK,
1620 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1621 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001622 // Two-block message.
1623 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001624 string iv1;
1625 string ciphertext1 = EncryptMessage(message, &iv1);
1626 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001627
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001628 string iv2;
1629 string ciphertext2 = EncryptMessage(message, &iv2);
1630 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001631
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001632 // IVs should be random, so ciphertexts should differ.
1633 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001634 EXPECT_NE(ciphertext1, ciphertext2);
1635
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001636 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001637 EXPECT_EQ(message, plaintext);
1638}
1639
Shawn Willden969aa382015-04-15 17:05:53 -07001640TEST_F(EncryptionOperationsTest, AesCallerNonce) {
1641 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1642 .AesEncryptionKey(128)
1643 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1644 .Authorization(TAG_CALLER_NONCE)));
1645 string message = "12345678901234567890123456789012";
1646 string iv1;
1647 // Don't specify nonce, should get a random one.
1648 string ciphertext1 = EncryptMessage(message, &iv1);
1649 EXPECT_EQ(message.size(), ciphertext1.size());
1650 EXPECT_EQ(16U, iv1.size());
1651
1652 string plaintext = DecryptMessage(ciphertext1, iv1);
1653 EXPECT_EQ(message, plaintext);
1654
1655 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06001656 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001657 AuthorizationSet update_params;
1658 AuthorizationSet output_params;
1659 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
1660 string ciphertext2 =
1661 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
1662
1663 // Decrypt with correct nonce.
1664 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1665 &output_params);
1666 EXPECT_EQ(message, plaintext);
1667
1668 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06001669 input_params.Reinitialize(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001670 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
1671 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1672 &output_params);
1673 EXPECT_NE(message, plaintext);
1674}
1675
Shawn Willden67706352015-04-28 00:43:19 -06001676TEST_F(EncryptionOperationsTest, AesCallerNonceProhibited) {
1677 ASSERT_EQ(KM_ERROR_OK,
1678 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1679 TAG_BLOCK_MODE, KM_MODE_CBC)));
1680
1681 string message = "12345678901234567890123456789012";
1682 string iv1;
1683 // Don't specify nonce, should get a random one.
1684 string ciphertext1 = EncryptMessage(message, &iv1);
1685 EXPECT_EQ(message.size(), ciphertext1.size());
1686 EXPECT_EQ(16U, iv1.size());
1687
1688 string plaintext = DecryptMessage(ciphertext1, iv1);
1689 EXPECT_EQ(message, plaintext);
1690
1691 // Now specify a nonce, should fail.
1692 AuthorizationSet input_params(client_params());
1693 AuthorizationSet update_params;
1694 AuthorizationSet output_params;
1695 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
1696
1697 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
1698 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1699}
1700
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001701TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001702 ASSERT_EQ(KM_ERROR_OK,
1703 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1704 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001705
1706 int increment = 15;
1707 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001708 AuthorizationSet input_params(client_params());
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001709 AuthorizationSet output_params;
1710 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1711
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001712 string ciphertext;
1713 size_t input_consumed;
1714 for (size_t i = 0; i < message.size(); i += increment)
1715 EXPECT_EQ(KM_ERROR_OK,
1716 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1717 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001718 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001719
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001720 // Move TAG_NONCE into input_params
1721 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001722 input_params.push_back(client_params());
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001723 output_params.Clear();
1724
1725 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001726 string plaintext;
1727 for (size_t i = 0; i < ciphertext.size(); i += increment)
1728 EXPECT_EQ(KM_ERROR_OK,
1729 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1730 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001731 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001732 EXPECT_EQ(message, plaintext);
1733}
1734
1735TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001736 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001737 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001738 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1739 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001740
1741 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001742 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001743 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001744 string iv;
1745 string ciphertext = EncryptMessage(message, &iv);
1746 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1747 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001748 EXPECT_EQ(message, plaintext);
1749 }
1750}
1751
Shawn Willdencd695822015-01-26 14:06:32 -07001752typedef KeymasterTest AddEntropyTest;
1753TEST_F(AddEntropyTest, AddEntropy) {
1754 // There's no obvious way to test that entropy is actually added, but we can test that the API
1755 // doesn't blow up or return an error.
1756 EXPECT_EQ(KM_ERROR_OK,
1757 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1758}
1759
Shawn Willden5fad7852015-01-26 16:10:56 -07001760typedef KeymasterTest RescopingTest;
1761TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001762 ASSERT_EQ(KM_ERROR_OK,
1763 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1764 TAG_RESCOPING_ADD, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001765 // TODO(swillden): Add a better error code for this.
Shawn Willdenf01329d2015-03-11 21:51:38 -06001766 EXPECT_EQ(KM_ERROR_RESCOPABLE_KEY_NOT_USABLE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001767}
1768
1769TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07001770 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07001771 .AesEncryptionKey(128)
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001772 .EcbMode()
1773 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1774 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
1775 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1776 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001777
1778 keymaster_key_blob_t rescoped_blob;
1779 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001780 AuthorizationSet new_params =
1781 AuthorizationSetBuilder().AesKey(128).Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN).build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001782
1783 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1784 ASSERT_TRUE(rescoped_characteristics != NULL);
1785
Shawn Willdenc6096592015-03-17 15:53:14 -06001786 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001787 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1788 keymaster_free_characteristics(rescoped_characteristics);
1789 free(rescoped_characteristics);
1790 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1791
1792 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001793 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1794 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001795}
1796
1797TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07001798 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001799 .RsaEncryptionKey(256, 3)
1800 .Padding(KM_PAD_RSA_OAEP)
Shawn Willden2c242002015-02-27 07:01:02 -07001801 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1802 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001803 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1804 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1805 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1806 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
1807
1808 keymaster_key_blob_t rescoped_blob;
1809 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001810 AuthorizationSet new_params = AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001811 .RsaSigningKey(256, 3)
1812 .Digest(KM_DIGEST_SHA_2_256)
1813 .Padding(KM_PAD_RSA_PSS)
Shawn Willden2c242002015-02-27 07:01:02 -07001814 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001815
1816 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1817 ASSERT_TRUE(rescoped_characteristics != NULL);
1818
Shawn Willdenc6096592015-03-17 15:53:14 -06001819 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001820 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1821 keymaster_free_characteristics(rescoped_characteristics);
1822 free(rescoped_characteristics);
1823 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1824
1825 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1826 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1827 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1828 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
1829}
1830
1831// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
1832// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
1833// may not be changed.
1834
Shawn Willden128ffe02014-08-06 12:31:33 -06001835} // namespace test
1836} // namespace keymaster