blob: da3c7fccb8d0f7e58b9dff0054075ed69570179d [file] [log] [blame]
Shawn Willden128ffe02014-08-06 12:31:33 -06001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Shawn Willden437fbd12014-08-20 11:59:49 -060017#include <fstream>
Shawn Willden76076ab2014-12-18 08:36:35 -070018#include <string>
19#include <vector>
Shawn Willden437fbd12014-08-20 11:59:49 -060020
Shawn Willden128ffe02014-08-06 12:31:33 -060021#include <openssl/engine.h>
22
Shawn Willdend7a5c712015-04-09 16:33:52 -060023#include <hardware/keymaster0.h>
24
Shawn Willden98d9b922014-08-26 08:14:10 -060025#include <keymaster/google_keymaster_utils.h>
26#include <keymaster/keymaster_tags.h>
Shawn Willdenb7510332015-02-06 19:58:29 -070027#include <keymaster/soft_keymaster_device.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060028
Shawn Willden76364712014-08-11 17:48:04 -060029#include "google_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060030
Shawn Willden437fbd12014-08-20 11:59:49 -060031using std::ifstream;
32using std::istreambuf_iterator;
Shawn Willden76076ab2014-12-18 08:36:35 -070033using std::string;
34using std::vector;
Shawn Willden437fbd12014-08-20 11:59:49 -060035
Shawn Willden63ac0432014-12-29 14:07:08 -070036template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
37 os << "{ ";
38 bool first = true;
39 for (T t : vec) {
40 os << (first ? "" : ", ") << t;
41 if (first)
42 first = false;
43 }
44 os << " }";
45 return os;
46}
47
Shawn Willden128ffe02014-08-06 12:31:33 -060048namespace keymaster {
49namespace test {
50
Shawn Willden567a4a02014-12-31 12:14:46 -070051StdoutLogger logger;
52
Shawn Willden95dda362015-02-27 10:58:37 -070053class KeymasterTest : public Keymaster1Test {
Shawn Willden128ffe02014-08-06 12:31:33 -060054 protected:
Shawn Willden95dda362015-02-27 10:58:37 -070055 KeymasterTest() {
56 SoftKeymasterDevice* device = new SoftKeymasterDevice;
57 init(device->keymaster_device());
Shawn Willden5b53c992015-02-02 08:05:25 -070058 }
Shawn Willden128ffe02014-08-06 12:31:33 -060059};
60
Shawn Willden128ffe02014-08-06 12:31:33 -060061typedef KeymasterTest CheckSupported;
62TEST_F(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -070063 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
64 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060065
Shawn Willden5b53c992015-02-02 08:05:25 -070066 size_t len;
67 keymaster_algorithm_t* algorithms;
68 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -070069 EXPECT_TRUE(ResponseContains(
Shawn Willden9c65b2b2015-04-07 17:01:10 -060070 {KM_ALGORITHM_RSA, KM_ALGORITHM_EC, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms, len));
Shawn Willden5b53c992015-02-02 08:05:25 -070071 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -060072}
73
74TEST_F(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070075 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
76 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
77 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060078
Shawn Willden5b53c992015-02-02 08:05:25 -070079 size_t len;
80 keymaster_block_mode_t* modes;
Shawn Willden63ac0432014-12-29 14:07:08 -070081 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
82 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -060083 EXPECT_EQ(0U, len);
Shawn Willden63ac0432014-12-29 14:07:08 -070084 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060085
Shawn Willden63ac0432014-12-29 14:07:08 -070086 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden9c65b2b2015-04-07 17:01:10 -060087 device()->get_supported_block_modes(device(), KM_ALGORITHM_EC, KM_PURPOSE_ENCRYPT,
Shawn Willden5b53c992015-02-02 08:05:25 -070088 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -060089
Shawn Willden63ac0432014-12-29 14:07:08 -070090 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
91 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc47c88f2015-04-07 17:23:27 -060092 EXPECT_TRUE(ResponseContains({KM_MODE_ECB, KM_MODE_CBC, KM_MODE_CTR}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -070093 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060094}
95
96TEST_F(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070097 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
98 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
99 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600100
Shawn Willden5b53c992015-02-02 08:05:25 -0700101 size_t len;
102 keymaster_padding_t* modes;
103 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
104 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700105 EXPECT_TRUE(
106 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700107 free(modes);
108
109 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
110 KM_PURPOSE_ENCRYPT, &modes, &len));
111 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700112 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600113
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600114 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700115 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600116 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700117 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700118
119 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
120 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
121 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600122}
123
124TEST_F(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700125 EXPECT_EQ(
126 KM_ERROR_OUTPUT_PARAMETER_NULL,
127 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600128
Shawn Willden5b53c992015-02-02 08:05:25 -0700129 size_t len;
130 keymaster_digest_t* digests;
131 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
132 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700133 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700134 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600135
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600136 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700137 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willdene998c132015-04-14 14:41:46 -0600138 EXPECT_TRUE(ResponseContains(KM_DIGEST_NONE, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700139 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600140
Shawn Willden63ac0432014-12-29 14:07:08 -0700141 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
142 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
143 &len));
144
145 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700146 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700147 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
148 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
149 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700150 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600151}
152
153TEST_F(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700154 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
155 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600156
Shawn Willden5b53c992015-02-02 08:05:25 -0700157 size_t len;
158 keymaster_key_format_t* formats;
159 EXPECT_EQ(KM_ERROR_OK,
160 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700161 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700162 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700163
164 EXPECT_EQ(KM_ERROR_OK,
165 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
166 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
167 free(formats);
168
169 EXPECT_EQ(KM_ERROR_OK,
170 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
171 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
172 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600173}
174
175TEST_F(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700176 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
177 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600178
Shawn Willden5b53c992015-02-02 08:05:25 -0700179 size_t len;
180 keymaster_key_format_t* formats;
181 EXPECT_EQ(KM_ERROR_OK,
182 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700183 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700184 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600185
Shawn Willden5b53c992015-02-02 08:05:25 -0700186 EXPECT_EQ(KM_ERROR_OK,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600187 device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700188 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700189 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600190
Shawn Willden5b53c992015-02-02 08:05:25 -0700191 EXPECT_EQ(KM_ERROR_OK,
192 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600193 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700194 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700195
196 EXPECT_EQ(KM_ERROR_OK,
197 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600198 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700199 free(formats);
200
201 EXPECT_EQ(KM_ERROR_OK,
202 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600203 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700204 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600205}
206
Shawn Willdend0772312014-09-18 12:27:57 -0600207class NewKeyGeneration : public KeymasterTest {
208 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700209 void CheckBaseParams() {
210 EXPECT_EQ(0U, hw_enforced().size());
211 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600212
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700213 AuthorizationSet auths = sw_enforced();
214 EXPECT_GT(auths.SerializedSize(), 12U);
215
Shawn Willden5b53c992015-02-02 08:05:25 -0700216 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
217 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
218 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600219 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700220 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600221
222 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700223 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
224 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
225 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600226
227 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700228 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
229 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
230 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600231
232 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600233 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700234 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600235 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700236};
237
Shawn Willden128ffe02014-08-06 12:31:33 -0600238TEST_F(NewKeyGeneration, Rsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600239 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
240 .RsaSigningKey(256, 3)
241 .Digest(KM_DIGEST_NONE)
242 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700243 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600244
Shawn Willden5b53c992015-02-02 08:05:25 -0700245 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700246 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700247 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
248 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
249 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600250}
251
Shawn Willden6bbe6782014-09-18 11:26:15 -0600252TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700253 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
254 GenerateKey(AuthorizationSetBuilder()
255 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
256 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
257 .SigningKey()));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600258}
259
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600260TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600261 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600262 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700263 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600264
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700265 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600266 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700267 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600268}
269
Shawn Willden6bbe6782014-09-18 11:26:15 -0600270TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600271 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600272 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700273 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600274
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700275 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600276 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600277
278 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700279 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600280}
281
282TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700283 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willdenaf533992015-04-15 13:48:28 -0600284 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600285}
286
287TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600288 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600289 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600290 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
291 KM_DIGEST_NONE)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700292 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600293 }
294}
295
Shawn Willden0d560bf2014-12-15 17:44:02 -0700296TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700297 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600298 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700299}
300
Shawn Willden76364712014-08-11 17:48:04 -0600301typedef KeymasterTest GetKeyCharacteristics;
302TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600303 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
304 .RsaSigningKey(256, 3)
305 .Digest(KM_DIGEST_NONE)
306 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700307 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600308
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700309 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
310 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600311}
312
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700313typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600314TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600315 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
316 .RsaSigningKey(256, 3)
317 .Digest(KM_DIGEST_NONE)
318 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700319 string message = "12345678901234567890123456789012";
320 string signature;
321 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600322}
323
Shawn Willden61902362014-12-18 10:33:24 -0700324TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
325 // Note that without padding, key size must exactly match digest size.
Shawn Willdenaf533992015-04-15 13:48:28 -0600326 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
327 .RsaSigningKey(256, 3)
328 .Digest(KM_DIGEST_SHA_2_256)
329 .Padding(KM_PAD_NONE)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700330 string message(1024, 'a');
331 string signature;
332 SignMessage(message, &signature);
333}
334
335TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600336 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
337 .RsaSigningKey(512, 3)
338 .Digest(KM_DIGEST_SHA_2_256)
339 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700340 // Use large message, which won't work without digesting.
341 string message(1024, 'a');
342 string signature;
343 SignMessage(message, &signature);
344}
345
Shawn Willdenf90f2352014-12-18 23:01:15 -0700346TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600347 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
348 .RsaSigningKey(512, 3)
349 .Digest(KM_DIGEST_SHA_2_256)
350 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700351 string message(1024, 'a');
352 string signature;
353 SignMessage(message, &signature);
354}
355
356TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
357 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
358 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600359 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
360 .RsaSigningKey(256 + 9 * 8, 3)
361 .Digest(KM_DIGEST_SHA_2_256)
362 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700363 string message(1024, 'a');
364 string signature;
365
366 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
367
368 string result;
369 size_t input_consumed;
370 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
371 EXPECT_EQ(message.size(), input_consumed);
372 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
373}
374
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600375TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600376 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600377 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700378 string message = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700379 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700380 SignMessage(message, &signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600381}
382
Shawn Willden1615f2e2014-08-13 10:37:40 -0600383TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600384 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
385 .RsaSigningKey(256, 3)
386 .Digest(KM_DIGEST_NONE)
387 .Padding(KM_PAD_NONE)));
Shawn Willdendfa1c032015-02-07 00:39:01 -0700388 AuthorizationSet input_params, output_params;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700389 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
390 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
391 // Another abort should fail
392 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600393}
394
395TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600396 GenerateKey(AuthorizationSetBuilder()
397 .RsaSigningKey(256, 3)
398 .Digest(KM_DIGEST_MD5)
399 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700400 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600401}
402
403TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600404 GenerateKey(AuthorizationSetBuilder()
405 .RsaSigningKey(256, 3)
406 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
407 .Padding(KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700408 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600409}
410
411TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700412 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700413 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700414 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700415 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600416 GenerateKey(AuthorizationSetBuilder()
417 .RsaSigningKey(256, 3)
418 .Digest(KM_DIGEST_NONE)
419 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700420 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600421}
422
423TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700424 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600425 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
426 KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700427 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600428}
429
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700430TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600431 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700432 string message = "12345678901234567890123456789012";
433 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600434 MacMessage(message, &signature, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600435 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700436}
437
Shawn Willden62c22862014-12-17 08:36:20 -0700438TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600439 ASSERT_EQ(KM_ERROR_OK,
440 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700441 string message = "12345678901234567890123456789012";
442 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600443 MacMessage(message, &signature, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600444 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700445}
446
Shawn Willden0d560bf2014-12-15 17:44:02 -0700447TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600448 ASSERT_EQ(KM_ERROR_OK,
449 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700450 string message = "12345678901234567890123456789012";
451 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600452 MacMessage(message, &signature, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600453 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700454}
455
Shawn Willden62c22862014-12-17 08:36:20 -0700456TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600457 ASSERT_EQ(KM_ERROR_OK,
458 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
459
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700460 string message = "12345678901234567890123456789012";
461 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600462 MacMessage(message, &signature, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600463 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700464}
465
466TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600467 ASSERT_EQ(KM_ERROR_OK,
468 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700469 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700470 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600471 MacMessage(message, &signature, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600472 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700473}
474
Shawn Willden09f25272015-04-15 13:49:49 -0600475TEST_F(SigningOperationsTest, HmacLengthInKey) {
476 // TODO(swillden): unified API should generate an error on key generation.
477 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
478 .HmacKey(128)
479 .Digest(KM_DIGEST_SHA_2_256)
480 .Authorization(TAG_MAC_LENGTH, 20)));
481 string message = "12345678901234567890123456789012";
482 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600483 MacMessage(message, &signature, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600484 // Size in key was ignored.
485 ASSERT_EQ(30U, signature.size());
486}
487
Shawn Willden3b702e22015-02-05 10:26:47 -0700488TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
489 uint8_t key_data[] = {
490 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
491 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
492 };
493 string message = "Hi There";
494 uint8_t sha_224_expected[] = {
495 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
496 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
497 };
498 uint8_t sha_256_expected[] = {
499 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
500 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
501 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
502 };
503 uint8_t sha_384_expected[] = {
504 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
505 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
506 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
507 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
508 };
509 uint8_t sha_512_expected[] = {
510 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
511 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
512 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
513 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
514 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
515 };
516
517 string key = make_string(key_data);
518
519 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
520 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
521 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
522 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
523}
524
525TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
526 string key = "Jefe";
527 string message = "what do ya want for nothing?";
528 uint8_t sha_224_expected[] = {
529 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
530 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
531 };
532 uint8_t sha_256_expected[] = {
533 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
534 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
535 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
536 };
537 uint8_t sha_384_expected[] = {
538 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
539 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
540 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
541 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
542 };
543 uint8_t sha_512_expected[] = {
544 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
545 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
546 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
547 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
548 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
549 };
550
551 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
552 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
553 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
554 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
555}
556
557TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
558 string key(20, 0xaa);
559 string message(50, 0xdd);
560 uint8_t sha_224_expected[] = {
561 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
562 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
563 };
564 uint8_t sha_256_expected[] = {
565 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
566 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
567 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
568 };
569 uint8_t sha_384_expected[] = {
570 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
571 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
572 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
573 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
574 };
575 uint8_t sha_512_expected[] = {
576 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
577 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
578 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
579 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
580 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
581 };
582
583 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
584 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
585 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
586 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
587}
588
589TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
590 uint8_t key_data[25] = {
591 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
592 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
593 };
594 string key = make_string(key_data);
595 string message(50, 0xcd);
596 uint8_t sha_224_expected[] = {
597 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
598 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
599 };
600 uint8_t sha_256_expected[] = {
601 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
602 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
603 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
604 };
605 uint8_t sha_384_expected[] = {
606 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
607 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
608 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
609 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
610 };
611 uint8_t sha_512_expected[] = {
612 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
613 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
614 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
615 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
616 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
617 };
618
619 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
620 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
621 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
622 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
623}
624
625TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
626 string key(20, 0x0c);
627 string message = "Test With Truncation";
628
629 uint8_t sha_224_expected[] = {
630 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
631 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
632 };
633 uint8_t sha_256_expected[] = {
634 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
635 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
636 };
637 uint8_t sha_384_expected[] = {
638 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
639 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
640 };
641 uint8_t sha_512_expected[] = {
642 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
643 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
644 };
645
646 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
647 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
648 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
649 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
650}
651
652TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
653 string key(131, 0xaa);
654 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
655
656 uint8_t sha_224_expected[] = {
657 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
658 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
659 };
660 uint8_t sha_256_expected[] = {
661 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
662 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
663 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
664 };
665 uint8_t sha_384_expected[] = {
666 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
667 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
668 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
669 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
670 };
671 uint8_t sha_512_expected[] = {
672 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
673 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
674 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
675 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
676 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
677 };
678
679 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
680 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
681 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
682 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
683}
684
685TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
686 string key(131, 0xaa);
687 string message = "This is a test using a larger than block-size key and a larger than "
688 "block-size data. The key needs to be hashed before being used by the HMAC "
689 "algorithm.";
690
691 uint8_t sha_224_expected[] = {
692 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
693 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
694 };
695 uint8_t sha_256_expected[] = {
696 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
697 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
698 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
699 };
700 uint8_t sha_384_expected[] = {
701 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
702 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
703 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
704 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
705 };
706 uint8_t sha_512_expected[] = {
707 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
708 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
709 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
710 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
711 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
712 };
713
714 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
715 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
716 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
717 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
718}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700719
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700720TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600721 ASSERT_EQ(KM_ERROR_OK,
722 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
723 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600724 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden09f25272015-04-15 13:49:49 -0600725 ASSERT_EQ(KM_ERROR_OK,
726 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
727 string message = "1234567890123456789012345678901";
728 string result;
729 size_t input_consumed;
730 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
731 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700732}
733
Shawn Willden1615f2e2014-08-13 10:37:40 -0600734TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600735 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
736 .RsaSigningKey(256, 3)
737 .Digest(KM_DIGEST_NONE)
738 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700739 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700740
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700741 string message = "1234567890123456789012345678901";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700742 string result;
743 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700744 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700745 EXPECT_EQ(0U, result.size());
746 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600747
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700748 string signature;
749 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
750 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -0600751}
752
Shawn Willden61902362014-12-18 10:33:24 -0700753// TODO(swillden): Add more verification failure tests.
754
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700755typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600756TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600757 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
758 .RsaSigningKey(256, 3)
759 .Digest(KM_DIGEST_NONE)
760 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700761 string message = "12345678901234567890123456789012";
762 string signature;
763 SignMessage(message, &signature);
764 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600765}
766
Shawn Willden61902362014-12-18 10:33:24 -0700767TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
768 // Note that without padding, key size must exactly match digest size.
Shawn Willdenaf533992015-04-15 13:48:28 -0600769 GenerateKey(AuthorizationSetBuilder()
770 .RsaSigningKey(256, 3)
771 .Digest(KM_DIGEST_SHA_2_256)
772 .Padding(KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700773 string message(1024, 'a');
774 string signature;
775 SignMessage(message, &signature);
776 VerifyMessage(message, signature);
777}
778
Shawn Willdenf90f2352014-12-18 23:01:15 -0700779TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600780 GenerateKey(AuthorizationSetBuilder()
781 .RsaSigningKey(256, 3)
782 .Digest(KM_DIGEST_SHA_2_256)
783 .Padding(KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700784 string message(1024, 'a');
785 string signature;
786 SignMessage(message, &signature);
787 ++signature[signature.size() / 2];
788
789 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
790
791 string result;
792 size_t input_consumed;
793 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
794 EXPECT_EQ(message.size(), input_consumed);
795 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
796}
797
Shawn Willdenf90f2352014-12-18 23:01:15 -0700798TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600799 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
800 .RsaSigningKey(512, 3)
801 .Digest(KM_DIGEST_SHA_2_256)
802 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700803 // Use large message, which won't work without digesting.
804 string message(1024, 'a');
805 string signature;
806 SignMessage(message, &signature);
807 VerifyMessage(message, signature);
808}
809
810TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600811 GenerateKey(AuthorizationSetBuilder()
812 .RsaSigningKey(512, 3)
813 .Digest(KM_DIGEST_SHA_2_256)
814 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700815 string message(1024, 'a');
816 string signature;
817 SignMessage(message, &signature);
818 ++signature[signature.size() / 2];
819
820 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
821
822 string result;
823 size_t input_consumed;
824 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
825 EXPECT_EQ(message.size(), input_consumed);
826 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
827}
828
829TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600830 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
831 .RsaSigningKey(512, 3)
832 .Digest(KM_DIGEST_SHA_2_256)
833 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700834 // Use large message, which won't work without digesting.
835 string message(1024, 'a');
836 string signature;
837 SignMessage(message, &signature);
838 ++message[message.size() / 2];
839
840 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
841
842 string result;
843 size_t input_consumed;
844 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
845 EXPECT_EQ(message.size(), input_consumed);
846 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
847}
848
Shawn Willdenf90f2352014-12-18 23:01:15 -0700849TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600850 GenerateKey(AuthorizationSetBuilder()
851 .RsaSigningKey(512, 3)
852 .Digest(KM_DIGEST_SHA_2_256)
853 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700854 string message(1024, 'a');
855 string signature;
856 SignMessage(message, &signature);
857 VerifyMessage(message, signature);
858}
859
860TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600861 GenerateKey(AuthorizationSetBuilder()
862 .RsaSigningKey(512, 3)
863 .Digest(KM_DIGEST_SHA_2_256)
864 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700865 string message(1024, 'a');
866 string signature;
867 SignMessage(message, &signature);
868 ++signature[signature.size() / 2];
869
870 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
871
872 string result;
873 size_t input_consumed;
874 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
875 EXPECT_EQ(message.size(), input_consumed);
876 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
877}
878
879TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600880 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
881 .RsaSigningKey(512, 3)
882 .Digest(KM_DIGEST_SHA_2_256)
883 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700884 // Use large message, which won't work without digesting.
885 string message(1024, 'a');
886 string signature;
887 SignMessage(message, &signature);
888 ++message[message.size() / 2];
889
890 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
891
892 string result;
893 size_t input_consumed;
894 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
895 EXPECT_EQ(message.size(), input_consumed);
896 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
897}
898
899template <typename T> vector<T> make_vector(const T* array, size_t len) {
900 return vector<T>(array, array + len);
901}
902
903TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
904 // Get all supported digests and padding modes.
905 size_t digests_len;
906 keymaster_digest_t* digests;
907 EXPECT_EQ(KM_ERROR_OK,
908 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
909 &digests_len));
910
911 size_t padding_modes_len;
912 keymaster_padding_t* padding_modes;
913 EXPECT_EQ(KM_ERROR_OK,
914 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
915 &padding_modes, &padding_modes_len));
916
917 // Try them.
918 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
919 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
920 // Compute key & message size that will work.
921 size_t key_bits = 256;
922 size_t message_len = 1000;
923 switch (digest) {
924 case KM_DIGEST_NONE:
925 switch (padding_mode) {
926 case KM_PAD_NONE:
927 // Match key size.
928 message_len = key_bits / 8;
929 break;
930 case KM_PAD_RSA_PKCS1_1_5_SIGN:
931 message_len = key_bits / 8 - 11;
932 break;
933 case KM_PAD_RSA_PSS:
934 // PSS requires a digest.
935 continue;
936 default:
937 FAIL() << "Missing padding";
938 break;
939 }
940 break;
941
942 case KM_DIGEST_SHA_2_256:
943 switch (padding_mode) {
944 case KM_PAD_NONE:
945 // Key size matches digest size
946 break;
947 case KM_PAD_RSA_PKCS1_1_5_SIGN:
948 key_bits += 8 * 11;
949 break;
950 case KM_PAD_RSA_PSS:
951 key_bits += 8 * 10;
952 break;
953 default:
954 FAIL() << "Missing padding";
955 break;
956 }
957 break;
958 default:
959 FAIL() << "Missing digest";
960 }
961
Shawn Willdenaf533992015-04-15 13:48:28 -0600962 GenerateKey(AuthorizationSetBuilder()
963 .RsaSigningKey(key_bits, 3)
964 .Digest(digest)
965 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700966 string message(message_len, 'a');
967 string signature;
968 SignMessage(message, &signature);
969 VerifyMessage(message, signature);
970 }
971 }
972
973 free(padding_modes);
974 free(digests);
975}
976
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600977TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600978 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600979 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700980 string message = "123456789012345678901234567890123456789012345678";
981 string signature;
982 SignMessage(message, &signature);
983 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600984}
985
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700986TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600987 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700988 string message = "123456789012345678901234567890123456789012345678";
989 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600990 MacMessage(message, &signature, 160);
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700991 VerifyMessage(message, signature);
992}
993
994TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600995 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700996 string message = "123456789012345678901234567890123456789012345678";
997 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600998 MacMessage(message, &signature, 224);
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700999 VerifyMessage(message, signature);
1000}
1001
Shawn Willden0d560bf2014-12-15 17:44:02 -07001002TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001003 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001004 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001005 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -06001006 MacMessage(message, &signature, 256);
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001007 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001008}
1009
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001010TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001011 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001012 string message = "123456789012345678901234567890123456789012345678";
1013 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -06001014 MacMessage(message, &signature, 384);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001015 VerifyMessage(message, signature);
1016}
1017
1018TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001019 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001020 string message = "123456789012345678901234567890123456789012345678";
1021 string signature;
Shawn Willden0c60f6f2015-04-27 23:40:10 -06001022 MacMessage(message, &signature, 512);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001023 VerifyMessage(message, signature);
1024}
1025
Shawn Willden5b53c992015-02-02 08:05:25 -07001026typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001027TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001028 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1029 .RsaSigningKey(256, 3)
1030 .Digest(KM_DIGEST_NONE)
1031 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001032 string export_data;
1033 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001034 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001035
1036 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001037}
1038
Shawn Willdenf268d742014-08-19 15:36:26 -06001039TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001040 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001041 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001042 string export_data;
1043 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001044 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001045
1046 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001047}
1048
1049TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001050 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1051 .RsaSigningKey(256, 3)
1052 .Digest(KM_DIGEST_NONE)
1053 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001054 string export_data;
1055 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001056}
1057
1058TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001059 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1060 .RsaSigningKey(256, 3)
1061 .Digest(KM_DIGEST_NONE)
1062 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001063 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001064 string export_data;
1065 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001066}
1067
Shawn Willden7dad93b2015-02-05 10:20:47 -07001068TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001069 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001070 string export_data;
1071
1072 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1073 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1074 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1075}
1076
Shawn Willden437fbd12014-08-20 11:59:49 -06001077static string read_file(const string& file_name) {
1078 ifstream file_stream(file_name, std::ios::binary);
1079 istreambuf_iterator<char> file_begin(file_stream);
1080 istreambuf_iterator<char> file_end;
1081 return string(file_begin, file_end);
1082}
1083
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001084typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001085TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001086 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001087 ASSERT_EQ(633U, pk8_key.size());
1088
Shawn Willdenaf533992015-04-15 13:48:28 -06001089 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1090 .RsaSigningKey(1024, 65537)
1091 .Digest(KM_DIGEST_NONE)
1092 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001093 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001094
1095 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001096 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1097 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1098 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001099
1100 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001101 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1102 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001103
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001104 string message(1024 / 8, 'a');
1105 string signature;
1106 SignMessage(message, &signature);
1107 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001108}
1109
Shawn Willdend7a5c712015-04-09 16:33:52 -06001110TEST_F(ImportKeyTest, OldApiRsaSuccess) {
1111 string pk8_key = read_file("rsa_privkey_pk8.der");
1112 ASSERT_EQ(633U, pk8_key.size());
1113
1114 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1115 // point softkeymaster will no longer support keymaster0 APIs anyway.
1116 uint8_t* key_blob;
1117 size_t key_blob_length;
1118 ASSERT_EQ(0,
1119 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1120 pk8_key.size(), &key_blob, &key_blob_length));
1121 set_key_blob(key_blob, key_blob_length);
1122
1123 string message(1024 / 8, 'a');
1124 string signature;
1125 SignMessage(message, &signature, false /* use_client_params */);
1126 VerifyMessage(message, signature, false /* use_client_params */);
1127}
1128
Shawn Willden6bbe6782014-09-18 11:26:15 -06001129TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001130 string pk8_key = read_file("rsa_privkey_pk8.der");
1131 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001132 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001133 ImportKey(AuthorizationSetBuilder()
1134 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1135 .Digest(KM_DIGEST_NONE)
1136 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001137 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001138}
1139
1140TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001141 string pk8_key = read_file("rsa_privkey_pk8.der");
1142 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001143 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001144 ImportKey(AuthorizationSetBuilder()
1145 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1146 .Digest(KM_DIGEST_NONE)
1147 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001148 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001149}
1150
Shawn Willden81effc62014-08-27 10:08:46 -06001151TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001152 string pk8_key = read_file("ec_privkey_pk8.der");
1153 ASSERT_EQ(138U, pk8_key.size());
1154
Shawn Willdenaf533992015-04-15 13:48:28 -06001155 ASSERT_EQ(KM_ERROR_OK,
1156 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1157 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001158
1159 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001160 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001161 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001162
1163 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001164 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1165 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001166
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001167 string message(1024 / 8, 'a');
1168 string signature;
1169 SignMessage(message, &signature);
1170 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001171}
1172
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001173TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1174 string pk8_key = read_file("ec_privkey_pk8.der");
1175 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001176
Shawn Willdenaf533992015-04-15 13:48:28 -06001177 ASSERT_EQ(KM_ERROR_OK,
1178 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1179 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001180
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001181 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001182 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001183 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1184
1185 // And values provided by GoogleKeymaster
1186 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1187 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1188
1189 string message(1024 / 8, 'a');
1190 string signature;
1191 SignMessage(message, &signature);
1192 VerifyMessage(message, signature);
1193}
1194
1195TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1196 string pk8_key = read_file("ec_privkey_pk8.der");
1197 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001198 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001199 ImportKey(AuthorizationSetBuilder()
1200 .EcdsaSigningKey(224 /* Doesn't match key */)
1201 .Digest(KM_DIGEST_NONE),
1202 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001203}
1204
Shawn Willden3b702e22015-02-05 10:26:47 -07001205TEST_F(ImportKeyTest, AesKeySuccess) {
1206 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1207 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001208 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001209 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1210 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001211 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001212
1213 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1214 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1215
1216 string message = "Hello World!";
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001217 string ciphertext = EncryptMessage(message);
1218 string plaintext = DecryptMessage(ciphertext);
Shawn Willden3b702e22015-02-05 10:26:47 -07001219 EXPECT_EQ(message, plaintext);
1220}
1221
1222TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1223 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1224 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001225 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1226 .HmacKey(sizeof(key_data) * 8)
1227 .Digest(KM_DIGEST_SHA_2_256)
1228 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001229 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001230
1231 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1232 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1233
1234 string message = "Hello World!";
1235 string signature;
Shawn Willden09f25272015-04-15 13:49:49 -06001236 MacMessage(message, &signature, 32);
Shawn Willden3b702e22015-02-05 10:26:47 -07001237 VerifyMessage(message, signature);
1238}
1239
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001240typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001241TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001242 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1243 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001244
1245 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001246 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001247 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001248
Shawn Willden6dde87c2014-12-11 14:08:48 -07001249 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001250 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001251
1252 // OAEP randomizes padding so every result should be different.
1253 EXPECT_NE(ciphertext1, ciphertext2);
1254}
1255
1256TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001257 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1258 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001259 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001260 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001261 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001262
Shawn Willden6dde87c2014-12-11 14:08:48 -07001263 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001264 EXPECT_EQ(message, plaintext);
1265}
1266
1267TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001268 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1269 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001270 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001271 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001272 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001273
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001274 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1275 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001276 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001277 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001278}
1279
1280TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001281 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1282 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001283 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001284 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001285 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001286
1287 // Corrupt the ciphertext
1288 ciphertext[512 / 8 / 2]++;
1289
Shawn Willden4200f212014-12-02 07:01:21 -07001290 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001291 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001292 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1293 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001294 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001295 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001296}
1297
1298TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001299 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1300 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001301 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001302 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001303 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001304
Shawn Willden6dde87c2014-12-11 14:08:48 -07001305 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001306 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001307
1308 // PKCS1 v1.5 randomizes padding so every result should be different.
1309 EXPECT_NE(ciphertext1, ciphertext2);
1310}
1311
1312TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001313 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1314 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001315 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001316 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001317 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001318
Shawn Willden6dde87c2014-12-11 14:08:48 -07001319 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001320 EXPECT_EQ(message, plaintext);
1321}
1322
1323TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001324 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1325 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001326 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001327 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001328 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001329
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001330 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1331 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001332 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001333 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001334}
1335
1336TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001337 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1338 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001339 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001340 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001341 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001342
1343 // Corrupt the ciphertext
1344 ciphertext[512 / 8 / 2]++;
1345
Shawn Willden4200f212014-12-02 07:01:21 -07001346 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001347 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001348 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1349 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
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001354TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001355 ASSERT_EQ(KM_ERROR_OK,
1356 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1357 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001358 // Two-block message.
1359 string message = "12345678901234567890123456789012";
1360 string ciphertext1 = EncryptMessage(message);
1361 EXPECT_EQ(message.size(), ciphertext1.size());
1362
1363 string ciphertext2 = EncryptMessage(string(message));
1364 EXPECT_EQ(message.size(), ciphertext2.size());
1365
1366 // ECB is deterministic.
1367 EXPECT_EQ(ciphertext1, ciphertext2);
1368
1369 string plaintext = DecryptMessage(ciphertext1);
1370 EXPECT_EQ(message, plaintext);
1371}
1372
1373TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07001374 ASSERT_EQ(KM_ERROR_OK,
1375 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1376 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001377 // Message is slightly shorter than two blocks.
1378 string message = "1234567890123456789012345678901";
1379
1380 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1381 string ciphertext;
1382 size_t input_consumed;
1383 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1384 EXPECT_EQ(message.size(), input_consumed);
1385 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1386}
1387
1388TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001389 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001390 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001391 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1392 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001393
1394 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001395 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001396 string message(i, 'a');
1397 string ciphertext = EncryptMessage(message);
1398 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1399 string plaintext = DecryptMessage(ciphertext);
1400 EXPECT_EQ(message, plaintext);
1401 }
1402}
1403
1404TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001405 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001406 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001407 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1408 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001409
1410 string message = "a";
1411 string ciphertext = EncryptMessage(message);
Shawn Willdenc6096592015-03-17 15:53:14 -06001412 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001413 EXPECT_NE(ciphertext, message);
1414 ++ciphertext[ciphertext.size() / 2];
1415
1416 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1417 string plaintext;
1418 size_t input_consumed;
1419 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1420 EXPECT_EQ(ciphertext.size(), input_consumed);
1421 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1422}
1423
Thai Duong20d725d2015-03-24 17:49:58 -07001424TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
1425 ASSERT_EQ(KM_ERROR_OK,
1426 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1427 TAG_BLOCK_MODE, KM_MODE_CTR)));
1428 string message = "123";
1429 string iv1;
1430 string ciphertext1 = EncryptMessage(message, &iv1);
1431 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001432 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001433
1434 string iv2;
1435 string ciphertext2 = EncryptMessage(message, &iv2);
1436 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001437 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001438
1439 // IVs should be random, so ciphertexts should differ.
1440 EXPECT_NE(iv1, iv2);
1441 EXPECT_NE(ciphertext1, ciphertext2);
1442
1443 string plaintext = DecryptMessage(ciphertext1, iv1);
1444 EXPECT_EQ(message, plaintext);
1445}
1446
1447TEST_F(EncryptionOperationsTest, AesCtrIncremental) {
1448 ASSERT_EQ(KM_ERROR_OK,
1449 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1450 TAG_BLOCK_MODE, KM_MODE_CTR)));
1451
1452 int increment = 15;
1453 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001454 AuthorizationSet input_params(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001455 AuthorizationSet output_params;
1456 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1457
1458 string ciphertext;
1459 size_t input_consumed;
1460 for (size_t i = 0; i < message.size(); i += increment)
1461 EXPECT_EQ(KM_ERROR_OK,
1462 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1463 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1464 EXPECT_EQ(message.size(), ciphertext.size());
1465
1466 // Move TAG_NONCE into input_params
1467 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001468 input_params.push_back(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001469 output_params.Clear();
1470
1471 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1472 string plaintext;
1473 for (size_t i = 0; i < ciphertext.size(); i += increment)
1474 EXPECT_EQ(KM_ERROR_OK,
1475 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1476 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1477 EXPECT_EQ(ciphertext.size(), plaintext.size());
1478 EXPECT_EQ(message, plaintext);
1479}
1480
1481struct AesCtrSp80038aTestVector {
1482 const char* key;
1483 const char* nonce;
1484 const char* plaintext;
1485 const char* ciphertext;
1486};
1487
1488// These test vectors are taken from
1489// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1490static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1491 // AES-128
1492 {
1493 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1494 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1495 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1496 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1497 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1498 },
1499 // AES-192
1500 {
1501 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1502 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1503 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1504 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1505 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1506 },
1507 // AES-256
1508 {
1509 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1510 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1511 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1512 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1513 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1514 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1515 },
1516};
1517
1518TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
1519 for (size_t i = 0; i < 3; i++) {
1520 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1521 const string key = hex2str(test.key);
1522 const string nonce = hex2str(test.nonce);
1523 const string plaintext = hex2str(test.plaintext);
1524 const string ciphertext = hex2str(test.ciphertext);
1525 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1526 }
1527}
1528
1529TEST_F(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
1530 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1531 .AesEncryptionKey(128)
1532 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1533 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
1534
1535 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
1536}
1537
1538TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
1539 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1540 .AesEncryptionKey(128)
1541 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1542 .Authorization(TAG_CALLER_NONCE)));
1543
Shawn Willden09f25272015-04-15 13:49:49 -06001544 AuthorizationSet input_params(client_params());
Thai Duong20d725d2015-03-24 17:49:58 -07001545 input_params.push_back(TAG_NONCE, "123", 3);
1546 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1547}
1548
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001549TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001550 ASSERT_EQ(KM_ERROR_OK,
1551 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1552 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001553 // Two-block message.
1554 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001555 string iv1;
1556 string ciphertext1 = EncryptMessage(message, &iv1);
1557 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001558
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001559 string iv2;
1560 string ciphertext2 = EncryptMessage(message, &iv2);
1561 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001562
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001563 // IVs should be random, so ciphertexts should differ.
1564 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001565 EXPECT_NE(ciphertext1, ciphertext2);
1566
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001567 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001568 EXPECT_EQ(message, plaintext);
1569}
1570
Shawn Willden969aa382015-04-15 17:05:53 -07001571TEST_F(EncryptionOperationsTest, AesCallerNonce) {
1572 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1573 .AesEncryptionKey(128)
1574 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1575 .Authorization(TAG_CALLER_NONCE)));
1576 string message = "12345678901234567890123456789012";
1577 string iv1;
1578 // Don't specify nonce, should get a random one.
1579 string ciphertext1 = EncryptMessage(message, &iv1);
1580 EXPECT_EQ(message.size(), ciphertext1.size());
1581 EXPECT_EQ(16U, iv1.size());
1582
1583 string plaintext = DecryptMessage(ciphertext1, iv1);
1584 EXPECT_EQ(message, plaintext);
1585
1586 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06001587 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001588 AuthorizationSet update_params;
1589 AuthorizationSet output_params;
1590 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
1591 string ciphertext2 =
1592 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
1593
1594 // Decrypt with correct nonce.
1595 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1596 &output_params);
1597 EXPECT_EQ(message, plaintext);
1598
1599 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06001600 input_params.Reinitialize(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001601 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
1602 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1603 &output_params);
1604 EXPECT_NE(message, plaintext);
1605}
1606
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001607TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001608 ASSERT_EQ(KM_ERROR_OK,
1609 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1610 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001611
1612 int increment = 15;
1613 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001614 AuthorizationSet input_params(client_params());
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001615 AuthorizationSet output_params;
1616 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1617
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001618 string ciphertext;
1619 size_t input_consumed;
1620 for (size_t i = 0; i < message.size(); i += increment)
1621 EXPECT_EQ(KM_ERROR_OK,
1622 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1623 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001624 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001625
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001626 // Move TAG_NONCE into input_params
1627 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001628 input_params.push_back(client_params());
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001629 output_params.Clear();
1630
1631 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001632 string plaintext;
1633 for (size_t i = 0; i < ciphertext.size(); i += increment)
1634 EXPECT_EQ(KM_ERROR_OK,
1635 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1636 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001637 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001638 EXPECT_EQ(message, plaintext);
1639}
1640
1641TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001642 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001643 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001644 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1645 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001646
1647 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001648 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001649 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001650 string iv;
1651 string ciphertext = EncryptMessage(message, &iv);
1652 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1653 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001654 EXPECT_EQ(message, plaintext);
1655 }
1656}
1657
Shawn Willdencd695822015-01-26 14:06:32 -07001658typedef KeymasterTest AddEntropyTest;
1659TEST_F(AddEntropyTest, AddEntropy) {
1660 // There's no obvious way to test that entropy is actually added, but we can test that the API
1661 // doesn't blow up or return an error.
1662 EXPECT_EQ(KM_ERROR_OK,
1663 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1664}
1665
Shawn Willden5fad7852015-01-26 16:10:56 -07001666typedef KeymasterTest RescopingTest;
1667TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001668 ASSERT_EQ(KM_ERROR_OK,
1669 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1670 TAG_RESCOPING_ADD, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001671 // TODO(swillden): Add a better error code for this.
Shawn Willdenf01329d2015-03-11 21:51:38 -06001672 EXPECT_EQ(KM_ERROR_RESCOPABLE_KEY_NOT_USABLE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001673}
1674
1675TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07001676 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07001677 .AesEncryptionKey(128)
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001678 .EcbMode()
1679 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1680 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
1681 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1682 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001683
1684 keymaster_key_blob_t rescoped_blob;
1685 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001686 AuthorizationSet new_params =
1687 AuthorizationSetBuilder().AesKey(128).Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN).build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001688
1689 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1690 ASSERT_TRUE(rescoped_characteristics != NULL);
1691
Shawn Willdenc6096592015-03-17 15:53:14 -06001692 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001693 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1694 keymaster_free_characteristics(rescoped_characteristics);
1695 free(rescoped_characteristics);
1696 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1697
1698 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001699 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1700 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001701}
1702
1703TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07001704 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001705 .RsaEncryptionKey(256, 3)
1706 .Padding(KM_PAD_RSA_OAEP)
Shawn Willden2c242002015-02-27 07:01:02 -07001707 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1708 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001709 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1710 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1711 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1712 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
1713
1714 keymaster_key_blob_t rescoped_blob;
1715 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001716 AuthorizationSet new_params = AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001717 .RsaSigningKey(256, 3)
1718 .Digest(KM_DIGEST_SHA_2_256)
1719 .Padding(KM_PAD_RSA_PSS)
Shawn Willden2c242002015-02-27 07:01:02 -07001720 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001721
1722 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1723 ASSERT_TRUE(rescoped_characteristics != NULL);
1724
Shawn Willdenc6096592015-03-17 15:53:14 -06001725 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001726 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1727 keymaster_free_characteristics(rescoped_characteristics);
1728 free(rescoped_characteristics);
1729 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1730
1731 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1732 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1733 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1734 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
1735}
1736
1737// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
1738// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
1739// may not be changed.
1740
Shawn Willden128ffe02014-08-06 12:31:33 -06001741} // namespace test
1742} // namespace keymaster