blob: 4a409f4a353ebf98703c3a0abbb388b1462ef16b [file] [log] [blame]
Shawn Willden128ffe02014-08-06 12:31:33 -06001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Shawn Willden437fbd12014-08-20 11:59:49 -060017#include <fstream>
Shawn Willden76076ab2014-12-18 08:36:35 -070018#include <string>
19#include <vector>
Shawn Willden437fbd12014-08-20 11:59:49 -060020
Shawn Willden128ffe02014-08-06 12:31:33 -060021#include <openssl/engine.h>
22
Shawn Willdend7a5c712015-04-09 16:33:52 -060023#include <hardware/keymaster0.h>
24
Shawn Willden98d9b922014-08-26 08:14:10 -060025#include <keymaster/google_keymaster_utils.h>
26#include <keymaster/keymaster_tags.h>
Shawn Willdenb7510332015-02-06 19:58:29 -070027#include <keymaster/soft_keymaster_device.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060028
Shawn Willden76364712014-08-11 17:48:04 -060029#include "google_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060030
Shawn Willden437fbd12014-08-20 11:59:49 -060031using std::ifstream;
32using std::istreambuf_iterator;
Shawn Willden76076ab2014-12-18 08:36:35 -070033using std::string;
34using std::vector;
Shawn Willden437fbd12014-08-20 11:59:49 -060035
Shawn Willden63ac0432014-12-29 14:07:08 -070036template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
37 os << "{ ";
38 bool first = true;
39 for (T t : vec) {
40 os << (first ? "" : ", ") << t;
41 if (first)
42 first = false;
43 }
44 os << " }";
45 return os;
46}
47
Shawn Willden128ffe02014-08-06 12:31:33 -060048namespace keymaster {
49namespace test {
50
Shawn Willden567a4a02014-12-31 12:14:46 -070051StdoutLogger logger;
52
Shawn Willden95dda362015-02-27 10:58:37 -070053class KeymasterTest : public Keymaster1Test {
Shawn Willden128ffe02014-08-06 12:31:33 -060054 protected:
Shawn Willden95dda362015-02-27 10:58:37 -070055 KeymasterTest() {
56 SoftKeymasterDevice* device = new SoftKeymasterDevice;
57 init(device->keymaster_device());
Shawn Willden5b53c992015-02-02 08:05:25 -070058 }
Shawn Willden128ffe02014-08-06 12:31:33 -060059};
60
Shawn Willden128ffe02014-08-06 12:31:33 -060061typedef KeymasterTest CheckSupported;
62TEST_F(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -070063 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
64 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060065
Shawn Willden5b53c992015-02-02 08:05:25 -070066 size_t len;
67 keymaster_algorithm_t* algorithms;
68 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -070069 EXPECT_TRUE(ResponseContains(
Shawn Willden9c65b2b2015-04-07 17:01:10 -060070 {KM_ALGORITHM_RSA, KM_ALGORITHM_EC, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms, len));
Shawn Willden5b53c992015-02-02 08:05:25 -070071 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -060072}
73
74TEST_F(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070075 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
76 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
77 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060078
Shawn Willden5b53c992015-02-02 08:05:25 -070079 size_t len;
80 keymaster_block_mode_t* modes;
Shawn Willden63ac0432014-12-29 14:07:08 -070081 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
82 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -060083 EXPECT_EQ(0U, len);
Shawn Willden63ac0432014-12-29 14:07:08 -070084 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060085
Shawn Willden63ac0432014-12-29 14:07:08 -070086 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden9c65b2b2015-04-07 17:01:10 -060087 device()->get_supported_block_modes(device(), KM_ALGORITHM_EC, KM_PURPOSE_ENCRYPT,
Shawn Willden5b53c992015-02-02 08:05:25 -070088 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -060089
Shawn Willden63ac0432014-12-29 14:07:08 -070090 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
91 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc47c88f2015-04-07 17:23:27 -060092 EXPECT_TRUE(ResponseContains({KM_MODE_ECB, KM_MODE_CBC, KM_MODE_CTR}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -070093 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060094}
95
96TEST_F(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070097 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
98 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
99 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600100
Shawn Willden5b53c992015-02-02 08:05:25 -0700101 size_t len;
102 keymaster_padding_t* modes;
103 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
104 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700105 EXPECT_TRUE(
106 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700107 free(modes);
108
109 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
110 KM_PURPOSE_ENCRYPT, &modes, &len));
111 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700112 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600113
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600114 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700115 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600116 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700117 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700118
119 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
120 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
121 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600122}
123
124TEST_F(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700125 EXPECT_EQ(
126 KM_ERROR_OUTPUT_PARAMETER_NULL,
127 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600128
Shawn Willden5b53c992015-02-02 08:05:25 -0700129 size_t len;
130 keymaster_digest_t* digests;
131 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
132 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700133 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700134 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600135
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600136 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700137 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willdene998c132015-04-14 14:41:46 -0600138 EXPECT_TRUE(ResponseContains(KM_DIGEST_NONE, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700139 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600140
Shawn Willden63ac0432014-12-29 14:07:08 -0700141 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
142 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
143 &len));
144
145 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700146 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700147 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
148 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
149 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700150 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600151}
152
153TEST_F(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700154 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
155 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600156
Shawn Willden5b53c992015-02-02 08:05:25 -0700157 size_t len;
158 keymaster_key_format_t* formats;
159 EXPECT_EQ(KM_ERROR_OK,
160 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700161 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700162 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700163
164 EXPECT_EQ(KM_ERROR_OK,
165 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
166 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
167 free(formats);
168
169 EXPECT_EQ(KM_ERROR_OK,
170 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
171 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
172 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600173}
174
175TEST_F(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700176 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
177 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600178
Shawn Willden5b53c992015-02-02 08:05:25 -0700179 size_t len;
180 keymaster_key_format_t* formats;
181 EXPECT_EQ(KM_ERROR_OK,
182 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700183 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700184 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600185
Shawn Willden5b53c992015-02-02 08:05:25 -0700186 EXPECT_EQ(KM_ERROR_OK,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600187 device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700188 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700189 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600190
Shawn Willden5b53c992015-02-02 08:05:25 -0700191 EXPECT_EQ(KM_ERROR_OK,
192 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600193 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700194 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700195
196 EXPECT_EQ(KM_ERROR_OK,
197 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600198 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700199 free(formats);
200
201 EXPECT_EQ(KM_ERROR_OK,
202 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600203 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700204 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600205}
206
Shawn Willdend0772312014-09-18 12:27:57 -0600207class NewKeyGeneration : public KeymasterTest {
208 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700209 void CheckBaseParams() {
210 EXPECT_EQ(0U, hw_enforced().size());
211 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600212
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700213 AuthorizationSet auths = sw_enforced();
214 EXPECT_GT(auths.SerializedSize(), 12U);
215
Shawn Willden5b53c992015-02-02 08:05:25 -0700216 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
217 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
218 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600219 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700220 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600221
222 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700223 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
224 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
225 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600226
227 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700228 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
229 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
230 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600231
232 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600233 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700234 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600235 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700236};
237
Shawn Willden128ffe02014-08-06 12:31:33 -0600238TEST_F(NewKeyGeneration, Rsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600239 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
240 .RsaSigningKey(256, 3)
241 .Digest(KM_DIGEST_NONE)
242 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700243 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600244
Shawn Willden5b53c992015-02-02 08:05:25 -0700245 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700246 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700247 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
248 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
249 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600250}
251
Shawn Willden6bbe6782014-09-18 11:26:15 -0600252TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700253 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
254 GenerateKey(AuthorizationSetBuilder()
255 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
256 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
257 .SigningKey()));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600258}
259
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600260TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600261 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600262 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700263 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600264
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700265 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600266 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700267 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600268}
269
Shawn Willden6bbe6782014-09-18 11:26:15 -0600270TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600271 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600272 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700273 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600274
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700275 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600276 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600277
278 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700279 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600280}
281
282TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700283 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willdenaf533992015-04-15 13:48:28 -0600284 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600285}
286
287TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600288 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600289 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600290 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
291 KM_DIGEST_NONE)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700292 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600293 }
294}
295
Shawn Willden0d560bf2014-12-15 17:44:02 -0700296TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700297 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600298 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700299}
300
Shawn Willden76364712014-08-11 17:48:04 -0600301typedef KeymasterTest GetKeyCharacteristics;
302TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600303 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
304 .RsaSigningKey(256, 3)
305 .Digest(KM_DIGEST_NONE)
306 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700307 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600308
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700309 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
310 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600311}
312
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700313typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600314TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600315 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
316 .RsaSigningKey(256, 3)
317 .Digest(KM_DIGEST_NONE)
318 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700319 string message = "12345678901234567890123456789012";
320 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600321 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600322}
323
Shawn Willden61902362014-12-18 10:33:24 -0700324TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600325 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600326 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600327 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600328 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700329 string message(1024, 'a');
330 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600331 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700332}
333
334TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600335 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
336 .RsaSigningKey(512, 3)
337 .Digest(KM_DIGEST_SHA_2_256)
338 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700339 // Use large message, which won't work without digesting.
340 string message(1024, 'a');
341 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600342 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700343}
344
Shawn Willdenf90f2352014-12-18 23:01:15 -0700345TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600346 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
347 .RsaSigningKey(512, 3)
348 .Digest(KM_DIGEST_SHA_2_256)
349 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700350 string message(1024, 'a');
351 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600352 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700353}
354
355TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
356 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
357 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600358 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
359 .RsaSigningKey(256 + 9 * 8, 3)
360 .Digest(KM_DIGEST_SHA_2_256)
361 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700362 string message(1024, 'a');
363 string signature;
364
Shawn Willden226746b2015-05-08 11:36:56 -0600365 AuthorizationSet begin_params(client_params());
366 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600367 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600368 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700369
370 string result;
371 size_t input_consumed;
372 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
373 EXPECT_EQ(message.size(), input_consumed);
374 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
375}
376
Shawn Willden1615f2e2014-08-13 10:37:40 -0600377TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600378 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
379 .RsaSigningKey(256, 3)
380 .Digest(KM_DIGEST_NONE)
381 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600382 AuthorizationSet begin_params(client_params());
383 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600384 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600385 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700386 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
387 // Another abort should fail
388 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600389}
390
391TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600392 GenerateKey(AuthorizationSetBuilder()
393 .RsaSigningKey(256, 3)
394 .Digest(KM_DIGEST_MD5)
395 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700396 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600397}
398
399TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600400 GenerateKey(AuthorizationSetBuilder()
401 .RsaSigningKey(256, 3)
402 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
403 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600404 AuthorizationSet begin_params(client_params());
405 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
406 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600407}
408
409TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700410 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700411 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700412 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700413 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600414 GenerateKey(AuthorizationSetBuilder()
415 .RsaSigningKey(256, 3)
416 .Digest(KM_DIGEST_NONE)
417 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600418 AuthorizationSet begin_params(client_params());
419 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600420 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600421 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600422}
423
424TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700425 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600426 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
427 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600428 AuthorizationSet begin_params(client_params());
429 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
430 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600431}
432
Shawn Willdenedb79942015-05-08 06:46:44 -0600433TEST_F(SigningOperationsTest, RsaTooShortMessage) {
434 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
435 .RsaSigningKey(256, 3)
436 .Digest(KM_DIGEST_NONE)
437 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600438 AuthorizationSet begin_params(client_params());
439 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600440 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600441 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600442
443 string message = "1234567890123456789012345678901";
444 string result;
445 size_t input_consumed;
446 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
447 EXPECT_EQ(0U, result.size());
448 EXPECT_EQ(31U, input_consumed);
449
450 string signature;
451 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
452 EXPECT_EQ(0U, signature.length());
453}
454
455TEST_F(SigningOperationsTest, RsaSignWithEncryptionKey) {
456 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
457 .RsaEncryptionKey(256, 3)
458 .Digest(KM_DIGEST_NONE)
459 .Padding(KM_PAD_NONE)));
460 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
461 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
462}
463
464TEST_F(SigningOperationsTest, EcdsaSuccess) {
465 ASSERT_EQ(KM_ERROR_OK,
466 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
467 string message = "123456789012345678901234567890123456789012345678";
468 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600469 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willdenedb79942015-05-08 06:46:44 -0600470}
471
472TEST_F(SigningOperationsTest, AesEcbSign) {
473 ASSERT_EQ(KM_ERROR_OK,
474 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
475 TAG_BLOCK_MODE, KM_MODE_ECB)));
476 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
477 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
478}
479
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700480TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600481 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700482 string message = "12345678901234567890123456789012";
483 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600484 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600485 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700486}
487
Shawn Willden62c22862014-12-17 08:36:20 -0700488TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600489 ASSERT_EQ(KM_ERROR_OK,
490 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700491 string message = "12345678901234567890123456789012";
492 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600493 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600494 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700495}
496
Shawn Willden0d560bf2014-12-15 17:44:02 -0700497TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600498 ASSERT_EQ(KM_ERROR_OK,
499 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700500 string message = "12345678901234567890123456789012";
501 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600502 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600503 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700504}
505
Shawn Willden62c22862014-12-17 08:36:20 -0700506TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600507 ASSERT_EQ(KM_ERROR_OK,
508 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
509
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700510 string message = "12345678901234567890123456789012";
511 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600512 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600513 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700514}
515
516TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600517 ASSERT_EQ(KM_ERROR_OK,
518 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700519 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700520 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600521 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600522 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700523}
524
Shawn Willden09f25272015-04-15 13:49:49 -0600525TEST_F(SigningOperationsTest, HmacLengthInKey) {
526 // TODO(swillden): unified API should generate an error on key generation.
527 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
528 .HmacKey(128)
529 .Digest(KM_DIGEST_SHA_2_256)
530 .Authorization(TAG_MAC_LENGTH, 20)));
531 string message = "12345678901234567890123456789012";
532 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600533 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600534 // Size in key was ignored.
535 ASSERT_EQ(30U, signature.size());
536}
537
Shawn Willden3b702e22015-02-05 10:26:47 -0700538TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
539 uint8_t key_data[] = {
540 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
541 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
542 };
543 string message = "Hi There";
544 uint8_t sha_224_expected[] = {
545 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
546 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
547 };
548 uint8_t sha_256_expected[] = {
549 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
550 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
551 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
552 };
553 uint8_t sha_384_expected[] = {
554 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
555 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
556 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
557 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
558 };
559 uint8_t sha_512_expected[] = {
560 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
561 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
562 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
563 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
564 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
565 };
566
567 string key = make_string(key_data);
568
569 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
570 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
571 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
572 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
573}
574
575TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
576 string key = "Jefe";
577 string message = "what do ya want for nothing?";
578 uint8_t sha_224_expected[] = {
579 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
580 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
581 };
582 uint8_t sha_256_expected[] = {
583 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
584 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
585 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
586 };
587 uint8_t sha_384_expected[] = {
588 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
589 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
590 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
591 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
592 };
593 uint8_t sha_512_expected[] = {
594 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
595 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
596 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
597 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
598 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
599 };
600
601 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
602 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
603 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
604 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
605}
606
607TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
608 string key(20, 0xaa);
609 string message(50, 0xdd);
610 uint8_t sha_224_expected[] = {
611 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
612 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
613 };
614 uint8_t sha_256_expected[] = {
615 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
616 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
617 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
618 };
619 uint8_t sha_384_expected[] = {
620 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
621 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
622 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
623 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
624 };
625 uint8_t sha_512_expected[] = {
626 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
627 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
628 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
629 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
630 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
631 };
632
633 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
634 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
635 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
636 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
637}
638
639TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
640 uint8_t key_data[25] = {
641 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
642 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
643 };
644 string key = make_string(key_data);
645 string message(50, 0xcd);
646 uint8_t sha_224_expected[] = {
647 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
648 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
649 };
650 uint8_t sha_256_expected[] = {
651 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
652 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
653 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
654 };
655 uint8_t sha_384_expected[] = {
656 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
657 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
658 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
659 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
660 };
661 uint8_t sha_512_expected[] = {
662 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
663 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
664 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
665 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
666 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
667 };
668
669 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
670 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
671 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
672 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
673}
674
675TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
676 string key(20, 0x0c);
677 string message = "Test With Truncation";
678
679 uint8_t sha_224_expected[] = {
680 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
681 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
682 };
683 uint8_t sha_256_expected[] = {
684 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
685 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
686 };
687 uint8_t sha_384_expected[] = {
688 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
689 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
690 };
691 uint8_t sha_512_expected[] = {
692 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
693 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
694 };
695
696 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
697 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
698 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
699 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
700}
701
702TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
703 string key(131, 0xaa);
704 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
705
706 uint8_t sha_224_expected[] = {
707 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
708 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
709 };
710 uint8_t sha_256_expected[] = {
711 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
712 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
713 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
714 };
715 uint8_t sha_384_expected[] = {
716 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
717 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
718 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
719 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
720 };
721 uint8_t sha_512_expected[] = {
722 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
723 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
724 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
725 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
726 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
727 };
728
729 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
730 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
731 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
732 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
733}
734
735TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
736 string key(131, 0xaa);
737 string message = "This is a test using a larger than block-size key and a larger than "
738 "block-size data. The key needs to be hashed before being used by the HMAC "
739 "algorithm.";
740
741 uint8_t sha_224_expected[] = {
742 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
743 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
744 };
745 uint8_t sha_256_expected[] = {
746 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
747 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
748 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
749 };
750 uint8_t sha_384_expected[] = {
751 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
752 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
753 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
754 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
755 };
756 uint8_t sha_512_expected[] = {
757 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
758 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
759 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
760 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
761 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
762 };
763
764 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
765 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
766 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
767 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
768}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700769
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700770TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600771 ASSERT_EQ(KM_ERROR_OK,
772 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
773 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600774 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600775 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600776 ASSERT_EQ(KM_ERROR_OK,
777 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
778 string message = "1234567890123456789012345678901";
779 string result;
780 size_t input_consumed;
781 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
782 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700783}
784
Shawn Willden61902362014-12-18 10:33:24 -0700785// TODO(swillden): Add more verification failure tests.
786
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700787typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600788TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600789 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
790 .RsaSigningKey(256, 3)
791 .Digest(KM_DIGEST_NONE)
792 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700793 string message = "12345678901234567890123456789012";
794 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600795 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
796 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600797}
798
Shawn Willden61902362014-12-18 10:33:24 -0700799TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600800 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600801 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600802 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600803 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700804 string message(1024, 'a');
805 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600806 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
807 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700808}
809
Shawn Willdenf90f2352014-12-18 23:01:15 -0700810TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600811 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600812 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600813 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600814 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700815 string message(1024, 'a');
816 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600817 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700818 ++signature[signature.size() / 2];
819
Shawn Willden226746b2015-05-08 11:36:56 -0600820 AuthorizationSet begin_params(client_params());
821 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600822 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600823 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -0700824
825 string result;
826 size_t input_consumed;
827 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
828 EXPECT_EQ(message.size(), input_consumed);
829 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
830}
831
Shawn Willdenf90f2352014-12-18 23:01:15 -0700832TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600833 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
834 .RsaSigningKey(512, 3)
835 .Digest(KM_DIGEST_SHA_2_256)
836 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700837 // Use large message, which won't work without digesting.
838 string message(1024, 'a');
839 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600840 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
841 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700842}
843
844TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600845 GenerateKey(AuthorizationSetBuilder()
846 .RsaSigningKey(512, 3)
847 .Digest(KM_DIGEST_SHA_2_256)
848 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700849 string message(1024, 'a');
850 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600851 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700852 ++signature[signature.size() / 2];
853
Shawn Willden226746b2015-05-08 11:36:56 -0600854 AuthorizationSet begin_params(client_params());
855 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600856 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600857 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700858
859 string result;
860 size_t input_consumed;
861 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
862 EXPECT_EQ(message.size(), input_consumed);
863 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
864}
865
866TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600867 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
868 .RsaSigningKey(512, 3)
869 .Digest(KM_DIGEST_SHA_2_256)
870 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700871 // Use large message, which won't work without digesting.
872 string message(1024, 'a');
873 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600874 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700875 ++message[message.size() / 2];
876
Shawn Willden226746b2015-05-08 11:36:56 -0600877 AuthorizationSet begin_params(client_params());
878 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600879 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600880 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -0700881
882 string result;
883 size_t input_consumed;
884 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
885 EXPECT_EQ(message.size(), input_consumed);
886 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
887}
888
Shawn Willdenf90f2352014-12-18 23:01:15 -0700889TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600890 GenerateKey(AuthorizationSetBuilder()
891 .RsaSigningKey(512, 3)
892 .Digest(KM_DIGEST_SHA_2_256)
893 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700894 string message(1024, 'a');
895 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600896 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
897 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700898}
899
900TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600901 GenerateKey(AuthorizationSetBuilder()
902 .RsaSigningKey(512, 3)
903 .Digest(KM_DIGEST_SHA_2_256)
904 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700905 string message(1024, 'a');
906 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600907 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700908 ++signature[signature.size() / 2];
909
Shawn Willden226746b2015-05-08 11:36:56 -0600910 AuthorizationSet begin_params(client_params());
911 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600912 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -0600913 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700914
915 string result;
916 size_t input_consumed;
917 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
918 EXPECT_EQ(message.size(), input_consumed);
919 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
920}
921
922TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600923 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
924 .RsaSigningKey(512, 3)
925 .Digest(KM_DIGEST_SHA_2_256)
926 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700927 // Use large message, which won't work without digesting.
928 string message(1024, 'a');
929 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600930 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700931 ++message[message.size() / 2];
932
Shawn Willden226746b2015-05-08 11:36:56 -0600933 AuthorizationSet begin_params(client_params());
934 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600935 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -0600936 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700937
938 string result;
939 size_t input_consumed;
940 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
941 EXPECT_EQ(message.size(), input_consumed);
942 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
943}
944
945template <typename T> vector<T> make_vector(const T* array, size_t len) {
946 return vector<T>(array, array + len);
947}
948
949TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
950 // Get all supported digests and padding modes.
951 size_t digests_len;
952 keymaster_digest_t* digests;
953 EXPECT_EQ(KM_ERROR_OK,
954 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
955 &digests_len));
956
957 size_t padding_modes_len;
958 keymaster_padding_t* padding_modes;
959 EXPECT_EQ(KM_ERROR_OK,
960 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
961 &padding_modes, &padding_modes_len));
962
963 // Try them.
964 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
965 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
966 // Compute key & message size that will work.
967 size_t key_bits = 256;
968 size_t message_len = 1000;
969 switch (digest) {
970 case KM_DIGEST_NONE:
971 switch (padding_mode) {
972 case KM_PAD_NONE:
973 // Match key size.
974 message_len = key_bits / 8;
975 break;
976 case KM_PAD_RSA_PKCS1_1_5_SIGN:
977 message_len = key_bits / 8 - 11;
978 break;
979 case KM_PAD_RSA_PSS:
980 // PSS requires a digest.
981 continue;
982 default:
983 FAIL() << "Missing padding";
984 break;
985 }
986 break;
987
988 case KM_DIGEST_SHA_2_256:
989 switch (padding_mode) {
990 case KM_PAD_NONE:
Shawn Willden3ad5f052015-05-08 14:05:13 -0600991 // Digesting requires padding
992 continue;
Shawn Willdenf90f2352014-12-18 23:01:15 -0700993 case KM_PAD_RSA_PKCS1_1_5_SIGN:
994 key_bits += 8 * 11;
995 break;
996 case KM_PAD_RSA_PSS:
997 key_bits += 8 * 10;
998 break;
999 default:
1000 FAIL() << "Missing padding";
1001 break;
1002 }
1003 break;
1004 default:
1005 FAIL() << "Missing digest";
1006 }
1007
Shawn Willdenaf533992015-04-15 13:48:28 -06001008 GenerateKey(AuthorizationSetBuilder()
1009 .RsaSigningKey(key_bits, 3)
1010 .Digest(digest)
1011 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001012 string message(message_len, 'a');
1013 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001014 SignMessage(message, &signature, digest, padding_mode);
1015 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001016 }
1017 }
1018
1019 free(padding_modes);
1020 free(digests);
1021}
1022
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001023TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001024 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001025 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001026 string message = "123456789012345678901234567890123456789012345678";
1027 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001028 SignMessage(message, &signature, KM_DIGEST_NONE);
1029 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001030}
1031
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001032TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001033 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001034 string message = "123456789012345678901234567890123456789012345678";
1035 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001036 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1037 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001038}
1039
1040TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001041 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001042 string message = "123456789012345678901234567890123456789012345678";
1043 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001044 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1045 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001046}
1047
Shawn Willden0d560bf2014-12-15 17:44:02 -07001048TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001049 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001050 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001051 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001052 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1053 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001054}
1055
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001056TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001057 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001058 string message = "123456789012345678901234567890123456789012345678";
1059 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001060 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1061 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001062}
1063
1064TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001065 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001066 string message = "123456789012345678901234567890123456789012345678";
1067 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001068 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1069 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001070}
1071
Shawn Willden5b53c992015-02-02 08:05:25 -07001072typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001073TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001074 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1075 .RsaSigningKey(256, 3)
1076 .Digest(KM_DIGEST_NONE)
1077 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001078 string export_data;
1079 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001080 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001081
1082 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001083}
1084
Shawn Willdenf268d742014-08-19 15:36:26 -06001085TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001086 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001087 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001088 string export_data;
1089 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001090 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001091
1092 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001093}
1094
1095TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001096 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1097 .RsaSigningKey(256, 3)
1098 .Digest(KM_DIGEST_NONE)
1099 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001100 string export_data;
1101 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001102}
1103
1104TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001105 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1106 .RsaSigningKey(256, 3)
1107 .Digest(KM_DIGEST_NONE)
1108 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001109 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001110 string export_data;
1111 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001112}
1113
Shawn Willden7dad93b2015-02-05 10:20:47 -07001114TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001115 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001116 string export_data;
1117
1118 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1119 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1120 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1121}
1122
Shawn Willden437fbd12014-08-20 11:59:49 -06001123static string read_file(const string& file_name) {
1124 ifstream file_stream(file_name, std::ios::binary);
1125 istreambuf_iterator<char> file_begin(file_stream);
1126 istreambuf_iterator<char> file_end;
1127 return string(file_begin, file_end);
1128}
1129
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001130typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001131TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001132 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001133 ASSERT_EQ(633U, pk8_key.size());
1134
Shawn Willdenaf533992015-04-15 13:48:28 -06001135 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1136 .RsaSigningKey(1024, 65537)
1137 .Digest(KM_DIGEST_NONE)
1138 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001139 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001140
1141 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001142 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1143 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1144 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001145
1146 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001147 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1148 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001149
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001150 string message(1024 / 8, 'a');
1151 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001152 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1153 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden437fbd12014-08-20 11:59:49 -06001154}
1155
Shawn Willdend7a5c712015-04-09 16:33:52 -06001156TEST_F(ImportKeyTest, OldApiRsaSuccess) {
1157 string pk8_key = read_file("rsa_privkey_pk8.der");
1158 ASSERT_EQ(633U, pk8_key.size());
1159
1160 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1161 // point softkeymaster will no longer support keymaster0 APIs anyway.
1162 uint8_t* key_blob;
1163 size_t key_blob_length;
1164 ASSERT_EQ(0,
1165 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1166 pk8_key.size(), &key_blob, &key_blob_length));
1167 set_key_blob(key_blob, key_blob_length);
1168
1169 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001170 AuthorizationSet begin_params; // Don't use client data.
1171 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001172 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001173 AuthorizationSet update_params;
1174 AuthorizationSet output_params;
1175 string signature =
1176 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1177 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1178 &output_params);
Shawn Willdend7a5c712015-04-09 16:33:52 -06001179}
1180
Shawn Willden6bbe6782014-09-18 11:26:15 -06001181TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001182 string pk8_key = read_file("rsa_privkey_pk8.der");
1183 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001184 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001185 ImportKey(AuthorizationSetBuilder()
1186 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1187 .Digest(KM_DIGEST_NONE)
1188 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001189 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001190}
1191
1192TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001193 string pk8_key = read_file("rsa_privkey_pk8.der");
1194 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001195 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001196 ImportKey(AuthorizationSetBuilder()
1197 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1198 .Digest(KM_DIGEST_NONE)
1199 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001200 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001201}
1202
Shawn Willden81effc62014-08-27 10:08:46 -06001203TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001204 string pk8_key = read_file("ec_privkey_pk8.der");
1205 ASSERT_EQ(138U, pk8_key.size());
1206
Shawn Willdenaf533992015-04-15 13:48:28 -06001207 ASSERT_EQ(KM_ERROR_OK,
1208 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1209 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001210
1211 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001212 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001213 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001214
1215 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001216 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1217 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001218
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001219 string message(1024 / 8, 'a');
1220 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001221 SignMessage(message, &signature, KM_DIGEST_NONE);
1222 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden81effc62014-08-27 10:08:46 -06001223}
1224
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001225TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1226 string pk8_key = read_file("ec_privkey_pk8.der");
1227 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001228
Shawn Willdenaf533992015-04-15 13:48:28 -06001229 ASSERT_EQ(KM_ERROR_OK,
1230 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1231 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001232
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001233 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001234 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001235 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1236
1237 // And values provided by GoogleKeymaster
1238 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1239 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1240
1241 string message(1024 / 8, 'a');
1242 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001243 SignMessage(message, &signature, KM_DIGEST_NONE);
1244 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001245}
1246
1247TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1248 string pk8_key = read_file("ec_privkey_pk8.der");
1249 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001250 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001251 ImportKey(AuthorizationSetBuilder()
1252 .EcdsaSigningKey(224 /* Doesn't match key */)
1253 .Digest(KM_DIGEST_NONE),
1254 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001255}
1256
Shawn Willden3b702e22015-02-05 10:26:47 -07001257TEST_F(ImportKeyTest, AesKeySuccess) {
1258 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1259 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001260 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001261 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1262 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001263 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001264
1265 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1266 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1267
1268 string message = "Hello World!";
Shawn Willden31e063f2015-05-08 14:31:22 -06001269 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
1270 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willden3b702e22015-02-05 10:26:47 -07001271 EXPECT_EQ(message, plaintext);
1272}
1273
1274TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1275 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1276 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001277 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1278 .HmacKey(sizeof(key_data) * 8)
1279 .Digest(KM_DIGEST_SHA_2_256)
1280 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001281 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001282
1283 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1284 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1285
1286 string message = "Hello World!";
1287 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001288 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1289 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden3b702e22015-02-05 10:26:47 -07001290}
1291
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001292typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001293TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001294 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1295 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001296
1297 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001298 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001299 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001300
Shawn Willden3ad5f052015-05-08 14:05:13 -06001301 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001302 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001303
1304 // OAEP randomizes padding so every result should be different.
1305 EXPECT_NE(ciphertext1, ciphertext2);
1306}
1307
1308TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001309 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1310 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001311 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001312 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001313 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001314
Shawn Willden3ad5f052015-05-08 14:05:13 -06001315 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001316 EXPECT_EQ(message, plaintext);
1317}
1318
1319TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001320 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1321 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001322 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001323 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001324 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001325
Shawn Willden3ad5f052015-05-08 14:05:13 -06001326 AuthorizationSet begin_params(client_params());
1327 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1328 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001329 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001330 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001331 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001332}
1333
1334TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001335 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1336 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001337 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001338 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001339 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001340
1341 // Corrupt the ciphertext
1342 ciphertext[512 / 8 / 2]++;
1343
Shawn Willden4200f212014-12-02 07:01:21 -07001344 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001345 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001346 AuthorizationSet begin_params(client_params());
1347 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1348 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001349 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001350 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001351 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001352}
1353
1354TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001355 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1356 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001357 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001358 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001359 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001360
Shawn Willden3ad5f052015-05-08 14:05:13 -06001361 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001362 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001363
1364 // PKCS1 v1.5 randomizes padding so every result should be different.
1365 EXPECT_NE(ciphertext1, ciphertext2);
1366}
1367
1368TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001369 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1370 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001371 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001372 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001373 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001374
Shawn Willden3ad5f052015-05-08 14:05:13 -06001375 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001376 EXPECT_EQ(message, plaintext);
1377}
1378
1379TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001380 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1381 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001382 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001383 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001384 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001385
Shawn Willden3ad5f052015-05-08 14:05:13 -06001386 AuthorizationSet begin_params(client_params());
1387 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1388 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001389 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001390 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001391 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001392}
1393
1394TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001395 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1396 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001397 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001398 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001399 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001400
1401 // Corrupt the ciphertext
1402 ciphertext[512 / 8 / 2]++;
1403
Shawn Willden4200f212014-12-02 07:01:21 -07001404 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001405 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001406 AuthorizationSet begin_params(client_params());
1407 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1408 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001409 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001410 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001411 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001412}
1413
Shawn Willdenedb79942015-05-08 06:46:44 -06001414TEST_F(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
1415 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1416 .RsaSigningKey(256, 3)
1417 .Digest(KM_DIGEST_NONE)
1418 .Padding(KM_PAD_NONE)));
1419 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1420 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1421}
1422
1423TEST_F(EncryptionOperationsTest, EcdsaEncrypt) {
1424 ASSERT_EQ(KM_ERROR_OK,
1425 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1426 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1427 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1428}
1429
1430TEST_F(EncryptionOperationsTest, HmacEncrypt) {
1431 ASSERT_EQ(
1432 KM_ERROR_OK,
1433 GenerateKey(
1434 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1435 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1436 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1437}
1438
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001439TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001440 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1441 .AesEncryptionKey(128)
1442 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1443 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001444 // Two-block message.
1445 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001446 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001447 EXPECT_EQ(message.size(), ciphertext1.size());
1448
Shawn Willden31e063f2015-05-08 14:31:22 -06001449 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001450 EXPECT_EQ(message.size(), ciphertext2.size());
1451
1452 // ECB is deterministic.
1453 EXPECT_EQ(ciphertext1, ciphertext2);
1454
Shawn Willden31e063f2015-05-08 14:31:22 -06001455 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001456 EXPECT_EQ(message, plaintext);
1457}
1458
1459TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001460 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1461 .AesEncryptionKey(128)
1462 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1463 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001464 // Message is slightly shorter than two blocks.
1465 string message = "1234567890123456789012345678901";
1466
Shawn Willden31e063f2015-05-08 14:31:22 -06001467 AuthorizationSet begin_params(client_params());
1468 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
1469 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001470 string ciphertext;
1471 size_t input_consumed;
1472 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1473 EXPECT_EQ(message.size(), input_consumed);
1474 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1475}
1476
1477TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001478 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001479 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001480 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1481 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001482
1483 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001484 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001485 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001486 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001487 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001488 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001489 EXPECT_EQ(message, plaintext);
1490 }
1491}
1492
1493TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001494 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001495 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001496 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1497 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001498
1499 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001500 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001501 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001502 EXPECT_NE(ciphertext, message);
1503 ++ciphertext[ciphertext.size() / 2];
1504
Shawn Willden31e063f2015-05-08 14:31:22 -06001505 AuthorizationSet begin_params(client_params());
1506 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
1507 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001508 string plaintext;
1509 size_t input_consumed;
1510 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1511 EXPECT_EQ(ciphertext.size(), input_consumed);
1512 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1513}
1514
Thai Duong20d725d2015-03-24 17:49:58 -07001515TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001516 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1517 .AesEncryptionKey(128)
1518 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1519 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001520 string message = "123";
1521 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001522 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001523 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001524 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001525
1526 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001527 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001528 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001529 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001530
1531 // IVs should be random, so ciphertexts should differ.
1532 EXPECT_NE(iv1, iv2);
1533 EXPECT_NE(ciphertext1, ciphertext2);
1534
Shawn Willden31e063f2015-05-08 14:31:22 -06001535 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001536 EXPECT_EQ(message, plaintext);
1537}
1538
1539TEST_F(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001540 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1541 .AesEncryptionKey(128)
1542 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1543 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001544
1545 int increment = 15;
1546 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001547 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001548 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Thai Duong20d725d2015-03-24 17:49:58 -07001549 AuthorizationSet output_params;
1550 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1551
1552 string ciphertext;
1553 size_t input_consumed;
1554 for (size_t i = 0; i < message.size(); i += increment)
1555 EXPECT_EQ(KM_ERROR_OK,
1556 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1557 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1558 EXPECT_EQ(message.size(), ciphertext.size());
1559
1560 // Move TAG_NONCE into input_params
1561 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001562 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001563 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Thai Duong20d725d2015-03-24 17:49:58 -07001564 output_params.Clear();
1565
1566 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1567 string plaintext;
1568 for (size_t i = 0; i < ciphertext.size(); i += increment)
1569 EXPECT_EQ(KM_ERROR_OK,
1570 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1571 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1572 EXPECT_EQ(ciphertext.size(), plaintext.size());
1573 EXPECT_EQ(message, plaintext);
1574}
1575
1576struct AesCtrSp80038aTestVector {
1577 const char* key;
1578 const char* nonce;
1579 const char* plaintext;
1580 const char* ciphertext;
1581};
1582
1583// These test vectors are taken from
1584// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1585static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1586 // AES-128
1587 {
1588 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1589 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1590 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1591 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1592 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1593 },
1594 // AES-192
1595 {
1596 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1597 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1598 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1599 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1600 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1601 },
1602 // AES-256
1603 {
1604 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1605 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1606 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1607 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1608 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1609 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1610 },
1611};
1612
1613TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
1614 for (size_t i = 0; i < 3; i++) {
1615 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1616 const string key = hex2str(test.key);
1617 const string nonce = hex2str(test.nonce);
1618 const string plaintext = hex2str(test.plaintext);
1619 const string ciphertext = hex2str(test.ciphertext);
1620 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1621 }
1622}
1623
1624TEST_F(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
1625 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1626 .AesEncryptionKey(128)
1627 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1628 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06001629 AuthorizationSet begin_params(client_params());
1630 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
1631 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Thai Duong20d725d2015-03-24 17:49:58 -07001632}
1633
1634TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
1635 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1636 .AesEncryptionKey(128)
1637 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001638 .Authorization(TAG_CALLER_NONCE)
1639 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001640
Shawn Willden09f25272015-04-15 13:49:49 -06001641 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001642 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Thai Duong20d725d2015-03-24 17:49:58 -07001643 input_params.push_back(TAG_NONCE, "123", 3);
1644 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1645}
1646
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001647TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001648 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1649 .AesEncryptionKey(128)
1650 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1651 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001652 // Two-block message.
1653 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001654 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001655 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001656 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001657
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001658 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001659 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001660 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001661
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001662 // IVs should be random, so ciphertexts should differ.
1663 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001664 EXPECT_NE(ciphertext1, ciphertext2);
1665
Shawn Willden31e063f2015-05-08 14:31:22 -06001666 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001667 EXPECT_EQ(message, plaintext);
1668}
1669
Shawn Willden969aa382015-04-15 17:05:53 -07001670TEST_F(EncryptionOperationsTest, AesCallerNonce) {
1671 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1672 .AesEncryptionKey(128)
1673 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001674 .Authorization(TAG_CALLER_NONCE)
1675 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07001676 string message = "12345678901234567890123456789012";
1677 string iv1;
1678 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06001679 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07001680 EXPECT_EQ(message.size(), ciphertext1.size());
1681 EXPECT_EQ(16U, iv1.size());
1682
Shawn Willden31e063f2015-05-08 14:31:22 -06001683 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07001684 EXPECT_EQ(message, plaintext);
1685
1686 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06001687 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001688 AuthorizationSet update_params;
1689 AuthorizationSet output_params;
1690 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06001691 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willden969aa382015-04-15 17:05:53 -07001692 string ciphertext2 =
1693 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
1694
1695 // Decrypt with correct nonce.
1696 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1697 &output_params);
1698 EXPECT_EQ(message, plaintext);
1699
1700 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06001701 input_params.Reinitialize(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001702 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willden969aa382015-04-15 17:05:53 -07001703 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
1704 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1705 &output_params);
1706 EXPECT_NE(message, plaintext);
1707}
1708
Shawn Willden67706352015-04-28 00:43:19 -06001709TEST_F(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001710 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1711 .AesEncryptionKey(128)
1712 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1713 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06001714
1715 string message = "12345678901234567890123456789012";
1716 string iv1;
1717 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06001718 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06001719 EXPECT_EQ(message.size(), ciphertext1.size());
1720 EXPECT_EQ(16U, iv1.size());
1721
Shawn Willden31e063f2015-05-08 14:31:22 -06001722 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06001723 EXPECT_EQ(message, plaintext);
1724
1725 // Now specify a nonce, should fail.
1726 AuthorizationSet input_params(client_params());
1727 AuthorizationSet update_params;
1728 AuthorizationSet output_params;
1729 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06001730 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willden67706352015-04-28 00:43:19 -06001731
1732 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
1733 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1734}
1735
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001736TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001737 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1738 .AesEncryptionKey(128)
1739 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1740 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001741
1742 int increment = 15;
1743 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001744 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001745 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001746 AuthorizationSet output_params;
1747 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1748
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001749 string ciphertext;
1750 size_t input_consumed;
1751 for (size_t i = 0; i < message.size(); i += increment)
1752 EXPECT_EQ(KM_ERROR_OK,
1753 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1754 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001755 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001756
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001757 // Move TAG_NONCE into input_params
1758 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001759 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001760 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001761 output_params.Clear();
1762
1763 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001764 string plaintext;
1765 for (size_t i = 0; i < ciphertext.size(); i += increment)
1766 EXPECT_EQ(KM_ERROR_OK,
1767 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1768 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001769 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001770 EXPECT_EQ(message, plaintext);
1771}
1772
1773TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001774 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001775 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001776 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1777 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001778
1779 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001780 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001781 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001782 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06001783 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001784 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001785 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001786 EXPECT_EQ(message, plaintext);
1787 }
1788}
1789
Shawn Willdencd695822015-01-26 14:06:32 -07001790typedef KeymasterTest AddEntropyTest;
1791TEST_F(AddEntropyTest, AddEntropy) {
1792 // There's no obvious way to test that entropy is actually added, but we can test that the API
1793 // doesn't blow up or return an error.
1794 EXPECT_EQ(KM_ERROR_OK,
1795 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1796}
1797
Shawn Willden5fad7852015-01-26 16:10:56 -07001798typedef KeymasterTest RescopingTest;
1799TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001800 ASSERT_EQ(KM_ERROR_OK,
1801 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1802 TAG_RESCOPING_ADD, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001803 // TODO(swillden): Add a better error code for this.
Shawn Willdenf01329d2015-03-11 21:51:38 -06001804 EXPECT_EQ(KM_ERROR_RESCOPABLE_KEY_NOT_USABLE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001805}
1806
1807TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07001808 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07001809 .AesEncryptionKey(128)
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001810 .EcbMode()
1811 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1812 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
1813 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1814 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001815
1816 keymaster_key_blob_t rescoped_blob;
1817 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001818 AuthorizationSet new_params =
1819 AuthorizationSetBuilder().AesKey(128).Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN).build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001820
1821 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1822 ASSERT_TRUE(rescoped_characteristics != NULL);
1823
Shawn Willdenc6096592015-03-17 15:53:14 -06001824 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001825 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1826 keymaster_free_characteristics(rescoped_characteristics);
1827 free(rescoped_characteristics);
1828 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1829
1830 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001831 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1832 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001833}
1834
1835TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07001836 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001837 .RsaEncryptionKey(256, 3)
1838 .Padding(KM_PAD_RSA_OAEP)
Shawn Willden2c242002015-02-27 07:01:02 -07001839 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1840 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001841 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1842 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1843 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1844 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
1845
1846 keymaster_key_blob_t rescoped_blob;
1847 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001848 AuthorizationSet new_params = AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001849 .RsaSigningKey(256, 3)
1850 .Digest(KM_DIGEST_SHA_2_256)
1851 .Padding(KM_PAD_RSA_PSS)
Shawn Willden2c242002015-02-27 07:01:02 -07001852 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001853
1854 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1855 ASSERT_TRUE(rescoped_characteristics != NULL);
1856
Shawn Willdenc6096592015-03-17 15:53:14 -06001857 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001858 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1859 keymaster_free_characteristics(rescoped_characteristics);
1860 free(rescoped_characteristics);
1861 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1862
1863 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1864 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1865 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1866 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
1867}
1868
1869// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
1870// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
1871// may not be changed.
1872
Shawn Willden128ffe02014-08-06 12:31:33 -06001873} // namespace test
1874} // namespace keymaster