blob: ab427d49b6e83b912e521f007c64d605c051c9e2 [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 Willdenaf533992015-04-15 13:48:28 -0600431 GenerateKey(AuthorizationSetBuilder()
432 .HmacKey(128)
433 .Digest(KM_DIGEST_SHA1)
434 .Authorization(TAG_MAC_LENGTH, 20));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700435 string message = "12345678901234567890123456789012";
436 string signature;
437 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600438 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700439}
440
Shawn Willden62c22862014-12-17 08:36:20 -0700441TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600442 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
443 .HmacKey(128)
444 .Digest(KM_DIGEST_SHA_2_224)
445 .Authorization(TAG_MAC_LENGTH, 28)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700446 string message = "12345678901234567890123456789012";
447 string signature;
448 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600449 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700450}
451
Shawn Willden0d560bf2014-12-15 17:44:02 -0700452TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600453 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
454 .HmacKey(128)
455 .Digest(KM_DIGEST_SHA_2_256)
456 .Authorization(TAG_MAC_LENGTH, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700457 string message = "12345678901234567890123456789012";
458 string signature;
459 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600460 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700461}
462
Shawn Willden62c22862014-12-17 08:36:20 -0700463TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600464 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
465 .HmacKey(128)
466 .Digest(KM_DIGEST_SHA_2_384)
467 .Authorization(TAG_MAC_LENGTH, 48)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700468 string message = "12345678901234567890123456789012";
469 string signature;
470 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600471 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700472}
473
474TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600475 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
476 .HmacKey(128)
477 .Digest(KM_DIGEST_SHA_2_512)
478 .Authorization(TAG_MAC_LENGTH, 64)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700479 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700480 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700481 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600482 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700483}
484
Shawn Willden3b702e22015-02-05 10:26:47 -0700485TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
486 uint8_t key_data[] = {
487 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
488 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
489 };
490 string message = "Hi There";
491 uint8_t sha_224_expected[] = {
492 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
493 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
494 };
495 uint8_t sha_256_expected[] = {
496 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
497 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
498 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
499 };
500 uint8_t sha_384_expected[] = {
501 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
502 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
503 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
504 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
505 };
506 uint8_t sha_512_expected[] = {
507 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
508 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
509 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
510 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
511 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
512 };
513
514 string key = make_string(key_data);
515
516 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
517 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
518 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
519 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
520}
521
522TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
523 string key = "Jefe";
524 string message = "what do ya want for nothing?";
525 uint8_t sha_224_expected[] = {
526 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
527 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
528 };
529 uint8_t sha_256_expected[] = {
530 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
531 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
532 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
533 };
534 uint8_t sha_384_expected[] = {
535 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
536 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
537 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
538 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
539 };
540 uint8_t sha_512_expected[] = {
541 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
542 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
543 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
544 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
545 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
546 };
547
548 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
549 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
550 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
551 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
552}
553
554TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
555 string key(20, 0xaa);
556 string message(50, 0xdd);
557 uint8_t sha_224_expected[] = {
558 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
559 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
560 };
561 uint8_t sha_256_expected[] = {
562 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
563 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
564 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
565 };
566 uint8_t sha_384_expected[] = {
567 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
568 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
569 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
570 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
571 };
572 uint8_t sha_512_expected[] = {
573 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
574 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
575 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
576 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
577 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
578 };
579
580 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
581 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
582 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
583 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
584}
585
586TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
587 uint8_t key_data[25] = {
588 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
589 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
590 };
591 string key = make_string(key_data);
592 string message(50, 0xcd);
593 uint8_t sha_224_expected[] = {
594 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
595 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
596 };
597 uint8_t sha_256_expected[] = {
598 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
599 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
600 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
601 };
602 uint8_t sha_384_expected[] = {
603 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
604 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
605 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
606 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
607 };
608 uint8_t sha_512_expected[] = {
609 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
610 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
611 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
612 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
613 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
614 };
615
616 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
617 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
618 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
619 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
620}
621
622TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
623 string key(20, 0x0c);
624 string message = "Test With Truncation";
625
626 uint8_t sha_224_expected[] = {
627 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
628 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
629 };
630 uint8_t sha_256_expected[] = {
631 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
632 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
633 };
634 uint8_t sha_384_expected[] = {
635 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
636 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
637 };
638 uint8_t sha_512_expected[] = {
639 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
640 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
641 };
642
643 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
644 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
645 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
646 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
647}
648
649TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
650 string key(131, 0xaa);
651 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
652
653 uint8_t sha_224_expected[] = {
654 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
655 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
656 };
657 uint8_t sha_256_expected[] = {
658 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
659 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
660 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
661 };
662 uint8_t sha_384_expected[] = {
663 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
664 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
665 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
666 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
667 };
668 uint8_t sha_512_expected[] = {
669 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
670 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
671 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
672 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
673 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
674 };
675
676 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
677 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
678 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
679 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
680}
681
682TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
683 string key(131, 0xaa);
684 string message = "This is a test using a larger than block-size key and a larger than "
685 "block-size data. The key needs to be hashed before being used by the HMAC "
686 "algorithm.";
687
688 uint8_t sha_224_expected[] = {
689 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
690 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
691 };
692 uint8_t sha_256_expected[] = {
693 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
694 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
695 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
696 };
697 uint8_t sha_384_expected[] = {
698 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
699 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
700 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
701 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
702 };
703 uint8_t sha_512_expected[] = {
704 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
705 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
706 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
707 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
708 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
709 };
710
711 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
712 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
713 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
714 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
715}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700716
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700717TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700718 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
719 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
720 .Authorization(TAG_KEY_SIZE, 128)
Shawn Willdenc24c1102014-12-22 15:30:09 -0700721 .SigningKey()
Shawn Willden2c242002015-02-27 07:01:02 -0700722 .Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700723 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700724}
725
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700726TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600727 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
728 .HmacKey(128)
729 .Digest(KM_DIGEST_SHA_2_256)
730 .Authorization(TAG_MAC_LENGTH, 33)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700731 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
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 Willdenaf533992015-04-15 13:48:28 -0600987 GenerateKey(AuthorizationSetBuilder()
988 .HmacKey(128)
989 .Digest(KM_DIGEST_SHA1)
990 .Authorization(TAG_MAC_LENGTH, 20));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700991 string message = "123456789012345678901234567890123456789012345678";
992 string signature;
993 SignMessage(message, &signature);
994 VerifyMessage(message, signature);
995}
996
997TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600998 GenerateKey(AuthorizationSetBuilder()
999 .HmacKey(128)
1000 .Digest(KM_DIGEST_SHA_2_224)
1001 .Authorization(TAG_MAC_LENGTH, 28));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001002 string message = "123456789012345678901234567890123456789012345678";
1003 string signature;
1004 SignMessage(message, &signature);
1005 VerifyMessage(message, signature);
1006}
1007
Shawn Willden0d560bf2014-12-15 17:44:02 -07001008TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001009 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1010 .HmacKey(128)
1011 .Digest(KM_DIGEST_SHA_2_256)
1012 .Authorization(TAG_MAC_LENGTH, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001013 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001014 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001015 SignMessage(message, &signature);
1016 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001017}
1018
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001019TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001020 GenerateKey(AuthorizationSetBuilder()
1021 .HmacKey(128)
1022 .Digest(KM_DIGEST_SHA_2_384)
1023 .Authorization(TAG_MAC_LENGTH, 48));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001024 string message = "123456789012345678901234567890123456789012345678";
1025 string signature;
1026 SignMessage(message, &signature);
1027 VerifyMessage(message, signature);
1028}
1029
1030TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001031 GenerateKey(AuthorizationSetBuilder()
1032 .HmacKey(128)
1033 .Digest(KM_DIGEST_SHA_2_512)
1034 .Authorization(TAG_MAC_LENGTH, 64));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001035 string message = "123456789012345678901234567890123456789012345678";
1036 string signature;
1037 SignMessage(message, &signature);
1038 VerifyMessage(message, signature);
1039}
1040
Shawn Willden5b53c992015-02-02 08:05:25 -07001041typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001042TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001043 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1044 .RsaSigningKey(256, 3)
1045 .Digest(KM_DIGEST_NONE)
1046 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001047 string export_data;
1048 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001049 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001050
1051 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001052}
1053
Shawn Willdenf268d742014-08-19 15:36:26 -06001054TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001055 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001056 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001057 string export_data;
1058 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001059 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001060
1061 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001062}
1063
1064TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001065 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1066 .RsaSigningKey(256, 3)
1067 .Digest(KM_DIGEST_NONE)
1068 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001069 string export_data;
1070 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001071}
1072
1073TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001074 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1075 .RsaSigningKey(256, 3)
1076 .Digest(KM_DIGEST_NONE)
1077 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001078 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001079 string export_data;
1080 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001081}
1082
Shawn Willden7dad93b2015-02-05 10:20:47 -07001083TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001084 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001085 string export_data;
1086
1087 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1088 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1089 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1090}
1091
Shawn Willden437fbd12014-08-20 11:59:49 -06001092static string read_file(const string& file_name) {
1093 ifstream file_stream(file_name, std::ios::binary);
1094 istreambuf_iterator<char> file_begin(file_stream);
1095 istreambuf_iterator<char> file_end;
1096 return string(file_begin, file_end);
1097}
1098
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001099typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001100TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001101 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001102 ASSERT_EQ(633U, pk8_key.size());
1103
Shawn Willdenaf533992015-04-15 13:48:28 -06001104 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1105 .RsaSigningKey(1024, 65537)
1106 .Digest(KM_DIGEST_NONE)
1107 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001108 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001109
1110 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001111 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1112 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1113 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001114
1115 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001116 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1117 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001118
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001119 string message(1024 / 8, 'a');
1120 string signature;
1121 SignMessage(message, &signature);
1122 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001123}
1124
Shawn Willdend7a5c712015-04-09 16:33:52 -06001125TEST_F(ImportKeyTest, OldApiRsaSuccess) {
1126 string pk8_key = read_file("rsa_privkey_pk8.der");
1127 ASSERT_EQ(633U, pk8_key.size());
1128
1129 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1130 // point softkeymaster will no longer support keymaster0 APIs anyway.
1131 uint8_t* key_blob;
1132 size_t key_blob_length;
1133 ASSERT_EQ(0,
1134 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1135 pk8_key.size(), &key_blob, &key_blob_length));
1136 set_key_blob(key_blob, key_blob_length);
1137
1138 string message(1024 / 8, 'a');
1139 string signature;
1140 SignMessage(message, &signature, false /* use_client_params */);
1141 VerifyMessage(message, signature, false /* use_client_params */);
1142}
1143
Shawn Willden6bbe6782014-09-18 11:26:15 -06001144TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001145 string pk8_key = read_file("rsa_privkey_pk8.der");
1146 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001147 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001148 ImportKey(AuthorizationSetBuilder()
1149 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1150 .Digest(KM_DIGEST_NONE)
1151 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001152 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001153}
1154
1155TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001156 string pk8_key = read_file("rsa_privkey_pk8.der");
1157 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001158 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001159 ImportKey(AuthorizationSetBuilder()
1160 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1161 .Digest(KM_DIGEST_NONE)
1162 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001163 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001164}
1165
Shawn Willden81effc62014-08-27 10:08:46 -06001166TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001167 string pk8_key = read_file("ec_privkey_pk8.der");
1168 ASSERT_EQ(138U, pk8_key.size());
1169
Shawn Willdenaf533992015-04-15 13:48:28 -06001170 ASSERT_EQ(KM_ERROR_OK,
1171 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1172 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001173
1174 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001175 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001176 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001177
1178 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001179 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1180 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001181
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001182 string message(1024 / 8, 'a');
1183 string signature;
1184 SignMessage(message, &signature);
1185 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001186}
1187
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001188TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1189 string pk8_key = read_file("ec_privkey_pk8.der");
1190 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001191
Shawn Willdenaf533992015-04-15 13:48:28 -06001192 ASSERT_EQ(KM_ERROR_OK,
1193 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1194 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001195
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001196 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001197 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001198 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1199
1200 // And values provided by GoogleKeymaster
1201 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1202 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1203
1204 string message(1024 / 8, 'a');
1205 string signature;
1206 SignMessage(message, &signature);
1207 VerifyMessage(message, signature);
1208}
1209
1210TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1211 string pk8_key = read_file("ec_privkey_pk8.der");
1212 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001213 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001214 ImportKey(AuthorizationSetBuilder()
1215 .EcdsaSigningKey(224 /* Doesn't match key */)
1216 .Digest(KM_DIGEST_NONE),
1217 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001218}
1219
Shawn Willden3b702e22015-02-05 10:26:47 -07001220TEST_F(ImportKeyTest, AesKeySuccess) {
1221 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1222 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001223 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001224 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1225 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001226 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001227
1228 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1229 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1230
1231 string message = "Hello World!";
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001232 string ciphertext = EncryptMessage(message);
1233 string plaintext = DecryptMessage(ciphertext);
Shawn Willden3b702e22015-02-05 10:26:47 -07001234 EXPECT_EQ(message, plaintext);
1235}
1236
1237TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1238 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1239 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001240 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1241 .HmacKey(sizeof(key_data) * 8)
1242 .Digest(KM_DIGEST_SHA_2_256)
1243 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001244 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001245
1246 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1247 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1248
1249 string message = "Hello World!";
1250 string signature;
1251 SignMessage(message, &signature);
1252 VerifyMessage(message, signature);
1253}
1254
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001255typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001256TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
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
1260 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001261 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001262 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001263
Shawn Willden6dde87c2014-12-11 14:08:48 -07001264 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001265 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001266
1267 // OAEP randomizes padding so every result should be different.
1268 EXPECT_NE(ciphertext1, ciphertext2);
1269}
1270
1271TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001272 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1273 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001274 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001275 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001276 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001277
Shawn Willden6dde87c2014-12-11 14:08:48 -07001278 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001279 EXPECT_EQ(message, plaintext);
1280}
1281
1282TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001283 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1284 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001285 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001286 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001287 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001288
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001289 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1290 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001291 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001292 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001293}
1294
1295TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001296 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1297 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001298 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001299 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001300 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001301
1302 // Corrupt the ciphertext
1303 ciphertext[512 / 8 / 2]++;
1304
Shawn Willden4200f212014-12-02 07:01:21 -07001305 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001306 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001307 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1308 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001309 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001310 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001311}
1312
1313TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001314 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1315 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001316 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001317 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001318 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001319
Shawn Willden6dde87c2014-12-11 14:08:48 -07001320 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001321 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001322
1323 // PKCS1 v1.5 randomizes padding so every result should be different.
1324 EXPECT_NE(ciphertext1, ciphertext2);
1325}
1326
1327TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001328 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1329 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001330 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001331 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001332 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001333
Shawn Willden6dde87c2014-12-11 14:08:48 -07001334 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001335 EXPECT_EQ(message, plaintext);
1336}
1337
1338TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001339 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1340 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001341 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001342 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001343 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001344
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001345 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1346 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001347 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001348 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001349}
1350
1351TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001352 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1353 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001354 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001355 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001356 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001357
1358 // Corrupt the ciphertext
1359 ciphertext[512 / 8 / 2]++;
1360
Shawn Willden4200f212014-12-02 07:01:21 -07001361 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001362 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001363 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1364 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001365 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001366 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001367}
1368
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001369TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001370 ASSERT_EQ(KM_ERROR_OK,
1371 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1372 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001373 // Two-block message.
1374 string message = "12345678901234567890123456789012";
1375 string ciphertext1 = EncryptMessage(message);
1376 EXPECT_EQ(message.size(), ciphertext1.size());
1377
1378 string ciphertext2 = EncryptMessage(string(message));
1379 EXPECT_EQ(message.size(), ciphertext2.size());
1380
1381 // ECB is deterministic.
1382 EXPECT_EQ(ciphertext1, ciphertext2);
1383
1384 string plaintext = DecryptMessage(ciphertext1);
1385 EXPECT_EQ(message, plaintext);
1386}
1387
1388TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07001389 ASSERT_EQ(KM_ERROR_OK,
1390 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1391 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001392 // Message is slightly shorter than two blocks.
1393 string message = "1234567890123456789012345678901";
1394
1395 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1396 string ciphertext;
1397 size_t input_consumed;
1398 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1399 EXPECT_EQ(message.size(), input_consumed);
1400 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1401}
1402
1403TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001404 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001405 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001406 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1407 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001408
1409 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001410 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001411 string message(i, 'a');
1412 string ciphertext = EncryptMessage(message);
1413 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1414 string plaintext = DecryptMessage(ciphertext);
1415 EXPECT_EQ(message, plaintext);
1416 }
1417}
1418
1419TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001420 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001421 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001422 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1423 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001424
1425 string message = "a";
1426 string ciphertext = EncryptMessage(message);
Shawn Willdenc6096592015-03-17 15:53:14 -06001427 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001428 EXPECT_NE(ciphertext, message);
1429 ++ciphertext[ciphertext.size() / 2];
1430
1431 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1432 string plaintext;
1433 size_t input_consumed;
1434 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1435 EXPECT_EQ(ciphertext.size(), input_consumed);
1436 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1437}
1438
Thai Duong20d725d2015-03-24 17:49:58 -07001439TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
1440 ASSERT_EQ(KM_ERROR_OK,
1441 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1442 TAG_BLOCK_MODE, KM_MODE_CTR)));
1443 string message = "123";
1444 string iv1;
1445 string ciphertext1 = EncryptMessage(message, &iv1);
1446 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001447 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001448
1449 string iv2;
1450 string ciphertext2 = EncryptMessage(message, &iv2);
1451 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001452 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001453
1454 // IVs should be random, so ciphertexts should differ.
1455 EXPECT_NE(iv1, iv2);
1456 EXPECT_NE(ciphertext1, ciphertext2);
1457
1458 string plaintext = DecryptMessage(ciphertext1, iv1);
1459 EXPECT_EQ(message, plaintext);
1460}
1461
1462TEST_F(EncryptionOperationsTest, AesCtrIncremental) {
1463 ASSERT_EQ(KM_ERROR_OK,
1464 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1465 TAG_BLOCK_MODE, KM_MODE_CTR)));
1466
1467 int increment = 15;
1468 string message(239, 'a');
1469 AuthorizationSet input_params;
1470 AuthorizationSet output_params;
1471 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1472
1473 string ciphertext;
1474 size_t input_consumed;
1475 for (size_t i = 0; i < message.size(); i += increment)
1476 EXPECT_EQ(KM_ERROR_OK,
1477 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1478 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1479 EXPECT_EQ(message.size(), ciphertext.size());
1480
1481 // Move TAG_NONCE into input_params
1482 input_params.Reinitialize(output_params);
1483 output_params.Clear();
1484
1485 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1486 string plaintext;
1487 for (size_t i = 0; i < ciphertext.size(); i += increment)
1488 EXPECT_EQ(KM_ERROR_OK,
1489 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1490 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1491 EXPECT_EQ(ciphertext.size(), plaintext.size());
1492 EXPECT_EQ(message, plaintext);
1493}
1494
1495struct AesCtrSp80038aTestVector {
1496 const char* key;
1497 const char* nonce;
1498 const char* plaintext;
1499 const char* ciphertext;
1500};
1501
1502// These test vectors are taken from
1503// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1504static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1505 // AES-128
1506 {
1507 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1508 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1509 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1510 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1511 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1512 },
1513 // AES-192
1514 {
1515 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1516 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1517 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1518 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1519 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1520 },
1521 // AES-256
1522 {
1523 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1524 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1525 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1526 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1527 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1528 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1529 },
1530};
1531
1532TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
1533 for (size_t i = 0; i < 3; i++) {
1534 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1535 const string key = hex2str(test.key);
1536 const string nonce = hex2str(test.nonce);
1537 const string plaintext = hex2str(test.plaintext);
1538 const string ciphertext = hex2str(test.ciphertext);
1539 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1540 }
1541}
1542
1543TEST_F(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
1544 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1545 .AesEncryptionKey(128)
1546 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1547 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
1548
1549 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
1550}
1551
1552TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
1553 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1554 .AesEncryptionKey(128)
1555 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1556 .Authorization(TAG_CALLER_NONCE)));
1557
1558 AuthorizationSet input_params;
1559 input_params.push_back(TAG_NONCE, "123", 3);
1560 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1561}
1562
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001563TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001564 ASSERT_EQ(KM_ERROR_OK,
1565 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1566 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001567 // Two-block message.
1568 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001569 string iv1;
1570 string ciphertext1 = EncryptMessage(message, &iv1);
1571 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001572
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001573 string iv2;
1574 string ciphertext2 = EncryptMessage(message, &iv2);
1575 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001576
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001577 // IVs should be random, so ciphertexts should differ.
1578 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001579 EXPECT_NE(ciphertext1, ciphertext2);
1580
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001581 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001582 EXPECT_EQ(message, plaintext);
1583}
1584
Shawn Willden969aa382015-04-15 17:05:53 -07001585TEST_F(EncryptionOperationsTest, AesCallerNonce) {
1586 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1587 .AesEncryptionKey(128)
1588 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1589 .Authorization(TAG_CALLER_NONCE)));
1590 string message = "12345678901234567890123456789012";
1591 string iv1;
1592 // Don't specify nonce, should get a random one.
1593 string ciphertext1 = EncryptMessage(message, &iv1);
1594 EXPECT_EQ(message.size(), ciphertext1.size());
1595 EXPECT_EQ(16U, iv1.size());
1596
1597 string plaintext = DecryptMessage(ciphertext1, iv1);
1598 EXPECT_EQ(message, plaintext);
1599
1600 // Now specify a nonce, should also work.
1601 AuthorizationSet input_params;
1602 AuthorizationSet update_params;
1603 AuthorizationSet output_params;
1604 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
1605 string ciphertext2 =
1606 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
1607
1608 // Decrypt with correct nonce.
1609 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1610 &output_params);
1611 EXPECT_EQ(message, plaintext);
1612
1613 // Now try with wrong nonce.
1614 input_params.Clear();
1615 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
1616 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1617 &output_params);
1618 EXPECT_NE(message, plaintext);
1619}
1620
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001621TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001622 ASSERT_EQ(KM_ERROR_OK,
1623 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1624 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001625
1626 int increment = 15;
1627 string message(240, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001628 AuthorizationSet input_params;
1629 AuthorizationSet output_params;
1630 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1631
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001632 string ciphertext;
1633 size_t input_consumed;
1634 for (size_t i = 0; i < message.size(); i += increment)
1635 EXPECT_EQ(KM_ERROR_OK,
1636 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1637 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001638 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001639
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001640 // Move TAG_NONCE into input_params
1641 input_params.Reinitialize(output_params);
1642 output_params.Clear();
1643
1644 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001645 string plaintext;
1646 for (size_t i = 0; i < ciphertext.size(); i += increment)
1647 EXPECT_EQ(KM_ERROR_OK,
1648 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1649 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001650 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001651 EXPECT_EQ(message, plaintext);
1652}
1653
1654TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001655 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001656 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001657 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1658 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001659
1660 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001661 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001662 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001663 string iv;
1664 string ciphertext = EncryptMessage(message, &iv);
1665 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1666 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001667 EXPECT_EQ(message, plaintext);
1668 }
1669}
1670
Shawn Willdencd695822015-01-26 14:06:32 -07001671typedef KeymasterTest AddEntropyTest;
1672TEST_F(AddEntropyTest, AddEntropy) {
1673 // There's no obvious way to test that entropy is actually added, but we can test that the API
1674 // doesn't blow up or return an error.
1675 EXPECT_EQ(KM_ERROR_OK,
1676 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1677}
1678
Shawn Willden5fad7852015-01-26 16:10:56 -07001679typedef KeymasterTest RescopingTest;
1680TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001681 ASSERT_EQ(KM_ERROR_OK,
1682 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1683 TAG_RESCOPING_ADD, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001684 // TODO(swillden): Add a better error code for this.
Shawn Willdenf01329d2015-03-11 21:51:38 -06001685 EXPECT_EQ(KM_ERROR_RESCOPABLE_KEY_NOT_USABLE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001686}
1687
1688TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07001689 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07001690 .AesEncryptionKey(128)
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001691 .EcbMode()
1692 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1693 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
1694 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1695 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001696
1697 keymaster_key_blob_t rescoped_blob;
1698 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001699 AuthorizationSet new_params =
1700 AuthorizationSetBuilder().AesKey(128).Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN).build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001701
1702 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1703 ASSERT_TRUE(rescoped_characteristics != NULL);
1704
Shawn Willdenc6096592015-03-17 15:53:14 -06001705 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001706 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1707 keymaster_free_characteristics(rescoped_characteristics);
1708 free(rescoped_characteristics);
1709 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1710
1711 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001712 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1713 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001714}
1715
1716TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07001717 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001718 .RsaEncryptionKey(256, 3)
1719 .Padding(KM_PAD_RSA_OAEP)
Shawn Willden2c242002015-02-27 07:01:02 -07001720 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1721 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001722 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1723 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1724 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1725 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
1726
1727 keymaster_key_blob_t rescoped_blob;
1728 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001729 AuthorizationSet new_params = AuthorizationSetBuilder()
Shawn Willdenaf533992015-04-15 13:48:28 -06001730 .RsaSigningKey(256, 3)
1731 .Digest(KM_DIGEST_SHA_2_256)
1732 .Padding(KM_PAD_RSA_PSS)
Shawn Willden2c242002015-02-27 07:01:02 -07001733 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001734
1735 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1736 ASSERT_TRUE(rescoped_characteristics != NULL);
1737
Shawn Willdenc6096592015-03-17 15:53:14 -06001738 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001739 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1740 keymaster_free_characteristics(rescoped_characteristics);
1741 free(rescoped_characteristics);
1742 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1743
1744 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1745 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1746 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1747 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
1748}
1749
1750// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
1751// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
1752// may not be changed.
1753
Shawn Willden128ffe02014-08-06 12:31:33 -06001754} // namespace test
1755} // namespace keymaster