blob: 6b0c86190061df8da218705f1d6b2c02bbfc674b [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 Willden2c242002015-02-27 07:01:02 -0700239 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
240 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700241 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600242
Shawn Willden5b53c992015-02-02 08:05:25 -0700243 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700244 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700245 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
246 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
247 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600248}
249
Shawn Willden6bbe6782014-09-18 11:26:15 -0600250TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700251 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
252 GenerateKey(AuthorizationSetBuilder()
253 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
254 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
255 .SigningKey()));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600256}
257
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600258TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600259 ASSERT_EQ(KM_ERROR_OK,
260 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700261 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600262
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700263 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600264 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700265 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600266}
267
Shawn Willden6bbe6782014-09-18 11:26:15 -0600268TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600269 ASSERT_EQ(KM_ERROR_OK,
270 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700271 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600272
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700273 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600274 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600275
276 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700277 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600278}
279
280TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700281 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden84b8da52015-03-11 07:21:32 -0600282 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190, KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600283}
284
285TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600286 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600287 for (size_t size : valid_sizes) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600288 EXPECT_EQ(KM_ERROR_OK,
289 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size, KM_DIGEST_NONE)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700290 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600291 }
292}
293
Shawn Willden0d560bf2014-12-15 17:44:02 -0700294TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700295 ASSERT_EQ(KM_ERROR_OK,
296 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700297}
298
Shawn Willden76364712014-08-11 17:48:04 -0600299typedef KeymasterTest GetKeyCharacteristics;
300TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700301 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
302 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700303 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600304
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700305 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
306 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600307}
308
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700309typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600310TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700311 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
312 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700313 string message = "12345678901234567890123456789012";
314 string signature;
315 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600316}
317
Shawn Willden61902362014-12-18 10:33:24 -0700318TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
319 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700320 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
321 256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700322 string message(1024, 'a');
323 string signature;
324 SignMessage(message, &signature);
325}
326
327TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700328 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
329 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700330 // Use large message, which won't work without digesting.
331 string message(1024, 'a');
332 string signature;
333 SignMessage(message, &signature);
334}
335
Shawn Willdenf90f2352014-12-18 23:01:15 -0700336TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700337 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
338 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700339 string message(1024, 'a');
340 string signature;
341 SignMessage(message, &signature);
342}
343
344TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
345 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
346 // that 9 bytes larger than hash won't work.
Shawn Willden2c242002015-02-27 07:01:02 -0700347 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
348 256 + 9 * 8, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700349 string message(1024, 'a');
350 string signature;
351
352 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
353
354 string result;
355 size_t input_consumed;
356 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
357 EXPECT_EQ(message.size(), input_consumed);
358 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
359}
360
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600361TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600362 ASSERT_EQ(KM_ERROR_OK,
363 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700364 string message = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700365 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700366 SignMessage(message, &signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600367}
368
Shawn Willden1615f2e2014-08-13 10:37:40 -0600369TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -0700370 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
371 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdendfa1c032015-02-07 00:39:01 -0700372 AuthorizationSet input_params, output_params;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700373 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
374 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
375 // Another abort should fail
376 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600377}
378
379TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willden2c242002015-02-27 07:01:02 -0700380 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_MD5,
381 KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700382 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600383}
384
385TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -0700386 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
387 256, 3, KM_DIGEST_SHA_2_256 /* supported digest */, KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700388 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600389}
390
391TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700392 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700393 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700394 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700395 // PSS requires a digest.
Shawn Willden2c242002015-02-27 07:01:02 -0700396 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_NONE, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700397 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600398}
399
400TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700401 // Padding must be specified
Shawn Willden2c242002015-02-27 07:01:02 -0700402 ASSERT_EQ(KM_ERROR_OK,
403 GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Authorization(
404 TAG_DIGEST, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700405 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600406}
407
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700408TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700409 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 20));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700410 string message = "12345678901234567890123456789012";
411 string signature;
412 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600413 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700414}
415
Shawn Willden62c22862014-12-17 08:36:20 -0700416TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700417 ASSERT_EQ(KM_ERROR_OK,
418 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 28)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700419 string message = "12345678901234567890123456789012";
420 string signature;
421 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600422 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700423}
424
Shawn Willden0d560bf2014-12-15 17:44:02 -0700425TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700426 ASSERT_EQ(KM_ERROR_OK,
427 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700428 string message = "12345678901234567890123456789012";
429 string signature;
430 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600431 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700432}
433
Shawn Willden62c22862014-12-17 08:36:20 -0700434TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700435 ASSERT_EQ(KM_ERROR_OK,
436 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 48)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700437 string message = "12345678901234567890123456789012";
438 string signature;
439 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600440 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700441}
442
443TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700444 ASSERT_EQ(KM_ERROR_OK,
445 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 64)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700446 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700447 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700448 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600449 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700450}
451
Shawn Willden3b702e22015-02-05 10:26:47 -0700452TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
453 uint8_t key_data[] = {
454 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
455 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
456 };
457 string message = "Hi There";
458 uint8_t sha_224_expected[] = {
459 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
460 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
461 };
462 uint8_t sha_256_expected[] = {
463 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
464 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
465 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
466 };
467 uint8_t sha_384_expected[] = {
468 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
469 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
470 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
471 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
472 };
473 uint8_t sha_512_expected[] = {
474 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
475 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
476 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
477 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
478 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
479 };
480
481 string key = make_string(key_data);
482
483 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
484 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
485 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
486 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
487}
488
489TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
490 string key = "Jefe";
491 string message = "what do ya want for nothing?";
492 uint8_t sha_224_expected[] = {
493 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
494 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
495 };
496 uint8_t sha_256_expected[] = {
497 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
498 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
499 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
500 };
501 uint8_t sha_384_expected[] = {
502 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
503 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
504 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
505 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
506 };
507 uint8_t sha_512_expected[] = {
508 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
509 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
510 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
511 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
512 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
513 };
514
515 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
516 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
517 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
518 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
519}
520
521TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
522 string key(20, 0xaa);
523 string message(50, 0xdd);
524 uint8_t sha_224_expected[] = {
525 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
526 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
527 };
528 uint8_t sha_256_expected[] = {
529 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
530 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
531 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
532 };
533 uint8_t sha_384_expected[] = {
534 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
535 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
536 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
537 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
538 };
539 uint8_t sha_512_expected[] = {
540 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
541 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
542 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
543 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
544 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
545 };
546
547 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
548 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
549 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
550 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
551}
552
553TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
554 uint8_t key_data[25] = {
555 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
556 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
557 };
558 string key = make_string(key_data);
559 string message(50, 0xcd);
560 uint8_t sha_224_expected[] = {
561 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
562 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
563 };
564 uint8_t sha_256_expected[] = {
565 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
566 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
567 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
568 };
569 uint8_t sha_384_expected[] = {
570 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
571 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
572 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
573 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
574 };
575 uint8_t sha_512_expected[] = {
576 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
577 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
578 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
579 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
580 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
581 };
582
583 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
584 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
585 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
586 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
587}
588
589TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
590 string key(20, 0x0c);
591 string message = "Test With Truncation";
592
593 uint8_t sha_224_expected[] = {
594 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
595 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
596 };
597 uint8_t sha_256_expected[] = {
598 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
599 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
600 };
601 uint8_t sha_384_expected[] = {
602 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
603 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
604 };
605 uint8_t sha_512_expected[] = {
606 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
607 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
608 };
609
610 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
611 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
612 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
613 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
614}
615
616TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
617 string key(131, 0xaa);
618 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
619
620 uint8_t sha_224_expected[] = {
621 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
622 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
623 };
624 uint8_t sha_256_expected[] = {
625 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
626 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
627 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
628 };
629 uint8_t sha_384_expected[] = {
630 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
631 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
632 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
633 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
634 };
635 uint8_t sha_512_expected[] = {
636 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
637 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
638 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
639 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
640 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
641 };
642
643 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
644 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
645 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
646 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
647}
648
649TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
650 string key(131, 0xaa);
651 string message = "This is a test using a larger than block-size key and a larger than "
652 "block-size data. The key needs to be hashed before being used by the HMAC "
653 "algorithm.";
654
655 uint8_t sha_224_expected[] = {
656 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
657 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
658 };
659 uint8_t sha_256_expected[] = {
660 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
661 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
662 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
663 };
664 uint8_t sha_384_expected[] = {
665 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
666 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
667 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
668 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
669 };
670 uint8_t sha_512_expected[] = {
671 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
672 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
673 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
674 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
675 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
676 };
677
678 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
679 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
680 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
681 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
682}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700683
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700684TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700685 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
686 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
687 .Authorization(TAG_KEY_SIZE, 128)
Shawn Willdenc24c1102014-12-22 15:30:09 -0700688 .SigningKey()
Shawn Willden2c242002015-02-27 07:01:02 -0700689 .Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700690 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700691}
692
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700693TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700694 ASSERT_EQ(KM_ERROR_OK,
695 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 33)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700696 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700697}
698
Shawn Willden1615f2e2014-08-13 10:37:40 -0600699TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willden2c242002015-02-27 07:01:02 -0700700 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
701 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700702 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700703
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700704 string message = "1234567890123456789012345678901";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700705 string result;
706 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700707 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700708 EXPECT_EQ(0U, result.size());
709 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600710
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700711 string signature;
712 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
713 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -0600714}
715
Shawn Willden61902362014-12-18 10:33:24 -0700716// TODO(swillden): Add more verification failure tests.
717
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700718typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600719TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700720 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
721 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700722 string message = "12345678901234567890123456789012";
723 string signature;
724 SignMessage(message, &signature);
725 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600726}
727
Shawn Willden61902362014-12-18 10:33:24 -0700728TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
729 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700730 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700731 string message(1024, 'a');
732 string signature;
733 SignMessage(message, &signature);
734 VerifyMessage(message, signature);
735}
736
Shawn Willdenf90f2352014-12-18 23:01:15 -0700737TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700738 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700739 string message(1024, 'a');
740 string signature;
741 SignMessage(message, &signature);
742 ++signature[signature.size() / 2];
743
744 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
745
746 string result;
747 size_t input_consumed;
748 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
749 EXPECT_EQ(message.size(), input_consumed);
750 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
751}
752
Shawn Willdenf90f2352014-12-18 23:01:15 -0700753TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700754 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
755 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700756 // Use large message, which won't work without digesting.
757 string message(1024, 'a');
758 string signature;
759 SignMessage(message, &signature);
760 VerifyMessage(message, signature);
761}
762
763TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700764 GenerateKey(
765 AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700766 string message(1024, 'a');
767 string signature;
768 SignMessage(message, &signature);
769 ++signature[signature.size() / 2];
770
771 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
772
773 string result;
774 size_t input_consumed;
775 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
776 EXPECT_EQ(message.size(), input_consumed);
777 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
778}
779
780TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -0700781 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
782 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700783 // Use large message, which won't work without digesting.
784 string message(1024, 'a');
785 string signature;
786 SignMessage(message, &signature);
787 ++message[message.size() / 2];
788
789 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
790
791 string result;
792 size_t input_consumed;
793 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
794 EXPECT_EQ(message.size(), input_consumed);
795 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
796}
797
Shawn Willdenf90f2352014-12-18 23:01:15 -0700798TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700799 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
800 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700801 string message(1024, 'a');
802 string signature;
803 SignMessage(message, &signature);
804 VerifyMessage(message, signature);
805}
806
807TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700808 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
809 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700810 string message(1024, 'a');
811 string signature;
812 SignMessage(message, &signature);
813 ++signature[signature.size() / 2];
814
815 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
816
817 string result;
818 size_t input_consumed;
819 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
820 EXPECT_EQ(message.size(), input_consumed);
821 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
822}
823
824TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -0700825 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
826 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700827 // Use large message, which won't work without digesting.
828 string message(1024, 'a');
829 string signature;
830 SignMessage(message, &signature);
831 ++message[message.size() / 2];
832
833 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
834
835 string result;
836 size_t input_consumed;
837 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
838 EXPECT_EQ(message.size(), input_consumed);
839 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
840}
841
842template <typename T> vector<T> make_vector(const T* array, size_t len) {
843 return vector<T>(array, array + len);
844}
845
846TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
847 // Get all supported digests and padding modes.
848 size_t digests_len;
849 keymaster_digest_t* digests;
850 EXPECT_EQ(KM_ERROR_OK,
851 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
852 &digests_len));
853
854 size_t padding_modes_len;
855 keymaster_padding_t* padding_modes;
856 EXPECT_EQ(KM_ERROR_OK,
857 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
858 &padding_modes, &padding_modes_len));
859
860 // Try them.
861 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
862 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
863 // Compute key & message size that will work.
864 size_t key_bits = 256;
865 size_t message_len = 1000;
866 switch (digest) {
867 case KM_DIGEST_NONE:
868 switch (padding_mode) {
869 case KM_PAD_NONE:
870 // Match key size.
871 message_len = key_bits / 8;
872 break;
873 case KM_PAD_RSA_PKCS1_1_5_SIGN:
874 message_len = key_bits / 8 - 11;
875 break;
876 case KM_PAD_RSA_PSS:
877 // PSS requires a digest.
878 continue;
879 default:
880 FAIL() << "Missing padding";
881 break;
882 }
883 break;
884
885 case KM_DIGEST_SHA_2_256:
886 switch (padding_mode) {
887 case KM_PAD_NONE:
888 // Key size matches digest size
889 break;
890 case KM_PAD_RSA_PKCS1_1_5_SIGN:
891 key_bits += 8 * 11;
892 break;
893 case KM_PAD_RSA_PSS:
894 key_bits += 8 * 10;
895 break;
896 default:
897 FAIL() << "Missing padding";
898 break;
899 }
900 break;
901 default:
902 FAIL() << "Missing digest";
903 }
904
Shawn Willden2c242002015-02-27 07:01:02 -0700905 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(key_bits, 3, digest, padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700906 string message(message_len, 'a');
907 string signature;
908 SignMessage(message, &signature);
909 VerifyMessage(message, signature);
910 }
911 }
912
913 free(padding_modes);
914 free(digests);
915}
916
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600917TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600918 ASSERT_EQ(KM_ERROR_OK,
919 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700920 string message = "123456789012345678901234567890123456789012345678";
921 string signature;
922 SignMessage(message, &signature);
923 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600924}
925
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700926TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700927 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700928 string message = "123456789012345678901234567890123456789012345678";
929 string signature;
930 SignMessage(message, &signature);
931 VerifyMessage(message, signature);
932}
933
934TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700935 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700936 string message = "123456789012345678901234567890123456789012345678";
937 string signature;
938 SignMessage(message, &signature);
939 VerifyMessage(message, signature);
940}
941
Shawn Willden0d560bf2014-12-15 17:44:02 -0700942TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700943 ASSERT_EQ(KM_ERROR_OK,
944 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700945 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -0700946 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700947 SignMessage(message, &signature);
948 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -0700949}
950
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700951TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700952 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700953 string message = "123456789012345678901234567890123456789012345678";
954 string signature;
955 SignMessage(message, &signature);
956 VerifyMessage(message, signature);
957}
958
959TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700960 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700961 string message = "123456789012345678901234567890123456789012345678";
962 string signature;
963 SignMessage(message, &signature);
964 VerifyMessage(message, signature);
965}
966
Shawn Willden5b53c992015-02-02 08:05:25 -0700967typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -0600968TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700969 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
970 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700971 string export_data;
972 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -0600973 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -0600974
975 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -0600976}
977
Shawn Willdenf268d742014-08-19 15:36:26 -0600978TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600979 ASSERT_EQ(KM_ERROR_OK,
980 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700981 string export_data;
982 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -0600983 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -0600984
985 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -0600986}
987
988TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willden2c242002015-02-27 07:01:02 -0700989 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
990 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700991 string export_data;
992 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -0600993}
994
995TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willden2c242002015-02-27 07:01:02 -0700996 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
997 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -0700998 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700999 string export_data;
1000 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001001}
1002
Shawn Willden7dad93b2015-02-05 10:20:47 -07001003TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001004 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001005 string export_data;
1006
1007 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1008 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1009 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1010}
1011
Shawn Willden437fbd12014-08-20 11:59:49 -06001012static string read_file(const string& file_name) {
1013 ifstream file_stream(file_name, std::ios::binary);
1014 istreambuf_iterator<char> file_begin(file_stream);
1015 istreambuf_iterator<char> file_end;
1016 return string(file_begin, file_end);
1017}
1018
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001019typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001020TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001021 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001022 ASSERT_EQ(633U, pk8_key.size());
1023
Shawn Willden2c242002015-02-27 07:01:02 -07001024 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().RsaSigningKey(
1025 1024, 65537, KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001026 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001027
1028 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001029 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1030 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1031 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001032
1033 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001034 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1035 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001036
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001037 string message(1024 / 8, 'a');
1038 string signature;
1039 SignMessage(message, &signature);
1040 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001041}
1042
Shawn Willdend7a5c712015-04-09 16:33:52 -06001043TEST_F(ImportKeyTest, OldApiRsaSuccess) {
1044 string pk8_key = read_file("rsa_privkey_pk8.der");
1045 ASSERT_EQ(633U, pk8_key.size());
1046
1047 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1048 // point softkeymaster will no longer support keymaster0 APIs anyway.
1049 uint8_t* key_blob;
1050 size_t key_blob_length;
1051 ASSERT_EQ(0,
1052 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1053 pk8_key.size(), &key_blob, &key_blob_length));
1054 set_key_blob(key_blob, key_blob_length);
1055
1056 string message(1024 / 8, 'a');
1057 string signature;
1058 SignMessage(message, &signature, false /* use_client_params */);
1059 VerifyMessage(message, signature, false /* use_client_params */);
1060}
1061
Shawn Willden6bbe6782014-09-18 11:26:15 -06001062TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001063 string pk8_key = read_file("rsa_privkey_pk8.der");
1064 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001065 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001066 ImportKey(AuthorizationSetBuilder().RsaSigningKey(2048 /* Doesn't match key */, 3,
1067 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001068 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001069}
1070
1071TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001072 string pk8_key = read_file("rsa_privkey_pk8.der");
1073 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001074 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001075 ImportKey(AuthorizationSetBuilder().RsaSigningKey(256, 3 /* Doesnt' match key */,
1076 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001077 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001078}
1079
Shawn Willden81effc62014-08-27 10:08:46 -06001080TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001081 string pk8_key = read_file("ec_privkey_pk8.der");
1082 ASSERT_EQ(138U, pk8_key.size());
1083
Shawn Willden84b8da52015-03-11 07:21:32 -06001084 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001085 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001086
1087 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001088 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001089 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001090
1091 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001092 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1093 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001094
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001095 string message(1024 / 8, 'a');
1096 string signature;
1097 SignMessage(message, &signature);
1098 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001099}
1100
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001101TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1102 string pk8_key = read_file("ec_privkey_pk8.der");
1103 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001104
Shawn Willden84b8da52015-03-11 07:21:32 -06001105 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001106 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001107
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001108 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001109 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001110 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1111
1112 // And values provided by GoogleKeymaster
1113 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1114 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1115
1116 string message(1024 / 8, 'a');
1117 string signature;
1118 SignMessage(message, &signature);
1119 VerifyMessage(message, signature);
1120}
1121
1122TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1123 string pk8_key = read_file("ec_privkey_pk8.der");
1124 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001125 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden84b8da52015-03-11 07:21:32 -06001126 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(
1127 224, KM_DIGEST_NONE), // Size does not match key
1128 KM_KEY_FORMAT_PKCS8,
1129 pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001130}
1131
Shawn Willden3b702e22015-02-05 10:26:47 -07001132TEST_F(ImportKeyTest, AesKeySuccess) {
1133 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1134 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001135 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001136 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1137 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001138 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001139
1140 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1141 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1142
1143 string message = "Hello World!";
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001144 string ciphertext = EncryptMessage(message);
1145 string plaintext = DecryptMessage(ciphertext);
Shawn Willden3b702e22015-02-05 10:26:47 -07001146 EXPECT_EQ(message, plaintext);
1147}
1148
1149TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1150 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1151 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001152 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().HmacKey(sizeof(key_data) * 8,
1153 KM_DIGEST_SHA_2_256, 32),
1154 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001155
1156 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1157 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1158
1159 string message = "Hello World!";
1160 string signature;
1161 SignMessage(message, &signature);
1162 VerifyMessage(message, signature);
1163}
1164
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001165typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001166TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001167 ASSERT_EQ(KM_ERROR_OK,
1168 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001169
1170 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001171 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001172 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001173
Shawn Willden6dde87c2014-12-11 14:08:48 -07001174 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001175 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001176
1177 // OAEP randomizes padding so every result should be different.
1178 EXPECT_NE(ciphertext1, ciphertext2);
1179}
1180
1181TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001182 ASSERT_EQ(KM_ERROR_OK,
1183 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001184 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001185 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001186 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001187
Shawn Willden6dde87c2014-12-11 14:08:48 -07001188 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001189 EXPECT_EQ(message, plaintext);
1190}
1191
1192TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willden2c242002015-02-27 07:01:02 -07001193 ASSERT_EQ(KM_ERROR_OK,
1194 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001195 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001196 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001197 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001198
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001199 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1200 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001201 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001202 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001203}
1204
1205TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001206 ASSERT_EQ(KM_ERROR_OK,
1207 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001208 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001209 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001210 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001211
1212 // Corrupt the ciphertext
1213 ciphertext[512 / 8 / 2]++;
1214
Shawn Willden4200f212014-12-02 07:01:21 -07001215 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001216 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001217 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1218 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001219 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001220 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001221}
1222
1223TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001224 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1225 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001226 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001227 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001228 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001229
Shawn Willden6dde87c2014-12-11 14:08:48 -07001230 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001231 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001232
1233 // PKCS1 v1.5 randomizes padding so every result should be different.
1234 EXPECT_NE(ciphertext1, ciphertext2);
1235}
1236
1237TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001238 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1239 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001240 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001241 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001242 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001243
Shawn Willden6dde87c2014-12-11 14:08:48 -07001244 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001245 EXPECT_EQ(message, plaintext);
1246}
1247
1248TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willden2c242002015-02-27 07:01:02 -07001249 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1250 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001251 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001252 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001253 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001254
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001255 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1256 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001257 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001258 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001259}
1260
1261TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001262 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1263 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001264 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001265 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001266 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001267
1268 // Corrupt the ciphertext
1269 ciphertext[512 / 8 / 2]++;
1270
Shawn Willden4200f212014-12-02 07:01:21 -07001271 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001272 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001273 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1274 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001275 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001276 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001277}
1278
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001279TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001280 ASSERT_EQ(KM_ERROR_OK,
1281 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1282 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001283 // Two-block message.
1284 string message = "12345678901234567890123456789012";
1285 string ciphertext1 = EncryptMessage(message);
1286 EXPECT_EQ(message.size(), ciphertext1.size());
1287
1288 string ciphertext2 = EncryptMessage(string(message));
1289 EXPECT_EQ(message.size(), ciphertext2.size());
1290
1291 // ECB is deterministic.
1292 EXPECT_EQ(ciphertext1, ciphertext2);
1293
1294 string plaintext = DecryptMessage(ciphertext1);
1295 EXPECT_EQ(message, plaintext);
1296}
1297
1298TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07001299 ASSERT_EQ(KM_ERROR_OK,
1300 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1301 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001302 // Message is slightly shorter than two blocks.
1303 string message = "1234567890123456789012345678901";
1304
1305 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1306 string ciphertext;
1307 size_t input_consumed;
1308 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1309 EXPECT_EQ(message.size(), input_consumed);
1310 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1311}
1312
1313TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001314 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001315 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001316 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1317 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001318
1319 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001320 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001321 string message(i, 'a');
1322 string ciphertext = EncryptMessage(message);
1323 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1324 string plaintext = DecryptMessage(ciphertext);
1325 EXPECT_EQ(message, plaintext);
1326 }
1327}
1328
1329TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001330 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001331 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001332 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1333 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001334
1335 string message = "a";
1336 string ciphertext = EncryptMessage(message);
Shawn Willdenc6096592015-03-17 15:53:14 -06001337 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001338 EXPECT_NE(ciphertext, message);
1339 ++ciphertext[ciphertext.size() / 2];
1340
1341 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1342 string plaintext;
1343 size_t input_consumed;
1344 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1345 EXPECT_EQ(ciphertext.size(), input_consumed);
1346 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1347}
1348
Thai Duong20d725d2015-03-24 17:49:58 -07001349TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
1350 ASSERT_EQ(KM_ERROR_OK,
1351 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1352 TAG_BLOCK_MODE, KM_MODE_CTR)));
1353 string message = "123";
1354 string iv1;
1355 string ciphertext1 = EncryptMessage(message, &iv1);
1356 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001357 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001358
1359 string iv2;
1360 string ciphertext2 = EncryptMessage(message, &iv2);
1361 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001362 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001363
1364 // IVs should be random, so ciphertexts should differ.
1365 EXPECT_NE(iv1, iv2);
1366 EXPECT_NE(ciphertext1, ciphertext2);
1367
1368 string plaintext = DecryptMessage(ciphertext1, iv1);
1369 EXPECT_EQ(message, plaintext);
1370}
1371
1372TEST_F(EncryptionOperationsTest, AesCtrIncremental) {
1373 ASSERT_EQ(KM_ERROR_OK,
1374 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1375 TAG_BLOCK_MODE, KM_MODE_CTR)));
1376
1377 int increment = 15;
1378 string message(239, 'a');
1379 AuthorizationSet input_params;
1380 AuthorizationSet output_params;
1381 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1382
1383 string ciphertext;
1384 size_t input_consumed;
1385 for (size_t i = 0; i < message.size(); i += increment)
1386 EXPECT_EQ(KM_ERROR_OK,
1387 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1388 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1389 EXPECT_EQ(message.size(), ciphertext.size());
1390
1391 // Move TAG_NONCE into input_params
1392 input_params.Reinitialize(output_params);
1393 output_params.Clear();
1394
1395 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1396 string plaintext;
1397 for (size_t i = 0; i < ciphertext.size(); i += increment)
1398 EXPECT_EQ(KM_ERROR_OK,
1399 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1400 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1401 EXPECT_EQ(ciphertext.size(), plaintext.size());
1402 EXPECT_EQ(message, plaintext);
1403}
1404
1405struct AesCtrSp80038aTestVector {
1406 const char* key;
1407 const char* nonce;
1408 const char* plaintext;
1409 const char* ciphertext;
1410};
1411
1412// These test vectors are taken from
1413// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1414static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1415 // AES-128
1416 {
1417 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1418 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1419 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1420 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1421 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1422 },
1423 // AES-192
1424 {
1425 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1426 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1427 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1428 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1429 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1430 },
1431 // AES-256
1432 {
1433 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1434 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1435 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1436 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1437 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1438 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1439 },
1440};
1441
1442TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
1443 for (size_t i = 0; i < 3; i++) {
1444 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1445 const string key = hex2str(test.key);
1446 const string nonce = hex2str(test.nonce);
1447 const string plaintext = hex2str(test.plaintext);
1448 const string ciphertext = hex2str(test.ciphertext);
1449 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1450 }
1451}
1452
1453TEST_F(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
1454 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1455 .AesEncryptionKey(128)
1456 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1457 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
1458
1459 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
1460}
1461
1462TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
1463 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1464 .AesEncryptionKey(128)
1465 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1466 .Authorization(TAG_CALLER_NONCE)));
1467
1468 AuthorizationSet input_params;
1469 input_params.push_back(TAG_NONCE, "123", 3);
1470 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1471}
1472
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001473TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001474 ASSERT_EQ(KM_ERROR_OK,
1475 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1476 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001477 // Two-block message.
1478 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001479 string iv1;
1480 string ciphertext1 = EncryptMessage(message, &iv1);
1481 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001482
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001483 string iv2;
1484 string ciphertext2 = EncryptMessage(message, &iv2);
1485 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001486
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001487 // IVs should be random, so ciphertexts should differ.
1488 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001489 EXPECT_NE(ciphertext1, ciphertext2);
1490
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001491 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001492 EXPECT_EQ(message, plaintext);
1493}
1494
1495TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001496 ASSERT_EQ(KM_ERROR_OK,
1497 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1498 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001499
1500 int increment = 15;
1501 string message(240, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001502 AuthorizationSet input_params;
1503 AuthorizationSet output_params;
1504 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1505
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001506 string ciphertext;
1507 size_t input_consumed;
1508 for (size_t i = 0; i < message.size(); i += increment)
1509 EXPECT_EQ(KM_ERROR_OK,
1510 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1511 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001512 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001513
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001514 // Move TAG_NONCE into input_params
1515 input_params.Reinitialize(output_params);
1516 output_params.Clear();
1517
1518 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001519 string plaintext;
1520 for (size_t i = 0; i < ciphertext.size(); i += increment)
1521 EXPECT_EQ(KM_ERROR_OK,
1522 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1523 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001524 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001525 EXPECT_EQ(message, plaintext);
1526}
1527
1528TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001529 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001530 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001531 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1532 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001533
1534 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001535 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001536 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001537 string iv;
1538 string ciphertext = EncryptMessage(message, &iv);
1539 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1540 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001541 EXPECT_EQ(message, plaintext);
1542 }
1543}
1544
Shawn Willdencd695822015-01-26 14:06:32 -07001545typedef KeymasterTest AddEntropyTest;
1546TEST_F(AddEntropyTest, AddEntropy) {
1547 // There's no obvious way to test that entropy is actually added, but we can test that the API
1548 // doesn't blow up or return an error.
1549 EXPECT_EQ(KM_ERROR_OK,
1550 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1551}
1552
Shawn Willden5fad7852015-01-26 16:10:56 -07001553typedef KeymasterTest RescopingTest;
1554TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001555 ASSERT_EQ(KM_ERROR_OK,
1556 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1557 TAG_RESCOPING_ADD, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001558 // TODO(swillden): Add a better error code for this.
Shawn Willdenf01329d2015-03-11 21:51:38 -06001559 EXPECT_EQ(KM_ERROR_RESCOPABLE_KEY_NOT_USABLE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001560}
1561
1562TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07001563 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07001564 .AesEncryptionKey(128)
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001565 .EcbMode()
1566 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1567 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
1568 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1569 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001570
1571 keymaster_key_blob_t rescoped_blob;
1572 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001573 AuthorizationSet new_params =
1574 AuthorizationSetBuilder().AesKey(128).Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN).build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001575
1576 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1577 ASSERT_TRUE(rescoped_characteristics != NULL);
1578
Shawn Willdenc6096592015-03-17 15:53:14 -06001579 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001580 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1581 keymaster_free_characteristics(rescoped_characteristics);
1582 free(rescoped_characteristics);
1583 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1584
1585 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001586 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1587 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001588}
1589
1590TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07001591 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1592 .RsaEncryptionKey(256, 3, KM_PAD_RSA_OAEP)
1593 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1594 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001595 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1596 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1597 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1598 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
1599
1600 keymaster_key_blob_t rescoped_blob;
1601 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001602 AuthorizationSet new_params = AuthorizationSetBuilder()
1603 .RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)
1604 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001605
1606 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1607 ASSERT_TRUE(rescoped_characteristics != NULL);
1608
Shawn Willdenc6096592015-03-17 15:53:14 -06001609 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001610 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1611 keymaster_free_characteristics(rescoped_characteristics);
1612 free(rescoped_characteristics);
1613 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1614
1615 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1616 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1617 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1618 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
1619}
1620
1621// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
1622// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
1623// may not be changed.
1624
Shawn Willden128ffe02014-08-06 12:31:33 -06001625} // namespace test
1626} // namespace keymaster