blob: a86e1cf46cc636144dc58e0c4ad8f6442d3b0ea9 [file] [log] [blame]
Shawn Willden128ffe02014-08-06 12:31:33 -06001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Shawn Willden437fbd12014-08-20 11:59:49 -060017#include <fstream>
Shawn Willden76076ab2014-12-18 08:36:35 -070018#include <string>
19#include <vector>
Shawn Willden437fbd12014-08-20 11:59:49 -060020
Shawn Willden128ffe02014-08-06 12:31:33 -060021#include <openssl/engine.h>
22
Shawn Willdend7a5c712015-04-09 16:33:52 -060023#include <hardware/keymaster0.h>
24
Shawn Willden98d9b922014-08-26 08:14:10 -060025#include <keymaster/google_keymaster_utils.h>
26#include <keymaster/keymaster_tags.h>
Shawn Willdenb7510332015-02-06 19:58:29 -070027#include <keymaster/soft_keymaster_device.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060028
Shawn Willden76364712014-08-11 17:48:04 -060029#include "google_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060030
Shawn Willden437fbd12014-08-20 11:59:49 -060031using std::ifstream;
32using std::istreambuf_iterator;
Shawn Willden76076ab2014-12-18 08:36:35 -070033using std::string;
34using std::vector;
Shawn Willden437fbd12014-08-20 11:59:49 -060035
Shawn Willden128ffe02014-08-06 12:31:33 -060036int main(int argc, char** argv) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -070037 ERR_load_crypto_strings();
Shawn Willden128ffe02014-08-06 12:31:33 -060038 ::testing::InitGoogleTest(&argc, argv);
39 int result = RUN_ALL_TESTS();
40 // Clean up stuff OpenSSL leaves around, so Valgrind doesn't complain.
41 CRYPTO_cleanup_all_ex_data();
Shawn Willden7c0a82b2014-09-17 12:57:32 -060042 ERR_remove_thread_state(NULL);
Shawn Willden128ffe02014-08-06 12:31:33 -060043 ERR_free_strings();
44 return result;
45}
46
Shawn Willden63ac0432014-12-29 14:07:08 -070047template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
48 os << "{ ";
49 bool first = true;
50 for (T t : vec) {
51 os << (first ? "" : ", ") << t;
52 if (first)
53 first = false;
54 }
55 os << " }";
56 return os;
57}
58
Shawn Willden128ffe02014-08-06 12:31:33 -060059namespace keymaster {
60namespace test {
61
Shawn Willden567a4a02014-12-31 12:14:46 -070062StdoutLogger logger;
63
Shawn Willden95dda362015-02-27 10:58:37 -070064class KeymasterTest : public Keymaster1Test {
Shawn Willden128ffe02014-08-06 12:31:33 -060065 protected:
Shawn Willden95dda362015-02-27 10:58:37 -070066 KeymasterTest() {
67 SoftKeymasterDevice* device = new SoftKeymasterDevice;
68 init(device->keymaster_device());
Shawn Willden5b53c992015-02-02 08:05:25 -070069 }
Shawn Willden128ffe02014-08-06 12:31:33 -060070};
71
Shawn Willden128ffe02014-08-06 12:31:33 -060072typedef KeymasterTest CheckSupported;
73TEST_F(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -070074 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
75 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060076
Shawn Willden5b53c992015-02-02 08:05:25 -070077 size_t len;
78 keymaster_algorithm_t* algorithms;
79 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -070080 EXPECT_TRUE(ResponseContains(
Shawn Willden9c65b2b2015-04-07 17:01:10 -060081 {KM_ALGORITHM_RSA, KM_ALGORITHM_EC, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms, len));
Shawn Willden5b53c992015-02-02 08:05:25 -070082 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -060083}
84
85TEST_F(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070086 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
87 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
88 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060089
Shawn Willden5b53c992015-02-02 08:05:25 -070090 size_t len;
91 keymaster_block_mode_t* modes;
Shawn Willden63ac0432014-12-29 14:07:08 -070092 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
93 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -060094 EXPECT_EQ(0U, len);
Shawn Willden63ac0432014-12-29 14:07:08 -070095 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060096
Shawn Willden63ac0432014-12-29 14:07:08 -070097 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden9c65b2b2015-04-07 17:01:10 -060098 device()->get_supported_block_modes(device(), KM_ALGORITHM_EC, KM_PURPOSE_ENCRYPT,
Shawn Willden5b53c992015-02-02 08:05:25 -070099 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600100
Shawn Willden63ac0432014-12-29 14:07:08 -0700101 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
102 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc47c88f2015-04-07 17:23:27 -0600103 EXPECT_TRUE(ResponseContains({KM_MODE_ECB, KM_MODE_CBC, KM_MODE_CTR}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700104 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600105}
106
107TEST_F(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700108 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
109 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
110 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600111
Shawn Willden5b53c992015-02-02 08:05:25 -0700112 size_t len;
113 keymaster_padding_t* modes;
114 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
115 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700116 EXPECT_TRUE(
117 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700118 free(modes);
119
120 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
121 KM_PURPOSE_ENCRYPT, &modes, &len));
122 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700123 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600124
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600125 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700126 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600127 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700128 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700129
130 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
131 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
132 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600133}
134
135TEST_F(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700136 EXPECT_EQ(
137 KM_ERROR_OUTPUT_PARAMETER_NULL,
138 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600139
Shawn Willden5b53c992015-02-02 08:05:25 -0700140 size_t len;
141 keymaster_digest_t* digests;
142 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
143 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700144 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700145 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600146
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600147 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700148 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden84b8da52015-03-11 07:21:32 -0600149 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700150 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600151
Shawn Willden63ac0432014-12-29 14:07:08 -0700152 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
153 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
154 &len));
155
156 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700157 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700158 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
159 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
160 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700161 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600162}
163
164TEST_F(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700165 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
166 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600167
Shawn Willden5b53c992015-02-02 08:05:25 -0700168 size_t len;
169 keymaster_key_format_t* formats;
170 EXPECT_EQ(KM_ERROR_OK,
171 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700172 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700173 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700174
175 EXPECT_EQ(KM_ERROR_OK,
176 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
177 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
178 free(formats);
179
180 EXPECT_EQ(KM_ERROR_OK,
181 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
182 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
183 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600184}
185
186TEST_F(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700187 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
188 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600189
Shawn Willden5b53c992015-02-02 08:05:25 -0700190 size_t len;
191 keymaster_key_format_t* formats;
192 EXPECT_EQ(KM_ERROR_OK,
193 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700194 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700195 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600196
Shawn Willden5b53c992015-02-02 08:05:25 -0700197 EXPECT_EQ(KM_ERROR_OK,
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600198 device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700199 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700200 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600201
Shawn Willden5b53c992015-02-02 08:05:25 -0700202 EXPECT_EQ(KM_ERROR_OK,
203 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600204 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700205 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700206
207 EXPECT_EQ(KM_ERROR_OK,
208 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600209 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700210 free(formats);
211
212 EXPECT_EQ(KM_ERROR_OK,
213 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600214 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700215 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600216}
217
Shawn Willdend0772312014-09-18 12:27:57 -0600218class NewKeyGeneration : public KeymasterTest {
219 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700220 void CheckBaseParams() {
221 EXPECT_EQ(0U, hw_enforced().size());
222 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600223
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700224 AuthorizationSet auths = sw_enforced();
225 EXPECT_GT(auths.SerializedSize(), 12U);
226
Shawn Willden5b53c992015-02-02 08:05:25 -0700227 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
228 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
229 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600230 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700231 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600232
233 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700234 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
235 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
236 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600237
238 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700239 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
240 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
241 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600242
243 // Now check that unspecified, defaulted tags are correct.
Shawn Willden0b2d3332015-04-07 17:46:18 -0600244 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_GENERATED));
Shawn Willden5b53c992015-02-02 08:05:25 -0700245 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600246 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700247};
248
Shawn Willden128ffe02014-08-06 12:31:33 -0600249TEST_F(NewKeyGeneration, Rsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700250 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
251 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700252 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600253
Shawn Willden5b53c992015-02-02 08:05:25 -0700254 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700255 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700256 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
257 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
258 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600259}
260
Shawn Willden6bbe6782014-09-18 11:26:15 -0600261TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700262 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
263 GenerateKey(AuthorizationSetBuilder()
264 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
265 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
266 .SigningKey()));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600267}
268
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600269TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600270 ASSERT_EQ(KM_ERROR_OK,
271 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700272 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600273
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700274 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600275 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700276 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600277}
278
Shawn Willden6bbe6782014-09-18 11:26:15 -0600279TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600280 ASSERT_EQ(KM_ERROR_OK,
281 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700282 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600283
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700284 // Check specified tags are all present in unenforced characteristics
Shawn Willden9c65b2b2015-04-07 17:01:10 -0600285 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600286
287 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700288 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600289}
290
291TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700292 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden84b8da52015-03-11 07:21:32 -0600293 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190, KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600294}
295
296TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600297 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600298 for (size_t size : valid_sizes) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600299 EXPECT_EQ(KM_ERROR_OK,
300 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size, KM_DIGEST_NONE)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700301 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600302 }
303}
304
Shawn Willden0d560bf2014-12-15 17:44:02 -0700305TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700306 ASSERT_EQ(KM_ERROR_OK,
307 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700308}
309
Shawn Willden76364712014-08-11 17:48:04 -0600310typedef KeymasterTest GetKeyCharacteristics;
311TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700312 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
313 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700314 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600315
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700316 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
317 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600318}
319
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700320typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600321TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700322 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
323 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700324 string message = "12345678901234567890123456789012";
325 string signature;
326 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600327}
328
Shawn Willden61902362014-12-18 10:33:24 -0700329TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
330 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700331 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
332 256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700333 string message(1024, 'a');
334 string signature;
335 SignMessage(message, &signature);
336}
337
338TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700339 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
340 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700341 // Use large message, which won't work without digesting.
342 string message(1024, 'a');
343 string signature;
344 SignMessage(message, &signature);
345}
346
Shawn Willdenf90f2352014-12-18 23:01:15 -0700347TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700348 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
349 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700350 string message(1024, 'a');
351 string signature;
352 SignMessage(message, &signature);
353}
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 Willden2c242002015-02-27 07:01:02 -0700358 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
359 256 + 9 * 8, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700360 string message(1024, 'a');
361 string signature;
362
363 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
364
365 string result;
366 size_t input_consumed;
367 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
368 EXPECT_EQ(message.size(), input_consumed);
369 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
370}
371
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600372TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600373 ASSERT_EQ(KM_ERROR_OK,
374 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700375 string message = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700376 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700377 SignMessage(message, &signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600378}
379
Shawn Willden1615f2e2014-08-13 10:37:40 -0600380TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -0700381 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
382 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdendfa1c032015-02-07 00:39:01 -0700383 AuthorizationSet input_params, output_params;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700384 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
385 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
386 // Another abort should fail
387 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600388}
389
390TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willden2c242002015-02-27 07:01:02 -0700391 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_MD5,
392 KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700393 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600394}
395
396TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -0700397 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
398 256, 3, KM_DIGEST_SHA_2_256 /* supported digest */, KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700399 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600400}
401
402TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700403 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700404 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700405 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700406 // PSS requires a digest.
Shawn Willden2c242002015-02-27 07:01:02 -0700407 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_NONE, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700408 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600409}
410
411TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700412 // Padding must be specified
Shawn Willden2c242002015-02-27 07:01:02 -0700413 ASSERT_EQ(KM_ERROR_OK,
414 GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Authorization(
415 TAG_DIGEST, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700416 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600417}
418
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700419TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700420 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 20));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700421 string message = "12345678901234567890123456789012";
422 string signature;
423 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600424 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700425}
426
Shawn Willden62c22862014-12-17 08:36:20 -0700427TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700428 ASSERT_EQ(KM_ERROR_OK,
429 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 28)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700430 string message = "12345678901234567890123456789012";
431 string signature;
432 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600433 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700434}
435
Shawn Willden0d560bf2014-12-15 17:44:02 -0700436TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700437 ASSERT_EQ(KM_ERROR_OK,
438 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700439 string message = "12345678901234567890123456789012";
440 string signature;
441 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600442 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700443}
444
Shawn Willden62c22862014-12-17 08:36:20 -0700445TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700446 ASSERT_EQ(KM_ERROR_OK,
447 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 48)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700448 string message = "12345678901234567890123456789012";
449 string signature;
450 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600451 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700452}
453
454TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700455 ASSERT_EQ(KM_ERROR_OK,
456 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 64)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700457 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700458 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700459 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600460 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700461}
462
Shawn Willden3b702e22015-02-05 10:26:47 -0700463TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
464 uint8_t key_data[] = {
465 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
466 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
467 };
468 string message = "Hi There";
469 uint8_t sha_224_expected[] = {
470 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
471 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
472 };
473 uint8_t sha_256_expected[] = {
474 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
475 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
476 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
477 };
478 uint8_t sha_384_expected[] = {
479 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
480 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
481 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
482 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
483 };
484 uint8_t sha_512_expected[] = {
485 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
486 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
487 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
488 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
489 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
490 };
491
492 string key = make_string(key_data);
493
494 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
495 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
496 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
497 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
498}
499
500TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
501 string key = "Jefe";
502 string message = "what do ya want for nothing?";
503 uint8_t sha_224_expected[] = {
504 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
505 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
506 };
507 uint8_t sha_256_expected[] = {
508 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
509 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
510 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
511 };
512 uint8_t sha_384_expected[] = {
513 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
514 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
515 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
516 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
517 };
518 uint8_t sha_512_expected[] = {
519 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
520 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
521 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
522 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
523 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
524 };
525
526 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
527 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
528 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
529 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
530}
531
532TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
533 string key(20, 0xaa);
534 string message(50, 0xdd);
535 uint8_t sha_224_expected[] = {
536 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
537 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
538 };
539 uint8_t sha_256_expected[] = {
540 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
541 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
542 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
543 };
544 uint8_t sha_384_expected[] = {
545 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
546 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
547 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
548 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
549 };
550 uint8_t sha_512_expected[] = {
551 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
552 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
553 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
554 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
555 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
556 };
557
558 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
559 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
560 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
561 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
562}
563
564TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
565 uint8_t key_data[25] = {
566 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
567 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
568 };
569 string key = make_string(key_data);
570 string message(50, 0xcd);
571 uint8_t sha_224_expected[] = {
572 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
573 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
574 };
575 uint8_t sha_256_expected[] = {
576 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
577 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
578 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
579 };
580 uint8_t sha_384_expected[] = {
581 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
582 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
583 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
584 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
585 };
586 uint8_t sha_512_expected[] = {
587 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
588 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
589 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
590 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
591 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
592 };
593
594 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
595 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
596 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
597 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
598}
599
600TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
601 string key(20, 0x0c);
602 string message = "Test With Truncation";
603
604 uint8_t sha_224_expected[] = {
605 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
606 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
607 };
608 uint8_t sha_256_expected[] = {
609 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
610 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
611 };
612 uint8_t sha_384_expected[] = {
613 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
614 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
615 };
616 uint8_t sha_512_expected[] = {
617 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
618 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
619 };
620
621 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
622 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
623 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
624 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
625}
626
627TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
628 string key(131, 0xaa);
629 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
630
631 uint8_t sha_224_expected[] = {
632 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
633 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
634 };
635 uint8_t sha_256_expected[] = {
636 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
637 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
638 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
639 };
640 uint8_t sha_384_expected[] = {
641 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
642 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
643 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
644 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
645 };
646 uint8_t sha_512_expected[] = {
647 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
648 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
649 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
650 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
651 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
652 };
653
654 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
655 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
656 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
657 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
658}
659
660TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
661 string key(131, 0xaa);
662 string message = "This is a test using a larger than block-size key and a larger than "
663 "block-size data. The key needs to be hashed before being used by the HMAC "
664 "algorithm.";
665
666 uint8_t sha_224_expected[] = {
667 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
668 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
669 };
670 uint8_t sha_256_expected[] = {
671 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
672 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
673 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
674 };
675 uint8_t sha_384_expected[] = {
676 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
677 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
678 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
679 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
680 };
681 uint8_t sha_512_expected[] = {
682 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
683 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
684 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
685 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
686 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
687 };
688
689 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
690 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
691 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
692 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
693}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700694
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700695TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700696 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
697 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
698 .Authorization(TAG_KEY_SIZE, 128)
Shawn Willdenc24c1102014-12-22 15:30:09 -0700699 .SigningKey()
Shawn Willden2c242002015-02-27 07:01:02 -0700700 .Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700701 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700702}
703
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700704TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700705 ASSERT_EQ(KM_ERROR_OK,
706 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 33)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700707 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700708}
709
Shawn Willden1615f2e2014-08-13 10:37:40 -0600710TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willden2c242002015-02-27 07:01:02 -0700711 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
712 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700713 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700714
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700715 string message = "1234567890123456789012345678901";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700716 string result;
717 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700718 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700719 EXPECT_EQ(0U, result.size());
720 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600721
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700722 string signature;
723 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
724 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -0600725}
726
Shawn Willden61902362014-12-18 10:33:24 -0700727// TODO(swillden): Add more verification failure tests.
728
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700729typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600730TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700731 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
732 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700733 string message = "12345678901234567890123456789012";
734 string signature;
735 SignMessage(message, &signature);
736 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600737}
738
Shawn Willden61902362014-12-18 10:33:24 -0700739TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
740 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700741 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700742 string message(1024, 'a');
743 string signature;
744 SignMessage(message, &signature);
745 VerifyMessage(message, signature);
746}
747
Shawn Willdenf90f2352014-12-18 23:01:15 -0700748TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700749 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700750 string message(1024, 'a');
751 string signature;
752 SignMessage(message, &signature);
753 ++signature[signature.size() / 2];
754
755 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
756
757 string result;
758 size_t input_consumed;
759 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
760 EXPECT_EQ(message.size(), input_consumed);
761 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
762}
763
Shawn Willdenf90f2352014-12-18 23:01:15 -0700764TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700765 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
766 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700767 // Use large message, which won't work without digesting.
768 string message(1024, 'a');
769 string signature;
770 SignMessage(message, &signature);
771 VerifyMessage(message, signature);
772}
773
774TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700775 GenerateKey(
776 AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700777 string message(1024, 'a');
778 string signature;
779 SignMessage(message, &signature);
780 ++signature[signature.size() / 2];
781
782 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
783
784 string result;
785 size_t input_consumed;
786 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
787 EXPECT_EQ(message.size(), input_consumed);
788 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
789}
790
791TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -0700792 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
793 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700794 // Use large message, which won't work without digesting.
795 string message(1024, 'a');
796 string signature;
797 SignMessage(message, &signature);
798 ++message[message.size() / 2];
799
800 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
801
802 string result;
803 size_t input_consumed;
804 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
805 EXPECT_EQ(message.size(), input_consumed);
806 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
807}
808
Shawn Willdenf90f2352014-12-18 23:01:15 -0700809TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700810 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
811 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700812 string message(1024, 'a');
813 string signature;
814 SignMessage(message, &signature);
815 VerifyMessage(message, signature);
816}
817
818TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700819 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
820 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700821 string message(1024, 'a');
822 string signature;
823 SignMessage(message, &signature);
824 ++signature[signature.size() / 2];
825
826 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
827
828 string result;
829 size_t input_consumed;
830 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
831 EXPECT_EQ(message.size(), input_consumed);
832 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
833}
834
835TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -0700836 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
837 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700838 // Use large message, which won't work without digesting.
839 string message(1024, 'a');
840 string signature;
841 SignMessage(message, &signature);
842 ++message[message.size() / 2];
843
844 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
845
846 string result;
847 size_t input_consumed;
848 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
849 EXPECT_EQ(message.size(), input_consumed);
850 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
851}
852
853template <typename T> vector<T> make_vector(const T* array, size_t len) {
854 return vector<T>(array, array + len);
855}
856
857TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
858 // Get all supported digests and padding modes.
859 size_t digests_len;
860 keymaster_digest_t* digests;
861 EXPECT_EQ(KM_ERROR_OK,
862 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
863 &digests_len));
864
865 size_t padding_modes_len;
866 keymaster_padding_t* padding_modes;
867 EXPECT_EQ(KM_ERROR_OK,
868 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
869 &padding_modes, &padding_modes_len));
870
871 // Try them.
872 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
873 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
874 // Compute key & message size that will work.
875 size_t key_bits = 256;
876 size_t message_len = 1000;
877 switch (digest) {
878 case KM_DIGEST_NONE:
879 switch (padding_mode) {
880 case KM_PAD_NONE:
881 // Match key size.
882 message_len = key_bits / 8;
883 break;
884 case KM_PAD_RSA_PKCS1_1_5_SIGN:
885 message_len = key_bits / 8 - 11;
886 break;
887 case KM_PAD_RSA_PSS:
888 // PSS requires a digest.
889 continue;
890 default:
891 FAIL() << "Missing padding";
892 break;
893 }
894 break;
895
896 case KM_DIGEST_SHA_2_256:
897 switch (padding_mode) {
898 case KM_PAD_NONE:
899 // Key size matches digest size
900 break;
901 case KM_PAD_RSA_PKCS1_1_5_SIGN:
902 key_bits += 8 * 11;
903 break;
904 case KM_PAD_RSA_PSS:
905 key_bits += 8 * 10;
906 break;
907 default:
908 FAIL() << "Missing padding";
909 break;
910 }
911 break;
912 default:
913 FAIL() << "Missing digest";
914 }
915
Shawn Willden2c242002015-02-27 07:01:02 -0700916 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(key_bits, 3, digest, padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700917 string message(message_len, 'a');
918 string signature;
919 SignMessage(message, &signature);
920 VerifyMessage(message, signature);
921 }
922 }
923
924 free(padding_modes);
925 free(digests);
926}
927
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600928TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600929 ASSERT_EQ(KM_ERROR_OK,
930 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700931 string message = "123456789012345678901234567890123456789012345678";
932 string signature;
933 SignMessage(message, &signature);
934 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600935}
936
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700937TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700938 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700939 string message = "123456789012345678901234567890123456789012345678";
940 string signature;
941 SignMessage(message, &signature);
942 VerifyMessage(message, signature);
943}
944
945TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700946 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700947 string message = "123456789012345678901234567890123456789012345678";
948 string signature;
949 SignMessage(message, &signature);
950 VerifyMessage(message, signature);
951}
952
Shawn Willden0d560bf2014-12-15 17:44:02 -0700953TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700954 ASSERT_EQ(KM_ERROR_OK,
955 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700956 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -0700957 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700958 SignMessage(message, &signature);
959 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -0700960}
961
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700962TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700963 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700964 string message = "123456789012345678901234567890123456789012345678";
965 string signature;
966 SignMessage(message, &signature);
967 VerifyMessage(message, signature);
968}
969
970TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700971 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700972 string message = "123456789012345678901234567890123456789012345678";
973 string signature;
974 SignMessage(message, &signature);
975 VerifyMessage(message, signature);
976}
977
Shawn Willden5b53c992015-02-02 08:05:25 -0700978typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -0600979TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700980 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
981 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700982 string export_data;
983 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -0600984 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -0600985
986 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -0600987}
988
Shawn Willdenf268d742014-08-19 15:36:26 -0600989TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600990 ASSERT_EQ(KM_ERROR_OK,
991 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700992 string export_data;
993 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -0600994 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -0600995
996 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -0600997}
998
999TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willden2c242002015-02-27 07:01:02 -07001000 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1001 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001002 string export_data;
1003 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001004}
1005
1006TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willden2c242002015-02-27 07:01:02 -07001007 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1008 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001009 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001010 string export_data;
1011 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001012}
1013
Shawn Willden7dad93b2015-02-05 10:20:47 -07001014TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001015 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001016 string export_data;
1017
1018 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1019 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1020 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1021}
1022
Shawn Willden437fbd12014-08-20 11:59:49 -06001023static string read_file(const string& file_name) {
1024 ifstream file_stream(file_name, std::ios::binary);
1025 istreambuf_iterator<char> file_begin(file_stream);
1026 istreambuf_iterator<char> file_end;
1027 return string(file_begin, file_end);
1028}
1029
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001030typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001031TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001032 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001033 ASSERT_EQ(633U, pk8_key.size());
1034
Shawn Willden2c242002015-02-27 07:01:02 -07001035 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().RsaSigningKey(
1036 1024, 65537, KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001037 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001038
1039 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001040 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1041 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1042 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001043
1044 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001045 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1046 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001047
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001048 string message(1024 / 8, 'a');
1049 string signature;
1050 SignMessage(message, &signature);
1051 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001052}
1053
Shawn Willdend7a5c712015-04-09 16:33:52 -06001054TEST_F(ImportKeyTest, OldApiRsaSuccess) {
1055 string pk8_key = read_file("rsa_privkey_pk8.der");
1056 ASSERT_EQ(633U, pk8_key.size());
1057
1058 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1059 // point softkeymaster will no longer support keymaster0 APIs anyway.
1060 uint8_t* key_blob;
1061 size_t key_blob_length;
1062 ASSERT_EQ(0,
1063 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1064 pk8_key.size(), &key_blob, &key_blob_length));
1065 set_key_blob(key_blob, key_blob_length);
1066
1067 string message(1024 / 8, 'a');
1068 string signature;
1069 SignMessage(message, &signature, false /* use_client_params */);
1070 VerifyMessage(message, signature, false /* use_client_params */);
1071}
1072
Shawn Willden6bbe6782014-09-18 11:26:15 -06001073TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001074 string pk8_key = read_file("rsa_privkey_pk8.der");
1075 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001076 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001077 ImportKey(AuthorizationSetBuilder().RsaSigningKey(2048 /* Doesn't match key */, 3,
1078 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001079 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001080}
1081
1082TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001083 string pk8_key = read_file("rsa_privkey_pk8.der");
1084 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001085 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001086 ImportKey(AuthorizationSetBuilder().RsaSigningKey(256, 3 /* Doesnt' match key */,
1087 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001088 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001089}
1090
Shawn Willden81effc62014-08-27 10:08:46 -06001091TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001092 string pk8_key = read_file("ec_privkey_pk8.der");
1093 ASSERT_EQ(138U, pk8_key.size());
1094
Shawn Willden84b8da52015-03-11 07:21:32 -06001095 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001096 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001097
1098 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001099 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001100 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001101
1102 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001103 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1104 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001105
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001106 string message(1024 / 8, 'a');
1107 string signature;
1108 SignMessage(message, &signature);
1109 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001110}
1111
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001112TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1113 string pk8_key = read_file("ec_privkey_pk8.der");
1114 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001115
Shawn Willden84b8da52015-03-11 07:21:32 -06001116 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001117 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001118
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001119 // Check values derived from the key.
Shawn Willden9c65b2b2015-04-07 17:01:10 -06001120 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_EC));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001121 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1122
1123 // And values provided by GoogleKeymaster
1124 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1125 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1126
1127 string message(1024 / 8, 'a');
1128 string signature;
1129 SignMessage(message, &signature);
1130 VerifyMessage(message, signature);
1131}
1132
1133TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1134 string pk8_key = read_file("ec_privkey_pk8.der");
1135 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001136 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden84b8da52015-03-11 07:21:32 -06001137 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(
1138 224, KM_DIGEST_NONE), // Size does not match key
1139 KM_KEY_FORMAT_PKCS8,
1140 pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001141}
1142
Shawn Willden3b702e22015-02-05 10:26:47 -07001143TEST_F(ImportKeyTest, AesKeySuccess) {
1144 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1145 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001146 ASSERT_EQ(KM_ERROR_OK,
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001147 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1148 TAG_PADDING, KM_PAD_PKCS7),
Shawn Willden2c242002015-02-27 07:01:02 -07001149 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001150
1151 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1152 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1153
1154 string message = "Hello World!";
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001155 string ciphertext = EncryptMessage(message);
1156 string plaintext = DecryptMessage(ciphertext);
Shawn Willden3b702e22015-02-05 10:26:47 -07001157 EXPECT_EQ(message, plaintext);
1158}
1159
1160TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1161 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1162 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001163 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().HmacKey(sizeof(key_data) * 8,
1164 KM_DIGEST_SHA_2_256, 32),
1165 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001166
1167 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1168 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1169
1170 string message = "Hello World!";
1171 string signature;
1172 SignMessage(message, &signature);
1173 VerifyMessage(message, signature);
1174}
1175
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001176typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001177TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001178 ASSERT_EQ(KM_ERROR_OK,
1179 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001180
1181 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001182 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001183 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001184
Shawn Willden6dde87c2014-12-11 14:08:48 -07001185 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001186 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001187
1188 // OAEP randomizes padding so every result should be different.
1189 EXPECT_NE(ciphertext1, ciphertext2);
1190}
1191
1192TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001193 ASSERT_EQ(KM_ERROR_OK,
1194 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001195 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001196 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001197 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001198
Shawn Willden6dde87c2014-12-11 14:08:48 -07001199 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001200 EXPECT_EQ(message, plaintext);
1201}
1202
1203TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willden2c242002015-02-27 07:01:02 -07001204 ASSERT_EQ(KM_ERROR_OK,
1205 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001206 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001207 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001208 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001209
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001210 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1211 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001212 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001213 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001214}
1215
1216TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001217 ASSERT_EQ(KM_ERROR_OK,
1218 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001219 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001220 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001221 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001222
1223 // Corrupt the ciphertext
1224 ciphertext[512 / 8 / 2]++;
1225
Shawn Willden4200f212014-12-02 07:01:21 -07001226 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001227 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001228 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1229 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001230 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001231 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001232}
1233
1234TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001235 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1236 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001237 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001238 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001239 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001240
Shawn Willden6dde87c2014-12-11 14:08:48 -07001241 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001242 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001243
1244 // PKCS1 v1.5 randomizes padding so every result should be different.
1245 EXPECT_NE(ciphertext1, ciphertext2);
1246}
1247
1248TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001249 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1250 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001251 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001252 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001253 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001254
Shawn Willden6dde87c2014-12-11 14:08:48 -07001255 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001256 EXPECT_EQ(message, plaintext);
1257}
1258
1259TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willden2c242002015-02-27 07:01:02 -07001260 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1261 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001262 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001263 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001264 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001265
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001266 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1267 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001268 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001269 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001270}
1271
1272TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001273 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1274 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001275 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001276 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001277 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001278
1279 // Corrupt the ciphertext
1280 ciphertext[512 / 8 / 2]++;
1281
Shawn Willden4200f212014-12-02 07:01:21 -07001282 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001283 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001284 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1285 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001286 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001287 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001288}
1289
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001290TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001291 ASSERT_EQ(KM_ERROR_OK,
1292 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1293 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001294 // Two-block message.
1295 string message = "12345678901234567890123456789012";
1296 string ciphertext1 = EncryptMessage(message);
1297 EXPECT_EQ(message.size(), ciphertext1.size());
1298
1299 string ciphertext2 = EncryptMessage(string(message));
1300 EXPECT_EQ(message.size(), ciphertext2.size());
1301
1302 // ECB is deterministic.
1303 EXPECT_EQ(ciphertext1, ciphertext2);
1304
1305 string plaintext = DecryptMessage(ciphertext1);
1306 EXPECT_EQ(message, plaintext);
1307}
1308
1309TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07001310 ASSERT_EQ(KM_ERROR_OK,
1311 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1312 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001313 // Message is slightly shorter than two blocks.
1314 string message = "1234567890123456789012345678901";
1315
1316 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1317 string ciphertext;
1318 size_t input_consumed;
1319 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1320 EXPECT_EQ(message.size(), input_consumed);
1321 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1322}
1323
1324TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001325 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001326 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001327 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1328 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001329
1330 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001331 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001332 string message(i, 'a');
1333 string ciphertext = EncryptMessage(message);
1334 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1335 string plaintext = DecryptMessage(ciphertext);
1336 EXPECT_EQ(message, plaintext);
1337 }
1338}
1339
1340TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001341 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001342 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001343 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1344 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001345
1346 string message = "a";
1347 string ciphertext = EncryptMessage(message);
Shawn Willdenc6096592015-03-17 15:53:14 -06001348 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001349 EXPECT_NE(ciphertext, message);
1350 ++ciphertext[ciphertext.size() / 2];
1351
1352 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1353 string plaintext;
1354 size_t input_consumed;
1355 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1356 EXPECT_EQ(ciphertext.size(), input_consumed);
1357 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1358}
1359
Thai Duong20d725d2015-03-24 17:49:58 -07001360TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
1361 ASSERT_EQ(KM_ERROR_OK,
1362 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1363 TAG_BLOCK_MODE, KM_MODE_CTR)));
1364 string message = "123";
1365 string iv1;
1366 string ciphertext1 = EncryptMessage(message, &iv1);
1367 EXPECT_EQ(message.size(), ciphertext1.size());
1368 EXPECT_EQ(16, iv1.size());
1369
1370 string iv2;
1371 string ciphertext2 = EncryptMessage(message, &iv2);
1372 EXPECT_EQ(message.size(), ciphertext2.size());
1373 EXPECT_EQ(16, iv2.size());
1374
1375 // IVs should be random, so ciphertexts should differ.
1376 EXPECT_NE(iv1, iv2);
1377 EXPECT_NE(ciphertext1, ciphertext2);
1378
1379 string plaintext = DecryptMessage(ciphertext1, iv1);
1380 EXPECT_EQ(message, plaintext);
1381}
1382
1383TEST_F(EncryptionOperationsTest, AesCtrIncremental) {
1384 ASSERT_EQ(KM_ERROR_OK,
1385 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1386 TAG_BLOCK_MODE, KM_MODE_CTR)));
1387
1388 int increment = 15;
1389 string message(239, 'a');
1390 AuthorizationSet input_params;
1391 AuthorizationSet output_params;
1392 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1393
1394 string ciphertext;
1395 size_t input_consumed;
1396 for (size_t i = 0; i < message.size(); i += increment)
1397 EXPECT_EQ(KM_ERROR_OK,
1398 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1399 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1400 EXPECT_EQ(message.size(), ciphertext.size());
1401
1402 // Move TAG_NONCE into input_params
1403 input_params.Reinitialize(output_params);
1404 output_params.Clear();
1405
1406 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1407 string plaintext;
1408 for (size_t i = 0; i < ciphertext.size(); i += increment)
1409 EXPECT_EQ(KM_ERROR_OK,
1410 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1411 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1412 EXPECT_EQ(ciphertext.size(), plaintext.size());
1413 EXPECT_EQ(message, plaintext);
1414}
1415
1416struct AesCtrSp80038aTestVector {
1417 const char* key;
1418 const char* nonce;
1419 const char* plaintext;
1420 const char* ciphertext;
1421};
1422
1423// These test vectors are taken from
1424// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1425static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1426 // AES-128
1427 {
1428 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1429 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1430 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1431 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1432 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1433 },
1434 // AES-192
1435 {
1436 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1437 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1438 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1439 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1440 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1441 },
1442 // AES-256
1443 {
1444 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1445 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1446 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1447 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1448 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1449 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1450 },
1451};
1452
1453TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
1454 for (size_t i = 0; i < 3; i++) {
1455 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1456 const string key = hex2str(test.key);
1457 const string nonce = hex2str(test.nonce);
1458 const string plaintext = hex2str(test.plaintext);
1459 const string ciphertext = hex2str(test.ciphertext);
1460 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1461 }
1462}
1463
1464TEST_F(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
1465 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1466 .AesEncryptionKey(128)
1467 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1468 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
1469
1470 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
1471}
1472
1473TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
1474 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1475 .AesEncryptionKey(128)
1476 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1477 .Authorization(TAG_CALLER_NONCE)));
1478
1479 AuthorizationSet input_params;
1480 input_params.push_back(TAG_NONCE, "123", 3);
1481 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1482}
1483
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001484TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001485 ASSERT_EQ(KM_ERROR_OK,
1486 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1487 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001488 // Two-block message.
1489 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001490 string iv1;
1491 string ciphertext1 = EncryptMessage(message, &iv1);
1492 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001493
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001494 string iv2;
1495 string ciphertext2 = EncryptMessage(message, &iv2);
1496 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001497
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001498 // IVs should be random, so ciphertexts should differ.
1499 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001500 EXPECT_NE(ciphertext1, ciphertext2);
1501
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001502 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001503 EXPECT_EQ(message, plaintext);
1504}
1505
1506TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001507 ASSERT_EQ(KM_ERROR_OK,
1508 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1509 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001510
1511 int increment = 15;
1512 string message(240, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001513 AuthorizationSet input_params;
1514 AuthorizationSet output_params;
1515 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1516
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001517 string ciphertext;
1518 size_t input_consumed;
1519 for (size_t i = 0; i < message.size(); i += increment)
1520 EXPECT_EQ(KM_ERROR_OK,
1521 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1522 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001523 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001524
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001525 // Move TAG_NONCE into input_params
1526 input_params.Reinitialize(output_params);
1527 output_params.Clear();
1528
1529 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001530 string plaintext;
1531 for (size_t i = 0; i < ciphertext.size(); i += increment)
1532 EXPECT_EQ(KM_ERROR_OK,
1533 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1534 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001535 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001536 EXPECT_EQ(message, plaintext);
1537}
1538
1539TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001540 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001541 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001542 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1543 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001544
1545 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001546 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001547 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001548 string iv;
1549 string ciphertext = EncryptMessage(message, &iv);
1550 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1551 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001552 EXPECT_EQ(message, plaintext);
1553 }
1554}
1555
Shawn Willdencd695822015-01-26 14:06:32 -07001556typedef KeymasterTest AddEntropyTest;
1557TEST_F(AddEntropyTest, AddEntropy) {
1558 // There's no obvious way to test that entropy is actually added, but we can test that the API
1559 // doesn't blow up or return an error.
1560 EXPECT_EQ(KM_ERROR_OK,
1561 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1562}
1563
Shawn Willden5fad7852015-01-26 16:10:56 -07001564typedef KeymasterTest RescopingTest;
1565TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001566 ASSERT_EQ(KM_ERROR_OK,
1567 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1568 TAG_RESCOPING_ADD, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001569 // TODO(swillden): Add a better error code for this.
Shawn Willdenf01329d2015-03-11 21:51:38 -06001570 EXPECT_EQ(KM_ERROR_RESCOPABLE_KEY_NOT_USABLE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001571}
1572
1573TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07001574 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07001575 .AesEncryptionKey(128)
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001576 .EcbMode()
1577 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1578 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
1579 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1580 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001581
1582 keymaster_key_blob_t rescoped_blob;
1583 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001584 AuthorizationSet new_params =
1585 AuthorizationSetBuilder().AesKey(128).Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN).build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001586
1587 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1588 ASSERT_TRUE(rescoped_characteristics != NULL);
1589
Shawn Willdenc6096592015-03-17 15:53:14 -06001590 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001591 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1592 keymaster_free_characteristics(rescoped_characteristics);
1593 free(rescoped_characteristics);
1594 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1595
1596 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
Shawn Willdenc47c88f2015-04-07 17:23:27 -06001597 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1598 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07001599}
1600
1601TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07001602 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1603 .RsaEncryptionKey(256, 3, KM_PAD_RSA_OAEP)
1604 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1605 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001606 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1607 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1608 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1609 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
1610
1611 keymaster_key_blob_t rescoped_blob;
1612 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001613 AuthorizationSet new_params = AuthorizationSetBuilder()
1614 .RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)
1615 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001616
1617 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1618 ASSERT_TRUE(rescoped_characteristics != NULL);
1619
Shawn Willdenc6096592015-03-17 15:53:14 -06001620 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07001621 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1622 keymaster_free_characteristics(rescoped_characteristics);
1623 free(rescoped_characteristics);
1624 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1625
1626 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1627 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1628 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
1629 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
1630}
1631
1632// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
1633// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
1634// may not be changed.
1635
Shawn Willden128ffe02014-08-06 12:31:33 -06001636} // namespace test
1637} // namespace keymaster