blob: 946c5fd4574324e2201534c0ec8299902db42f55 [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 Willden98d9b922014-08-26 08:14:10 -060023#include <keymaster/google_keymaster_utils.h>
24#include <keymaster/keymaster_tags.h>
Shawn Willdenb7510332015-02-06 19:58:29 -070025#include <keymaster/soft_keymaster_device.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060026
Shawn Willden76364712014-08-11 17:48:04 -060027#include "google_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060028
Shawn Willden437fbd12014-08-20 11:59:49 -060029using std::ifstream;
30using std::istreambuf_iterator;
Shawn Willden76076ab2014-12-18 08:36:35 -070031using std::string;
32using std::vector;
Shawn Willden437fbd12014-08-20 11:59:49 -060033
Shawn Willden128ffe02014-08-06 12:31:33 -060034int main(int argc, char** argv) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -070035 ERR_load_crypto_strings();
Shawn Willden128ffe02014-08-06 12:31:33 -060036 ::testing::InitGoogleTest(&argc, argv);
37 int result = RUN_ALL_TESTS();
38 // Clean up stuff OpenSSL leaves around, so Valgrind doesn't complain.
39 CRYPTO_cleanup_all_ex_data();
Shawn Willden7c0a82b2014-09-17 12:57:32 -060040 ERR_remove_thread_state(NULL);
Shawn Willden128ffe02014-08-06 12:31:33 -060041 ERR_free_strings();
42 return result;
43}
44
Shawn Willden63ac0432014-12-29 14:07:08 -070045template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
46 os << "{ ";
47 bool first = true;
48 for (T t : vec) {
49 os << (first ? "" : ", ") << t;
50 if (first)
51 first = false;
52 }
53 os << " }";
54 return os;
55}
56
Shawn Willden128ffe02014-08-06 12:31:33 -060057namespace keymaster {
58namespace test {
59
Shawn Willden567a4a02014-12-31 12:14:46 -070060StdoutLogger logger;
61
Shawn Willden95dda362015-02-27 10:58:37 -070062class KeymasterTest : public Keymaster1Test {
Shawn Willden128ffe02014-08-06 12:31:33 -060063 protected:
Shawn Willden95dda362015-02-27 10:58:37 -070064 KeymasterTest() {
65 SoftKeymasterDevice* device = new SoftKeymasterDevice;
66 init(device->keymaster_device());
Shawn Willden5b53c992015-02-02 08:05:25 -070067 }
Shawn Willden128ffe02014-08-06 12:31:33 -060068};
69
Shawn Willden128ffe02014-08-06 12:31:33 -060070typedef KeymasterTest CheckSupported;
71TEST_F(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -070072 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
73 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060074
Shawn Willden5b53c992015-02-02 08:05:25 -070075 size_t len;
76 keymaster_algorithm_t* algorithms;
77 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -070078 EXPECT_TRUE(ResponseContains(
79 {KM_ALGORITHM_RSA, KM_ALGORITHM_ECDSA, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms,
80 len));
Shawn Willden5b53c992015-02-02 08:05:25 -070081 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -060082}
83
84TEST_F(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070085 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
86 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
87 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060088
Shawn Willden5b53c992015-02-02 08:05:25 -070089 size_t len;
90 keymaster_block_mode_t* modes;
Shawn Willden63ac0432014-12-29 14:07:08 -070091 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
92 KM_PURPOSE_ENCRYPT, &modes, &len));
93 EXPECT_EQ(0, len);
94 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060095
Shawn Willden76076ab2014-12-18 08:36:35 -070096 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
Shawn Willden5b53c992015-02-02 08:05:25 -070097 device()->get_supported_block_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_ENCRYPT,
98 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -060099
Shawn Willden63ac0432014-12-29 14:07:08 -0700100 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden5b53c992015-02-02 08:05:25 -0700101 device()->get_supported_block_modes(device(), KM_ALGORITHM_ECDSA, KM_PURPOSE_ENCRYPT,
102 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600103
Shawn Willden63ac0432014-12-29 14:07:08 -0700104 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
105 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willden498e0aa2015-03-04 15:35:45 -0700106 EXPECT_TRUE(ResponseContains({KM_MODE_OCB, KM_MODE_ECB, KM_MODE_CBC}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700107 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600108}
109
110TEST_F(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700111 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
112 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
113 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600114
Shawn Willden5b53c992015-02-02 08:05:25 -0700115 size_t len;
116 keymaster_padding_t* modes;
117 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
118 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700119 EXPECT_TRUE(
120 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700121 free(modes);
122
123 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
124 KM_PURPOSE_ENCRYPT, &modes, &len));
125 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700126 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600127
Shawn Willden76076ab2014-12-18 08:36:35 -0700128 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
129 device()->get_supported_padding_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_SIGN,
130 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600131
Shawn Willden5b53c992015-02-02 08:05:25 -0700132 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_ECDSA,
133 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700134 EXPECT_EQ(0, len);
135 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700136
137 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
138 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
139 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600140}
141
142TEST_F(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700143 EXPECT_EQ(
144 KM_ERROR_OUTPUT_PARAMETER_NULL,
145 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600146
Shawn Willden5b53c992015-02-02 08:05:25 -0700147 size_t len;
148 keymaster_digest_t* digests;
149 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
150 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700151 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700152 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600153
Shawn Willden76076ab2014-12-18 08:36:35 -0700154 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
155 device()->get_supported_digests(device(), KM_ALGORITHM_DSA, KM_PURPOSE_SIGN, &digests,
156 &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600157
Shawn Willden5b53c992015-02-02 08:05:25 -0700158 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_ECDSA,
159 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden84b8da52015-03-11 07:21:32 -0600160 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700161 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600162
Shawn Willden63ac0432014-12-29 14:07:08 -0700163 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
164 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
165 &len));
166
167 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700168 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700169 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
170 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
171 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700172 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600173}
174
175TEST_F(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700176 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
177 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600178
Shawn Willden5b53c992015-02-02 08:05:25 -0700179 size_t len;
180 keymaster_key_format_t* formats;
181 EXPECT_EQ(KM_ERROR_OK,
182 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700183 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700184 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700185
186 EXPECT_EQ(KM_ERROR_OK,
187 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
188 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
189 free(formats);
190
191 EXPECT_EQ(KM_ERROR_OK,
192 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
193 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
194 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600195}
196
197TEST_F(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700198 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
199 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600200
Shawn Willden5b53c992015-02-02 08:05:25 -0700201 size_t len;
202 keymaster_key_format_t* formats;
203 EXPECT_EQ(KM_ERROR_OK,
204 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700205 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700206 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600207
Shawn Willden76076ab2014-12-18 08:36:35 -0700208 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
Shawn Willden5b53c992015-02-02 08:05:25 -0700209 device()->get_supported_export_formats(device(), KM_ALGORITHM_DSA, &formats, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600210
Shawn Willden5b53c992015-02-02 08:05:25 -0700211 EXPECT_EQ(KM_ERROR_OK,
212 device()->get_supported_export_formats(device(), KM_ALGORITHM_ECDSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700213 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700214 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600215
Shawn Willden5b53c992015-02-02 08:05:25 -0700216 EXPECT_EQ(KM_ERROR_OK,
217 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
218 EXPECT_EQ(0, len);
219 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700220
221 EXPECT_EQ(KM_ERROR_OK,
222 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
223 EXPECT_EQ(0, len);
224 free(formats);
225
226 EXPECT_EQ(KM_ERROR_OK,
227 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
228 EXPECT_EQ(0, len);
229 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600230}
231
Shawn Willdend0772312014-09-18 12:27:57 -0600232class NewKeyGeneration : public KeymasterTest {
233 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700234 void CheckBaseParams() {
235 EXPECT_EQ(0U, hw_enforced().size());
236 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600237
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700238 AuthorizationSet auths = sw_enforced();
239 EXPECT_GT(auths.SerializedSize(), 12U);
240
Shawn Willden5b53c992015-02-02 08:05:25 -0700241 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
242 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
243 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600244 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700245 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600246
247 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700248 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
249 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
250 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600251
252 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700253 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
254 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
255 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600256
257 // Now check that unspecified, defaulted tags are correct.
Shawn Willden5b53c992015-02-02 08:05:25 -0700258 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
259 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600260 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700261};
262
Shawn Willden128ffe02014-08-06 12:31:33 -0600263TEST_F(NewKeyGeneration, Rsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700264 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
265 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700266 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600267
Shawn Willden5b53c992015-02-02 08:05:25 -0700268 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700269 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700270 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
271 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
272 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600273}
274
Shawn Willden6bbe6782014-09-18 11:26:15 -0600275TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700276 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
277 GenerateKey(AuthorizationSetBuilder()
278 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
279 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
280 .SigningKey()));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600281}
282
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600283TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600284 ASSERT_EQ(KM_ERROR_OK,
285 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700286 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600287
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700288 // Check specified tags are all present in unenforced characteristics
289 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
290 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600291}
292
Shawn Willden6bbe6782014-09-18 11:26:15 -0600293TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600294 ASSERT_EQ(KM_ERROR_OK,
295 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700296 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600297
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700298 // Check specified tags are all present in unenforced characteristics
299 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600300
301 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700302 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600303}
304
305TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700306 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden84b8da52015-03-11 07:21:32 -0600307 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190, KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600308}
309
310TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600311 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600312 for (size_t size : valid_sizes) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600313 EXPECT_EQ(KM_ERROR_OK,
314 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size, KM_DIGEST_NONE)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700315 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600316 }
317}
318
Shawn Willden19fca882015-01-22 16:35:30 -0700319TEST_F(NewKeyGeneration, AesOcb) {
Shawn Willden2c242002015-02-27 07:01:02 -0700320 ASSERT_EQ(KM_ERROR_OK,
321 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700322}
323
324TEST_F(NewKeyGeneration, AesOcbInvalidKeySize) {
Shawn Willden7dad93b2015-02-05 10:20:47 -0700325 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden2c242002015-02-27 07:01:02 -0700326 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(136).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700327}
328
329TEST_F(NewKeyGeneration, AesOcbAllValidSizes) {
Shawn Willden19fca882015-01-22 16:35:30 -0700330 size_t valid_sizes[] = {128, 192, 256};
331 for (size_t size : valid_sizes) {
Shawn Willden2c242002015-02-27 07:01:02 -0700332 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(size)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700333 << "Failed to generate size: " << size;
Shawn Willden19fca882015-01-22 16:35:30 -0700334 }
335}
336
Shawn Willden0d560bf2014-12-15 17:44:02 -0700337TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700338 ASSERT_EQ(KM_ERROR_OK,
339 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700340}
341
Shawn Willden76364712014-08-11 17:48:04 -0600342typedef KeymasterTest GetKeyCharacteristics;
343TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700344 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
345 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700346 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600347
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700348 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
349 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600350}
351
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700352typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600353TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700354 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
355 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700356 string message = "12345678901234567890123456789012";
357 string signature;
358 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600359}
360
Shawn Willden61902362014-12-18 10:33:24 -0700361TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
362 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700363 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
364 256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700365 string message(1024, 'a');
366 string signature;
367 SignMessage(message, &signature);
368}
369
370TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700371 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
372 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700373 // Use large message, which won't work without digesting.
374 string message(1024, 'a');
375 string signature;
376 SignMessage(message, &signature);
377}
378
Shawn Willdenf90f2352014-12-18 23:01:15 -0700379TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700380 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
381 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700382 string message(1024, 'a');
383 string signature;
384 SignMessage(message, &signature);
385}
386
387TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
388 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
389 // that 9 bytes larger than hash won't work.
Shawn Willden2c242002015-02-27 07:01:02 -0700390 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
391 256 + 9 * 8, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700392 string message(1024, 'a');
393 string signature;
394
395 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
396
397 string result;
398 size_t input_consumed;
399 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
400 EXPECT_EQ(message.size(), input_consumed);
401 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
402}
403
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600404TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600405 ASSERT_EQ(KM_ERROR_OK,
406 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700407 string message = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700408 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700409 SignMessage(message, &signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600410}
411
Shawn Willden1615f2e2014-08-13 10:37:40 -0600412TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -0700413 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
414 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdendfa1c032015-02-07 00:39:01 -0700415 AuthorizationSet input_params, output_params;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700416 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
417 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
418 // Another abort should fail
419 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600420}
421
422TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willden2c242002015-02-27 07:01:02 -0700423 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_MD5,
424 KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700425 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600426}
427
428TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -0700429 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
430 256, 3, KM_DIGEST_SHA_2_256 /* supported digest */, KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700431 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600432}
433
434TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700435 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700436 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700437 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700438 // PSS requires a digest.
Shawn Willden2c242002015-02-27 07:01:02 -0700439 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_NONE, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700440 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600441}
442
443TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700444 // Padding must be specified
Shawn Willden2c242002015-02-27 07:01:02 -0700445 ASSERT_EQ(KM_ERROR_OK,
446 GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Authorization(
447 TAG_DIGEST, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700448 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600449}
450
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700451TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700452 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 20));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700453 string message = "12345678901234567890123456789012";
454 string signature;
455 SignMessage(message, &signature);
456 ASSERT_EQ(20, signature.size());
457}
458
Shawn Willden62c22862014-12-17 08:36:20 -0700459TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700460 ASSERT_EQ(KM_ERROR_OK,
461 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 28)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700462 string message = "12345678901234567890123456789012";
463 string signature;
464 SignMessage(message, &signature);
465 ASSERT_EQ(28, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700466}
467
Shawn Willden0d560bf2014-12-15 17:44:02 -0700468TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700469 ASSERT_EQ(KM_ERROR_OK,
470 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700471 string message = "12345678901234567890123456789012";
472 string signature;
473 SignMessage(message, &signature);
474 ASSERT_EQ(32, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700475}
476
Shawn Willden62c22862014-12-17 08:36:20 -0700477TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700478 ASSERT_EQ(KM_ERROR_OK,
479 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 48)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700480 string message = "12345678901234567890123456789012";
481 string signature;
482 SignMessage(message, &signature);
483 ASSERT_EQ(48, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700484}
485
486TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700487 ASSERT_EQ(KM_ERROR_OK,
488 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 64)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700489 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700490 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700491 SignMessage(message, &signature);
492 ASSERT_EQ(64, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700493}
494
Shawn Willden3b702e22015-02-05 10:26:47 -0700495TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
496 uint8_t key_data[] = {
497 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
498 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
499 };
500 string message = "Hi There";
501 uint8_t sha_224_expected[] = {
502 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
503 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
504 };
505 uint8_t sha_256_expected[] = {
506 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
507 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
508 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
509 };
510 uint8_t sha_384_expected[] = {
511 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
512 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
513 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
514 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
515 };
516 uint8_t sha_512_expected[] = {
517 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
518 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
519 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
520 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
521 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
522 };
523
524 string key = make_string(key_data);
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, HmacRfc4231TestCase2) {
533 string key = "Jefe";
534 string message = "what do ya want for nothing?";
535 uint8_t sha_224_expected[] = {
536 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
537 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
538 };
539 uint8_t sha_256_expected[] = {
540 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
541 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
542 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
543 };
544 uint8_t sha_384_expected[] = {
545 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
546 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
547 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
548 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
549 };
550 uint8_t sha_512_expected[] = {
551 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
552 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
553 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
554 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
555 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
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, HmacRfc4231TestCase3) {
565 string key(20, 0xaa);
566 string message(50, 0xdd);
567 uint8_t sha_224_expected[] = {
568 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
569 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
570 };
571 uint8_t sha_256_expected[] = {
572 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
573 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
574 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
575 };
576 uint8_t sha_384_expected[] = {
577 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
578 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
579 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
580 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
581 };
582 uint8_t sha_512_expected[] = {
583 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
584 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
585 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
586 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
587 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
588 };
589
590 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
591 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
592 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
593 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
594}
595
596TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
597 uint8_t key_data[25] = {
598 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
599 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
600 };
601 string key = make_string(key_data);
602 string message(50, 0xcd);
603 uint8_t sha_224_expected[] = {
604 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
605 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
606 };
607 uint8_t sha_256_expected[] = {
608 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
609 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
610 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
611 };
612 uint8_t sha_384_expected[] = {
613 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
614 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
615 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
616 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
617 };
618 uint8_t sha_512_expected[] = {
619 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
620 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
621 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
622 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
623 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
624 };
625
626 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
627 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
628 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
629 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
630}
631
632TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
633 string key(20, 0x0c);
634 string message = "Test With Truncation";
635
636 uint8_t sha_224_expected[] = {
637 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
638 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
639 };
640 uint8_t sha_256_expected[] = {
641 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
642 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
643 };
644 uint8_t sha_384_expected[] = {
645 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
646 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
647 };
648 uint8_t sha_512_expected[] = {
649 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
650 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
651 };
652
653 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
654 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
655 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
656 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
657}
658
659TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
660 string key(131, 0xaa);
661 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
662
663 uint8_t sha_224_expected[] = {
664 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
665 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
666 };
667 uint8_t sha_256_expected[] = {
668 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
669 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
670 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
671 };
672 uint8_t sha_384_expected[] = {
673 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
674 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
675 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
676 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
677 };
678 uint8_t sha_512_expected[] = {
679 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
680 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
681 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
682 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
683 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
684 };
685
686 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
687 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
688 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
689 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
690}
691
692TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
693 string key(131, 0xaa);
694 string message = "This is a test using a larger than block-size key and a larger than "
695 "block-size data. The key needs to be hashed before being used by the HMAC "
696 "algorithm.";
697
698 uint8_t sha_224_expected[] = {
699 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
700 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
701 };
702 uint8_t sha_256_expected[] = {
703 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
704 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
705 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
706 };
707 uint8_t sha_384_expected[] = {
708 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
709 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
710 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
711 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
712 };
713 uint8_t sha_512_expected[] = {
714 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
715 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
716 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
717 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
718 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
719 };
720
721 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
722 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
723 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
724 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
725}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700726
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700727TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700728 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
729 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
730 .Authorization(TAG_KEY_SIZE, 128)
Shawn Willdenc24c1102014-12-22 15:30:09 -0700731 .SigningKey()
Shawn Willden2c242002015-02-27 07:01:02 -0700732 .Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700733 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700734}
735
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700736TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700737 ASSERT_EQ(KM_ERROR_OK,
738 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 33)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700739 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700740}
741
Shawn Willden1615f2e2014-08-13 10:37:40 -0600742TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willden2c242002015-02-27 07:01:02 -0700743 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
744 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700745 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700746
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700747 string message = "1234567890123456789012345678901";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700748 string result;
749 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700750 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700751 EXPECT_EQ(0U, result.size());
752 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600753
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700754 string signature;
755 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
756 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -0600757}
758
Shawn Willden61902362014-12-18 10:33:24 -0700759// TODO(swillden): Add more verification failure tests.
760
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700761typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600762TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700763 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
764 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700765 string message = "12345678901234567890123456789012";
766 string signature;
767 SignMessage(message, &signature);
768 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600769}
770
Shawn Willden61902362014-12-18 10:33:24 -0700771TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
772 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700773 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700774 string message(1024, 'a');
775 string signature;
776 SignMessage(message, &signature);
777 VerifyMessage(message, signature);
778}
779
Shawn Willdenf90f2352014-12-18 23:01:15 -0700780TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700781 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700782 string message(1024, 'a');
783 string signature;
784 SignMessage(message, &signature);
785 ++signature[signature.size() / 2];
786
787 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
788
789 string result;
790 size_t input_consumed;
791 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
792 EXPECT_EQ(message.size(), input_consumed);
793 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
794}
795
Shawn Willdenf90f2352014-12-18 23:01:15 -0700796TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700797 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
798 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700799 // Use large message, which won't work without digesting.
800 string message(1024, 'a');
801 string signature;
802 SignMessage(message, &signature);
803 VerifyMessage(message, signature);
804}
805
806TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700807 GenerateKey(
808 AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700809 string message(1024, 'a');
810 string signature;
811 SignMessage(message, &signature);
812 ++signature[signature.size() / 2];
813
814 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
815
816 string result;
817 size_t input_consumed;
818 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
819 EXPECT_EQ(message.size(), input_consumed);
820 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
821}
822
823TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -0700824 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
825 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700826 // Use large message, which won't work without digesting.
827 string message(1024, 'a');
828 string signature;
829 SignMessage(message, &signature);
830 ++message[message.size() / 2];
831
832 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
833
834 string result;
835 size_t input_consumed;
836 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
837 EXPECT_EQ(message.size(), input_consumed);
838 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
839}
840
Shawn Willdenf90f2352014-12-18 23:01:15 -0700841TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700842 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
843 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700844 string message(1024, 'a');
845 string signature;
846 SignMessage(message, &signature);
847 VerifyMessage(message, signature);
848}
849
850TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700851 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
852 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700853 string message(1024, 'a');
854 string signature;
855 SignMessage(message, &signature);
856 ++signature[signature.size() / 2];
857
858 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
859
860 string result;
861 size_t input_consumed;
862 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
863 EXPECT_EQ(message.size(), input_consumed);
864 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
865}
866
867TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -0700868 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
869 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700870 // Use large message, which won't work without digesting.
871 string message(1024, 'a');
872 string signature;
873 SignMessage(message, &signature);
874 ++message[message.size() / 2];
875
876 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
877
878 string result;
879 size_t input_consumed;
880 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
881 EXPECT_EQ(message.size(), input_consumed);
882 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
883}
884
885template <typename T> vector<T> make_vector(const T* array, size_t len) {
886 return vector<T>(array, array + len);
887}
888
889TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
890 // Get all supported digests and padding modes.
891 size_t digests_len;
892 keymaster_digest_t* digests;
893 EXPECT_EQ(KM_ERROR_OK,
894 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
895 &digests_len));
896
897 size_t padding_modes_len;
898 keymaster_padding_t* padding_modes;
899 EXPECT_EQ(KM_ERROR_OK,
900 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
901 &padding_modes, &padding_modes_len));
902
903 // Try them.
904 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
905 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
906 // Compute key & message size that will work.
907 size_t key_bits = 256;
908 size_t message_len = 1000;
909 switch (digest) {
910 case KM_DIGEST_NONE:
911 switch (padding_mode) {
912 case KM_PAD_NONE:
913 // Match key size.
914 message_len = key_bits / 8;
915 break;
916 case KM_PAD_RSA_PKCS1_1_5_SIGN:
917 message_len = key_bits / 8 - 11;
918 break;
919 case KM_PAD_RSA_PSS:
920 // PSS requires a digest.
921 continue;
922 default:
923 FAIL() << "Missing padding";
924 break;
925 }
926 break;
927
928 case KM_DIGEST_SHA_2_256:
929 switch (padding_mode) {
930 case KM_PAD_NONE:
931 // Key size matches digest size
932 break;
933 case KM_PAD_RSA_PKCS1_1_5_SIGN:
934 key_bits += 8 * 11;
935 break;
936 case KM_PAD_RSA_PSS:
937 key_bits += 8 * 10;
938 break;
939 default:
940 FAIL() << "Missing padding";
941 break;
942 }
943 break;
944 default:
945 FAIL() << "Missing digest";
946 }
947
Shawn Willden2c242002015-02-27 07:01:02 -0700948 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(key_bits, 3, digest, padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700949 string message(message_len, 'a');
950 string signature;
951 SignMessage(message, &signature);
952 VerifyMessage(message, signature);
953 }
954 }
955
956 free(padding_modes);
957 free(digests);
958}
959
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600960TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600961 ASSERT_EQ(KM_ERROR_OK,
962 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700963 string message = "123456789012345678901234567890123456789012345678";
964 string signature;
965 SignMessage(message, &signature);
966 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600967}
968
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700969TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700970 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700971 string message = "123456789012345678901234567890123456789012345678";
972 string signature;
973 SignMessage(message, &signature);
974 VerifyMessage(message, signature);
975}
976
977TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700978 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700979 string message = "123456789012345678901234567890123456789012345678";
980 string signature;
981 SignMessage(message, &signature);
982 VerifyMessage(message, signature);
983}
984
Shawn Willden0d560bf2014-12-15 17:44:02 -0700985TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700986 ASSERT_EQ(KM_ERROR_OK,
987 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700988 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -0700989 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700990 SignMessage(message, &signature);
991 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -0700992}
993
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700994TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700995 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700996 string message = "123456789012345678901234567890123456789012345678";
997 string signature;
998 SignMessage(message, &signature);
999 VerifyMessage(message, signature);
1000}
1001
1002TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001003 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001004 string message = "123456789012345678901234567890123456789012345678";
1005 string signature;
1006 SignMessage(message, &signature);
1007 VerifyMessage(message, signature);
1008}
1009
Shawn Willden5b53c992015-02-02 08:05:25 -07001010typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001011TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001012 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1013 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001014 string export_data;
1015 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1016 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001017
1018 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001019}
1020
Shawn Willdenf268d742014-08-19 15:36:26 -06001021TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001022 ASSERT_EQ(KM_ERROR_OK,
1023 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001024 string export_data;
1025 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1026 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001027
1028 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001029}
1030
1031TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willden2c242002015-02-27 07:01:02 -07001032 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1033 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001034 string export_data;
1035 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001036}
1037
1038TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willden2c242002015-02-27 07:01:02 -07001039 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1040 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001041 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001042 string export_data;
1043 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001044}
1045
Shawn Willden7dad93b2015-02-05 10:20:47 -07001046TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001047 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001048 string export_data;
1049
1050 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1051 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1052 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1053}
1054
Shawn Willden437fbd12014-08-20 11:59:49 -06001055static string read_file(const string& file_name) {
1056 ifstream file_stream(file_name, std::ios::binary);
1057 istreambuf_iterator<char> file_begin(file_stream);
1058 istreambuf_iterator<char> file_end;
1059 return string(file_begin, file_end);
1060}
1061
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001062typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001063TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001064 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001065 ASSERT_EQ(633U, pk8_key.size());
1066
Shawn Willden2c242002015-02-27 07:01:02 -07001067 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().RsaSigningKey(
1068 1024, 65537, KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001069 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001070
1071 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001072 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1073 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1074 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001075
1076 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001077 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1078 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001079
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001080 string message(1024 / 8, 'a');
1081 string signature;
1082 SignMessage(message, &signature);
1083 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001084}
1085
Shawn Willden6bbe6782014-09-18 11:26:15 -06001086TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001087 string pk8_key = read_file("rsa_privkey_pk8.der");
1088 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001089 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001090 ImportKey(AuthorizationSetBuilder().RsaSigningKey(2048 /* Doesn't match key */, 3,
1091 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001092 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001093}
1094
1095TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001096 string pk8_key = read_file("rsa_privkey_pk8.der");
1097 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001098 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001099 ImportKey(AuthorizationSetBuilder().RsaSigningKey(256, 3 /* Doesnt' match key */,
1100 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001101 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001102}
1103
Shawn Willden81effc62014-08-27 10:08:46 -06001104TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001105 string pk8_key = read_file("ec_privkey_pk8.der");
1106 ASSERT_EQ(138U, pk8_key.size());
1107
Shawn Willden84b8da52015-03-11 07:21:32 -06001108 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001109 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001110
1111 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001112 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1113 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001114
1115 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001116 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1117 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001118
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001119 string message(1024 / 8, 'a');
1120 string signature;
1121 SignMessage(message, &signature);
1122 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001123}
1124
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001125TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1126 string pk8_key = read_file("ec_privkey_pk8.der");
1127 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001128
Shawn Willden84b8da52015-03-11 07:21:32 -06001129 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001130 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001131
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001132 // Check values derived from the key.
1133 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1134 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1135
1136 // And values provided by GoogleKeymaster
1137 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1138 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1139
1140 string message(1024 / 8, 'a');
1141 string signature;
1142 SignMessage(message, &signature);
1143 VerifyMessage(message, signature);
1144}
1145
1146TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1147 string pk8_key = read_file("ec_privkey_pk8.der");
1148 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001149 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden84b8da52015-03-11 07:21:32 -06001150 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(
1151 224, KM_DIGEST_NONE), // Size does not match key
1152 KM_KEY_FORMAT_PKCS8,
1153 pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001154}
1155
Shawn Willden3b702e22015-02-05 10:26:47 -07001156TEST_F(ImportKeyTest, AesKeySuccess) {
1157 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1158 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001159 ASSERT_EQ(KM_ERROR_OK,
1160 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16),
1161 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001162
1163 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1164 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1165
1166 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001167 string nonce;
1168 string ciphertext = EncryptMessage(message, &nonce);
1169 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden3b702e22015-02-05 10:26:47 -07001170 EXPECT_EQ(message, plaintext);
1171}
1172
1173TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1174 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1175 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001176 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().HmacKey(sizeof(key_data) * 8,
1177 KM_DIGEST_SHA_2_256, 32),
1178 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001179
1180 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1181 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1182
1183 string message = "Hello World!";
1184 string signature;
1185 SignMessage(message, &signature);
1186 VerifyMessage(message, signature);
1187}
1188
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001189typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001190TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001191 ASSERT_EQ(KM_ERROR_OK,
1192 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001193
1194 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001195 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001196 EXPECT_EQ(512 / 8, ciphertext1.size());
1197
Shawn Willden6dde87c2014-12-11 14:08:48 -07001198 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001199 EXPECT_EQ(512 / 8, ciphertext2.size());
1200
1201 // OAEP randomizes padding so every result should be different.
1202 EXPECT_NE(ciphertext1, ciphertext2);
1203}
1204
1205TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001206 ASSERT_EQ(KM_ERROR_OK,
1207 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001208 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001209 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001210 EXPECT_EQ(512 / 8, ciphertext.size());
1211
Shawn Willden6dde87c2014-12-11 14:08:48 -07001212 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001213 EXPECT_EQ(message, plaintext);
1214}
1215
1216TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
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 = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001220 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001221 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001222
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001223 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1224 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001225 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001226 EXPECT_EQ(0, result.size());
1227}
1228
1229TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001230 ASSERT_EQ(KM_ERROR_OK,
1231 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001232 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001233 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001234 EXPECT_EQ(512 / 8, ciphertext.size());
1235
1236 // Corrupt the ciphertext
1237 ciphertext[512 / 8 / 2]++;
1238
Shawn Willden4200f212014-12-02 07:01:21 -07001239 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001240 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001241 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1242 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001243 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001244 EXPECT_EQ(0, result.size());
1245}
1246
1247TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001248 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1249 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001250 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001251 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001252 EXPECT_EQ(512 / 8, ciphertext1.size());
1253
Shawn Willden6dde87c2014-12-11 14:08:48 -07001254 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001255 EXPECT_EQ(512 / 8, ciphertext2.size());
1256
1257 // PKCS1 v1.5 randomizes padding so every result should be different.
1258 EXPECT_NE(ciphertext1, ciphertext2);
1259}
1260
1261TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001262 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1263 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001264 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001265 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001266 EXPECT_EQ(512 / 8, ciphertext.size());
1267
Shawn Willden6dde87c2014-12-11 14:08:48 -07001268 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001269 EXPECT_EQ(message, plaintext);
1270}
1271
1272TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
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 = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001276 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001277 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001278
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001279 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1280 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001281 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001282 EXPECT_EQ(0, result.size());
1283}
1284
1285TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001286 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1287 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001288 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001289 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001290 EXPECT_EQ(512 / 8, ciphertext.size());
1291
1292 // Corrupt the ciphertext
1293 ciphertext[512 / 8 / 2]++;
1294
Shawn Willden4200f212014-12-02 07:01:21 -07001295 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001296 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001297 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1298 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001299 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001300 EXPECT_EQ(0, result.size());
1301}
1302
Shawn Willden907c3012014-12-08 15:51:55 -07001303TEST_F(EncryptionOperationsTest, AesOcbSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001304 ASSERT_EQ(KM_ERROR_OK,
1305 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001306 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001307 string nonce1;
1308 string ciphertext1 = EncryptMessage(message, &nonce1);
1309 EXPECT_EQ(12, nonce1.size());
1310 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext1.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001311
Shawn Willdendfa1c032015-02-07 00:39:01 -07001312 string nonce2;
1313 string ciphertext2 = EncryptMessage(message, &nonce2);
1314 EXPECT_EQ(12, nonce2.size());
1315 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext2.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001316
Shawn Willdendfa1c032015-02-07 00:39:01 -07001317 // Nonces should be random
1318 EXPECT_NE(nonce1, nonce2);
1319
1320 // Therefore ciphertexts are different
Shawn Willden907c3012014-12-08 15:51:55 -07001321 EXPECT_NE(ciphertext1, ciphertext2);
1322}
1323
Shawn Willden6dde87c2014-12-11 14:08:48 -07001324TEST_F(EncryptionOperationsTest, AesOcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001325 ASSERT_EQ(KM_ERROR_OK,
1326 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001327 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001328 string nonce;
1329 string ciphertext = EncryptMessage(message, &nonce);
1330 EXPECT_EQ(12, nonce.size());
1331 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001332
Shawn Willdendfa1c032015-02-07 00:39:01 -07001333 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001334 EXPECT_EQ(message, plaintext);
1335}
1336
1337TEST_F(EncryptionOperationsTest, AesOcbRoundTripCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001338 ASSERT_EQ(KM_ERROR_OK,
1339 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001340 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001341 string nonce;
1342 string ciphertext = EncryptMessage(message, &nonce);
1343 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001344
1345 ciphertext[ciphertext.size() / 2]++;
1346
Shawn Willdendfa1c032015-02-07 00:39:01 -07001347 AuthorizationSet input_set, output_set;
1348 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1349 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set, &output_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001350
1351 string result;
1352 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001353 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001354 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001355 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001356}
1357
1358TEST_F(EncryptionOperationsTest, AesDecryptGarbage) {
Shawn Willden2c242002015-02-27 07:01:02 -07001359 ASSERT_EQ(KM_ERROR_OK,
1360 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001361 string ciphertext(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001362 AuthorizationSet input_params;
1363 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaa", 12);
1364 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001365
1366 string result;
1367 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001368 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001369 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001370 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001371}
1372
Shawn Willdendfa1c032015-02-07 00:39:01 -07001373TEST_F(EncryptionOperationsTest, AesDecryptTooShortNonce) {
Shawn Willden2c242002015-02-27 07:01:02 -07001374 ASSERT_EQ(KM_ERROR_OK,
1375 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001376
Shawn Willdendfa1c032015-02-07 00:39:01 -07001377 // Try decrypting garbage ciphertext with too-short nonce
1378 string ciphertext(15, 'a');
1379 AuthorizationSet input_params;
1380 input_params.push_back(TAG_NONCE, "aaaaaaaaaaa", 11);
1381 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001382}
1383
1384TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptySuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001385 ASSERT_EQ(KM_ERROR_OK,
1386 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001387 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001388 string nonce;
1389 string ciphertext = EncryptMessage(message, &nonce);
1390 EXPECT_EQ(12, nonce.size());
1391 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001392
Shawn Willdendfa1c032015-02-07 00:39:01 -07001393 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001394 EXPECT_EQ(message, plaintext);
1395}
1396
1397TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptyCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001398 ASSERT_EQ(KM_ERROR_OK,
1399 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001400 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001401 string nonce;
1402 string ciphertext = EncryptMessage(message, &nonce);
1403 EXPECT_EQ(12, nonce.size());
1404 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001405
1406 ciphertext[ciphertext.size() / 2]++;
1407
Shawn Willdendfa1c032015-02-07 00:39:01 -07001408 AuthorizationSet input_set;
1409 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1410 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001411
1412 string result;
1413 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001414 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001415 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001416 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001417}
1418
1419TEST_F(EncryptionOperationsTest, AesOcbFullChunk) {
Shawn Willden2c242002015-02-27 07:01:02 -07001420 ASSERT_EQ(KM_ERROR_OK,
1421 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001422 string message(4096, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001423 string nonce;
1424 string ciphertext = EncryptMessage(message, &nonce);
1425 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001426
Shawn Willdendfa1c032015-02-07 00:39:01 -07001427 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001428 EXPECT_EQ(message, plaintext);
1429}
1430
1431TEST_F(EncryptionOperationsTest, AesOcbVariousChunkLengths) {
1432 for (unsigned chunk_length = 1; chunk_length <= 128; ++chunk_length) {
Shawn Willden2c242002015-02-27 07:01:02 -07001433 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(
1434 chunk_length, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001435 string message(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001436 string nonce;
1437 string ciphertext = EncryptMessage(message, &nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001438 int expected_tag_count = (message.length() + chunk_length - 1) / chunk_length;
Shawn Willdendfa1c032015-02-07 00:39:01 -07001439 EXPECT_EQ(message.length() + 16 * expected_tag_count, ciphertext.size())
Shawn Willden6dde87c2014-12-11 14:08:48 -07001440 << "Unexpected ciphertext size for chunk length " << chunk_length
1441 << " expected tag count was " << expected_tag_count
1442 << " but actual tag count was probably "
1443 << (ciphertext.size() - message.length() - 12) / 16;
1444
Shawn Willdendfa1c032015-02-07 00:39:01 -07001445 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001446 EXPECT_EQ(message, plaintext);
1447 }
1448}
1449
1450TEST_F(EncryptionOperationsTest, AesOcbAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -07001451 ASSERT_EQ(KM_ERROR_OK,
1452 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001453 string message = "Hello";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001454
Shawn Willdendfa1c032015-02-07 00:39:01 -07001455 AuthorizationSet input_set, output_set;
1456 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_set, &output_set));
1457 EXPECT_EQ(1, output_set.size());
1458 EXPECT_EQ(0, output_set.find(TAG_NONCE));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001459
1460 string result;
1461 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001462 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1463 EXPECT_EQ(message.length(), input_consumed);
1464 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001465}
1466
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001467TEST_F(EncryptionOperationsTest, AesOcbNoChunkLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001468 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenc24c1102014-12-22 15:30:09 -07001469 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001470 .Authorization(TAG_BLOCK_MODE, KM_MODE_OCB)
1471 .Authorization(TAG_MAC_LENGTH, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001472 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001473}
1474
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001475TEST_F(EncryptionOperationsTest, AesOcbPaddingUnsupported) {
Shawn Willden2c242002015-02-27 07:01:02 -07001476 ASSERT_EQ(
1477 KM_ERROR_OK,
1478 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Authorization(
1479 TAG_PADDING, KM_PAD_ZERO)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001480 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001481}
1482
1483TEST_F(EncryptionOperationsTest, AesOcbInvalidMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001484 ASSERT_EQ(KM_ERROR_OK,
1485 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 17)));
Shawn Willden63ac0432014-12-29 14:07:08 -07001486 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001487}
1488
Shawn Willdendfa1c032015-02-07 00:39:01 -07001489uint8_t rfc_7523_test_key_data[] = {
1490 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1491};
1492string rfc_7523_test_key = make_string(rfc_7523_test_key_data);
1493
1494TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector1) {
1495 uint8_t nonce[] = {
1496 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
1497 };
1498 uint8_t expected_ciphertext[] = {
1499 0x78, 0x54, 0x07, 0xBF, 0xFF, 0xC8, 0xAD, 0x9E,
1500 0xDC, 0xC5, 0x52, 0x0A, 0xC9, 0x11, 0x1E, 0xE6,
1501 };
1502 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1503 "" /* plaintext */, make_string(expected_ciphertext));
1504}
1505
1506TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector2) {
1507 uint8_t nonce[] = {
1508 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x01,
1509 };
1510 uint8_t associated_data[] = {
1511 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1512 };
1513 uint8_t plaintext[] = {
1514 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1515 };
1516 uint8_t expected_ciphertext[] = {
1517 0x68, 0x20, 0xB3, 0x65, 0x7B, 0x6F, 0x61, 0x5A, 0x57, 0x25, 0xBD, 0xA0,
1518 0xD3, 0xB4, 0xEB, 0x3A, 0x25, 0x7C, 0x9A, 0xF1, 0xF8, 0xF0, 0x30, 0x09,
1519 };
1520 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1521 make_string(plaintext), make_string(expected_ciphertext));
1522}
1523
1524TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector3) {
1525 uint8_t nonce[] = {
1526 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x02,
1527 };
1528 uint8_t associated_data[] = {
1529 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1530 };
1531 uint8_t expected_ciphertext[] = {
1532 0x81, 0x01, 0x7F, 0x82, 0x03, 0xF0, 0x81, 0x27,
1533 0x71, 0x52, 0xFA, 0xDE, 0x69, 0x4A, 0x0A, 0x00,
1534 };
1535 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1536 "" /* plaintext */, make_string(expected_ciphertext));
1537}
1538
1539TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector4) {
1540 uint8_t nonce[] = {
1541 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x03,
1542 };
1543 uint8_t plaintext[] = {
1544 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1545 };
1546 uint8_t expected_ciphertext[] = {
1547 0x45, 0xDD, 0x69, 0xF8, 0xF5, 0xAA, 0xE7, 0x24, 0x14, 0x05, 0x4C, 0xD1,
1548 0xF3, 0x5D, 0x82, 0x76, 0x0B, 0x2C, 0xD0, 0x0D, 0x2F, 0x99, 0xBF, 0xA9,
1549 };
1550 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1551 make_string(plaintext), make_string(expected_ciphertext));
1552}
1553
1554TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector5) {
1555 uint8_t nonce[] = {
1556 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x04,
1557 };
1558 uint8_t associated_data[] = {
1559 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1560 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1561 };
1562 uint8_t plaintext[] = {
1563 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1564 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1565 };
1566 uint8_t expected_ciphertext[] = {
1567 0x57, 0x1D, 0x53, 0x5B, 0x60, 0xB2, 0x77, 0x18, 0x8B, 0xE5, 0x14,
1568 0x71, 0x70, 0xA9, 0xA2, 0x2C, 0x3A, 0xD7, 0xA4, 0xFF, 0x38, 0x35,
1569 0xB8, 0xC5, 0x70, 0x1C, 0x1C, 0xCE, 0xC8, 0xFC, 0x33, 0x58,
1570 };
1571 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1572 make_string(plaintext), make_string(expected_ciphertext));
1573}
1574
1575TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector6) {
1576 uint8_t nonce[] = {
1577 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x05,
1578 };
1579 uint8_t associated_data[] = {
1580 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1581 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1582 };
1583 uint8_t expected_ciphertext[] = {
1584 0x8C, 0xF7, 0x61, 0xB6, 0x90, 0x2E, 0xF7, 0x64,
1585 0x46, 0x2A, 0xD8, 0x64, 0x98, 0xCA, 0x6B, 0x97,
1586 };
1587 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1588 "" /* plaintext */, make_string(expected_ciphertext));
1589}
1590
1591TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector7) {
1592 uint8_t nonce[] = {
1593 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x06,
1594 };
1595 uint8_t plaintext[] = {
1596 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1597 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1598 };
1599 uint8_t expected_ciphertext[] = {
1600 0x5C, 0xE8, 0x8E, 0xC2, 0xE0, 0x69, 0x27, 0x06, 0xA9, 0x15, 0xC0,
1601 0x0A, 0xEB, 0x8B, 0x23, 0x96, 0xF4, 0x0E, 0x1C, 0x74, 0x3F, 0x52,
1602 0x43, 0x6B, 0xDF, 0x06, 0xD8, 0xFA, 0x1E, 0xCA, 0x34, 0x3D,
1603 };
1604 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1605 make_string(plaintext), make_string(expected_ciphertext));
1606}
1607
1608TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector8) {
1609 uint8_t nonce[] = {
1610 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x07,
1611 };
1612 uint8_t associated_data[] = {
1613 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1614 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1615 };
1616 uint8_t plaintext[] = {
1617 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1618 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1619 };
1620 uint8_t expected_ciphertext[] = {
1621 0x1C, 0xA2, 0x20, 0x73, 0x08, 0xC8, 0x7C, 0x01, 0x07, 0x56, 0x10, 0x4D, 0x88, 0x40,
1622 0xCE, 0x19, 0x52, 0xF0, 0x96, 0x73, 0xA4, 0x48, 0xA1, 0x22, 0xC9, 0x2C, 0x62, 0x24,
1623 0x10, 0x51, 0xF5, 0x73, 0x56, 0xD7, 0xF3, 0xC9, 0x0B, 0xB0, 0xE0, 0x7F,
1624 };
1625 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1626 make_string(plaintext), make_string(expected_ciphertext));
1627}
1628
1629TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector9) {
1630 uint8_t nonce[] = {
1631 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x08,
1632 };
1633 uint8_t associated_data[] = {
1634 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1635 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1636 };
1637 uint8_t expected_ciphertext[] = {
1638 0x6D, 0xC2, 0x25, 0xA0, 0x71, 0xFC, 0x1B, 0x9F,
1639 0x7C, 0x69, 0xF9, 0x3B, 0x0F, 0x1E, 0x10, 0xDE,
1640 };
1641 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1642 "" /* plaintext */, make_string(expected_ciphertext));
1643}
1644
1645TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector10) {
1646 uint8_t nonce[] = {
1647 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x09,
1648 };
1649 uint8_t plaintext[] = {
1650 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1651 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1652 };
1653 uint8_t expected_ciphertext[] = {
1654 0x22, 0x1B, 0xD0, 0xDE, 0x7F, 0xA6, 0xFE, 0x99, 0x3E, 0xCC, 0xD7, 0x69, 0x46, 0x0A,
1655 0x0A, 0xF2, 0xD6, 0xCD, 0xED, 0x0C, 0x39, 0x5B, 0x1C, 0x3C, 0xE7, 0x25, 0xF3, 0x24,
1656 0x94, 0xB9, 0xF9, 0x14, 0xD8, 0x5C, 0x0B, 0x1E, 0xB3, 0x83, 0x57, 0xFF,
1657 };
1658 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1659 make_string(plaintext), make_string(expected_ciphertext));
1660}
1661
1662TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector11) {
1663 uint8_t nonce[] = {
1664 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0A,
1665 };
1666 uint8_t associated_data[] = {
1667 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1668 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1669 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1670 };
1671 uint8_t plaintext[] = {
1672 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1673 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1674 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1675 };
1676 uint8_t expected_ciphertext[] = {
1677 0xBD, 0x6F, 0x6C, 0x49, 0x62, 0x01, 0xC6, 0x92, 0x96, 0xC1, 0x1E, 0xFD,
1678 0x13, 0x8A, 0x46, 0x7A, 0xBD, 0x3C, 0x70, 0x79, 0x24, 0xB9, 0x64, 0xDE,
1679 0xAF, 0xFC, 0x40, 0x31, 0x9A, 0xF5, 0xA4, 0x85, 0x40, 0xFB, 0xBA, 0x18,
1680 0x6C, 0x55, 0x53, 0xC6, 0x8A, 0xD9, 0xF5, 0x92, 0xA7, 0x9A, 0x42, 0x40,
1681 };
1682 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1683 make_string(plaintext), make_string(expected_ciphertext));
1684}
1685
1686TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector12) {
1687 uint8_t nonce[] = {
1688 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0B,
1689 };
1690 uint8_t associated_data[] = {
1691 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1692 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1693 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1694 };
1695 uint8_t plaintext[] = {};
1696 uint8_t expected_ciphertext[] = {
1697 0xFE, 0x80, 0x69, 0x0B, 0xEE, 0x8A, 0x48, 0x5D,
1698 0x11, 0xF3, 0x29, 0x65, 0xBC, 0x9D, 0x2A, 0x32,
1699 };
1700 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1701 "" /* plaintext */, make_string(expected_ciphertext));
1702}
1703
1704TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector13) {
1705 uint8_t nonce[] = {
1706 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0C,
1707 };
1708 uint8_t associated_data[] = {};
1709 uint8_t plaintext[] = {
1710 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1711 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1712 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1713 };
1714 uint8_t expected_ciphertext[] = {
1715 0x29, 0x42, 0xBF, 0xC7, 0x73, 0xBD, 0xA2, 0x3C, 0xAB, 0xC6, 0xAC, 0xFD,
1716 0x9B, 0xFD, 0x58, 0x35, 0xBD, 0x30, 0x0F, 0x09, 0x73, 0x79, 0x2E, 0xF4,
1717 0x60, 0x40, 0xC5, 0x3F, 0x14, 0x32, 0xBC, 0xDF, 0xB5, 0xE1, 0xDD, 0xE3,
1718 0xBC, 0x18, 0xA5, 0xF8, 0x40, 0xB5, 0x2E, 0x65, 0x34, 0x44, 0xD5, 0xDF,
1719 };
1720 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1721 make_string(plaintext), make_string(expected_ciphertext));
1722}
1723
1724TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector14) {
1725 uint8_t nonce[] = {
1726 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0D,
1727 };
1728 uint8_t associated_data[] = {
1729 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1730 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1731 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1732 };
1733 uint8_t plaintext[] = {
1734 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1735 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1736 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1737 };
1738 uint8_t expected_ciphertext[] = {
1739 0xD5, 0xCA, 0x91, 0x74, 0x84, 0x10, 0xC1, 0x75, 0x1F, 0xF8, 0xA2, 0xF6, 0x18, 0x25,
1740 0x5B, 0x68, 0xA0, 0xA1, 0x2E, 0x09, 0x3F, 0xF4, 0x54, 0x60, 0x6E, 0x59, 0xF9, 0xC1,
1741 0xD0, 0xDD, 0xC5, 0x4B, 0x65, 0xE8, 0x62, 0x8E, 0x56, 0x8B, 0xAD, 0x7A, 0xED, 0x07,
1742 0xBA, 0x06, 0xA4, 0xA6, 0x94, 0x83, 0xA7, 0x03, 0x54, 0x90, 0xC5, 0x76, 0x9E, 0x60,
1743 };
1744 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1745 make_string(plaintext), make_string(expected_ciphertext));
1746}
1747
1748TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector15) {
1749 uint8_t nonce[] = {
1750 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0E,
1751 };
1752 uint8_t associated_data[] = {
1753 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1754 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1755 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1756 };
1757 uint8_t plaintext[] = {};
1758 uint8_t expected_ciphertext[] = {
1759 0xC5, 0xCD, 0x9D, 0x18, 0x50, 0xC1, 0x41, 0xE3,
1760 0x58, 0x64, 0x99, 0x94, 0xEE, 0x70, 0x1B, 0x68,
1761 };
1762 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1763 "" /* plaintext */, make_string(expected_ciphertext));
1764}
1765
1766TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector16) {
1767 uint8_t nonce[] = {
1768 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0F,
1769 };
1770 uint8_t associated_data[] = {};
1771 uint8_t plaintext[] = {
1772 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1773 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1774 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1775 };
1776 uint8_t expected_ciphertext[] = {
1777 0x44, 0x12, 0x92, 0x34, 0x93, 0xC5, 0x7D, 0x5D, 0xE0, 0xD7, 0x00, 0xF7, 0x53, 0xCC,
1778 0xE0, 0xD1, 0xD2, 0xD9, 0x50, 0x60, 0x12, 0x2E, 0x9F, 0x15, 0xA5, 0xDD, 0xBF, 0xC5,
1779 0x78, 0x7E, 0x50, 0xB5, 0xCC, 0x55, 0xEE, 0x50, 0x7B, 0xCB, 0x08, 0x4E, 0x47, 0x9A,
1780 0xD3, 0x63, 0xAC, 0x36, 0x6B, 0x95, 0xA9, 0x8C, 0xA5, 0xF3, 0x00, 0x0B, 0x14, 0x79,
1781 };
1782 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1783 make_string(plaintext), make_string(expected_ciphertext));
1784}
1785
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001786TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001787 ASSERT_EQ(KM_ERROR_OK,
1788 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1789 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001790 // Two-block message.
1791 string message = "12345678901234567890123456789012";
1792 string ciphertext1 = EncryptMessage(message);
1793 EXPECT_EQ(message.size(), ciphertext1.size());
1794
1795 string ciphertext2 = EncryptMessage(string(message));
1796 EXPECT_EQ(message.size(), ciphertext2.size());
1797
1798 // ECB is deterministic.
1799 EXPECT_EQ(ciphertext1, ciphertext2);
1800
1801 string plaintext = DecryptMessage(ciphertext1);
1802 EXPECT_EQ(message, plaintext);
1803}
1804
1805TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07001806 ASSERT_EQ(KM_ERROR_OK,
1807 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1808 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001809 // Message is slightly shorter than two blocks.
1810 string message = "1234567890123456789012345678901";
1811
1812 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1813 string ciphertext;
1814 size_t input_consumed;
1815 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1816 EXPECT_EQ(message.size(), input_consumed);
1817 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1818}
1819
1820TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001821 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001822 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001823 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1824 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001825
1826 // Try various message lengths; all should work.
1827 for (int i = 0; i < 32; ++i) {
1828 string message(i, 'a');
1829 string ciphertext = EncryptMessage(message);
1830 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1831 string plaintext = DecryptMessage(ciphertext);
1832 EXPECT_EQ(message, plaintext);
1833 }
1834}
1835
1836TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001837 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001838 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001839 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1840 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001841
1842 string message = "a";
1843 string ciphertext = EncryptMessage(message);
1844 EXPECT_EQ(16, ciphertext.size());
1845 EXPECT_NE(ciphertext, message);
1846 ++ciphertext[ciphertext.size() / 2];
1847
1848 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1849 string plaintext;
1850 size_t input_consumed;
1851 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1852 EXPECT_EQ(ciphertext.size(), input_consumed);
1853 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1854}
1855
1856TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001857 ASSERT_EQ(KM_ERROR_OK,
1858 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1859 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001860 // Two-block message.
1861 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001862 string iv1;
1863 string ciphertext1 = EncryptMessage(message, &iv1);
1864 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001865
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001866 string iv2;
1867 string ciphertext2 = EncryptMessage(message, &iv2);
1868 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001869
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001870 // IVs should be random, so ciphertexts should differ.
1871 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001872 EXPECT_NE(ciphertext1, ciphertext2);
1873
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001874 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001875 EXPECT_EQ(message, plaintext);
1876}
1877
1878TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001879 ASSERT_EQ(KM_ERROR_OK,
1880 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1881 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001882
1883 int increment = 15;
1884 string message(240, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001885 AuthorizationSet input_params;
1886 AuthorizationSet output_params;
1887 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1888
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001889 string ciphertext;
1890 size_t input_consumed;
1891 for (size_t i = 0; i < message.size(); i += increment)
1892 EXPECT_EQ(KM_ERROR_OK,
1893 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1894 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001895 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001896
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001897 // Move TAG_NONCE into input_params
1898 input_params.Reinitialize(output_params);
1899 output_params.Clear();
1900
1901 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001902 string plaintext;
1903 for (size_t i = 0; i < ciphertext.size(); i += increment)
1904 EXPECT_EQ(KM_ERROR_OK,
1905 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1906 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001907 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001908 EXPECT_EQ(message, plaintext);
1909}
1910
1911TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001912 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001913 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001914 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1915 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001916
1917 // Try various message lengths; all should work.
1918 for (int i = 0; i < 32; ++i) {
1919 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001920 string iv;
1921 string ciphertext = EncryptMessage(message, &iv);
1922 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1923 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001924 EXPECT_EQ(message, plaintext);
1925 }
1926}
1927
Shawn Willdencd695822015-01-26 14:06:32 -07001928typedef KeymasterTest AddEntropyTest;
1929TEST_F(AddEntropyTest, AddEntropy) {
1930 // There's no obvious way to test that entropy is actually added, but we can test that the API
1931 // doesn't blow up or return an error.
1932 EXPECT_EQ(KM_ERROR_OK,
1933 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1934}
1935
Shawn Willden5fad7852015-01-26 16:10:56 -07001936typedef KeymasterTest RescopingTest;
1937TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willden2c242002015-02-27 07:01:02 -07001938 ASSERT_EQ(
1939 KM_ERROR_OK,
1940 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Authorization(
1941 TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001942 // TODO(swillden): Add a better error code for this.
1943 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, BeginOperation(KM_PURPOSE_ENCRYPT));
1944}
1945
1946TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07001947 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07001948 .AesEncryptionKey(128)
1949 .OcbMode(4096, 16)
Shawn Willden2c242002015-02-27 07:01:02 -07001950 .Authorization(TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)
1951 .Authorization(TAG_RESCOPING_DEL, KM_TAG_MAC_LENGTH)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001952 EXPECT_FALSE(contains(sw_enforced(), TAG_MAC_LENGTH, 15));
1953 EXPECT_TRUE(contains(sw_enforced(), TAG_MAC_LENGTH, 16));
1954
1955 keymaster_key_blob_t rescoped_blob;
1956 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001957 AuthorizationSet new_params = AuthorizationSetBuilder()
1958 .AesEncryptionKey(128)
1959 .OcbMode(4096, 15 /* note changed */)
1960 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001961
1962 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1963 ASSERT_TRUE(rescoped_characteristics != NULL);
1964
1965 EXPECT_EQ(0, rescoped_characteristics->hw_enforced.length);
1966 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1967 keymaster_free_characteristics(rescoped_characteristics);
1968 free(rescoped_characteristics);
1969 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1970
1971 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
1972 EXPECT_TRUE(contains(auths, TAG_MAC_LENGTH, 15));
1973 EXPECT_FALSE(contains(auths, TAG_MAC_LENGTH, 16));
1974}
1975
1976TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07001977 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1978 .RsaEncryptionKey(256, 3, KM_PAD_RSA_OAEP)
1979 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1980 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001981 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1982 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1983 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1984 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
1985
1986 keymaster_key_blob_t rescoped_blob;
1987 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001988 AuthorizationSet new_params = AuthorizationSetBuilder()
1989 .RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)
1990 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001991
1992 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1993 ASSERT_TRUE(rescoped_characteristics != NULL);
1994
1995 EXPECT_EQ(0, rescoped_characteristics->hw_enforced.length);
1996 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1997 keymaster_free_characteristics(rescoped_characteristics);
1998 free(rescoped_characteristics);
1999 free(const_cast<uint8_t*>(rescoped_blob.key_material));
2000
2001 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
2002 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
2003 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
2004 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
2005}
2006
2007// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
2008// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
2009// may not be changed.
2010
Shawn Willden128ffe02014-08-06 12:31:33 -06002011} // namespace test
2012} // namespace keymaster