blob: e3faefa4d4aca90b74fa3085cc741abc8702e34e [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 Willdenb6837e72015-05-16 09:20:59 -060025#include <keymaster/android_keymaster_utils.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060026#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 Willdenb6837e72015-05-16 09:20:59 -060029#include "android_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 Willden0cb69422015-05-26 08:31:37 -060081 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden63ac0432014-12-29 14:07:08 -070082 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 Willden0cb69422015-05-26 08:31:37 -060090 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
Shawn Willden63ac0432014-12-29 14:07:08 -070091 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;
Shawn Willden0cb69422015-05-26 08:31:37 -0600103 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden5b53c992015-02-02 08:05:25 -0700104 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
Shawn Willden0cb69422015-05-26 08:31:37 -0600109 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
Shawn Willden63ac0432014-12-29 14:07:08 -0700110 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 Willden0cb69422015-05-26 08:31:37 -0600114 ASSERT_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;
Shawn Willden0cb69422015-05-26 08:31:37 -0600131 ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
Shawn Willden5b53c992015-02-02 08:05:25 -0700132 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 Willden0cb69422015-05-26 08:31:37 -0600136 ASSERT_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
Shawn Willden0cb69422015-05-26 08:31:37 -0600145 ASSERT_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;
Shawn Willden0cb69422015-05-26 08:31:37 -0600159 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700160 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
Shawn Willden0cb69422015-05-26 08:31:37 -0600164 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700165 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
Shawn Willden0cb69422015-05-26 08:31:37 -0600169 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700170 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;
Shawn Willden0cb69422015-05-26 08:31:37 -0600181 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700182 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 Willden0cb69422015-05-26 08:31:37 -0600186 ASSERT_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 Willden0cb69422015-05-26 08:31:37 -0600191 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden5b53c992015-02-02 08:05:25 -0700192 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
Shawn Willden0cb69422015-05-26 08:31:37 -0600196 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700197 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
Shawn Willden0cb69422015-05-26 08:31:37 -0600201 ASSERT_EQ(KM_ERROR_OK,
Shawn Willden7dad93b2015-02-05 10:20:47 -0700202 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600203 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700204 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600205}
206
Shawn Willdend0772312014-09-18 12:27:57 -0600207class NewKeyGeneration : public KeymasterTest {
208 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700209 void CheckBaseParams() {
210 EXPECT_EQ(0U, hw_enforced().size());
211 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600212
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700213 AuthorizationSet auths = sw_enforced();
214 EXPECT_GT(auths.SerializedSize(), 12U);
215
Shawn Willden5b53c992015-02-02 08:05:25 -0700216 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
217 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
218 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600219 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700220 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600221
222 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700223 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
224 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
225 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600226
227 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700228 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
229 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
230 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600231
232 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600233 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700234 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600235 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700236};
237
Shawn Willden128ffe02014-08-06 12:31:33 -0600238TEST_F(NewKeyGeneration, Rsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600239 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
240 .RsaSigningKey(256, 3)
241 .Digest(KM_DIGEST_NONE)
242 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700243 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600244
Shawn Willden5b53c992015-02-02 08:05:25 -0700245 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700246 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700247 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
248 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
249 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600250}
251
Shawn Willden6bbe6782014-09-18 11:26:15 -0600252TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700253 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
254 GenerateKey(AuthorizationSetBuilder()
255 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
256 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
257 .SigningKey()));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600258}
259
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600260TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600261 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600262 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700263 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600264
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700265 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600266 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700267 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600268}
269
Shawn Willden6bbe6782014-09-18 11:26:15 -0600270TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600271 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600272 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700273 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600274
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700275 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600276 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600277
278 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700279 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600280}
281
282TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700283 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willdenaf533992015-04-15 13:48:28 -0600284 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600285}
286
287TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600288 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600289 for (size_t size : valid_sizes) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600290 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
291 KM_DIGEST_NONE)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700292 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600293 }
294}
295
Shawn Willden0d560bf2014-12-15 17:44:02 -0700296TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700297 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -0600298 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700299}
300
Shawn Willden76364712014-08-11 17:48:04 -0600301typedef KeymasterTest GetKeyCharacteristics;
302TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600303 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
304 .RsaSigningKey(256, 3)
305 .Digest(KM_DIGEST_NONE)
306 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700307 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600308
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700309 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
310 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600311}
312
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700313typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600314TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600315 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
316 .RsaSigningKey(256, 3)
317 .Digest(KM_DIGEST_NONE)
318 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700319 string message = "12345678901234567890123456789012";
320 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600321 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600322}
323
Shawn Willden61902362014-12-18 10:33:24 -0700324TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600325 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600326 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600327 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600328 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700329 string message(1024, 'a');
330 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600331 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700332}
333
334TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600335 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
336 .RsaSigningKey(512, 3)
337 .Digest(KM_DIGEST_SHA_2_256)
338 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700339 // Use large message, which won't work without digesting.
340 string message(1024, 'a');
341 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600342 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700343}
344
Shawn Willdenf90f2352014-12-18 23:01:15 -0700345TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600346 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
347 .RsaSigningKey(512, 3)
348 .Digest(KM_DIGEST_SHA_2_256)
349 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700350 string message(1024, 'a');
351 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600352 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700353}
354
355TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
356 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
357 // that 9 bytes larger than hash won't work.
Shawn Willdenaf533992015-04-15 13:48:28 -0600358 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
359 .RsaSigningKey(256 + 9 * 8, 3)
360 .Digest(KM_DIGEST_SHA_2_256)
361 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700362 string message(1024, 'a');
363 string signature;
364
Shawn Willden226746b2015-05-08 11:36:56 -0600365 AuthorizationSet begin_params(client_params());
366 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600367 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600368 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700369
370 string result;
371 size_t input_consumed;
372 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
373 EXPECT_EQ(message.size(), input_consumed);
374 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
375}
376
Shawn Willden1615f2e2014-08-13 10:37:40 -0600377TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600378 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
379 .RsaSigningKey(256, 3)
380 .Digest(KM_DIGEST_NONE)
381 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600382 AuthorizationSet begin_params(client_params());
383 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600384 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600385 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700386 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
387 // Another abort should fail
388 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600389}
390
391TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600392 GenerateKey(AuthorizationSetBuilder()
393 .RsaSigningKey(256, 3)
394 .Digest(KM_DIGEST_MD5)
395 .Padding(KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700396 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600397}
398
399TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600400 GenerateKey(AuthorizationSetBuilder()
401 .RsaSigningKey(256, 3)
402 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
403 .Padding(KM_PAD_PKCS7));
Shawn Willden226746b2015-05-08 11:36:56 -0600404 AuthorizationSet begin_params(client_params());
405 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
406 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600407}
408
409TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700410 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700411 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700412 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700413 // PSS requires a digest.
Shawn Willdenaf533992015-04-15 13:48:28 -0600414 GenerateKey(AuthorizationSetBuilder()
415 .RsaSigningKey(256, 3)
416 .Digest(KM_DIGEST_NONE)
417 .Padding(KM_PAD_RSA_PSS));
Shawn Willden226746b2015-05-08 11:36:56 -0600418 AuthorizationSet begin_params(client_params());
419 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600420 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600421 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600422}
423
424TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700425 // Padding must be specified
Shawn Willdenaf533992015-04-15 13:48:28 -0600426 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
427 KM_DIGEST_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600428 AuthorizationSet begin_params(client_params());
429 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
430 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600431}
432
Shawn Willdenedb79942015-05-08 06:46:44 -0600433TEST_F(SigningOperationsTest, RsaTooShortMessage) {
434 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
435 .RsaSigningKey(256, 3)
436 .Digest(KM_DIGEST_NONE)
437 .Padding(KM_PAD_NONE)));
Shawn Willden226746b2015-05-08 11:36:56 -0600438 AuthorizationSet begin_params(client_params());
439 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600440 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -0600441 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
Shawn Willdenedb79942015-05-08 06:46:44 -0600442
443 string message = "1234567890123456789012345678901";
444 string result;
445 size_t input_consumed;
446 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
447 EXPECT_EQ(0U, result.size());
448 EXPECT_EQ(31U, input_consumed);
449
450 string signature;
451 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
452 EXPECT_EQ(0U, signature.length());
453}
454
455TEST_F(SigningOperationsTest, RsaSignWithEncryptionKey) {
456 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
457 .RsaEncryptionKey(256, 3)
458 .Digest(KM_DIGEST_NONE)
459 .Padding(KM_PAD_NONE)));
460 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
461 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
462}
463
464TEST_F(SigningOperationsTest, EcdsaSuccess) {
465 ASSERT_EQ(KM_ERROR_OK,
466 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
467 string message = "123456789012345678901234567890123456789012345678";
468 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600469 SignMessage(message, &signature, KM_DIGEST_NONE);
Shawn Willdenedb79942015-05-08 06:46:44 -0600470}
471
472TEST_F(SigningOperationsTest, AesEcbSign) {
473 ASSERT_EQ(KM_ERROR_OK,
474 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
475 TAG_BLOCK_MODE, KM_MODE_ECB)));
476 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
477 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
478}
479
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700480TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600481 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700482 string message = "12345678901234567890123456789012";
483 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600484 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
Shawn Willdenc6096592015-03-17 15:53:14 -0600485 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700486}
487
Shawn Willden62c22862014-12-17 08:36:20 -0700488TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600489 ASSERT_EQ(KM_ERROR_OK,
490 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700491 string message = "12345678901234567890123456789012";
492 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600493 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
Shawn Willdenc6096592015-03-17 15:53:14 -0600494 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700495}
496
Shawn Willden0d560bf2014-12-15 17:44:02 -0700497TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600498 ASSERT_EQ(KM_ERROR_OK,
499 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700500 string message = "12345678901234567890123456789012";
501 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600502 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
Shawn Willdenc6096592015-03-17 15:53:14 -0600503 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700504}
505
Shawn Willden62c22862014-12-17 08:36:20 -0700506TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600507 ASSERT_EQ(KM_ERROR_OK,
508 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384)));
509
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700510 string message = "12345678901234567890123456789012";
511 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600512 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
Shawn Willdenc6096592015-03-17 15:53:14 -0600513 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700514}
515
516TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -0600517 ASSERT_EQ(KM_ERROR_OK,
518 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700519 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700520 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600521 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
Shawn Willdenc6096592015-03-17 15:53:14 -0600522 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700523}
524
Shawn Willden09f25272015-04-15 13:49:49 -0600525TEST_F(SigningOperationsTest, HmacLengthInKey) {
526 // TODO(swillden): unified API should generate an error on key generation.
527 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
528 .HmacKey(128)
529 .Digest(KM_DIGEST_SHA_2_256)
530 .Authorization(TAG_MAC_LENGTH, 20)));
531 string message = "12345678901234567890123456789012";
532 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -0600533 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 240);
Shawn Willden09f25272015-04-15 13:49:49 -0600534 // Size in key was ignored.
535 ASSERT_EQ(30U, signature.size());
536}
537
Shawn Willden3b702e22015-02-05 10:26:47 -0700538TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
539 uint8_t key_data[] = {
540 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
541 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
542 };
543 string message = "Hi There";
544 uint8_t sha_224_expected[] = {
545 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
546 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
547 };
548 uint8_t sha_256_expected[] = {
549 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
550 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
551 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
552 };
553 uint8_t sha_384_expected[] = {
554 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
555 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
556 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
557 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
558 };
559 uint8_t sha_512_expected[] = {
560 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
561 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
562 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
563 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
564 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
565 };
566
567 string key = make_string(key_data);
568
569 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
570 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
571 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
572 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
573}
574
575TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
576 string key = "Jefe";
577 string message = "what do ya want for nothing?";
578 uint8_t sha_224_expected[] = {
579 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
580 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
581 };
582 uint8_t sha_256_expected[] = {
583 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
584 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
585 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
586 };
587 uint8_t sha_384_expected[] = {
588 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
589 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
590 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
591 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
592 };
593 uint8_t sha_512_expected[] = {
594 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
595 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
596 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
597 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
598 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
599 };
600
601 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
602 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
603 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
604 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
605}
606
607TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
608 string key(20, 0xaa);
609 string message(50, 0xdd);
610 uint8_t sha_224_expected[] = {
611 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
612 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
613 };
614 uint8_t sha_256_expected[] = {
615 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
616 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
617 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
618 };
619 uint8_t sha_384_expected[] = {
620 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
621 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
622 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
623 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
624 };
625 uint8_t sha_512_expected[] = {
626 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
627 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
628 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
629 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
630 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
631 };
632
633 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
634 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
635 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
636 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
637}
638
639TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
640 uint8_t key_data[25] = {
641 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
642 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
643 };
644 string key = make_string(key_data);
645 string message(50, 0xcd);
646 uint8_t sha_224_expected[] = {
647 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
648 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
649 };
650 uint8_t sha_256_expected[] = {
651 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
652 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
653 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
654 };
655 uint8_t sha_384_expected[] = {
656 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
657 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
658 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
659 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
660 };
661 uint8_t sha_512_expected[] = {
662 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
663 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
664 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
665 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
666 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
667 };
668
669 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
670 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
671 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
672 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
673}
674
675TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
676 string key(20, 0x0c);
677 string message = "Test With Truncation";
678
679 uint8_t sha_224_expected[] = {
680 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
681 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
682 };
683 uint8_t sha_256_expected[] = {
684 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
685 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
686 };
687 uint8_t sha_384_expected[] = {
688 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
689 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
690 };
691 uint8_t sha_512_expected[] = {
692 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
693 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
694 };
695
696 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
697 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
698 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
699 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
700}
701
702TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
703 string key(131, 0xaa);
704 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
705
706 uint8_t sha_224_expected[] = {
707 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
708 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
709 };
710 uint8_t sha_256_expected[] = {
711 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
712 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
713 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
714 };
715 uint8_t sha_384_expected[] = {
716 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
717 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
718 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
719 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
720 };
721 uint8_t sha_512_expected[] = {
722 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
723 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
724 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
725 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
726 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
727 };
728
729 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
730 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
731 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
732 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
733}
734
735TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
736 string key(131, 0xaa);
737 string message = "This is a test using a larger than block-size key and a larger than "
738 "block-size data. The key needs to be hashed before being used by the HMAC "
739 "algorithm.";
740
741 uint8_t sha_224_expected[] = {
742 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
743 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
744 };
745 uint8_t sha_256_expected[] = {
746 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
747 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
748 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
749 };
750 uint8_t sha_384_expected[] = {
751 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
752 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
753 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
754 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
755 };
756 uint8_t sha_512_expected[] = {
757 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
758 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
759 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
760 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
761 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
762 };
763
764 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
765 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
766 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
767 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
768}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700769
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700770TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden09f25272015-04-15 13:49:49 -0600771 ASSERT_EQ(KM_ERROR_OK,
772 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256)));
773 AuthorizationSet begin_params(client_params());
Shawn Willden0c60f6f2015-04-27 23:40:10 -0600774 begin_params.push_back(TAG_MAC_LENGTH, 264);
Shawn Willden226746b2015-05-08 11:36:56 -0600775 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden09f25272015-04-15 13:49:49 -0600776 ASSERT_EQ(KM_ERROR_OK,
777 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
778 string message = "1234567890123456789012345678901";
779 string result;
780 size_t input_consumed;
781 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
782 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, FinishOperation(&result));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700783}
784
Shawn Willden61902362014-12-18 10:33:24 -0700785// TODO(swillden): Add more verification failure tests.
786
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700787typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600788TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600789 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
790 .RsaSigningKey(256, 3)
791 .Digest(KM_DIGEST_NONE)
792 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700793 string message = "12345678901234567890123456789012";
794 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600795 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
796 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600797}
798
Shawn Willden61902362014-12-18 10:33:24 -0700799TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600800 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600801 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600802 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600803 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700804 string message(1024, 'a');
805 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600806 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
807 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700808}
809
Shawn Willdenf90f2352014-12-18 23:01:15 -0700810TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600811 GenerateKey(AuthorizationSetBuilder()
Shawn Willden3ad5f052015-05-08 14:05:13 -0600812 .RsaSigningKey(384, 3)
Shawn Willdenaf533992015-04-15 13:48:28 -0600813 .Digest(KM_DIGEST_SHA_2_256)
Shawn Willden3ad5f052015-05-08 14:05:13 -0600814 .Padding(KM_PAD_RSA_PSS));
Shawn Willden61902362014-12-18 10:33:24 -0700815 string message(1024, 'a');
816 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600817 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700818 ++signature[signature.size() / 2];
819
Shawn Willden226746b2015-05-08 11:36:56 -0600820 AuthorizationSet begin_params(client_params());
821 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600822 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600823 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -0700824
825 string result;
826 size_t input_consumed;
827 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
828 EXPECT_EQ(message.size(), input_consumed);
829 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
830}
831
Shawn Willdenf90f2352014-12-18 23:01:15 -0700832TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600833 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
834 .RsaSigningKey(512, 3)
835 .Digest(KM_DIGEST_SHA_2_256)
836 .Padding(KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700837 // Use large message, which won't work without digesting.
838 string message(1024, 'a');
839 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600840 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
841 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700842}
843
844TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600845 GenerateKey(AuthorizationSetBuilder()
846 .RsaSigningKey(512, 3)
847 .Digest(KM_DIGEST_SHA_2_256)
848 .Padding(KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700849 string message(1024, 'a');
850 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600851 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700852 ++signature[signature.size() / 2];
853
Shawn Willden226746b2015-05-08 11:36:56 -0600854 AuthorizationSet begin_params(client_params());
855 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600856 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600857 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700858
859 string result;
860 size_t input_consumed;
861 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
862 EXPECT_EQ(message.size(), input_consumed);
863 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
864}
865
866TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600867 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
868 .RsaSigningKey(512, 3)
869 .Digest(KM_DIGEST_SHA_2_256)
870 .Padding(KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700871 // Use large message, which won't work without digesting.
872 string message(1024, 'a');
873 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600874 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
Shawn Willden61902362014-12-18 10:33:24 -0700875 ++message[message.size() / 2];
876
Shawn Willden226746b2015-05-08 11:36:56 -0600877 AuthorizationSet begin_params(client_params());
878 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600879 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
Shawn Willden226746b2015-05-08 11:36:56 -0600880 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willden61902362014-12-18 10:33:24 -0700881
882 string result;
883 size_t input_consumed;
884 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
885 EXPECT_EQ(message.size(), input_consumed);
886 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
887}
888
Shawn Willdenf90f2352014-12-18 23:01:15 -0700889TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600890 GenerateKey(AuthorizationSetBuilder()
891 .RsaSigningKey(512, 3)
892 .Digest(KM_DIGEST_SHA_2_256)
893 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700894 string message(1024, 'a');
895 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600896 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
897 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700898}
899
900TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600901 GenerateKey(AuthorizationSetBuilder()
902 .RsaSigningKey(512, 3)
903 .Digest(KM_DIGEST_SHA_2_256)
904 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700905 string message(1024, 'a');
906 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600907 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700908 ++signature[signature.size() / 2];
909
Shawn Willden226746b2015-05-08 11:36:56 -0600910 AuthorizationSet begin_params(client_params());
911 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600912 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -0600913 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700914
915 string result;
916 size_t input_consumed;
917 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
918 EXPECT_EQ(message.size(), input_consumed);
919 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
920}
921
922TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willdenaf533992015-04-15 13:48:28 -0600923 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
924 .RsaSigningKey(512, 3)
925 .Digest(KM_DIGEST_SHA_2_256)
926 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700927 // Use large message, which won't work without digesting.
928 string message(1024, 'a');
929 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -0600930 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willdenf90f2352014-12-18 23:01:15 -0700931 ++message[message.size() / 2];
932
Shawn Willden226746b2015-05-08 11:36:56 -0600933 AuthorizationSet begin_params(client_params());
934 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
Shawn Willden3ad5f052015-05-08 14:05:13 -0600935 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
Shawn Willden226746b2015-05-08 11:36:56 -0600936 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700937
938 string result;
939 size_t input_consumed;
940 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
941 EXPECT_EQ(message.size(), input_consumed);
942 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
943}
944
945template <typename T> vector<T> make_vector(const T* array, size_t len) {
946 return vector<T>(array, array + len);
947}
948
949TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
950 // Get all supported digests and padding modes.
951 size_t digests_len;
952 keymaster_digest_t* digests;
Shawn Willden0cb69422015-05-26 08:31:37 -0600953 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -0700954 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
955 &digests_len));
956
957 size_t padding_modes_len;
958 keymaster_padding_t* padding_modes;
Shawn Willden0cb69422015-05-26 08:31:37 -0600959 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenf90f2352014-12-18 23:01:15 -0700960 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
961 &padding_modes, &padding_modes_len));
962
963 // Try them.
964 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
965 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
966 // Compute key & message size that will work.
967 size_t key_bits = 256;
968 size_t message_len = 1000;
969 switch (digest) {
970 case KM_DIGEST_NONE:
971 switch (padding_mode) {
972 case KM_PAD_NONE:
973 // Match key size.
974 message_len = key_bits / 8;
975 break;
976 case KM_PAD_RSA_PKCS1_1_5_SIGN:
977 message_len = key_bits / 8 - 11;
978 break;
979 case KM_PAD_RSA_PSS:
980 // PSS requires a digest.
981 continue;
982 default:
983 FAIL() << "Missing padding";
984 break;
985 }
986 break;
987
988 case KM_DIGEST_SHA_2_256:
989 switch (padding_mode) {
990 case KM_PAD_NONE:
Shawn Willden3ad5f052015-05-08 14:05:13 -0600991 // Digesting requires padding
992 continue;
Shawn Willdenf90f2352014-12-18 23:01:15 -0700993 case KM_PAD_RSA_PKCS1_1_5_SIGN:
994 key_bits += 8 * 11;
995 break;
996 case KM_PAD_RSA_PSS:
997 key_bits += 8 * 10;
998 break;
999 default:
1000 FAIL() << "Missing padding";
1001 break;
1002 }
1003 break;
1004 default:
1005 FAIL() << "Missing digest";
1006 }
1007
Shawn Willdenaf533992015-04-15 13:48:28 -06001008 GenerateKey(AuthorizationSetBuilder()
1009 .RsaSigningKey(key_bits, 3)
1010 .Digest(digest)
1011 .Padding(padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -07001012 string message(message_len, 'a');
1013 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001014 SignMessage(message, &signature, digest, padding_mode);
1015 VerifyMessage(message, signature, digest, padding_mode);
Shawn Willdenf90f2352014-12-18 23:01:15 -07001016 }
1017 }
1018
1019 free(padding_modes);
1020 free(digests);
1021}
1022
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001023TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001024 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001025 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001026 string message = "123456789012345678901234567890123456789012345678";
1027 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001028 SignMessage(message, &signature, KM_DIGEST_NONE);
1029 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -06001030}
1031
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001032TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001033 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA1));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001034 string message = "123456789012345678901234567890123456789012345678";
1035 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001036 MacMessage(message, &signature, KM_DIGEST_SHA1, 160);
1037 VerifyMessage(message, signature, KM_DIGEST_SHA1);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001038}
1039
1040TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001041 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_224));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001042 string message = "123456789012345678901234567890123456789012345678";
1043 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001044 MacMessage(message, &signature, KM_DIGEST_SHA_2_224, 224);
1045 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001046}
1047
Shawn Willden0d560bf2014-12-15 17:44:02 -07001048TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001049 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_256));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001050 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -07001051 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001052 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 256);
1053 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001054}
1055
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001056TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001057 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_384));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001058 string message = "123456789012345678901234567890123456789012345678";
1059 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001060 MacMessage(message, &signature, KM_DIGEST_SHA_2_384, 384);
1061 VerifyMessage(message, signature, KM_DIGEST_SHA_2_384);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001062}
1063
1064TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden09f25272015-04-15 13:49:49 -06001065 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_SHA_2_512));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001066 string message = "123456789012345678901234567890123456789012345678";
1067 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001068 MacMessage(message, &signature, KM_DIGEST_SHA_2_512, 512);
1069 VerifyMessage(message, signature, KM_DIGEST_SHA_2_512);
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001070}
1071
Shawn Willden5b53c992015-02-02 08:05:25 -07001072typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001073TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001074 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1075 .RsaSigningKey(256, 3)
1076 .Digest(KM_DIGEST_NONE)
1077 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001078 string export_data;
1079 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001080 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001081
1082 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001083}
1084
Shawn Willdenf268d742014-08-19 15:36:26 -06001085TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001086 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenaf533992015-04-15 13:48:28 -06001087 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001088 string export_data;
1089 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001090 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001091
1092 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001093}
1094
1095TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001096 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1097 .RsaSigningKey(256, 3)
1098 .Digest(KM_DIGEST_NONE)
1099 .Padding(KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001100 string export_data;
1101 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001102}
1103
1104TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001105 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1106 .RsaSigningKey(256, 3)
1107 .Digest(KM_DIGEST_NONE)
1108 .Padding(KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001109 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001110 string export_data;
1111 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001112}
1113
Shawn Willden7dad93b2015-02-05 10:20:47 -07001114TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001115 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001116 string export_data;
1117
1118 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1119 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1120 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1121}
1122
Shawn Willden437fbd12014-08-20 11:59:49 -06001123static string read_file(const string& file_name) {
1124 ifstream file_stream(file_name, std::ios::binary);
1125 istreambuf_iterator<char> file_begin(file_stream);
1126 istreambuf_iterator<char> file_end;
1127 return string(file_begin, file_end);
1128}
1129
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001130typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001131TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001132 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001133 ASSERT_EQ(633U, pk8_key.size());
1134
Shawn Willdenaf533992015-04-15 13:48:28 -06001135 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1136 .RsaSigningKey(1024, 65537)
1137 .Digest(KM_DIGEST_NONE)
1138 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001139 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001140
1141 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001142 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1143 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1144 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001145
Shawn Willdenb6837e72015-05-16 09:20:59 -06001146 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001147 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1148 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001149
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001150 string message(1024 / 8, 'a');
1151 string signature;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001152 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1153 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
Shawn Willden437fbd12014-08-20 11:59:49 -06001154}
1155
Shawn Willdend7a5c712015-04-09 16:33:52 -06001156TEST_F(ImportKeyTest, OldApiRsaSuccess) {
1157 string pk8_key = read_file("rsa_privkey_pk8.der");
1158 ASSERT_EQ(633U, pk8_key.size());
1159
1160 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1161 // point softkeymaster will no longer support keymaster0 APIs anyway.
1162 uint8_t* key_blob;
1163 size_t key_blob_length;
1164 ASSERT_EQ(0,
1165 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1166 pk8_key.size(), &key_blob, &key_blob_length));
1167 set_key_blob(key_blob, key_blob_length);
1168
1169 string message(1024 / 8, 'a');
Shawn Willden226746b2015-05-08 11:36:56 -06001170 AuthorizationSet begin_params; // Don't use client data.
1171 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
Shawn Willden3ad5f052015-05-08 14:05:13 -06001172 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden226746b2015-05-08 11:36:56 -06001173 AuthorizationSet update_params;
1174 AuthorizationSet output_params;
1175 string signature =
1176 ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1177 ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1178 &output_params);
Shawn Willdend7a5c712015-04-09 16:33:52 -06001179}
1180
Shawn Willden6bbe6782014-09-18 11:26:15 -06001181TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001182 string pk8_key = read_file("rsa_privkey_pk8.der");
1183 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001184 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001185 ImportKey(AuthorizationSetBuilder()
1186 .RsaSigningKey(2048 /* Doesn't match key */, 3)
1187 .Digest(KM_DIGEST_NONE)
1188 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001189 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001190}
1191
1192TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001193 string pk8_key = read_file("rsa_privkey_pk8.der");
1194 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001195 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001196 ImportKey(AuthorizationSetBuilder()
1197 .RsaSigningKey(256, 3 /* Doesnt' match key */)
1198 .Digest(KM_DIGEST_NONE)
1199 .Padding(KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001200 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001201}
1202
Shawn Willden81effc62014-08-27 10:08:46 -06001203TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001204 string pk8_key = read_file("ec_privkey_pk8.der");
1205 ASSERT_EQ(138U, pk8_key.size());
1206
Shawn Willdenaf533992015-04-15 13:48:28 -06001207 ASSERT_EQ(KM_ERROR_OK,
1208 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1209 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001210
1211 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001212 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001213 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001214
Shawn Willdenb6837e72015-05-16 09:20:59 -06001215 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001216 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1217 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001218
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001219 string message(1024 / 8, 'a');
1220 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001221 SignMessage(message, &signature, KM_DIGEST_NONE);
1222 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willden81effc62014-08-27 10:08:46 -06001223}
1224
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001225TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1226 string pk8_key = read_file("ec_privkey_pk8.der");
1227 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001228
Shawn Willdenaf533992015-04-15 13:48:28 -06001229 ASSERT_EQ(KM_ERROR_OK,
1230 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1231 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001232
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001233 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001234 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001235 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1236
Shawn Willdenb6837e72015-05-16 09:20:59 -06001237 // And values provided by AndroidKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001238 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1239 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1240
1241 string message(1024 / 8, 'a');
1242 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001243 SignMessage(message, &signature, KM_DIGEST_NONE);
1244 VerifyMessage(message, signature, KM_DIGEST_NONE);
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001245}
1246
1247TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1248 string pk8_key = read_file("ec_privkey_pk8.der");
1249 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001250 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willdenaf533992015-04-15 13:48:28 -06001251 ImportKey(AuthorizationSetBuilder()
1252 .EcdsaSigningKey(224 /* Doesn't match key */)
1253 .Digest(KM_DIGEST_NONE),
1254 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001255}
1256
Shawn Willden3b702e22015-02-05 10:26:47 -07001257TEST_F(ImportKeyTest, AesKeySuccess) {
1258 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1259 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001260 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001261 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1262 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001263 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001264
1265 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1266 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1267
1268 string message = "Hello World!";
Shawn Willdenc4424672015-05-11 11:56:02 -06001269 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1270 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willden3b702e22015-02-05 10:26:47 -07001271 EXPECT_EQ(message, plaintext);
1272}
1273
1274TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1275 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1276 string key(key_data, sizeof(key_data));
Shawn Willdenaf533992015-04-15 13:48:28 -06001277 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1278 .HmacKey(sizeof(key_data) * 8)
1279 .Digest(KM_DIGEST_SHA_2_256)
1280 .Authorization(TAG_MAC_LENGTH, 32),
Shawn Willden2c242002015-02-27 07:01:02 -07001281 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001282
1283 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1284 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1285
1286 string message = "Hello World!";
1287 string signature;
Shawn Willden226746b2015-05-08 11:36:56 -06001288 MacMessage(message, &signature, KM_DIGEST_SHA_2_256, 32);
1289 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
Shawn Willden3b702e22015-02-05 10:26:47 -07001290}
1291
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001292typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001293TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001294 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1295 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001296
1297 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001298 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001299 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001300
Shawn Willden3ad5f052015-05-08 14:05:13 -06001301 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001302 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001303
1304 // OAEP randomizes padding so every result should be different.
1305 EXPECT_NE(ciphertext1, ciphertext2);
1306}
1307
1308TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001309 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1310 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001311 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001312 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001313 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001314
Shawn Willden3ad5f052015-05-08 14:05:13 -06001315 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_OAEP);
Shawn Willden4200f212014-12-02 07:01:21 -07001316 EXPECT_EQ(message, plaintext);
1317}
1318
1319TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001320 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1321 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001322 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001323 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001324 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001325
Shawn Willden3ad5f052015-05-08 14:05:13 -06001326 AuthorizationSet begin_params(client_params());
1327 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1328 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001329 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001330 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001331 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001332}
1333
1334TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001335 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1336 KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001337 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001338 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_OAEP);
Shawn Willdenc6096592015-03-17 15:53:14 -06001339 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001340
1341 // Corrupt the ciphertext
1342 ciphertext[512 / 8 / 2]++;
1343
Shawn Willden4200f212014-12-02 07:01:21 -07001344 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001345 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001346 AuthorizationSet begin_params(client_params());
1347 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
1348 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001349 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001350 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001351 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001352}
1353
1354TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001355 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1356 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001357 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001358 string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001359 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001360
Shawn Willden3ad5f052015-05-08 14:05:13 -06001361 string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001362 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001363
1364 // PKCS1 v1.5 randomizes padding so every result should be different.
1365 EXPECT_NE(ciphertext1, ciphertext2);
1366}
1367
1368TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001369 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1370 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001371 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001372 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001373 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001374
Shawn Willden3ad5f052015-05-08 14:05:13 -06001375 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willden4200f212014-12-02 07:01:21 -07001376 EXPECT_EQ(message, plaintext);
1377}
1378
1379TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001380 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1381 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001382 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001383 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001384 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001385
Shawn Willden3ad5f052015-05-08 14:05:13 -06001386 AuthorizationSet begin_params(client_params());
1387 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1388 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001389 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001390 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001391 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001392}
1393
1394TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willdenaf533992015-04-15 13:48:28 -06001395 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
1396 KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001397 string message = "Hello World!";
Shawn Willden3ad5f052015-05-08 14:05:13 -06001398 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
Shawn Willdenc6096592015-03-17 15:53:14 -06001399 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001400
1401 // Corrupt the ciphertext
1402 ciphertext[512 / 8 / 2]++;
1403
Shawn Willden4200f212014-12-02 07:01:21 -07001404 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001405 size_t input_consumed;
Shawn Willden3ad5f052015-05-08 14:05:13 -06001406 AuthorizationSet begin_params(client_params());
1407 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
1408 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001409 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001410 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001411 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001412}
1413
Shawn Willdenedb79942015-05-08 06:46:44 -06001414TEST_F(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
1415 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1416 .RsaSigningKey(256, 3)
1417 .Digest(KM_DIGEST_NONE)
1418 .Padding(KM_PAD_NONE)));
1419 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1420 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1421}
1422
1423TEST_F(EncryptionOperationsTest, EcdsaEncrypt) {
1424 ASSERT_EQ(KM_ERROR_OK,
1425 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1426 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1427 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1428}
1429
1430TEST_F(EncryptionOperationsTest, HmacEncrypt) {
1431 ASSERT_EQ(
1432 KM_ERROR_OK,
1433 GenerateKey(
1434 AuthorizationSetBuilder().HmacKey(128).Digest(KM_DIGEST_NONE).Padding(KM_PAD_NONE)));
1435 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
1436 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
1437}
1438
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001439TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001440 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1441 .AesEncryptionKey(128)
1442 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1443 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001444 // Two-block message.
1445 string message = "12345678901234567890123456789012";
Shawn Willden31e063f2015-05-08 14:31:22 -06001446 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001447 EXPECT_EQ(message.size(), ciphertext1.size());
1448
Shawn Willden31e063f2015-05-08 14:31:22 -06001449 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001450 EXPECT_EQ(message.size(), ciphertext2.size());
1451
1452 // ECB is deterministic.
1453 EXPECT_EQ(ciphertext1, ciphertext2);
1454
Shawn Willden31e063f2015-05-08 14:31:22 -06001455 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001456 EXPECT_EQ(message, plaintext);
1457}
1458
1459TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001460 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1461 .AesEncryptionKey(128)
1462 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1463 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001464 // Message is slightly shorter than two blocks.
1465 string message = "1234567890123456789012345678901";
1466
Shawn Willden31e063f2015-05-08 14:31:22 -06001467 AuthorizationSet begin_params(client_params());
1468 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001469 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001470 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001471 string ciphertext;
1472 size_t input_consumed;
1473 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1474 EXPECT_EQ(message.size(), input_consumed);
1475 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1476}
1477
1478TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001479 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001480 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001481 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1482 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001483
1484 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001485 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001486 string message(i, 'a');
Shawn Willden31e063f2015-05-08 14:31:22 -06001487 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001488 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001489 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001490 EXPECT_EQ(message, plaintext);
1491 }
1492}
1493
1494TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001495 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001496 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001497 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1498 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001499
1500 string message = "a";
Shawn Willden31e063f2015-05-08 14:31:22 -06001501 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
Shawn Willdenc6096592015-03-17 15:53:14 -06001502 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001503 EXPECT_NE(ciphertext, message);
1504 ++ciphertext[ciphertext.size() / 2];
1505
Shawn Willden31e063f2015-05-08 14:31:22 -06001506 AuthorizationSet begin_params(client_params());
1507 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
Shawn Willdenc4424672015-05-11 11:56:02 -06001508 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
Shawn Willden31e063f2015-05-08 14:31:22 -06001509 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001510 string plaintext;
1511 size_t input_consumed;
1512 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1513 EXPECT_EQ(ciphertext.size(), input_consumed);
1514 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1515}
1516
Thai Duong20d725d2015-03-24 17:49:58 -07001517TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001518 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1519 .AesEncryptionKey(128)
1520 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1521 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001522 string message = "123";
1523 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001524 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001525 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001526 EXPECT_EQ(16U, iv1.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001527
1528 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001529 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
Thai Duong20d725d2015-03-24 17:49:58 -07001530 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willden72a5fdd2015-03-17 20:04:33 -06001531 EXPECT_EQ(16U, iv2.size());
Thai Duong20d725d2015-03-24 17:49:58 -07001532
1533 // IVs should be random, so ciphertexts should differ.
1534 EXPECT_NE(iv1, iv2);
1535 EXPECT_NE(ciphertext1, ciphertext2);
1536
Shawn Willden31e063f2015-05-08 14:31:22 -06001537 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
Thai Duong20d725d2015-03-24 17:49:58 -07001538 EXPECT_EQ(message, plaintext);
1539}
1540
1541TEST_F(EncryptionOperationsTest, AesCtrIncremental) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001542 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1543 .AesEncryptionKey(128)
1544 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1545 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001546
1547 int increment = 15;
1548 string message(239, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001549 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001550 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001551 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001552 AuthorizationSet output_params;
1553 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1554
1555 string ciphertext;
1556 size_t input_consumed;
1557 for (size_t i = 0; i < message.size(); i += increment)
1558 EXPECT_EQ(KM_ERROR_OK,
1559 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1560 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1561 EXPECT_EQ(message.size(), ciphertext.size());
1562
1563 // Move TAG_NONCE into input_params
1564 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001565 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001566 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001567 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001568 output_params.Clear();
1569
1570 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1571 string plaintext;
1572 for (size_t i = 0; i < ciphertext.size(); i += increment)
1573 EXPECT_EQ(KM_ERROR_OK,
1574 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1575 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1576 EXPECT_EQ(ciphertext.size(), plaintext.size());
1577 EXPECT_EQ(message, plaintext);
1578}
1579
1580struct AesCtrSp80038aTestVector {
1581 const char* key;
1582 const char* nonce;
1583 const char* plaintext;
1584 const char* ciphertext;
1585};
1586
1587// These test vectors are taken from
1588// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1589static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1590 // AES-128
1591 {
1592 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1593 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1594 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1595 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1596 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1597 },
1598 // AES-192
1599 {
1600 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1601 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1602 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1603 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1604 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1605 },
1606 // AES-256
1607 {
1608 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1609 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1610 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1611 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1612 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1613 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1614 },
1615};
1616
1617TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
1618 for (size_t i = 0; i < 3; i++) {
1619 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1620 const string key = hex2str(test.key);
1621 const string nonce = hex2str(test.nonce);
1622 const string plaintext = hex2str(test.plaintext);
1623 const string ciphertext = hex2str(test.ciphertext);
1624 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1625 }
1626}
1627
1628TEST_F(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
1629 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1630 .AesEncryptionKey(128)
1631 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1632 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willden31e063f2015-05-08 14:31:22 -06001633 AuthorizationSet begin_params(client_params());
1634 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001635 begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden31e063f2015-05-08 14:31:22 -06001636 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
Thai Duong20d725d2015-03-24 17:49:58 -07001637}
1638
1639TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
1640 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1641 .AesEncryptionKey(128)
1642 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001643 .Authorization(TAG_CALLER_NONCE)
1644 .Padding(KM_PAD_NONE)));
Thai Duong20d725d2015-03-24 17:49:58 -07001645
Shawn Willden09f25272015-04-15 13:49:49 -06001646 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001647 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
Shawn Willdenc4424672015-05-11 11:56:02 -06001648 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Thai Duong20d725d2015-03-24 17:49:58 -07001649 input_params.push_back(TAG_NONCE, "123", 3);
1650 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1651}
1652
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001653TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001654 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1655 .AesEncryptionKey(128)
1656 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1657 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001658 // Two-block message.
1659 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001660 string iv1;
Shawn Willden31e063f2015-05-08 14:31:22 -06001661 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001662 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001663
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001664 string iv2;
Shawn Willden31e063f2015-05-08 14:31:22 -06001665 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001666 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001667
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001668 // IVs should be random, so ciphertexts should differ.
1669 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001670 EXPECT_NE(ciphertext1, ciphertext2);
1671
Shawn Willden31e063f2015-05-08 14:31:22 -06001672 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001673 EXPECT_EQ(message, plaintext);
1674}
1675
Shawn Willden969aa382015-04-15 17:05:53 -07001676TEST_F(EncryptionOperationsTest, AesCallerNonce) {
1677 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1678 .AesEncryptionKey(128)
1679 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
Shawn Willden3ad5f052015-05-08 14:05:13 -06001680 .Authorization(TAG_CALLER_NONCE)
1681 .Padding(KM_PAD_NONE)));
Shawn Willden969aa382015-04-15 17:05:53 -07001682 string message = "12345678901234567890123456789012";
1683 string iv1;
1684 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06001685 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07001686 EXPECT_EQ(message.size(), ciphertext1.size());
1687 EXPECT_EQ(16U, iv1.size());
1688
Shawn Willden31e063f2015-05-08 14:31:22 -06001689 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden969aa382015-04-15 17:05:53 -07001690 EXPECT_EQ(message, plaintext);
1691
1692 // Now specify a nonce, should also work.
Shawn Willden09f25272015-04-15 13:49:49 -06001693 AuthorizationSet input_params(client_params());
Shawn Willden969aa382015-04-15 17:05:53 -07001694 AuthorizationSet update_params;
1695 AuthorizationSet output_params;
1696 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06001697 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06001698 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07001699 string ciphertext2 =
1700 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
1701
1702 // Decrypt with correct nonce.
1703 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1704 &output_params);
1705 EXPECT_EQ(message, plaintext);
1706
1707 // Now try with wrong nonce.
Shawn Willden09f25272015-04-15 13:49:49 -06001708 input_params.Reinitialize(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001709 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06001710 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden969aa382015-04-15 17:05:53 -07001711 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
1712 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
1713 &output_params);
1714 EXPECT_NE(message, plaintext);
1715}
1716
Shawn Willden67706352015-04-28 00:43:19 -06001717TEST_F(EncryptionOperationsTest, AesCallerNonceProhibited) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001718 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1719 .AesEncryptionKey(128)
1720 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1721 .Padding(KM_PAD_NONE)));
Shawn Willden67706352015-04-28 00:43:19 -06001722
1723 string message = "12345678901234567890123456789012";
1724 string iv1;
1725 // Don't specify nonce, should get a random one.
Shawn Willden31e063f2015-05-08 14:31:22 -06001726 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
Shawn Willden67706352015-04-28 00:43:19 -06001727 EXPECT_EQ(message.size(), ciphertext1.size());
1728 EXPECT_EQ(16U, iv1.size());
1729
Shawn Willden31e063f2015-05-08 14:31:22 -06001730 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
Shawn Willden67706352015-04-28 00:43:19 -06001731 EXPECT_EQ(message, plaintext);
1732
1733 // Now specify a nonce, should fail.
1734 AuthorizationSet input_params(client_params());
1735 AuthorizationSet update_params;
1736 AuthorizationSet output_params;
1737 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
Shawn Willden31e063f2015-05-08 14:31:22 -06001738 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06001739 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden67706352015-04-28 00:43:19 -06001740
1741 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
1742 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1743}
1744
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001745TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden3ad5f052015-05-08 14:05:13 -06001746 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1747 .AesEncryptionKey(128)
1748 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1749 .Padding(KM_PAD_NONE)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001750
1751 int increment = 15;
1752 string message(240, 'a');
Shawn Willden09f25272015-04-15 13:49:49 -06001753 AuthorizationSet input_params(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001754 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06001755 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001756 AuthorizationSet output_params;
1757 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1758
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001759 string ciphertext;
1760 size_t input_consumed;
1761 for (size_t i = 0; i < message.size(); i += increment)
1762 EXPECT_EQ(KM_ERROR_OK,
1763 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1764 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001765 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001766
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001767 // Move TAG_NONCE into input_params
1768 input_params.Reinitialize(output_params);
Shawn Willden09f25272015-04-15 13:49:49 -06001769 input_params.push_back(client_params());
Shawn Willden31e063f2015-05-08 14:31:22 -06001770 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
Shawn Willdenc4424672015-05-11 11:56:02 -06001771 input_params.push_back(TAG_PADDING, KM_PAD_NONE);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001772 output_params.Clear();
1773
1774 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001775 string plaintext;
1776 for (size_t i = 0; i < ciphertext.size(); i += increment)
1777 EXPECT_EQ(KM_ERROR_OK,
1778 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1779 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001780 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001781 EXPECT_EQ(message, plaintext);
1782}
1783
1784TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001785 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001786 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001787 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1788 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001789
1790 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001791 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001792 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001793 string iv;
Shawn Willden31e063f2015-05-08 14:31:22 -06001794 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001795 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
Shawn Willden31e063f2015-05-08 14:31:22 -06001796 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001797 EXPECT_EQ(message, plaintext);
1798 }
1799}
1800
Shawn Willdencd695822015-01-26 14:06:32 -07001801typedef KeymasterTest AddEntropyTest;
1802TEST_F(AddEntropyTest, AddEntropy) {
1803 // There's no obvious way to test that entropy is actually added, but we can test that the API
1804 // doesn't blow up or return an error.
1805 EXPECT_EQ(KM_ERROR_OK,
1806 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1807}
1808
Shawn Willden128ffe02014-08-06 12:31:33 -06001809} // namespace test
1810} // namespace keymaster