blob: 5c2ad8291b4a6f793e74493d2744a6427741f6ea [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 Willden3ad5f052015-05-08 14:05:13 -0600321 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600322}
323
Shawn Willden61902362014-12-18 10:33:24 -0700324TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600325 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600326 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600327 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600328 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700329 string message(1024, 'a');
330 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600331 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700332}
333
334TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600335 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
336 .RsaSigningKey(512, 3)
337 .Digest(KM_DIGEST_SHA_2_256)
338 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700339 // Use large message, which won't work without digesting.
340 string message(1024, 'a');
341 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600342 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700343}
344
Shawn Willdenf90f2352014-12-18 23:01:15 -0700345TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600346 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
347 .RsaSigningKey(512, 3)
348 .Digest(KM_DIGEST_SHA_2_256)
349 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700350 string message(1024, 'a');
351 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600352 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700353}
354
355TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
356 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
357 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600358 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
359 .RsaSigningKey(256 + 9 * 8, 3)
360 .Digest(KM_DIGEST_SHA_2_256)
361 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700362 string message(1024, 'a');
363 string signature;
364
Shawn Willden226746b2015-05-08 11:36:56 -0600365 AuthorizationSet begin_params(client_params());
366 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600367 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600368 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);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600384 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600385 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700386 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
387 // Another abort should fail
388 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600389}
390
391TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600392 GenerateKey(AuthorizationSetBuilder()
393 .RsaSigningKey(256, 3)
394 .Digest(KM_DIGEST_MD5)
395 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700396 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600397}
398
399TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600400 GenerateKey(AuthorizationSetBuilder()
401 .RsaSigningKey(256, 3)
402 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
403 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600404 AuthorizationSet begin_params(client_params());
405 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
406 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600407}
408
409TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700410 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700411 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700412 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700413 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600414 GenerateKey(AuthorizationSetBuilder()
415 .RsaSigningKey(256, 3)
416 .Digest(KM_DIGEST_NONE)
417 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600418 AuthorizationSet begin_params(client_params());
419 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600420 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600421 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600422}
423
424TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700425 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600426 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
427 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600428 AuthorizationSet begin_params(client_params());
429 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
430 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600431}
432
Shawn Willdenedb79942015-05-08 06:46:44 -0600433TEST_F(SigningOperationsTest, RsaTooShortMessage) {
434 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
435 .RsaSigningKey(256, 3)
436 .Digest(KM_DIGEST_NONE)
437 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600438 AuthorizationSet begin_params(client_params());
439 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600440 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600441 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600442
443 string message = "1234567890123456789012345678901";
444 string result;
445 size_t input_consumed;
446 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
447 EXPECT_EQ(0U, result.size());
448 EXPECT_EQ(31U, input_consumed);
449
450 string signature;
451 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
452 EXPECT_EQ(0U, signature.length());
453}
454
455TEST_F(SigningOperationsTest, RsaSignWithEncryptionKey) {
456 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
457 .RsaEncryptionKey(256, 3)
458 .Digest(KM_DIGEST_NONE)
459 .Padding(KM_PAD_NONE)));
460 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
461 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
462}
463
464TEST_F(SigningOperationsTest, EcdsaSuccess) {
465 ASSERT_EQ(KM_ERROR_OK,
466 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
467 string message = "123456789012345678901234567890123456789012345678";
468 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600469 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willdenedb79942015-05-08 06:46:44 -0600470}
471
472TEST_F(SigningOperationsTest, AesEcbSign) {
473 ASSERT_EQ(KM_ERROR_OK,
474 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
475 TAG_BLOCK_MODE, KM_MODE_ECB)));
476 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
477 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
478}
479
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700480TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600481 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700482 string message = "12345678901234567890123456789012";
483 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600484 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600485 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700486}
487
Shawn Willden62c22862014-12-17 08:36:20 -0700488TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600489 ASSERT_EQ(KM_ERROR_OK,
490 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700491 string message = "12345678901234567890123456789012";
492 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600493 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600494 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700495}
496
Shawn Willden0d560bf2014-12-15 17:44:02 -0700497TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600498 ASSERT_EQ(KM_ERROR_OK,
499 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700500 string message = "12345678901234567890123456789012";
501 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600502 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600503 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700504}
505
Shawn Willden62c22862014-12-17 08:36:20 -0700506TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600507 ASSERT_EQ(KM_ERROR_OK,
508 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
509
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700510 string message = "12345678901234567890123456789012";
511 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600512 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600513 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700514}
515
516TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600517 ASSERT_EQ(KM_ERROR_OK,
518 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700519 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700520 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600521 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600522 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700523}
524
Shawn Willden09f25272015-04-15 13:49:49 -0600525TEST_F(SigningOperationsTest, HmacLengthInKey) {
526 // TODO(swillden): unified API should generate an error on key generation.
527 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
528 .HmacKey(128)
529 .Digest(KM_DIGEST_SHA_2_256)
530 .Authorization(TAG_MAC_LENGTH, 20)));
531 string message = "12345678901234567890123456789012";
532 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600533 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600534 // Size in key was ignored.
535 ASSERT_EQ(30U, signature.size());
536}
537
Shawn Willden3b702e22015-02-05 10:26:47 -0700538TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
539 uint8_t key_data[] = {
540 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
541 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
542 };
543 string message = "Hi There";
544 uint8_t sha_224_expected[] = {
545 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
546 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
547 };
548 uint8_t sha_256_expected[] = {
549 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
550 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
551 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
552 };
553 uint8_t sha_384_expected[] = {
554 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
555 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
556 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
557 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
558 };
559 uint8_t sha_512_expected[] = {
560 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
561 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
562 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
563 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
564 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
565 };
566
567 string key = make_string(key_data);
568
569 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
570 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
571 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
572 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
573}
574
575TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
576 string key = "Jefe";
577 string message = "what do ya want for nothing?";
578 uint8_t sha_224_expected[] = {
579 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
580 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
581 };
582 uint8_t sha_256_expected[] = {
583 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
584 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
585 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
586 };
587 uint8_t sha_384_expected[] = {
588 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
589 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
590 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
591 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
592 };
593 uint8_t sha_512_expected[] = {
594 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
595 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
596 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
597 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
598 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
599 };
600
601 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
602 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
603 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
604 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
605}
606
607TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
608 string key(20, 0xaa);
609 string message(50, 0xdd);
610 uint8_t sha_224_expected[] = {
611 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
612 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
613 };
614 uint8_t sha_256_expected[] = {
615 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
616 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
617 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
618 };
619 uint8_t sha_384_expected[] = {
620 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
621 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
622 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
623 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
624 };
625 uint8_t sha_512_expected[] = {
626 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
627 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
628 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
629 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
630 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
631 };
632
633 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
634 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
635 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
636 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
637}
638
639TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
640 uint8_t key_data[25] = {
641 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
642 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
643 };
644 string key = make_string(key_data);
645 string message(50, 0xcd);
646 uint8_t sha_224_expected[] = {
647 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
648 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
649 };
650 uint8_t sha_256_expected[] = {
651 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
652 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
653 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
654 };
655 uint8_t sha_384_expected[] = {
656 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
657 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
658 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
659 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
660 };
661 uint8_t sha_512_expected[] = {
662 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
663 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
664 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
665 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
666 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
667 };
668
669 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
670 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
671 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
672 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
673}
674
675TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
676 string key(20, 0x0c);
677 string message = "Test With Truncation";
678
679 uint8_t sha_224_expected[] = {
680 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
681 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
682 };
683 uint8_t sha_256_expected[] = {
684 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
685 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
686 };
687 uint8_t sha_384_expected[] = {
688 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
689 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
690 };
691 uint8_t sha_512_expected[] = {
692 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
693 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
694 };
695
696 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
697 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
698 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
699 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
700}
701
702TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
703 string key(131, 0xaa);
704 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
705
706 uint8_t sha_224_expected[] = {
707 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
708 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
709 };
710 uint8_t sha_256_expected[] = {
711 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
712 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
713 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
714 };
715 uint8_t sha_384_expected[] = {
716 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
717 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
718 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
719 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
720 };
721 uint8_t sha_512_expected[] = {
722 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
723 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
724 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
725 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
726 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
727 };
728
729 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
730 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
731 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
732 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
733}
734
735TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
736 string key(131, 0xaa);
737 string message = "This is a test using a larger than block-size key and a larger than "
738 "block-size data. The key needs to be hashed before being used by the HMAC "
739 "algorithm.";
740
741 uint8_t sha_224_expected[] = {
742 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
743 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
744 };
745 uint8_t sha_256_expected[] = {
746 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
747 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
748 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
749 };
750 uint8_t sha_384_expected[] = {
751 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
752 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
753 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
754 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
755 };
756 uint8_t sha_512_expected[] = {
757 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
758 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
759 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
760 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
761 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
762 };
763
764 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
765 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
766 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
767 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
768}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700769
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700770TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600771 ASSERT_EQ(KM_ERROR_OK,
772 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
773 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600774 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600775 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600776 ASSERT_EQ(KM_ERROR_OK,
777 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
778 string message = "1234567890123456789012345678901";
779 string result;
780 size_t input_consumed;
781 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
782 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700783}
784
Shawn Willden61902362014-12-18 10:33:24 -0700785// TODO(swillden): Add more verification failure tests.
786
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700787typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600788TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600789 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
790 .RsaSigningKey(256, 3)
791 .Digest(KM_DIGEST_NONE)
792 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700793 string message = "12345678901234567890123456789012";
794 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600795 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
796 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600797}
798
Shawn Willden61902362014-12-18 10:33:24 -0700799TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600800 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600801 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600802 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600803 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700804 string message(1024, 'a');
805 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600806 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
807 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700808}
809
Shawn Willdenf90f2352014-12-18 23:01:15 -0700810TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600811 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600812 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600813 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600814 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700815 string message(1024, 'a');
816 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600817 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700818 ++signature[signature.size() / 2];
819
Shawn Willden226746b2015-05-08 11:36:56 -0600820 AuthorizationSet begin_params(client_params());
821 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600822 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600823 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -0700824
825 string result;
826 size_t input_consumed;
827 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
828 EXPECT_EQ(message.size(), input_consumed);
829 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
830}
831
Shawn Willdenf90f2352014-12-18 23:01:15 -0700832TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600833 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
834 .RsaSigningKey(512, 3)
835 .Digest(KM_DIGEST_SHA_2_256)
836 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700837 // Use large message, which won't work without digesting.
838 string message(1024, 'a');
839 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600840 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
841 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700842}
843
844TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600845 GenerateKey(AuthorizationSetBuilder()
846 .RsaSigningKey(512, 3)
847 .Digest(KM_DIGEST_SHA_2_256)
848 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700849 string message(1024, 'a');
850 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600851 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700852 ++signature[signature.size() / 2];
853
Shawn Willden226746b2015-05-08 11:36:56 -0600854 AuthorizationSet begin_params(client_params());
855 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600856 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600857 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700858
859 string result;
860 size_t input_consumed;
861 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
862 EXPECT_EQ(message.size(), input_consumed);
863 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
864}
865
866TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600867 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
868 .RsaSigningKey(512, 3)
869 .Digest(KM_DIGEST_SHA_2_256)
870 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700871 // Use large message, which won't work without digesting.
872 string message(1024, 'a');
873 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600874 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700875 ++message[message.size() / 2];
876
Shawn Willden226746b2015-05-08 11:36:56 -0600877 AuthorizationSet begin_params(client_params());
878 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600879 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600880 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -0700881
882 string result;
883 size_t input_consumed;
884 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
885 EXPECT_EQ(message.size(), input_consumed);
886 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
887}
888
Shawn Willdenf90f2352014-12-18 23:01:15 -0700889TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600890 GenerateKey(AuthorizationSetBuilder()
891 .RsaSigningKey(512, 3)
892 .Digest(KM_DIGEST_SHA_2_256)
893 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700894 string message(1024, 'a');
895 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600896 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
897 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700898}
899
900TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600901 GenerateKey(AuthorizationSetBuilder()
902 .RsaSigningKey(512, 3)
903 .Digest(KM_DIGEST_SHA_2_256)
904 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700905 string message(1024, 'a');
906 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600907 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700908 ++signature[signature.size() / 2];
909
Shawn Willden226746b2015-05-08 11:36:56 -0600910 AuthorizationSet begin_params(client_params());
911 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600912 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -0600913 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700914
915 string result;
916 size_t input_consumed;
917 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
918 EXPECT_EQ(message.size(), input_consumed);
919 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
920}
921
922TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600923 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
924 .RsaSigningKey(512, 3)
925 .Digest(KM_DIGEST_SHA_2_256)
926 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700927 // Use large message, which won't work without digesting.
928 string message(1024, 'a');
929 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600930 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700931 ++message[message.size() / 2];
932
Shawn Willden226746b2015-05-08 11:36:56 -0600933 AuthorizationSet begin_params(client_params());
934 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600935 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -0600936 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700937
938 string result;
939 size_t input_consumed;
940 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
941 EXPECT_EQ(message.size(), input_consumed);
942 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
943}
944
945template <typename T> vector<T> make_vector(const T* array, size_t len) {
946 return vector<T>(array, array + len);
947}
948
949TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
950 // Get all supported digests and padding modes.
951 size_t digests_len;
952 keymaster_digest_t* digests;
953 EXPECT_EQ(KM_ERROR_OK,
954 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
955 &digests_len));
956
957 size_t padding_modes_len;
958 keymaster_padding_t* padding_modes;
959 EXPECT_EQ(KM_ERROR_OK,
960 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
961 &padding_modes, &padding_modes_len));
962
963 // Try them.
964 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
965 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
966 // Compute key & message size that will work.
967 size_t key_bits = 256;
968 size_t message_len = 1000;
969 switch (digest) {
970 case KM_DIGEST_NONE:
971 switch (padding_mode) {
972 case KM_PAD_NONE:
973 // Match key size.
974 message_len = key_bits / 8;
975 break;
976 case KM_PAD_RSA_PKCS1_1_5_SIGN:
977 message_len = key_bits / 8 - 11;
978 break;
979 case KM_PAD_RSA_PSS:
980 // PSS requires a digest.
981 continue;
982 default:
983 FAIL() << "Missing padding";
984 break;
985 }
986 break;
987
988 case KM_DIGEST_SHA_2_256:
989 switch (padding_mode) {
990 case KM_PAD_NONE:
Shawn Willden3ad5f052015-05-08 14:05:13 -0600991 // Digesting requires padding
992 continue;
Shawn Willdenf90f2352014-12-18 23:01:15 -0700993 case KM_PAD_RSA_PKCS1_1_5_SIGN:
994 key_bits += 8 * 11;
995 break;
996 case KM_PAD_RSA_PSS:
997 key_bits += 8 * 10;
998 break;
999 default:
1000 FAIL() << "Missing padding";
1001 break;
1002 }
1003 break;
1004 default:
1005 FAIL() << "Missing digest";
1006 }
1007
Shawn Willdenaf533992015-04-15 13:48:28 -06001008 GenerateKey(AuthorizationSetBuilder()
1009 .RsaSigningKey(key_bits, 3)
1010 .Digest(digest)
1011 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001012 string message(message_len, 'a');
1013 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001014 SignMessage(message, &signature, digest, padding_mode);
1015 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001016 }
1017 }
1018
1019 free(padding_modes);
1020 free(digests);
1021}
1022
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001023TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001024 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001025 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001026 string message = "123456789012345678901234567890123456789012345678";
1027 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001028 SignMessage(message, &signature, KM_DIGEST_NONE);
1029 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001030}
1031
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001032TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001033 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001034 string message = "123456789012345678901234567890123456789012345678";
1035 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001036 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1037 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001038}
1039
1040TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001041 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001042 string message = "123456789012345678901234567890123456789012345678";
1043 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001044 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1045 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001046}
1047
Shawn Willden0d560bf2014-12-15 17:44:02 -07001048TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001049 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001050 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001051 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001052 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1053 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001054}
1055
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001056TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001057 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001058 string message = "123456789012345678901234567890123456789012345678";
1059 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001060 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1061 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001062}
1063
1064TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001065 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001066 string message = "123456789012345678901234567890123456789012345678";
1067 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001068 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1069 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001070}
1071
Shawn Willden5b53c992015-02-02 08:05:25 -07001072typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001073TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001074 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1075 .RsaSigningKey(256, 3)
1076 .Digest(KM_DIGEST_NONE)
1077 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001078 string export_data;
1079 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001080 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001081
1082 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001083}
1084
Shawn Willdenf268d742014-08-19 15:36:26 -06001085TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001086 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001087 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001088 string export_data;
1089 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001090 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001091
1092 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001093}
1094
1095TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001096 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1097 .RsaSigningKey(256, 3)
1098 .Digest(KM_DIGEST_NONE)
1099 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001100 string export_data;
1101 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001102}
1103
1104TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001105 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1106 .RsaSigningKey(256, 3)
1107 .Digest(KM_DIGEST_NONE)
1108 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001109 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001110 string export_data;
1111 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001112}
1113
Shawn Willden7dad93b2015-02-05 10:20:47 -07001114TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001115 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001116 string export_data;
1117
1118 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1119 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1120 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1121}
1122
Shawn Willden437fbd12014-08-20 11:59:49 -06001123static string read_file(const string& file_name) {
1124 ifstream file_stream(file_name, std::ios::binary);
1125 istreambuf_iterator<char> file_begin(file_stream);
1126 istreambuf_iterator<char> file_end;
1127 return string(file_begin, file_end);
1128}
1129
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001130typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001131TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001132 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001133 ASSERT_EQ(633U, pk8_key.size());
1134
Shawn Willdenaf533992015-04-15 13:48:28 -06001135 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1136 .RsaSigningKey(1024, 65537)
1137 .Digest(KM_DIGEST_NONE)
1138 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001139 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001140
1141 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001142 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1143 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1144 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001145
1146 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001147 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1148 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001149
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001150 string message(1024 / 8, 'a');
1151 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001152 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1153 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden437fbd12014-08-20 11:59:49 -06001154}
1155
Shawn Willdend7a5c712015-04-09 16:33:52 -06001156TEST_F(ImportKeyTest, OldApiRsaSuccess) {
1157 string pk8_key = read_file("rsa_privkey_pk8.der");
1158 ASSERT_EQ(633U, pk8_key.size());
1159
1160 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1161 // point softkeymaster will no longer support keymaster0 APIs anyway.
1162 uint8_t* key_blob;
1163 size_t key_blob_length;
1164 ASSERT_EQ(0,
1165 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1166 pk8_key.size(), &key_blob, &key_blob_length));
1167 set_key_blob(key_blob, key_blob_length);
1168
1169 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001170 AuthorizationSet begin_params; // Don't use client data.
1171 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001172 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001173 AuthorizationSet update_params;
1174 AuthorizationSet output_params;
1175 string signature =
1176 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1177 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1178 &output_params);
Shawn Willdend7a5c712015-04-09 16:33:52 -06001179}
1180
Shawn Willden6bbe6782014-09-18 11:26:15 -06001181TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001182 string pk8_key = read_file("rsa_privkey_pk8.der");
1183 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001184 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001185 ImportKey(AuthorizationSetBuilder()
1186 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1187 .Digest(KM_DIGEST_NONE)
1188 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001189 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001190}
1191
1192TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001193 string pk8_key = read_file("rsa_privkey_pk8.der");
1194 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001195 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001196 ImportKey(AuthorizationSetBuilder()
1197 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1198 .Digest(KM_DIGEST_NONE)
1199 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001200 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001201}
1202
Shawn Willden81effc62014-08-27 10:08:46 -06001203TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001204 string pk8_key = read_file("ec_privkey_pk8.der");
1205 ASSERT_EQ(138U, pk8_key.size());
1206
Shawn Willdenaf533992015-04-15 13:48:28 -06001207 ASSERT_EQ(KM_ERROR_OK,
1208 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1209 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001210
1211 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001212 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001213 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001214
1215 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001216 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1217 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001218
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001219 string message(1024 / 8, 'a');
1220 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001221 SignMessage(message, &signature, KM_DIGEST_NONE);
1222 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden81effc62014-08-27 10:08:46 -06001223}
1224
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001225TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1226 string pk8_key = read_file("ec_privkey_pk8.der");
1227 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001228
Shawn Willdenaf533992015-04-15 13:48:28 -06001229 ASSERT_EQ(KM_ERROR_OK,
1230 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1231 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001232
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001233 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001234 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001235 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1236
1237 // And values provided by GoogleKeymaster
1238 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1239 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1240
1241 string message(1024 / 8, 'a');
1242 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001243 SignMessage(message, &signature, KM_DIGEST_NONE);
1244 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001245}
1246
1247TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1248 string pk8_key = read_file("ec_privkey_pk8.der");
1249 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001250 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001251 ImportKey(AuthorizationSetBuilder()
1252 .EcdsaSigningKey(224 /* Doesn't match key */)
1253 .Digest(KM_DIGEST_NONE),
1254 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001255}
1256
Shawn Willden3b702e22015-02-05 10:26:47 -07001257TEST_F(ImportKeyTest, AesKeySuccess) {
1258 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1259 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001260 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001261 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1262 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001263 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001264
1265 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1266 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1267
1268 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001269 string ciphertext = EncryptMessage(message, KM_PAD_NONE);
1270 string plaintext = DecryptMessage(ciphertext, KM_PAD_NONE);
Shawn Willden3b702e22015-02-05 10:26:47 -07001271 EXPECT_EQ(message, plaintext);
1272}
1273
1274TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1275 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1276 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001277 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1278 .HmacKey(sizeof(key_data) * 8)
1279 .Digest(KM_DIGEST_SHA_2_256)
1280 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001281 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001282
1283 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1284 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1285
1286 string message = "Hello World!";
1287 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001288 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1289 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden3b702e22015-02-05 10:26:47 -07001290}
1291
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001292typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001293TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001294 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1295 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001296
1297 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001298 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001299 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001300
Shawn Willden3ad5f052015-05-08 14:05:13 -06001301 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001302 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001303
1304 // OAEP randomizes padding so every result should be different.
1305 EXPECT_NE(ciphertext1, ciphertext2);
1306}
1307
1308TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001309 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1310 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001311 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001312 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001313 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001314
Shawn Willden3ad5f052015-05-08 14:05:13 -06001315 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001316 EXPECT_EQ(message, plaintext);
1317}
1318
1319TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001320 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1321 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001322 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001323 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001324 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001325
Shawn Willden3ad5f052015-05-08 14:05:13 -06001326 AuthorizationSet begin_params(client_params());
1327 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1328 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001329 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001330 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001331 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001332}
1333
1334TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001335 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1336 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001337 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001338 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001339 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001340
1341 // Corrupt the ciphertext
1342 ciphertext[512 / 8 / 2]++;
1343
Shawn Willden4200f212014-12-02 07:01:21 -07001344 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001345 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001346 AuthorizationSet begin_params(client_params());
1347 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1348 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001349 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001350 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001351 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001352}
1353
1354TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001355 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1356 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001357 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001358 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001359 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001360
Shawn Willden3ad5f052015-05-08 14:05:13 -06001361 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001362 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001363
1364 // PKCS1 v1.5 randomizes padding so every result should be different.
1365 EXPECT_NE(ciphertext1, ciphertext2);
1366}
1367
1368TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001369 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1370 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001371 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001372 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001373 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001374
Shawn Willden3ad5f052015-05-08 14:05:13 -06001375 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001376 EXPECT_EQ(message, plaintext);
1377}
1378
1379TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001380 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1381 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001382 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001383 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001384 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001385
Shawn Willden3ad5f052015-05-08 14:05:13 -06001386 AuthorizationSet begin_params(client_params());
1387 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1388 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001389 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001390 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001391 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001392}
1393
1394TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001395 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1396 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001397 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001398 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001399 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001400
1401 // Corrupt the ciphertext
1402 ciphertext[512 / 8 / 2]++;
1403
Shawn Willden4200f212014-12-02 07:01:21 -07001404 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001405 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001406 AuthorizationSet begin_params(client_params());
1407 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1408 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001409 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001410 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001411 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001412}
1413
Shawn Willdenedb79942015-05-08 06:46:44 -06001414TEST_F(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
1415 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1416 .RsaSigningKey(256, 3)
1417 .Digest(KM_DIGEST_NONE)
1418 .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
1423TEST_F(EncryptionOperationsTest, EcdsaEncrypt) {
1424 ASSERT_EQ(KM_ERROR_OK,
1425 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1426 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1427 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1428}
1429
1430TEST_F(EncryptionOperationsTest, HmacEncrypt) {
1431 ASSERT_EQ(
1432 KM_ERROR_OK,
1433 GenerateKey(
1434 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1435 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1436 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1437}
1438
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001439TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001440 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1441 .AesEncryptionKey(128)
1442 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1443 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001444 // Two-block message.
1445 string message = "12345678901234567890123456789012";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001446 string ciphertext1 = EncryptMessage(message, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001447 EXPECT_EQ(message.size(), ciphertext1.size());
1448
Shawn Willden3ad5f052015-05-08 14:05:13 -06001449 string ciphertext2 = EncryptMessage(string(message), KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001450 EXPECT_EQ(message.size(), ciphertext2.size());
1451
1452 // ECB is deterministic.
1453 EXPECT_EQ(ciphertext1, ciphertext2);
1454
Shawn Willden3ad5f052015-05-08 14:05:13 -06001455 string plaintext = DecryptMessage(ciphertext1, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001456 EXPECT_EQ(message, plaintext);
1457}
1458
1459TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001460 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1461 .AesEncryptionKey(128)
1462 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1463 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001464 // Message is slightly shorter than two blocks.
1465 string message = "1234567890123456789012345678901";
1466
1467 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1468 string ciphertext;
1469 size_t input_consumed;
1470 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1471 EXPECT_EQ(message.size(), input_consumed);
1472 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1473}
1474
1475TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001476 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001477 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001478 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1479 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001480
1481 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001482 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001483 string message(i, 'a');
Shawn Willden3ad5f052015-05-08 14:05:13 -06001484 string ciphertext = EncryptMessage(message, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001485 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden3ad5f052015-05-08 14:05:13 -06001486 string plaintext = DecryptMessage(ciphertext, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001487 EXPECT_EQ(message, plaintext);
1488 }
1489}
1490
1491TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001492 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001493 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001494 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1495 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001496
1497 string message = "a";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001498 string ciphertext = EncryptMessage(message, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001499 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001500 EXPECT_NE(ciphertext, message);
1501 ++ciphertext[ciphertext.size() / 2];
1502
1503 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1504 string plaintext;
1505 size_t input_consumed;
1506 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1507 EXPECT_EQ(ciphertext.size(), input_consumed);
1508 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1509}
1510
Thai Duong20d725d2015-03-24 17:49:58 -07001511TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001512 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1513 .AesEncryptionKey(128)
1514 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1515 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001516 string message = "123";
1517 string iv1;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001518 string ciphertext1 = EncryptMessage(message, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001519 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001520 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001521
1522 string iv2;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001523 string ciphertext2 = EncryptMessage(message, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001524 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001525 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001526
1527 // IVs should be random, so ciphertexts should differ.
1528 EXPECT_NE(iv1, iv2);
1529 EXPECT_NE(ciphertext1, ciphertext2);
1530
Shawn Willden3ad5f052015-05-08 14:05:13 -06001531 string plaintext = DecryptMessage(ciphertext1, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001532 EXPECT_EQ(message, plaintext);
1533}
1534
1535TEST_F(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001536 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1537 .AesEncryptionKey(128)
1538 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1539 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001540
1541 int increment = 15;
1542 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001543 AuthorizationSet input_params(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001544 AuthorizationSet output_params;
1545 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1546
1547 string ciphertext;
1548 size_t input_consumed;
1549 for (size_t i = 0; i < message.size(); i += increment)
1550 EXPECT_EQ(KM_ERROR_OK,
1551 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1552 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1553 EXPECT_EQ(message.size(), ciphertext.size());
1554
1555 // Move TAG_NONCE into input_params
1556 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001557 input_params.push_back(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001558 output_params.Clear();
1559
1560 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1561 string plaintext;
1562 for (size_t i = 0; i < ciphertext.size(); i += increment)
1563 EXPECT_EQ(KM_ERROR_OK,
1564 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1565 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1566 EXPECT_EQ(ciphertext.size(), plaintext.size());
1567 EXPECT_EQ(message, plaintext);
1568}
1569
1570struct AesCtrSp80038aTestVector {
1571 const char* key;
1572 const char* nonce;
1573 const char* plaintext;
1574 const char* ciphertext;
1575};
1576
1577// These test vectors are taken from
1578// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1579static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1580 // AES-128
1581 {
1582 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1583 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1584 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1585 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1586 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1587 },
1588 // AES-192
1589 {
1590 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1591 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1592 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1593 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1594 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1595 },
1596 // AES-256
1597 {
1598 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1599 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1600 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1601 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1602 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1603 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1604 },
1605};
1606
1607TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
1608 for (size_t i = 0; i < 3; i++) {
1609 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1610 const string key = hex2str(test.key);
1611 const string nonce = hex2str(test.nonce);
1612 const string plaintext = hex2str(test.plaintext);
1613 const string ciphertext = hex2str(test.ciphertext);
1614 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1615 }
1616}
1617
1618TEST_F(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
1619 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1620 .AesEncryptionKey(128)
1621 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1622 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
1623
Shawn Willden3ad5f052015-05-08 14:05:13 -06001624 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
Thai Duong20d725d2015-03-24 17:49:58 -07001625}
1626
1627TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
1628 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1629 .AesEncryptionKey(128)
1630 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001631 .Authorization(TAG_CALLER_NONCE)
1632 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001633
Shawn Willden09f25272015-04-15 13:49:49 -06001634 AuthorizationSet input_params(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001635 input_params.push_back(TAG_NONCE, "123", 3);
1636 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1637}
1638
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001639TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001640 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1641 .AesEncryptionKey(128)
1642 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1643 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001644 // Two-block message.
1645 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001646 string iv1;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001647 string ciphertext1 = EncryptMessage(message, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001648 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001649
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001650 string iv2;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001651 string ciphertext2 = EncryptMessage(message, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001652 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001653
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001654 // IVs should be random, so ciphertexts should differ.
1655 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001656 EXPECT_NE(ciphertext1, ciphertext2);
1657
Shawn Willden3ad5f052015-05-08 14:05:13 -06001658 string plaintext = DecryptMessage(ciphertext1, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001659 EXPECT_EQ(message, plaintext);
1660}
1661
Shawn Willden969aa382015-04-15 17:05:53 -07001662TEST_F(EncryptionOperationsTest, AesCallerNonce) {
1663 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1664 .AesEncryptionKey(128)
1665 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001666 .Authorization(TAG_CALLER_NONCE)
1667 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07001668 string message = "12345678901234567890123456789012";
1669 string iv1;
1670 // Don't specify nonce, should get a random one.
Shawn Willden3ad5f052015-05-08 14:05:13 -06001671 string ciphertext1 = EncryptMessage(message, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07001672 EXPECT_EQ(message.size(), ciphertext1.size());
1673 EXPECT_EQ(16U, iv1.size());
1674
Shawn Willden3ad5f052015-05-08 14:05:13 -06001675 string plaintext = DecryptMessage(ciphertext1, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07001676 EXPECT_EQ(message, plaintext);
1677
1678 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06001679 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001680 AuthorizationSet update_params;
1681 AuthorizationSet output_params;
1682 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
1683 string ciphertext2 =
1684 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
1685
1686 // Decrypt with correct nonce.
1687 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1688 &output_params);
1689 EXPECT_EQ(message, plaintext);
1690
1691 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06001692 input_params.Reinitialize(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001693 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
1694 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1695 &output_params);
1696 EXPECT_NE(message, plaintext);
1697}
1698
Shawn Willden67706352015-04-28 00:43:19 -06001699TEST_F(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001700 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1701 .AesEncryptionKey(128)
1702 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1703 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06001704
1705 string message = "12345678901234567890123456789012";
1706 string iv1;
1707 // Don't specify nonce, should get a random one.
Shawn Willden3ad5f052015-05-08 14:05:13 -06001708 string ciphertext1 = EncryptMessage(message, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06001709 EXPECT_EQ(message.size(), ciphertext1.size());
1710 EXPECT_EQ(16U, iv1.size());
1711
Shawn Willden3ad5f052015-05-08 14:05:13 -06001712 string plaintext = DecryptMessage(ciphertext1, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06001713 EXPECT_EQ(message, plaintext);
1714
1715 // Now specify a nonce, should fail.
1716 AuthorizationSet input_params(client_params());
1717 AuthorizationSet update_params;
1718 AuthorizationSet output_params;
1719 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
1720
1721 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
1722 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1723}
1724
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001725TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001726 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1727 .AesEncryptionKey(128)
1728 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1729 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001730
1731 int increment = 15;
1732 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001733 AuthorizationSet input_params(client_params());
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001734 AuthorizationSet output_params;
1735 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1736
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001737 string ciphertext;
1738 size_t input_consumed;
1739 for (size_t i = 0; i < message.size(); i += increment)
1740 EXPECT_EQ(KM_ERROR_OK,
1741 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1742 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001743 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001744
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001745 // Move TAG_NONCE into input_params
1746 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001747 input_params.push_back(client_params());
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001748 output_params.Clear();
1749
1750 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001751 string plaintext;
1752 for (size_t i = 0; i < ciphertext.size(); i += increment)
1753 EXPECT_EQ(KM_ERROR_OK,
1754 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1755 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001756 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001757 EXPECT_EQ(message, plaintext);
1758}
1759
1760TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001761 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001762 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001763 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1764 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001765
1766 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001767 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001768 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001769 string iv;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001770 string ciphertext = EncryptMessage(message, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001771 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden3ad5f052015-05-08 14:05:13 -06001772 string plaintext = DecryptMessage(ciphertext, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001773 EXPECT_EQ(message, plaintext);
1774 }
1775}
1776
Shawn Willdencd695822015-01-26 14:06:32 -07001777typedef KeymasterTest AddEntropyTest;
1778TEST_F(AddEntropyTest, AddEntropy) {
1779 // There's no obvious way to test that entropy is actually added, but we can test that the API
1780 // doesn't blow up or return an error.
1781 EXPECT_EQ(KM_ERROR_OK,
1782 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1783}
1784
Shawn Willden5fad7852015-01-26 16:10:56 -07001785typedef KeymasterTest RescopingTest;
1786TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001787 ASSERT_EQ(KM_ERROR_OK,
1788 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1789 TAG_RESCOPING_ADD, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001790 // TODO(swillden): Add a better error code for this.
Shawn Willdenf01329d2015-03-11 21:51:38 -06001791 EXPECT_EQ(KM_ERROR_RESCOPABLE_KEY_NOT_USABLE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001792}
1793
1794TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07001795 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07001796 .AesEncryptionKey(128)
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001797 .EcbMode()
1798 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1799 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
1800 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1801 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001802
1803 keymaster_key_blob_t rescoped_blob;
1804 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001805 AuthorizationSet new_params =
1806 AuthorizationSetBuilder().AesKey(128).Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN).build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001807
1808 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1809 ASSERT_TRUE(rescoped_characteristics != NULL);
1810
Shawn Willdenc6096592015-03-17 15:53:14 -06001811 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001812 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1813 keymaster_free_characteristics(rescoped_characteristics);
1814 free(rescoped_characteristics);
1815 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1816
1817 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001818 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1819 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001820}
1821
1822TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07001823 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001824 .RsaEncryptionKey(256, 3)
1825 .Padding(KM_PAD_RSA_OAEP)
Shawn Willden2c242002015-02-27 07:01:02 -07001826 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1827 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001828 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1829 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1830 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1831 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
1832
1833 keymaster_key_blob_t rescoped_blob;
1834 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001835 AuthorizationSet new_params = AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001836 .RsaSigningKey(256, 3)
1837 .Digest(KM_DIGEST_SHA_2_256)
1838 .Padding(KM_PAD_RSA_PSS)
Shawn Willden2c242002015-02-27 07:01:02 -07001839 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001840
1841 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1842 ASSERT_TRUE(rescoped_characteristics != NULL);
1843
Shawn Willdenc6096592015-03-17 15:53:14 -06001844 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001845 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1846 keymaster_free_characteristics(rescoped_characteristics);
1847 free(rescoped_characteristics);
1848 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1849
1850 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1851 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1852 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1853 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
1854}
1855
1856// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
1857// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
1858// may not be changed.
1859
Shawn Willden128ffe02014-08-06 12:31:33 -06001860} // namespace test
1861} // namespace keymaster