blob: b26dc21b6b59642599b61734f945dbea97ad70a8 [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;
321 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600322}
323
Shawn Willden61902362014-12-18 10:33:24 -0700324TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
325 // Note that without padding, key size must exactly match digest size.
Shawn Willdenaf533992015-04-15 13:48:28 -0600326 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
327 .RsaSigningKey(256, 3)
328 .Digest(KM_DIGEST_SHA_2_256)
329 .Padding(KM_PAD_NONE)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700330 string message(1024, 'a');
331 string signature;
332 SignMessage(message, &signature);
333}
334
335TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600336 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
337 .RsaSigningKey(512, 3)
338 .Digest(KM_DIGEST_SHA_2_256)
339 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700340 // Use large message, which won't work without digesting.
341 string message(1024, 'a');
342 string signature;
343 SignMessage(message, &signature);
344}
345
Shawn Willdenf90f2352014-12-18 23:01:15 -0700346TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600347 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
348 .RsaSigningKey(512, 3)
349 .Digest(KM_DIGEST_SHA_2_256)
350 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700351 string message(1024, 'a');
352 string signature;
353 SignMessage(message, &signature);
354}
355
356TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
357 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
358 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600359 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
360 .RsaSigningKey(256 + 9 * 8, 3)
361 .Digest(KM_DIGEST_SHA_2_256)
362 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700363 string message(1024, 'a');
364 string signature;
365
366 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
367
368 string result;
369 size_t input_consumed;
370 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
371 EXPECT_EQ(message.size(), input_consumed);
372 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
373}
374
Shawn Willden1615f2e2014-08-13 10:37:40 -0600375TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600376 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
377 .RsaSigningKey(256, 3)
378 .Digest(KM_DIGEST_NONE)
379 .Padding(KM_PAD_NONE)));
Shawn Willdendfa1c032015-02-07 00:39:01 -0700380 AuthorizationSet input_params, output_params;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700381 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
382 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
383 // Another abort should fail
384 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600385}
386
387TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600388 GenerateKey(AuthorizationSetBuilder()
389 .RsaSigningKey(256, 3)
390 .Digest(KM_DIGEST_MD5)
391 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700392 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600393}
394
395TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600396 GenerateKey(AuthorizationSetBuilder()
397 .RsaSigningKey(256, 3)
398 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
399 .Padding(KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700400 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600401}
402
403TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700404 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700405 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700406 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700407 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600408 GenerateKey(AuthorizationSetBuilder()
409 .RsaSigningKey(256, 3)
410 .Digest(KM_DIGEST_NONE)
411 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700412 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600413}
414
415TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700416 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600417 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
418 KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700419 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600420}
421
Shawn Willdenedb79942015-05-08 06:46:44 -0600422TEST_F(SigningOperationsTest, RsaTooShortMessage) {
423 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
424 .RsaSigningKey(256, 3)
425 .Digest(KM_DIGEST_NONE)
426 .Padding(KM_PAD_NONE)));
427 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
428
429 string message = "1234567890123456789012345678901";
430 string result;
431 size_t input_consumed;
432 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
433 EXPECT_EQ(0U, result.size());
434 EXPECT_EQ(31U, input_consumed);
435
436 string signature;
437 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
438 EXPECT_EQ(0U, signature.length());
439}
440
441TEST_F(SigningOperationsTest, RsaSignWithEncryptionKey) {
442 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
443 .RsaEncryptionKey(256, 3)
444 .Digest(KM_DIGEST_NONE)
445 .Padding(KM_PAD_NONE)));
446 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
447 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
448}
449
450TEST_F(SigningOperationsTest, EcdsaSuccess) {
451 ASSERT_EQ(KM_ERROR_OK,
452 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
453 string message = "123456789012345678901234567890123456789012345678";
454 string signature;
455 SignMessage(message, &signature);
456}
457
458TEST_F(SigningOperationsTest, AesEcbSign) {
459 ASSERT_EQ(KM_ERROR_OK,
460 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
461 TAG_BLOCK_MODE, KM_MODE_ECB)));
462 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
463 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
464}
465
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700466TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600467 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700468 string message = "12345678901234567890123456789012";
469 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600470 MacMessage(message, &signature, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600471 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700472}
473
Shawn Willden62c22862014-12-17 08:36:20 -0700474TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600475 ASSERT_EQ(KM_ERROR_OK,
476 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700477 string message = "12345678901234567890123456789012";
478 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600479 MacMessage(message, &signature, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600480 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700481}
482
Shawn Willden0d560bf2014-12-15 17:44:02 -0700483TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600484 ASSERT_EQ(KM_ERROR_OK,
485 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700486 string message = "12345678901234567890123456789012";
487 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600488 MacMessage(message, &signature, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600489 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700490}
491
Shawn Willden62c22862014-12-17 08:36:20 -0700492TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600493 ASSERT_EQ(KM_ERROR_OK,
494 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
495
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700496 string message = "12345678901234567890123456789012";
497 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600498 MacMessage(message, &signature, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600499 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700500}
501
502TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600503 ASSERT_EQ(KM_ERROR_OK,
504 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700505 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700506 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600507 MacMessage(message, &signature, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600508 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700509}
510
Shawn Willden09f25272015-04-15 13:49:49 -0600511TEST_F(SigningOperationsTest, HmacLengthInKey) {
512 // TODO(swillden): unified API should generate an error on key generation.
513 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
514 .HmacKey(128)
515 .Digest(KM_DIGEST_SHA_2_256)
516 .Authorization(TAG_MAC_LENGTH, 20)));
517 string message = "12345678901234567890123456789012";
518 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600519 MacMessage(message, &signature, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600520 // Size in key was ignored.
521 ASSERT_EQ(30U, signature.size());
522}
523
Shawn Willden3b702e22015-02-05 10:26:47 -0700524TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
525 uint8_t key_data[] = {
526 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
527 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
528 };
529 string message = "Hi There";
530 uint8_t sha_224_expected[] = {
531 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
532 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
533 };
534 uint8_t sha_256_expected[] = {
535 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
536 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
537 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
538 };
539 uint8_t sha_384_expected[] = {
540 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
541 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
542 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
543 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
544 };
545 uint8_t sha_512_expected[] = {
546 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
547 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
548 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
549 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
550 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
551 };
552
553 string key = make_string(key_data);
554
555 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
556 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
557 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
558 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
559}
560
561TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
562 string key = "Jefe";
563 string message = "what do ya want for nothing?";
564 uint8_t sha_224_expected[] = {
565 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
566 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
567 };
568 uint8_t sha_256_expected[] = {
569 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
570 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
571 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
572 };
573 uint8_t sha_384_expected[] = {
574 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
575 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
576 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
577 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
578 };
579 uint8_t sha_512_expected[] = {
580 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
581 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
582 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
583 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
584 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
585 };
586
587 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
588 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
589 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
590 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
591}
592
593TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
594 string key(20, 0xaa);
595 string message(50, 0xdd);
596 uint8_t sha_224_expected[] = {
597 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
598 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
599 };
600 uint8_t sha_256_expected[] = {
601 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
602 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
603 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
604 };
605 uint8_t sha_384_expected[] = {
606 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
607 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
608 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
609 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
610 };
611 uint8_t sha_512_expected[] = {
612 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
613 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
614 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
615 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
616 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
617 };
618
619 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
620 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
621 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
622 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
623}
624
625TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
626 uint8_t key_data[25] = {
627 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
628 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
629 };
630 string key = make_string(key_data);
631 string message(50, 0xcd);
632 uint8_t sha_224_expected[] = {
633 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
634 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
635 };
636 uint8_t sha_256_expected[] = {
637 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
638 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
639 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
640 };
641 uint8_t sha_384_expected[] = {
642 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
643 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
644 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
645 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
646 };
647 uint8_t sha_512_expected[] = {
648 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
649 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
650 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
651 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
652 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
653 };
654
655 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
656 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
657 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
658 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
659}
660
661TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
662 string key(20, 0x0c);
663 string message = "Test With Truncation";
664
665 uint8_t sha_224_expected[] = {
666 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
667 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
668 };
669 uint8_t sha_256_expected[] = {
670 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
671 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
672 };
673 uint8_t sha_384_expected[] = {
674 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
675 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
676 };
677 uint8_t sha_512_expected[] = {
678 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
679 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
680 };
681
682 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
683 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
684 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
685 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
686}
687
688TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
689 string key(131, 0xaa);
690 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
691
692 uint8_t sha_224_expected[] = {
693 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
694 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
695 };
696 uint8_t sha_256_expected[] = {
697 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
698 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
699 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
700 };
701 uint8_t sha_384_expected[] = {
702 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
703 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
704 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
705 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
706 };
707 uint8_t sha_512_expected[] = {
708 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
709 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
710 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
711 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
712 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
713 };
714
715 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
716 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
717 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
718 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
719}
720
721TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
722 string key(131, 0xaa);
723 string message = "This is a test using a larger than block-size key and a larger than "
724 "block-size data. The key needs to be hashed before being used by the HMAC "
725 "algorithm.";
726
727 uint8_t sha_224_expected[] = {
728 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
729 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
730 };
731 uint8_t sha_256_expected[] = {
732 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
733 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
734 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
735 };
736 uint8_t sha_384_expected[] = {
737 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
738 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
739 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
740 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
741 };
742 uint8_t sha_512_expected[] = {
743 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
744 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
745 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
746 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
747 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
748 };
749
750 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
751 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
752 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
753 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
754}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700755
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700756TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600757 ASSERT_EQ(KM_ERROR_OK,
758 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
759 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600760 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden09f25272015-04-15 13:49:49 -0600761 ASSERT_EQ(KM_ERROR_OK,
762 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
763 string message = "1234567890123456789012345678901";
764 string result;
765 size_t input_consumed;
766 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
767 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700768}
769
Shawn Willden61902362014-12-18 10:33:24 -0700770// TODO(swillden): Add more verification failure tests.
771
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700772typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600773TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600774 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
775 .RsaSigningKey(256, 3)
776 .Digest(KM_DIGEST_NONE)
777 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700778 string message = "12345678901234567890123456789012";
779 string signature;
780 SignMessage(message, &signature);
781 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600782}
783
Shawn Willden61902362014-12-18 10:33:24 -0700784TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
785 // Note that without padding, key size must exactly match digest size.
Shawn Willdenaf533992015-04-15 13:48:28 -0600786 GenerateKey(AuthorizationSetBuilder()
787 .RsaSigningKey(256, 3)
788 .Digest(KM_DIGEST_SHA_2_256)
789 .Padding(KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700790 string message(1024, 'a');
791 string signature;
792 SignMessage(message, &signature);
793 VerifyMessage(message, signature);
794}
795
Shawn Willdenf90f2352014-12-18 23:01:15 -0700796TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600797 GenerateKey(AuthorizationSetBuilder()
798 .RsaSigningKey(256, 3)
799 .Digest(KM_DIGEST_SHA_2_256)
800 .Padding(KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700801 string message(1024, 'a');
802 string signature;
803 SignMessage(message, &signature);
804 ++signature[signature.size() / 2];
805
806 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
807
808 string result;
809 size_t input_consumed;
810 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
811 EXPECT_EQ(message.size(), input_consumed);
812 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
813}
814
Shawn Willdenf90f2352014-12-18 23:01:15 -0700815TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600816 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
817 .RsaSigningKey(512, 3)
818 .Digest(KM_DIGEST_SHA_2_256)
819 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700820 // Use large message, which won't work without digesting.
821 string message(1024, 'a');
822 string signature;
823 SignMessage(message, &signature);
824 VerifyMessage(message, signature);
825}
826
827TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600828 GenerateKey(AuthorizationSetBuilder()
829 .RsaSigningKey(512, 3)
830 .Digest(KM_DIGEST_SHA_2_256)
831 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700832 string message(1024, 'a');
833 string signature;
834 SignMessage(message, &signature);
835 ++signature[signature.size() / 2];
836
837 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
838
839 string result;
840 size_t input_consumed;
841 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
842 EXPECT_EQ(message.size(), input_consumed);
843 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
844}
845
846TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600847 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
848 .RsaSigningKey(512, 3)
849 .Digest(KM_DIGEST_SHA_2_256)
850 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700851 // Use large message, which won't work without digesting.
852 string message(1024, 'a');
853 string signature;
854 SignMessage(message, &signature);
855 ++message[message.size() / 2];
856
857 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
858
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
Shawn Willdenf90f2352014-12-18 23:01:15 -0700866TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600867 GenerateKey(AuthorizationSetBuilder()
868 .RsaSigningKey(512, 3)
869 .Digest(KM_DIGEST_SHA_2_256)
870 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700871 string message(1024, 'a');
872 string signature;
873 SignMessage(message, &signature);
874 VerifyMessage(message, signature);
875}
876
877TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600878 GenerateKey(AuthorizationSetBuilder()
879 .RsaSigningKey(512, 3)
880 .Digest(KM_DIGEST_SHA_2_256)
881 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700882 string message(1024, 'a');
883 string signature;
884 SignMessage(message, &signature);
885 ++signature[signature.size() / 2];
886
887 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
888
889 string result;
890 size_t input_consumed;
891 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
892 EXPECT_EQ(message.size(), input_consumed);
893 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
894}
895
896TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600897 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
898 .RsaSigningKey(512, 3)
899 .Digest(KM_DIGEST_SHA_2_256)
900 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700901 // Use large message, which won't work without digesting.
902 string message(1024, 'a');
903 string signature;
904 SignMessage(message, &signature);
905 ++message[message.size() / 2];
906
907 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
908
909 string result;
910 size_t input_consumed;
911 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
912 EXPECT_EQ(message.size(), input_consumed);
913 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
914}
915
916template <typename T> vector<T> make_vector(const T* array, size_t len) {
917 return vector<T>(array, array + len);
918}
919
920TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
921 // Get all supported digests and padding modes.
922 size_t digests_len;
923 keymaster_digest_t* digests;
924 EXPECT_EQ(KM_ERROR_OK,
925 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
926 &digests_len));
927
928 size_t padding_modes_len;
929 keymaster_padding_t* padding_modes;
930 EXPECT_EQ(KM_ERROR_OK,
931 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
932 &padding_modes, &padding_modes_len));
933
934 // Try them.
935 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
936 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
937 // Compute key & message size that will work.
938 size_t key_bits = 256;
939 size_t message_len = 1000;
940 switch (digest) {
941 case KM_DIGEST_NONE:
942 switch (padding_mode) {
943 case KM_PAD_NONE:
944 // Match key size.
945 message_len = key_bits / 8;
946 break;
947 case KM_PAD_RSA_PKCS1_1_5_SIGN:
948 message_len = key_bits / 8 - 11;
949 break;
950 case KM_PAD_RSA_PSS:
951 // PSS requires a digest.
952 continue;
953 default:
954 FAIL() << "Missing padding";
955 break;
956 }
957 break;
958
959 case KM_DIGEST_SHA_2_256:
960 switch (padding_mode) {
961 case KM_PAD_NONE:
962 // Key size matches digest size
963 break;
964 case KM_PAD_RSA_PKCS1_1_5_SIGN:
965 key_bits += 8 * 11;
966 break;
967 case KM_PAD_RSA_PSS:
968 key_bits += 8 * 10;
969 break;
970 default:
971 FAIL() << "Missing padding";
972 break;
973 }
974 break;
975 default:
976 FAIL() << "Missing digest";
977 }
978
Shawn Willdenaf533992015-04-15 13:48:28 -0600979 GenerateKey(AuthorizationSetBuilder()
980 .RsaSigningKey(key_bits, 3)
981 .Digest(digest)
982 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700983 string message(message_len, 'a');
984 string signature;
985 SignMessage(message, &signature);
986 VerifyMessage(message, signature);
987 }
988 }
989
990 free(padding_modes);
991 free(digests);
992}
993
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600994TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600995 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600996 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700997 string message = "123456789012345678901234567890123456789012345678";
998 string signature;
999 SignMessage(message, &signature);
1000 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001001}
1002
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001003TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001004 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001005 string message = "123456789012345678901234567890123456789012345678";
1006 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -06001007 MacMessage(message, &signature, 160);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001008 VerifyMessage(message, signature);
1009}
1010
1011TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001012 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001013 string message = "123456789012345678901234567890123456789012345678";
1014 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -06001015 MacMessage(message, &signature, 224);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001016 VerifyMessage(message, signature);
1017}
1018
Shawn Willden0d560bf2014-12-15 17:44:02 -07001019TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001020 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001021 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001022 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -06001023 MacMessage(message, &signature, 256);
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001024 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001025}
1026
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001027TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001028 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001029 string message = "123456789012345678901234567890123456789012345678";
1030 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -06001031 MacMessage(message, &signature, 384);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001032 VerifyMessage(message, signature);
1033}
1034
1035TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001036 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001037 string message = "123456789012345678901234567890123456789012345678";
1038 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -06001039 MacMessage(message, &signature, 512);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001040 VerifyMessage(message, signature);
1041}
1042
Shawn Willden5b53c992015-02-02 08:05:25 -07001043typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001044TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001045 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1046 .RsaSigningKey(256, 3)
1047 .Digest(KM_DIGEST_NONE)
1048 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001049 string export_data;
1050 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001051 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001052
1053 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001054}
1055
Shawn Willdenf268d742014-08-19 15:36:26 -06001056TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001057 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001058 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001059 string export_data;
1060 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001061 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001062
1063 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001064}
1065
1066TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001067 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1068 .RsaSigningKey(256, 3)
1069 .Digest(KM_DIGEST_NONE)
1070 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001071 string export_data;
1072 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001073}
1074
1075TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001076 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1077 .RsaSigningKey(256, 3)
1078 .Digest(KM_DIGEST_NONE)
1079 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001080 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001081 string export_data;
1082 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001083}
1084
Shawn Willden7dad93b2015-02-05 10:20:47 -07001085TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001086 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001087 string export_data;
1088
1089 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1090 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1091 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1092}
1093
Shawn Willden437fbd12014-08-20 11:59:49 -06001094static string read_file(const string& file_name) {
1095 ifstream file_stream(file_name, std::ios::binary);
1096 istreambuf_iterator<char> file_begin(file_stream);
1097 istreambuf_iterator<char> file_end;
1098 return string(file_begin, file_end);
1099}
1100
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001101typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001102TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001103 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001104 ASSERT_EQ(633U, pk8_key.size());
1105
Shawn Willdenaf533992015-04-15 13:48:28 -06001106 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1107 .RsaSigningKey(1024, 65537)
1108 .Digest(KM_DIGEST_NONE)
1109 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001110 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001111
1112 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001113 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1114 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1115 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001116
1117 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001118 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1119 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001120
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001121 string message(1024 / 8, 'a');
1122 string signature;
1123 SignMessage(message, &signature);
1124 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001125}
1126
Shawn Willdend7a5c712015-04-09 16:33:52 -06001127TEST_F(ImportKeyTest, OldApiRsaSuccess) {
1128 string pk8_key = read_file("rsa_privkey_pk8.der");
1129 ASSERT_EQ(633U, pk8_key.size());
1130
1131 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1132 // point softkeymaster will no longer support keymaster0 APIs anyway.
1133 uint8_t* key_blob;
1134 size_t key_blob_length;
1135 ASSERT_EQ(0,
1136 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1137 pk8_key.size(), &key_blob, &key_blob_length));
1138 set_key_blob(key_blob, key_blob_length);
1139
1140 string message(1024 / 8, 'a');
1141 string signature;
1142 SignMessage(message, &signature, false /* use_client_params */);
1143 VerifyMessage(message, signature, false /* use_client_params */);
1144}
1145
Shawn Willden6bbe6782014-09-18 11:26:15 -06001146TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001147 string pk8_key = read_file("rsa_privkey_pk8.der");
1148 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001149 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001150 ImportKey(AuthorizationSetBuilder()
1151 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1152 .Digest(KM_DIGEST_NONE)
1153 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001154 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001155}
1156
1157TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001158 string pk8_key = read_file("rsa_privkey_pk8.der");
1159 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001160 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001161 ImportKey(AuthorizationSetBuilder()
1162 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1163 .Digest(KM_DIGEST_NONE)
1164 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001165 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001166}
1167
Shawn Willden81effc62014-08-27 10:08:46 -06001168TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001169 string pk8_key = read_file("ec_privkey_pk8.der");
1170 ASSERT_EQ(138U, pk8_key.size());
1171
Shawn Willdenaf533992015-04-15 13:48:28 -06001172 ASSERT_EQ(KM_ERROR_OK,
1173 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1174 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001175
1176 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001177 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001178 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001179
1180 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001181 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1182 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001183
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001184 string message(1024 / 8, 'a');
1185 string signature;
1186 SignMessage(message, &signature);
1187 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001188}
1189
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001190TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1191 string pk8_key = read_file("ec_privkey_pk8.der");
1192 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001193
Shawn Willdenaf533992015-04-15 13:48:28 -06001194 ASSERT_EQ(KM_ERROR_OK,
1195 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1196 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001197
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001198 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001199 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001200 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1201
1202 // And values provided by GoogleKeymaster
1203 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1204 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1205
1206 string message(1024 / 8, 'a');
1207 string signature;
1208 SignMessage(message, &signature);
1209 VerifyMessage(message, signature);
1210}
1211
1212TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1213 string pk8_key = read_file("ec_privkey_pk8.der");
1214 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001215 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001216 ImportKey(AuthorizationSetBuilder()
1217 .EcdsaSigningKey(224 /* Doesn't match key */)
1218 .Digest(KM_DIGEST_NONE),
1219 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001220}
1221
Shawn Willden3b702e22015-02-05 10:26:47 -07001222TEST_F(ImportKeyTest, AesKeySuccess) {
1223 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1224 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001225 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001226 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1227 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001228 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001229
1230 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1231 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1232
1233 string message = "Hello World!";
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001234 string ciphertext = EncryptMessage(message);
1235 string plaintext = DecryptMessage(ciphertext);
Shawn Willden3b702e22015-02-05 10:26:47 -07001236 EXPECT_EQ(message, plaintext);
1237}
1238
1239TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1240 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1241 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001242 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1243 .HmacKey(sizeof(key_data) * 8)
1244 .Digest(KM_DIGEST_SHA_2_256)
1245 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001246 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001247
1248 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1249 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1250
1251 string message = "Hello World!";
1252 string signature;
Shawn Willden09f25272015-04-15 13:49:49 -06001253 MacMessage(message, &signature, 32);
Shawn Willden3b702e22015-02-05 10:26:47 -07001254 VerifyMessage(message, signature);
1255}
1256
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001257typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001258TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001259 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1260 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001261
1262 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001263 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001264 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001265
Shawn Willden6dde87c2014-12-11 14:08:48 -07001266 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001267 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001268
1269 // OAEP randomizes padding so every result should be different.
1270 EXPECT_NE(ciphertext1, ciphertext2);
1271}
1272
1273TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001274 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1275 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001276 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001277 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001278 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001279
Shawn Willden6dde87c2014-12-11 14:08:48 -07001280 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001281 EXPECT_EQ(message, plaintext);
1282}
1283
1284TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001285 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1286 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001287 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001288 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001289 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001290
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001291 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1292 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001293 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001294 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001295}
1296
1297TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001298 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1299 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001300 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001301 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001302 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001303
1304 // Corrupt the ciphertext
1305 ciphertext[512 / 8 / 2]++;
1306
Shawn Willden4200f212014-12-02 07:01:21 -07001307 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001308 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001309 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1310 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001311 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001312 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001313}
1314
1315TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001316 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1317 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001318 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001319 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001320 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001321
Shawn Willden6dde87c2014-12-11 14:08:48 -07001322 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001323 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001324
1325 // PKCS1 v1.5 randomizes padding so every result should be different.
1326 EXPECT_NE(ciphertext1, ciphertext2);
1327}
1328
1329TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001330 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1331 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001332 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001333 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001334 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001335
Shawn Willden6dde87c2014-12-11 14:08:48 -07001336 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001337 EXPECT_EQ(message, plaintext);
1338}
1339
1340TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001341 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1342 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001343 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001344 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001345 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001346
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001347 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1348 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001349 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001350 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001351}
1352
1353TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001354 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1355 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001356 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001357 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001358 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001359
1360 // Corrupt the ciphertext
1361 ciphertext[512 / 8 / 2]++;
1362
Shawn Willden4200f212014-12-02 07:01:21 -07001363 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001364 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001365 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1366 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001367 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001368 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001369}
1370
Shawn Willdenedb79942015-05-08 06:46:44 -06001371TEST_F(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
1372 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1373 .RsaSigningKey(256, 3)
1374 .Digest(KM_DIGEST_NONE)
1375 .Padding(KM_PAD_NONE)));
1376 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1377 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1378}
1379
1380TEST_F(EncryptionOperationsTest, EcdsaEncrypt) {
1381 ASSERT_EQ(KM_ERROR_OK,
1382 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1383 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1384 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1385}
1386
1387TEST_F(EncryptionOperationsTest, HmacEncrypt) {
1388 ASSERT_EQ(
1389 KM_ERROR_OK,
1390 GenerateKey(
1391 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1392 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1393 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1394}
1395
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001396TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001397 ASSERT_EQ(KM_ERROR_OK,
1398 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1399 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001400 // Two-block message.
1401 string message = "12345678901234567890123456789012";
1402 string ciphertext1 = EncryptMessage(message);
1403 EXPECT_EQ(message.size(), ciphertext1.size());
1404
1405 string ciphertext2 = EncryptMessage(string(message));
1406 EXPECT_EQ(message.size(), ciphertext2.size());
1407
1408 // ECB is deterministic.
1409 EXPECT_EQ(ciphertext1, ciphertext2);
1410
1411 string plaintext = DecryptMessage(ciphertext1);
1412 EXPECT_EQ(message, plaintext);
1413}
1414
1415TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07001416 ASSERT_EQ(KM_ERROR_OK,
1417 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1418 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001419 // Message is slightly shorter than two blocks.
1420 string message = "1234567890123456789012345678901";
1421
1422 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1423 string ciphertext;
1424 size_t input_consumed;
1425 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1426 EXPECT_EQ(message.size(), input_consumed);
1427 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1428}
1429
1430TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001431 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001432 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001433 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1434 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001435
1436 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001437 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001438 string message(i, 'a');
1439 string ciphertext = EncryptMessage(message);
1440 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1441 string plaintext = DecryptMessage(ciphertext);
1442 EXPECT_EQ(message, plaintext);
1443 }
1444}
1445
1446TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001447 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001448 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001449 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1450 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001451
1452 string message = "a";
1453 string ciphertext = EncryptMessage(message);
Shawn Willdenc6096592015-03-17 15:53:14 -06001454 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001455 EXPECT_NE(ciphertext, message);
1456 ++ciphertext[ciphertext.size() / 2];
1457
1458 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1459 string plaintext;
1460 size_t input_consumed;
1461 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1462 EXPECT_EQ(ciphertext.size(), input_consumed);
1463 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1464}
1465
Thai Duong20d725d2015-03-24 17:49:58 -07001466TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
1467 ASSERT_EQ(KM_ERROR_OK,
1468 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1469 TAG_BLOCK_MODE, KM_MODE_CTR)));
1470 string message = "123";
1471 string iv1;
1472 string ciphertext1 = EncryptMessage(message, &iv1);
1473 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001474 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001475
1476 string iv2;
1477 string ciphertext2 = EncryptMessage(message, &iv2);
1478 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001479 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001480
1481 // IVs should be random, so ciphertexts should differ.
1482 EXPECT_NE(iv1, iv2);
1483 EXPECT_NE(ciphertext1, ciphertext2);
1484
1485 string plaintext = DecryptMessage(ciphertext1, iv1);
1486 EXPECT_EQ(message, plaintext);
1487}
1488
1489TEST_F(EncryptionOperationsTest, AesCtrIncremental) {
1490 ASSERT_EQ(KM_ERROR_OK,
1491 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1492 TAG_BLOCK_MODE, KM_MODE_CTR)));
1493
1494 int increment = 15;
1495 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001496 AuthorizationSet input_params(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001497 AuthorizationSet output_params;
1498 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1499
1500 string ciphertext;
1501 size_t input_consumed;
1502 for (size_t i = 0; i < message.size(); i += increment)
1503 EXPECT_EQ(KM_ERROR_OK,
1504 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1505 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1506 EXPECT_EQ(message.size(), ciphertext.size());
1507
1508 // Move TAG_NONCE into input_params
1509 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001510 input_params.push_back(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001511 output_params.Clear();
1512
1513 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1514 string plaintext;
1515 for (size_t i = 0; i < ciphertext.size(); i += increment)
1516 EXPECT_EQ(KM_ERROR_OK,
1517 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1518 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1519 EXPECT_EQ(ciphertext.size(), plaintext.size());
1520 EXPECT_EQ(message, plaintext);
1521}
1522
1523struct AesCtrSp80038aTestVector {
1524 const char* key;
1525 const char* nonce;
1526 const char* plaintext;
1527 const char* ciphertext;
1528};
1529
1530// These test vectors are taken from
1531// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1532static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1533 // AES-128
1534 {
1535 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1536 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1537 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1538 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1539 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1540 },
1541 // AES-192
1542 {
1543 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1544 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1545 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1546 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1547 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1548 },
1549 // AES-256
1550 {
1551 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1552 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1553 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1554 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1555 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1556 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1557 },
1558};
1559
1560TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
1561 for (size_t i = 0; i < 3; i++) {
1562 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1563 const string key = hex2str(test.key);
1564 const string nonce = hex2str(test.nonce);
1565 const string plaintext = hex2str(test.plaintext);
1566 const string ciphertext = hex2str(test.ciphertext);
1567 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1568 }
1569}
1570
1571TEST_F(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
1572 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1573 .AesEncryptionKey(128)
1574 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1575 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
1576
1577 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
1578}
1579
1580TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
1581 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1582 .AesEncryptionKey(128)
1583 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1584 .Authorization(TAG_CALLER_NONCE)));
1585
Shawn Willden09f25272015-04-15 13:49:49 -06001586 AuthorizationSet input_params(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001587 input_params.push_back(TAG_NONCE, "123", 3);
1588 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1589}
1590
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001591TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001592 ASSERT_EQ(KM_ERROR_OK,
1593 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1594 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001595 // Two-block message.
1596 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001597 string iv1;
1598 string ciphertext1 = EncryptMessage(message, &iv1);
1599 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001600
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001601 string iv2;
1602 string ciphertext2 = EncryptMessage(message, &iv2);
1603 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001604
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001605 // IVs should be random, so ciphertexts should differ.
1606 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001607 EXPECT_NE(ciphertext1, ciphertext2);
1608
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001609 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001610 EXPECT_EQ(message, plaintext);
1611}
1612
Shawn Willden969aa382015-04-15 17:05:53 -07001613TEST_F(EncryptionOperationsTest, AesCallerNonce) {
1614 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1615 .AesEncryptionKey(128)
1616 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1617 .Authorization(TAG_CALLER_NONCE)));
1618 string message = "12345678901234567890123456789012";
1619 string iv1;
1620 // Don't specify nonce, should get a random one.
1621 string ciphertext1 = EncryptMessage(message, &iv1);
1622 EXPECT_EQ(message.size(), ciphertext1.size());
1623 EXPECT_EQ(16U, iv1.size());
1624
1625 string plaintext = DecryptMessage(ciphertext1, iv1);
1626 EXPECT_EQ(message, plaintext);
1627
1628 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06001629 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001630 AuthorizationSet update_params;
1631 AuthorizationSet output_params;
1632 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
1633 string ciphertext2 =
1634 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
1635
1636 // Decrypt with correct nonce.
1637 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1638 &output_params);
1639 EXPECT_EQ(message, plaintext);
1640
1641 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06001642 input_params.Reinitialize(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001643 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
1644 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1645 &output_params);
1646 EXPECT_NE(message, plaintext);
1647}
1648
Shawn Willden67706352015-04-28 00:43:19 -06001649TEST_F(EncryptionOperationsTest, AesCallerNonceProhibited) {
1650 ASSERT_EQ(KM_ERROR_OK,
1651 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1652 TAG_BLOCK_MODE, KM_MODE_CBC)));
1653
1654 string message = "12345678901234567890123456789012";
1655 string iv1;
1656 // Don't specify nonce, should get a random one.
1657 string ciphertext1 = EncryptMessage(message, &iv1);
1658 EXPECT_EQ(message.size(), ciphertext1.size());
1659 EXPECT_EQ(16U, iv1.size());
1660
1661 string plaintext = DecryptMessage(ciphertext1, iv1);
1662 EXPECT_EQ(message, plaintext);
1663
1664 // Now specify a nonce, should fail.
1665 AuthorizationSet input_params(client_params());
1666 AuthorizationSet update_params;
1667 AuthorizationSet output_params;
1668 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
1669
1670 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
1671 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1672}
1673
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001674TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001675 ASSERT_EQ(KM_ERROR_OK,
1676 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1677 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001678
1679 int increment = 15;
1680 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001681 AuthorizationSet input_params(client_params());
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001682 AuthorizationSet output_params;
1683 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1684
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001685 string ciphertext;
1686 size_t input_consumed;
1687 for (size_t i = 0; i < message.size(); i += increment)
1688 EXPECT_EQ(KM_ERROR_OK,
1689 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1690 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001691 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001692
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001693 // Move TAG_NONCE into input_params
1694 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001695 input_params.push_back(client_params());
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001696 output_params.Clear();
1697
1698 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001699 string plaintext;
1700 for (size_t i = 0; i < ciphertext.size(); i += increment)
1701 EXPECT_EQ(KM_ERROR_OK,
1702 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1703 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001704 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001705 EXPECT_EQ(message, plaintext);
1706}
1707
1708TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001709 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001710 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001711 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1712 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001713
1714 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001715 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001716 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001717 string iv;
1718 string ciphertext = EncryptMessage(message, &iv);
1719 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1720 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001721 EXPECT_EQ(message, plaintext);
1722 }
1723}
1724
Shawn Willdencd695822015-01-26 14:06:32 -07001725typedef KeymasterTest AddEntropyTest;
1726TEST_F(AddEntropyTest, AddEntropy) {
1727 // There's no obvious way to test that entropy is actually added, but we can test that the API
1728 // doesn't blow up or return an error.
1729 EXPECT_EQ(KM_ERROR_OK,
1730 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1731}
1732
Shawn Willden5fad7852015-01-26 16:10:56 -07001733typedef KeymasterTest RescopingTest;
1734TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001735 ASSERT_EQ(KM_ERROR_OK,
1736 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1737 TAG_RESCOPING_ADD, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001738 // TODO(swillden): Add a better error code for this.
Shawn Willdenf01329d2015-03-11 21:51:38 -06001739 EXPECT_EQ(KM_ERROR_RESCOPABLE_KEY_NOT_USABLE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001740}
1741
1742TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07001743 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07001744 .AesEncryptionKey(128)
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001745 .EcbMode()
1746 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1747 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
1748 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1749 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001750
1751 keymaster_key_blob_t rescoped_blob;
1752 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001753 AuthorizationSet new_params =
1754 AuthorizationSetBuilder().AesKey(128).Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN).build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001755
1756 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1757 ASSERT_TRUE(rescoped_characteristics != NULL);
1758
Shawn Willdenc6096592015-03-17 15:53:14 -06001759 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001760 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1761 keymaster_free_characteristics(rescoped_characteristics);
1762 free(rescoped_characteristics);
1763 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1764
1765 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001766 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1767 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001768}
1769
1770TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07001771 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001772 .RsaEncryptionKey(256, 3)
1773 .Padding(KM_PAD_RSA_OAEP)
Shawn Willden2c242002015-02-27 07:01:02 -07001774 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1775 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001776 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1777 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1778 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1779 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
1780
1781 keymaster_key_blob_t rescoped_blob;
1782 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001783 AuthorizationSet new_params = AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001784 .RsaSigningKey(256, 3)
1785 .Digest(KM_DIGEST_SHA_2_256)
1786 .Padding(KM_PAD_RSA_PSS)
Shawn Willden2c242002015-02-27 07:01:02 -07001787 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001788
1789 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1790 ASSERT_TRUE(rescoped_characteristics != NULL);
1791
Shawn Willdenc6096592015-03-17 15:53:14 -06001792 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001793 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1794 keymaster_free_characteristics(rescoped_characteristics);
1795 free(rescoped_characteristics);
1796 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1797
1798 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1799 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1800 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1801 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
1802}
1803
1804// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
1805// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
1806// may not be changed.
1807
Shawn Willden128ffe02014-08-06 12:31:33 -06001808} // namespace test
1809} // namespace keymaster