blob: 931a9e1146fd564162862193c69370e98a107711 [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));
244 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_ID, 8));
245 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 Willden2c242002015-02-27 07:01:02 -0700276 ASSERT_EQ(
277 KM_ERROR_OK,
278 GenerateKey(
279 AuthorizationSetBuilder().Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA).SigningKey()));
280
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700281 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600282
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700283 // Check specified tags are all present in unenforced characteristics
284 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600285
286 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700287 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537));
288 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 2048));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600289}
290
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600291TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600292 ASSERT_EQ(KM_ERROR_OK,
293 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700294 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600295
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700296 // Check specified tags are all present in unenforced characteristics
297 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
298 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600299}
300
Shawn Willden6bbe6782014-09-18 11:26:15 -0600301TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600302 ASSERT_EQ(KM_ERROR_OK,
303 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700304 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600305
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700306 // Check specified tags are all present in unenforced characteristics
307 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600308
309 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700310 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600311}
312
313TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700314 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden84b8da52015-03-11 07:21:32 -0600315 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190, KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600316}
317
318TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600319 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600320 for (size_t size : valid_sizes) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600321 EXPECT_EQ(KM_ERROR_OK,
322 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size, KM_DIGEST_NONE)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700323 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600324 }
325}
326
Shawn Willden19fca882015-01-22 16:35:30 -0700327TEST_F(NewKeyGeneration, AesOcb) {
Shawn Willden2c242002015-02-27 07:01:02 -0700328 ASSERT_EQ(KM_ERROR_OK,
329 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700330}
331
332TEST_F(NewKeyGeneration, AesOcbInvalidKeySize) {
Shawn Willden7dad93b2015-02-05 10:20:47 -0700333 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden2c242002015-02-27 07:01:02 -0700334 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(136).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700335}
336
337TEST_F(NewKeyGeneration, AesOcbAllValidSizes) {
Shawn Willden19fca882015-01-22 16:35:30 -0700338 size_t valid_sizes[] = {128, 192, 256};
339 for (size_t size : valid_sizes) {
Shawn Willden2c242002015-02-27 07:01:02 -0700340 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(size)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700341 << "Failed to generate size: " << size;
Shawn Willden19fca882015-01-22 16:35:30 -0700342 }
343}
344
Shawn Willden0d560bf2014-12-15 17:44:02 -0700345TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700346 ASSERT_EQ(KM_ERROR_OK,
347 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700348}
349
Shawn Willden76364712014-08-11 17:48:04 -0600350typedef KeymasterTest GetKeyCharacteristics;
351TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700352 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
353 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700354 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600355
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700356 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
357 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600358}
359
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700360typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600361TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700362 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
363 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700364 string message = "12345678901234567890123456789012";
365 string signature;
366 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600367}
368
Shawn Willden61902362014-12-18 10:33:24 -0700369TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
370 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700371 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
372 256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700373 string message(1024, 'a');
374 string signature;
375 SignMessage(message, &signature);
376}
377
378TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700379 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
380 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700381 // Use large message, which won't work without digesting.
382 string message(1024, 'a');
383 string signature;
384 SignMessage(message, &signature);
385}
386
Shawn Willdenf90f2352014-12-18 23:01:15 -0700387TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700388 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
389 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700390 string message(1024, 'a');
391 string signature;
392 SignMessage(message, &signature);
393}
394
395TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
396 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
397 // that 9 bytes larger than hash won't work.
Shawn Willden2c242002015-02-27 07:01:02 -0700398 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
399 256 + 9 * 8, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700400 string message(1024, 'a');
401 string signature;
402
403 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
404
405 string result;
406 size_t input_consumed;
407 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
408 EXPECT_EQ(message.size(), input_consumed);
409 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
410}
411
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600412TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600413 ASSERT_EQ(KM_ERROR_OK,
414 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700415 string message = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700416 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700417 SignMessage(message, &signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600418}
419
Shawn Willden1615f2e2014-08-13 10:37:40 -0600420TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -0700421 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
422 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdendfa1c032015-02-07 00:39:01 -0700423 AuthorizationSet input_params, output_params;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700424 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
425 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
426 // Another abort should fail
427 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600428}
429
430TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willden2c242002015-02-27 07:01:02 -0700431 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_MD5,
432 KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700433 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600434}
435
436TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -0700437 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
438 256, 3, KM_DIGEST_SHA_2_256 /* supported digest */, KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700439 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600440}
441
442TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700443 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700444 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700445 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700446 // PSS requires a digest.
Shawn Willden2c242002015-02-27 07:01:02 -0700447 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_NONE, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700448 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600449}
450
451TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700452 // Padding must be specified
Shawn Willden2c242002015-02-27 07:01:02 -0700453 ASSERT_EQ(KM_ERROR_OK,
454 GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Authorization(
455 TAG_DIGEST, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700456 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600457}
458
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700459TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700460 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 20));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700461 string message = "12345678901234567890123456789012";
462 string signature;
463 SignMessage(message, &signature);
464 ASSERT_EQ(20, signature.size());
465}
466
Shawn Willden62c22862014-12-17 08:36:20 -0700467TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700468 ASSERT_EQ(KM_ERROR_OK,
469 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 28)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700470 string message = "12345678901234567890123456789012";
471 string signature;
472 SignMessage(message, &signature);
473 ASSERT_EQ(28, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700474}
475
Shawn Willden0d560bf2014-12-15 17:44:02 -0700476TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700477 ASSERT_EQ(KM_ERROR_OK,
478 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700479 string message = "12345678901234567890123456789012";
480 string signature;
481 SignMessage(message, &signature);
482 ASSERT_EQ(32, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700483}
484
Shawn Willden62c22862014-12-17 08:36:20 -0700485TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700486 ASSERT_EQ(KM_ERROR_OK,
487 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 48)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700488 string message = "12345678901234567890123456789012";
489 string signature;
490 SignMessage(message, &signature);
491 ASSERT_EQ(48, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700492}
493
494TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700495 ASSERT_EQ(KM_ERROR_OK,
496 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 64)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700497 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700498 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700499 SignMessage(message, &signature);
500 ASSERT_EQ(64, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700501}
502
Shawn Willden3b702e22015-02-05 10:26:47 -0700503TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
504 uint8_t key_data[] = {
505 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
506 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
507 };
508 string message = "Hi There";
509 uint8_t sha_224_expected[] = {
510 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
511 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
512 };
513 uint8_t sha_256_expected[] = {
514 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
515 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
516 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
517 };
518 uint8_t sha_384_expected[] = {
519 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
520 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
521 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
522 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
523 };
524 uint8_t sha_512_expected[] = {
525 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
526 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
527 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
528 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
529 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
530 };
531
532 string key = make_string(key_data);
533
534 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
535 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
536 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
537 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
538}
539
540TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
541 string key = "Jefe";
542 string message = "what do ya want for nothing?";
543 uint8_t sha_224_expected[] = {
544 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
545 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
546 };
547 uint8_t sha_256_expected[] = {
548 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
549 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
550 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
551 };
552 uint8_t sha_384_expected[] = {
553 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
554 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
555 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
556 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
557 };
558 uint8_t sha_512_expected[] = {
559 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
560 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
561 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
562 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
563 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
564 };
565
566 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
567 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
568 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
569 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
570}
571
572TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
573 string key(20, 0xaa);
574 string message(50, 0xdd);
575 uint8_t sha_224_expected[] = {
576 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
577 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
578 };
579 uint8_t sha_256_expected[] = {
580 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
581 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
582 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
583 };
584 uint8_t sha_384_expected[] = {
585 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
586 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
587 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
588 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
589 };
590 uint8_t sha_512_expected[] = {
591 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
592 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
593 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
594 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
595 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
596 };
597
598 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
599 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
600 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
601 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
602}
603
604TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
605 uint8_t key_data[25] = {
606 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
607 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
608 };
609 string key = make_string(key_data);
610 string message(50, 0xcd);
611 uint8_t sha_224_expected[] = {
612 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
613 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
614 };
615 uint8_t sha_256_expected[] = {
616 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
617 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
618 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
619 };
620 uint8_t sha_384_expected[] = {
621 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
622 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
623 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
624 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
625 };
626 uint8_t sha_512_expected[] = {
627 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
628 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
629 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
630 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
631 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
632 };
633
634 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
635 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
636 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
637 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
638}
639
640TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
641 string key(20, 0x0c);
642 string message = "Test With Truncation";
643
644 uint8_t sha_224_expected[] = {
645 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
646 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
647 };
648 uint8_t sha_256_expected[] = {
649 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
650 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
651 };
652 uint8_t sha_384_expected[] = {
653 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
654 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
655 };
656 uint8_t sha_512_expected[] = {
657 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
658 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
659 };
660
661 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
662 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
663 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
664 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
665}
666
667TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
668 string key(131, 0xaa);
669 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
670
671 uint8_t sha_224_expected[] = {
672 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
673 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
674 };
675 uint8_t sha_256_expected[] = {
676 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
677 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
678 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
679 };
680 uint8_t sha_384_expected[] = {
681 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
682 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
683 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
684 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
685 };
686 uint8_t sha_512_expected[] = {
687 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
688 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
689 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
690 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
691 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
692 };
693
694 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
695 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
696 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
697 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
698}
699
700TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
701 string key(131, 0xaa);
702 string message = "This is a test using a larger than block-size key and a larger than "
703 "block-size data. The key needs to be hashed before being used by the HMAC "
704 "algorithm.";
705
706 uint8_t sha_224_expected[] = {
707 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
708 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
709 };
710 uint8_t sha_256_expected[] = {
711 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
712 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
713 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
714 };
715 uint8_t sha_384_expected[] = {
716 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
717 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
718 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
719 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
720 };
721 uint8_t sha_512_expected[] = {
722 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
723 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
724 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
725 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
726 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
727 };
728
729 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
730 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
731 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
732 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
733}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700734
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700735TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700736 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
737 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
738 .Authorization(TAG_KEY_SIZE, 128)
Shawn Willdenc24c1102014-12-22 15:30:09 -0700739 .SigningKey()
Shawn Willden2c242002015-02-27 07:01:02 -0700740 .Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700741 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700742}
743
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700744TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700745 ASSERT_EQ(KM_ERROR_OK,
746 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 33)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700747 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700748}
749
Shawn Willden1615f2e2014-08-13 10:37:40 -0600750TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willden2c242002015-02-27 07:01:02 -0700751 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
752 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700753 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700754
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700755 string message = "1234567890123456789012345678901";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700756 string result;
757 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700758 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700759 EXPECT_EQ(0U, result.size());
760 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600761
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700762 string signature;
763 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
764 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -0600765}
766
Shawn Willden61902362014-12-18 10:33:24 -0700767// TODO(swillden): Add more verification failure tests.
768
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700769typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600770TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700771 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
772 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700773 string message = "12345678901234567890123456789012";
774 string signature;
775 SignMessage(message, &signature);
776 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600777}
778
Shawn Willden61902362014-12-18 10:33:24 -0700779TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
780 // Note that without padding, key size must exactly match digest size.
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 VerifyMessage(message, signature);
786}
787
Shawn Willdenf90f2352014-12-18 23:01:15 -0700788TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700789 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700790 string message(1024, 'a');
791 string signature;
792 SignMessage(message, &signature);
793 ++signature[signature.size() / 2];
794
795 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
796
797 string result;
798 size_t input_consumed;
799 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
800 EXPECT_EQ(message.size(), input_consumed);
801 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
802}
803
Shawn Willdenf90f2352014-12-18 23:01:15 -0700804TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700805 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
806 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700807 // Use large message, which won't work without digesting.
808 string message(1024, 'a');
809 string signature;
810 SignMessage(message, &signature);
811 VerifyMessage(message, signature);
812}
813
814TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700815 GenerateKey(
816 AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700817 string message(1024, 'a');
818 string signature;
819 SignMessage(message, &signature);
820 ++signature[signature.size() / 2];
821
822 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
823
824 string result;
825 size_t input_consumed;
826 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
827 EXPECT_EQ(message.size(), input_consumed);
828 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
829}
830
831TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -0700832 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
833 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700834 // Use large message, which won't work without digesting.
835 string message(1024, 'a');
836 string signature;
837 SignMessage(message, &signature);
838 ++message[message.size() / 2];
839
840 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
841
842 string result;
843 size_t input_consumed;
844 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
845 EXPECT_EQ(message.size(), input_consumed);
846 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
847}
848
Shawn Willdenf90f2352014-12-18 23:01:15 -0700849TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700850 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
851 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700852 string message(1024, 'a');
853 string signature;
854 SignMessage(message, &signature);
855 VerifyMessage(message, signature);
856}
857
858TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700859 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
860 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700861 string message(1024, 'a');
862 string signature;
863 SignMessage(message, &signature);
864 ++signature[signature.size() / 2];
865
866 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
867
868 string result;
869 size_t input_consumed;
870 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
871 EXPECT_EQ(message.size(), input_consumed);
872 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
873}
874
875TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -0700876 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
877 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700878 // Use large message, which won't work without digesting.
879 string message(1024, 'a');
880 string signature;
881 SignMessage(message, &signature);
882 ++message[message.size() / 2];
883
884 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
885
886 string result;
887 size_t input_consumed;
888 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
889 EXPECT_EQ(message.size(), input_consumed);
890 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
891}
892
893template <typename T> vector<T> make_vector(const T* array, size_t len) {
894 return vector<T>(array, array + len);
895}
896
897TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
898 // Get all supported digests and padding modes.
899 size_t digests_len;
900 keymaster_digest_t* digests;
901 EXPECT_EQ(KM_ERROR_OK,
902 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
903 &digests_len));
904
905 size_t padding_modes_len;
906 keymaster_padding_t* padding_modes;
907 EXPECT_EQ(KM_ERROR_OK,
908 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
909 &padding_modes, &padding_modes_len));
910
911 // Try them.
912 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
913 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
914 // Compute key & message size that will work.
915 size_t key_bits = 256;
916 size_t message_len = 1000;
917 switch (digest) {
918 case KM_DIGEST_NONE:
919 switch (padding_mode) {
920 case KM_PAD_NONE:
921 // Match key size.
922 message_len = key_bits / 8;
923 break;
924 case KM_PAD_RSA_PKCS1_1_5_SIGN:
925 message_len = key_bits / 8 - 11;
926 break;
927 case KM_PAD_RSA_PSS:
928 // PSS requires a digest.
929 continue;
930 default:
931 FAIL() << "Missing padding";
932 break;
933 }
934 break;
935
936 case KM_DIGEST_SHA_2_256:
937 switch (padding_mode) {
938 case KM_PAD_NONE:
939 // Key size matches digest size
940 break;
941 case KM_PAD_RSA_PKCS1_1_5_SIGN:
942 key_bits += 8 * 11;
943 break;
944 case KM_PAD_RSA_PSS:
945 key_bits += 8 * 10;
946 break;
947 default:
948 FAIL() << "Missing padding";
949 break;
950 }
951 break;
952 default:
953 FAIL() << "Missing digest";
954 }
955
Shawn Willden2c242002015-02-27 07:01:02 -0700956 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(key_bits, 3, digest, padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700957 string message(message_len, 'a');
958 string signature;
959 SignMessage(message, &signature);
960 VerifyMessage(message, signature);
961 }
962 }
963
964 free(padding_modes);
965 free(digests);
966}
967
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600968TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600969 ASSERT_EQ(KM_ERROR_OK,
970 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700971 string message = "123456789012345678901234567890123456789012345678";
972 string signature;
973 SignMessage(message, &signature);
974 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600975}
976
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700977TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700978 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 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
985TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700986 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700987 string message = "123456789012345678901234567890123456789012345678";
988 string signature;
989 SignMessage(message, &signature);
990 VerifyMessage(message, signature);
991}
992
Shawn Willden0d560bf2014-12-15 17:44:02 -0700993TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700994 ASSERT_EQ(KM_ERROR_OK,
995 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700996 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -0700997 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700998 SignMessage(message, &signature);
999 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -07001000}
1001
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001002TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001003 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 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
1010TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001011 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001012 string message = "123456789012345678901234567890123456789012345678";
1013 string signature;
1014 SignMessage(message, &signature);
1015 VerifyMessage(message, signature);
1016}
1017
Shawn Willden5b53c992015-02-02 08:05:25 -07001018typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001019TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001020 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1021 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001022 string export_data;
1023 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1024 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001025
1026 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001027}
1028
Shawn Willdenf268d742014-08-19 15:36:26 -06001029TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001030 ASSERT_EQ(KM_ERROR_OK,
1031 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001032 string export_data;
1033 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1034 EXPECT_GT(export_data.length(), 0);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001035
1036 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001037}
1038
1039TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willden2c242002015-02-27 07:01:02 -07001040 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1041 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001042 string export_data;
1043 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001044}
1045
1046TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willden2c242002015-02-27 07:01:02 -07001047 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1048 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001049 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001050 string export_data;
1051 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001052}
1053
Shawn Willden7dad93b2015-02-05 10:20:47 -07001054TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001055 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001056 string export_data;
1057
1058 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1059 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1060 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1061}
1062
Shawn Willden437fbd12014-08-20 11:59:49 -06001063static string read_file(const string& file_name) {
1064 ifstream file_stream(file_name, std::ios::binary);
1065 istreambuf_iterator<char> file_begin(file_stream);
1066 istreambuf_iterator<char> file_end;
1067 return string(file_begin, file_end);
1068}
1069
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001070typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001071TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001072 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001073 ASSERT_EQ(633U, pk8_key.size());
1074
Shawn Willden2c242002015-02-27 07:01:02 -07001075 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().RsaSigningKey(
1076 1024, 65537, KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001077 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001078
1079 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001080 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1081 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1082 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001083
1084 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001085 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1086 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001087
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001088 string message(1024 / 8, 'a');
1089 string signature;
1090 SignMessage(message, &signature);
1091 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001092}
1093
Shawn Willden6bbe6782014-09-18 11:26:15 -06001094TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001095 string pk8_key = read_file("rsa_privkey_pk8.der");
1096 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001097 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001098 ImportKey(AuthorizationSetBuilder().RsaSigningKey(2048 /* Doesn't match key */, 3,
1099 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001100 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001101}
1102
1103TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001104 string pk8_key = read_file("rsa_privkey_pk8.der");
1105 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001106 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001107 ImportKey(AuthorizationSetBuilder().RsaSigningKey(256, 3 /* Doesnt' match key */,
1108 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001109 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001110}
1111
Shawn Willden81effc62014-08-27 10:08:46 -06001112TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001113 string pk8_key = read_file("ec_privkey_pk8.der");
1114 ASSERT_EQ(138U, pk8_key.size());
1115
Shawn Willden84b8da52015-03-11 07:21:32 -06001116 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001117 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001118
1119 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001120 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1121 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001122
1123 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001124 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1125 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001126
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001127 string message(1024 / 8, 'a');
1128 string signature;
1129 SignMessage(message, &signature);
1130 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001131}
1132
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001133TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1134 string pk8_key = read_file("ec_privkey_pk8.der");
1135 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001136
Shawn Willden84b8da52015-03-11 07:21:32 -06001137 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001138 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001139
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001140 // Check values derived from the key.
1141 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1142 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1143
1144 // And values provided by GoogleKeymaster
1145 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1146 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1147
1148 string message(1024 / 8, 'a');
1149 string signature;
1150 SignMessage(message, &signature);
1151 VerifyMessage(message, signature);
1152}
1153
1154TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1155 string pk8_key = read_file("ec_privkey_pk8.der");
1156 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001157 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden84b8da52015-03-11 07:21:32 -06001158 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(
1159 224, KM_DIGEST_NONE), // Size does not match key
1160 KM_KEY_FORMAT_PKCS8,
1161 pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001162}
1163
Shawn Willden3b702e22015-02-05 10:26:47 -07001164TEST_F(ImportKeyTest, AesKeySuccess) {
1165 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1166 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001167 ASSERT_EQ(KM_ERROR_OK,
1168 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16),
1169 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001170
1171 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1172 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1173
1174 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001175 string nonce;
1176 string ciphertext = EncryptMessage(message, &nonce);
1177 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden3b702e22015-02-05 10:26:47 -07001178 EXPECT_EQ(message, plaintext);
1179}
1180
1181TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1182 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1183 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001184 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().HmacKey(sizeof(key_data) * 8,
1185 KM_DIGEST_SHA_2_256, 32),
1186 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001187
1188 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1189 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1190
1191 string message = "Hello World!";
1192 string signature;
1193 SignMessage(message, &signature);
1194 VerifyMessage(message, signature);
1195}
1196
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001197typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001198TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001199 ASSERT_EQ(KM_ERROR_OK,
1200 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001201
1202 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001203 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001204 EXPECT_EQ(512 / 8, ciphertext1.size());
1205
Shawn Willden6dde87c2014-12-11 14:08:48 -07001206 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001207 EXPECT_EQ(512 / 8, ciphertext2.size());
1208
1209 // OAEP randomizes padding so every result should be different.
1210 EXPECT_NE(ciphertext1, ciphertext2);
1211}
1212
1213TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001214 ASSERT_EQ(KM_ERROR_OK,
1215 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001216 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001217 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001218 EXPECT_EQ(512 / 8, ciphertext.size());
1219
Shawn Willden6dde87c2014-12-11 14:08:48 -07001220 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001221 EXPECT_EQ(message, plaintext);
1222}
1223
1224TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
Shawn Willden2c242002015-02-27 07:01:02 -07001225 ASSERT_EQ(KM_ERROR_OK,
1226 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001227 string message = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001228 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001229 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001230
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001231 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1232 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001233 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001234 EXPECT_EQ(0, result.size());
1235}
1236
1237TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001238 ASSERT_EQ(KM_ERROR_OK,
1239 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001240 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001241 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001242 EXPECT_EQ(512 / 8, ciphertext.size());
1243
1244 // Corrupt the ciphertext
1245 ciphertext[512 / 8 / 2]++;
1246
Shawn Willden4200f212014-12-02 07:01:21 -07001247 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001248 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001249 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1250 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001251 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001252 EXPECT_EQ(0, result.size());
1253}
1254
1255TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001256 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1257 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001258 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001259 string ciphertext1 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001260 EXPECT_EQ(512 / 8, ciphertext1.size());
1261
Shawn Willden6dde87c2014-12-11 14:08:48 -07001262 string ciphertext2 = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001263 EXPECT_EQ(512 / 8, ciphertext2.size());
1264
1265 // PKCS1 v1.5 randomizes padding so every result should be different.
1266 EXPECT_NE(ciphertext1, ciphertext2);
1267}
1268
1269TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001270 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1271 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001272 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001273 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001274 EXPECT_EQ(512 / 8, ciphertext.size());
1275
Shawn Willden6dde87c2014-12-11 14:08:48 -07001276 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001277 EXPECT_EQ(message, plaintext);
1278}
1279
1280TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
Shawn Willden2c242002015-02-27 07:01:02 -07001281 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1282 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001283 string message = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001284 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001285 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001286
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001287 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1288 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001289 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001290 EXPECT_EQ(0, result.size());
1291}
1292
1293TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001294 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1295 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001296 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001297 string ciphertext = EncryptMessage(string(message));
Shawn Willden4200f212014-12-02 07:01:21 -07001298 EXPECT_EQ(512 / 8, ciphertext.size());
1299
1300 // Corrupt the ciphertext
1301 ciphertext[512 / 8 / 2]++;
1302
Shawn Willden4200f212014-12-02 07:01:21 -07001303 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001304 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001305 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1306 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001307 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willden4200f212014-12-02 07:01:21 -07001308 EXPECT_EQ(0, result.size());
1309}
1310
Shawn Willden907c3012014-12-08 15:51:55 -07001311TEST_F(EncryptionOperationsTest, AesOcbSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001312 ASSERT_EQ(KM_ERROR_OK,
1313 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001314 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001315 string nonce1;
1316 string ciphertext1 = EncryptMessage(message, &nonce1);
1317 EXPECT_EQ(12, nonce1.size());
1318 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext1.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001319
Shawn Willdendfa1c032015-02-07 00:39:01 -07001320 string nonce2;
1321 string ciphertext2 = EncryptMessage(message, &nonce2);
1322 EXPECT_EQ(12, nonce2.size());
1323 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext2.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001324
Shawn Willdendfa1c032015-02-07 00:39:01 -07001325 // Nonces should be random
1326 EXPECT_NE(nonce1, nonce2);
1327
1328 // Therefore ciphertexts are different
Shawn Willden907c3012014-12-08 15:51:55 -07001329 EXPECT_NE(ciphertext1, ciphertext2);
1330}
1331
Shawn Willden6dde87c2014-12-11 14:08:48 -07001332TEST_F(EncryptionOperationsTest, AesOcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001333 ASSERT_EQ(KM_ERROR_OK,
1334 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001335 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001336 string nonce;
1337 string ciphertext = EncryptMessage(message, &nonce);
1338 EXPECT_EQ(12, nonce.size());
1339 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001340
Shawn Willdendfa1c032015-02-07 00:39:01 -07001341 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001342 EXPECT_EQ(message, plaintext);
1343}
1344
1345TEST_F(EncryptionOperationsTest, AesOcbRoundTripCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001346 ASSERT_EQ(KM_ERROR_OK,
1347 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001348 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001349 string nonce;
1350 string ciphertext = EncryptMessage(message, &nonce);
1351 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001352
1353 ciphertext[ciphertext.size() / 2]++;
1354
Shawn Willdendfa1c032015-02-07 00:39:01 -07001355 AuthorizationSet input_set, output_set;
1356 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1357 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set, &output_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001358
1359 string result;
1360 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001361 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001362 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001363 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001364}
1365
1366TEST_F(EncryptionOperationsTest, AesDecryptGarbage) {
Shawn Willden2c242002015-02-27 07:01:02 -07001367 ASSERT_EQ(KM_ERROR_OK,
1368 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001369 string ciphertext(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001370 AuthorizationSet input_params;
1371 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaa", 12);
1372 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001373
1374 string result;
1375 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001376 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001377 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001378 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001379}
1380
Shawn Willdendfa1c032015-02-07 00:39:01 -07001381TEST_F(EncryptionOperationsTest, AesDecryptTooShortNonce) {
Shawn Willden2c242002015-02-27 07:01:02 -07001382 ASSERT_EQ(KM_ERROR_OK,
1383 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001384
Shawn Willdendfa1c032015-02-07 00:39:01 -07001385 // Try decrypting garbage ciphertext with too-short nonce
1386 string ciphertext(15, 'a');
1387 AuthorizationSet input_params;
1388 input_params.push_back(TAG_NONCE, "aaaaaaaaaaa", 11);
1389 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001390}
1391
1392TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptySuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001393 ASSERT_EQ(KM_ERROR_OK,
1394 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001395 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001396 string nonce;
1397 string ciphertext = EncryptMessage(message, &nonce);
1398 EXPECT_EQ(12, nonce.size());
1399 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001400
Shawn Willdendfa1c032015-02-07 00:39:01 -07001401 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001402 EXPECT_EQ(message, plaintext);
1403}
1404
1405TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptyCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001406 ASSERT_EQ(KM_ERROR_OK,
1407 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001408 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001409 string nonce;
1410 string ciphertext = EncryptMessage(message, &nonce);
1411 EXPECT_EQ(12, nonce.size());
1412 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001413
1414 ciphertext[ciphertext.size() / 2]++;
1415
Shawn Willdendfa1c032015-02-07 00:39:01 -07001416 AuthorizationSet input_set;
1417 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1418 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001419
1420 string result;
1421 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001422 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001423 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001424 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001425}
1426
1427TEST_F(EncryptionOperationsTest, AesOcbFullChunk) {
Shawn Willden2c242002015-02-27 07:01:02 -07001428 ASSERT_EQ(KM_ERROR_OK,
1429 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001430 string message(4096, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001431 string nonce;
1432 string ciphertext = EncryptMessage(message, &nonce);
1433 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001434
Shawn Willdendfa1c032015-02-07 00:39:01 -07001435 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001436 EXPECT_EQ(message, plaintext);
1437}
1438
1439TEST_F(EncryptionOperationsTest, AesOcbVariousChunkLengths) {
1440 for (unsigned chunk_length = 1; chunk_length <= 128; ++chunk_length) {
Shawn Willden2c242002015-02-27 07:01:02 -07001441 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(
1442 chunk_length, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001443 string message(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001444 string nonce;
1445 string ciphertext = EncryptMessage(message, &nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001446 int expected_tag_count = (message.length() + chunk_length - 1) / chunk_length;
Shawn Willdendfa1c032015-02-07 00:39:01 -07001447 EXPECT_EQ(message.length() + 16 * expected_tag_count, ciphertext.size())
Shawn Willden6dde87c2014-12-11 14:08:48 -07001448 << "Unexpected ciphertext size for chunk length " << chunk_length
1449 << " expected tag count was " << expected_tag_count
1450 << " but actual tag count was probably "
1451 << (ciphertext.size() - message.length() - 12) / 16;
1452
Shawn Willdendfa1c032015-02-07 00:39:01 -07001453 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001454 EXPECT_EQ(message, plaintext);
1455 }
1456}
1457
1458TEST_F(EncryptionOperationsTest, AesOcbAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -07001459 ASSERT_EQ(KM_ERROR_OK,
1460 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001461 string message = "Hello";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001462
Shawn Willdendfa1c032015-02-07 00:39:01 -07001463 AuthorizationSet input_set, output_set;
1464 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_set, &output_set));
1465 EXPECT_EQ(1, output_set.size());
1466 EXPECT_EQ(0, output_set.find(TAG_NONCE));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001467
1468 string result;
1469 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001470 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1471 EXPECT_EQ(message.length(), input_consumed);
1472 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001473}
1474
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001475TEST_F(EncryptionOperationsTest, AesOcbNoChunkLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001476 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenc24c1102014-12-22 15:30:09 -07001477 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001478 .Authorization(TAG_BLOCK_MODE, KM_MODE_OCB)
1479 .Authorization(TAG_MAC_LENGTH, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001480 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001481}
1482
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001483TEST_F(EncryptionOperationsTest, AesOcbPaddingUnsupported) {
Shawn Willden2c242002015-02-27 07:01:02 -07001484 ASSERT_EQ(
1485 KM_ERROR_OK,
1486 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Authorization(
1487 TAG_PADDING, KM_PAD_ZERO)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001488 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001489}
1490
1491TEST_F(EncryptionOperationsTest, AesOcbInvalidMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001492 ASSERT_EQ(KM_ERROR_OK,
1493 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 17)));
Shawn Willden63ac0432014-12-29 14:07:08 -07001494 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001495}
1496
Shawn Willdendfa1c032015-02-07 00:39:01 -07001497uint8_t rfc_7523_test_key_data[] = {
1498 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1499};
1500string rfc_7523_test_key = make_string(rfc_7523_test_key_data);
1501
1502TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector1) {
1503 uint8_t nonce[] = {
1504 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
1505 };
1506 uint8_t expected_ciphertext[] = {
1507 0x78, 0x54, 0x07, 0xBF, 0xFF, 0xC8, 0xAD, 0x9E,
1508 0xDC, 0xC5, 0x52, 0x0A, 0xC9, 0x11, 0x1E, 0xE6,
1509 };
1510 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1511 "" /* plaintext */, make_string(expected_ciphertext));
1512}
1513
1514TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector2) {
1515 uint8_t nonce[] = {
1516 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x01,
1517 };
1518 uint8_t associated_data[] = {
1519 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1520 };
1521 uint8_t plaintext[] = {
1522 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1523 };
1524 uint8_t expected_ciphertext[] = {
1525 0x68, 0x20, 0xB3, 0x65, 0x7B, 0x6F, 0x61, 0x5A, 0x57, 0x25, 0xBD, 0xA0,
1526 0xD3, 0xB4, 0xEB, 0x3A, 0x25, 0x7C, 0x9A, 0xF1, 0xF8, 0xF0, 0x30, 0x09,
1527 };
1528 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1529 make_string(plaintext), make_string(expected_ciphertext));
1530}
1531
1532TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector3) {
1533 uint8_t nonce[] = {
1534 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x02,
1535 };
1536 uint8_t associated_data[] = {
1537 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1538 };
1539 uint8_t expected_ciphertext[] = {
1540 0x81, 0x01, 0x7F, 0x82, 0x03, 0xF0, 0x81, 0x27,
1541 0x71, 0x52, 0xFA, 0xDE, 0x69, 0x4A, 0x0A, 0x00,
1542 };
1543 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1544 "" /* plaintext */, make_string(expected_ciphertext));
1545}
1546
1547TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector4) {
1548 uint8_t nonce[] = {
1549 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x03,
1550 };
1551 uint8_t plaintext[] = {
1552 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1553 };
1554 uint8_t expected_ciphertext[] = {
1555 0x45, 0xDD, 0x69, 0xF8, 0xF5, 0xAA, 0xE7, 0x24, 0x14, 0x05, 0x4C, 0xD1,
1556 0xF3, 0x5D, 0x82, 0x76, 0x0B, 0x2C, 0xD0, 0x0D, 0x2F, 0x99, 0xBF, 0xA9,
1557 };
1558 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1559 make_string(plaintext), make_string(expected_ciphertext));
1560}
1561
1562TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector5) {
1563 uint8_t nonce[] = {
1564 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x04,
1565 };
1566 uint8_t associated_data[] = {
1567 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1568 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1569 };
1570 uint8_t plaintext[] = {
1571 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1572 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1573 };
1574 uint8_t expected_ciphertext[] = {
1575 0x57, 0x1D, 0x53, 0x5B, 0x60, 0xB2, 0x77, 0x18, 0x8B, 0xE5, 0x14,
1576 0x71, 0x70, 0xA9, 0xA2, 0x2C, 0x3A, 0xD7, 0xA4, 0xFF, 0x38, 0x35,
1577 0xB8, 0xC5, 0x70, 0x1C, 0x1C, 0xCE, 0xC8, 0xFC, 0x33, 0x58,
1578 };
1579 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1580 make_string(plaintext), make_string(expected_ciphertext));
1581}
1582
1583TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector6) {
1584 uint8_t nonce[] = {
1585 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x05,
1586 };
1587 uint8_t associated_data[] = {
1588 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1589 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1590 };
1591 uint8_t expected_ciphertext[] = {
1592 0x8C, 0xF7, 0x61, 0xB6, 0x90, 0x2E, 0xF7, 0x64,
1593 0x46, 0x2A, 0xD8, 0x64, 0x98, 0xCA, 0x6B, 0x97,
1594 };
1595 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1596 "" /* plaintext */, make_string(expected_ciphertext));
1597}
1598
1599TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector7) {
1600 uint8_t nonce[] = {
1601 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x06,
1602 };
1603 uint8_t plaintext[] = {
1604 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1605 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1606 };
1607 uint8_t expected_ciphertext[] = {
1608 0x5C, 0xE8, 0x8E, 0xC2, 0xE0, 0x69, 0x27, 0x06, 0xA9, 0x15, 0xC0,
1609 0x0A, 0xEB, 0x8B, 0x23, 0x96, 0xF4, 0x0E, 0x1C, 0x74, 0x3F, 0x52,
1610 0x43, 0x6B, 0xDF, 0x06, 0xD8, 0xFA, 0x1E, 0xCA, 0x34, 0x3D,
1611 };
1612 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1613 make_string(plaintext), make_string(expected_ciphertext));
1614}
1615
1616TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector8) {
1617 uint8_t nonce[] = {
1618 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x07,
1619 };
1620 uint8_t associated_data[] = {
1621 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1622 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1623 };
1624 uint8_t plaintext[] = {
1625 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1626 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1627 };
1628 uint8_t expected_ciphertext[] = {
1629 0x1C, 0xA2, 0x20, 0x73, 0x08, 0xC8, 0x7C, 0x01, 0x07, 0x56, 0x10, 0x4D, 0x88, 0x40,
1630 0xCE, 0x19, 0x52, 0xF0, 0x96, 0x73, 0xA4, 0x48, 0xA1, 0x22, 0xC9, 0x2C, 0x62, 0x24,
1631 0x10, 0x51, 0xF5, 0x73, 0x56, 0xD7, 0xF3, 0xC9, 0x0B, 0xB0, 0xE0, 0x7F,
1632 };
1633 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1634 make_string(plaintext), make_string(expected_ciphertext));
1635}
1636
1637TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector9) {
1638 uint8_t nonce[] = {
1639 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x08,
1640 };
1641 uint8_t associated_data[] = {
1642 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1643 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1644 };
1645 uint8_t expected_ciphertext[] = {
1646 0x6D, 0xC2, 0x25, 0xA0, 0x71, 0xFC, 0x1B, 0x9F,
1647 0x7C, 0x69, 0xF9, 0x3B, 0x0F, 0x1E, 0x10, 0xDE,
1648 };
1649 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1650 "" /* plaintext */, make_string(expected_ciphertext));
1651}
1652
1653TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector10) {
1654 uint8_t nonce[] = {
1655 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x09,
1656 };
1657 uint8_t plaintext[] = {
1658 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1659 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1660 };
1661 uint8_t expected_ciphertext[] = {
1662 0x22, 0x1B, 0xD0, 0xDE, 0x7F, 0xA6, 0xFE, 0x99, 0x3E, 0xCC, 0xD7, 0x69, 0x46, 0x0A,
1663 0x0A, 0xF2, 0xD6, 0xCD, 0xED, 0x0C, 0x39, 0x5B, 0x1C, 0x3C, 0xE7, 0x25, 0xF3, 0x24,
1664 0x94, 0xB9, 0xF9, 0x14, 0xD8, 0x5C, 0x0B, 0x1E, 0xB3, 0x83, 0x57, 0xFF,
1665 };
1666 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1667 make_string(plaintext), make_string(expected_ciphertext));
1668}
1669
1670TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector11) {
1671 uint8_t nonce[] = {
1672 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0A,
1673 };
1674 uint8_t associated_data[] = {
1675 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1676 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1677 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1678 };
1679 uint8_t plaintext[] = {
1680 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1681 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1682 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1683 };
1684 uint8_t expected_ciphertext[] = {
1685 0xBD, 0x6F, 0x6C, 0x49, 0x62, 0x01, 0xC6, 0x92, 0x96, 0xC1, 0x1E, 0xFD,
1686 0x13, 0x8A, 0x46, 0x7A, 0xBD, 0x3C, 0x70, 0x79, 0x24, 0xB9, 0x64, 0xDE,
1687 0xAF, 0xFC, 0x40, 0x31, 0x9A, 0xF5, 0xA4, 0x85, 0x40, 0xFB, 0xBA, 0x18,
1688 0x6C, 0x55, 0x53, 0xC6, 0x8A, 0xD9, 0xF5, 0x92, 0xA7, 0x9A, 0x42, 0x40,
1689 };
1690 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1691 make_string(plaintext), make_string(expected_ciphertext));
1692}
1693
1694TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector12) {
1695 uint8_t nonce[] = {
1696 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0B,
1697 };
1698 uint8_t associated_data[] = {
1699 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1700 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1701 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1702 };
1703 uint8_t plaintext[] = {};
1704 uint8_t expected_ciphertext[] = {
1705 0xFE, 0x80, 0x69, 0x0B, 0xEE, 0x8A, 0x48, 0x5D,
1706 0x11, 0xF3, 0x29, 0x65, 0xBC, 0x9D, 0x2A, 0x32,
1707 };
1708 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1709 "" /* plaintext */, make_string(expected_ciphertext));
1710}
1711
1712TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector13) {
1713 uint8_t nonce[] = {
1714 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0C,
1715 };
1716 uint8_t associated_data[] = {};
1717 uint8_t plaintext[] = {
1718 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1719 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1720 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1721 };
1722 uint8_t expected_ciphertext[] = {
1723 0x29, 0x42, 0xBF, 0xC7, 0x73, 0xBD, 0xA2, 0x3C, 0xAB, 0xC6, 0xAC, 0xFD,
1724 0x9B, 0xFD, 0x58, 0x35, 0xBD, 0x30, 0x0F, 0x09, 0x73, 0x79, 0x2E, 0xF4,
1725 0x60, 0x40, 0xC5, 0x3F, 0x14, 0x32, 0xBC, 0xDF, 0xB5, 0xE1, 0xDD, 0xE3,
1726 0xBC, 0x18, 0xA5, 0xF8, 0x40, 0xB5, 0x2E, 0x65, 0x34, 0x44, 0xD5, 0xDF,
1727 };
1728 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1729 make_string(plaintext), make_string(expected_ciphertext));
1730}
1731
1732TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector14) {
1733 uint8_t nonce[] = {
1734 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0D,
1735 };
1736 uint8_t associated_data[] = {
1737 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1738 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1739 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1740 };
1741 uint8_t plaintext[] = {
1742 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1743 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1744 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1745 };
1746 uint8_t expected_ciphertext[] = {
1747 0xD5, 0xCA, 0x91, 0x74, 0x84, 0x10, 0xC1, 0x75, 0x1F, 0xF8, 0xA2, 0xF6, 0x18, 0x25,
1748 0x5B, 0x68, 0xA0, 0xA1, 0x2E, 0x09, 0x3F, 0xF4, 0x54, 0x60, 0x6E, 0x59, 0xF9, 0xC1,
1749 0xD0, 0xDD, 0xC5, 0x4B, 0x65, 0xE8, 0x62, 0x8E, 0x56, 0x8B, 0xAD, 0x7A, 0xED, 0x07,
1750 0xBA, 0x06, 0xA4, 0xA6, 0x94, 0x83, 0xA7, 0x03, 0x54, 0x90, 0xC5, 0x76, 0x9E, 0x60,
1751 };
1752 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1753 make_string(plaintext), make_string(expected_ciphertext));
1754}
1755
1756TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector15) {
1757 uint8_t nonce[] = {
1758 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0E,
1759 };
1760 uint8_t associated_data[] = {
1761 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1762 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1763 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1764 };
1765 uint8_t plaintext[] = {};
1766 uint8_t expected_ciphertext[] = {
1767 0xC5, 0xCD, 0x9D, 0x18, 0x50, 0xC1, 0x41, 0xE3,
1768 0x58, 0x64, 0x99, 0x94, 0xEE, 0x70, 0x1B, 0x68,
1769 };
1770 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1771 "" /* plaintext */, make_string(expected_ciphertext));
1772}
1773
1774TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector16) {
1775 uint8_t nonce[] = {
1776 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0F,
1777 };
1778 uint8_t associated_data[] = {};
1779 uint8_t plaintext[] = {
1780 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1781 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1782 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1783 };
1784 uint8_t expected_ciphertext[] = {
1785 0x44, 0x12, 0x92, 0x34, 0x93, 0xC5, 0x7D, 0x5D, 0xE0, 0xD7, 0x00, 0xF7, 0x53, 0xCC,
1786 0xE0, 0xD1, 0xD2, 0xD9, 0x50, 0x60, 0x12, 0x2E, 0x9F, 0x15, 0xA5, 0xDD, 0xBF, 0xC5,
1787 0x78, 0x7E, 0x50, 0xB5, 0xCC, 0x55, 0xEE, 0x50, 0x7B, 0xCB, 0x08, 0x4E, 0x47, 0x9A,
1788 0xD3, 0x63, 0xAC, 0x36, 0x6B, 0x95, 0xA9, 0x8C, 0xA5, 0xF3, 0x00, 0x0B, 0x14, 0x79,
1789 };
1790 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1791 make_string(plaintext), make_string(expected_ciphertext));
1792}
1793
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001794TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001795 ASSERT_EQ(KM_ERROR_OK,
1796 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1797 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001798 // Two-block message.
1799 string message = "12345678901234567890123456789012";
1800 string ciphertext1 = EncryptMessage(message);
1801 EXPECT_EQ(message.size(), ciphertext1.size());
1802
1803 string ciphertext2 = EncryptMessage(string(message));
1804 EXPECT_EQ(message.size(), ciphertext2.size());
1805
1806 // ECB is deterministic.
1807 EXPECT_EQ(ciphertext1, ciphertext2);
1808
1809 string plaintext = DecryptMessage(ciphertext1);
1810 EXPECT_EQ(message, plaintext);
1811}
1812
1813TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07001814 ASSERT_EQ(KM_ERROR_OK,
1815 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1816 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001817 // Message is slightly shorter than two blocks.
1818 string message = "1234567890123456789012345678901";
1819
1820 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1821 string ciphertext;
1822 size_t input_consumed;
1823 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1824 EXPECT_EQ(message.size(), input_consumed);
1825 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1826}
1827
1828TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001829 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001830 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001831 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1832 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001833
1834 // Try various message lengths; all should work.
1835 for (int i = 0; i < 32; ++i) {
1836 string message(i, 'a');
1837 string ciphertext = EncryptMessage(message);
1838 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1839 string plaintext = DecryptMessage(ciphertext);
1840 EXPECT_EQ(message, plaintext);
1841 }
1842}
1843
1844TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001845 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001846 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001847 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1848 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001849
1850 string message = "a";
1851 string ciphertext = EncryptMessage(message);
1852 EXPECT_EQ(16, ciphertext.size());
1853 EXPECT_NE(ciphertext, message);
1854 ++ciphertext[ciphertext.size() / 2];
1855
1856 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1857 string plaintext;
1858 size_t input_consumed;
1859 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1860 EXPECT_EQ(ciphertext.size(), input_consumed);
1861 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1862}
1863
1864TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001865 ASSERT_EQ(KM_ERROR_OK,
1866 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1867 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001868 // Two-block message.
1869 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001870 string iv1;
1871 string ciphertext1 = EncryptMessage(message, &iv1);
1872 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001873
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001874 string iv2;
1875 string ciphertext2 = EncryptMessage(message, &iv2);
1876 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001877
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001878 // IVs should be random, so ciphertexts should differ.
1879 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001880 EXPECT_NE(ciphertext1, ciphertext2);
1881
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001882 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001883 EXPECT_EQ(message, plaintext);
1884}
1885
1886TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001887 ASSERT_EQ(KM_ERROR_OK,
1888 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1889 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001890
1891 int increment = 15;
1892 string message(240, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001893 AuthorizationSet input_params;
1894 AuthorizationSet output_params;
1895 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1896
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001897 string ciphertext;
1898 size_t input_consumed;
1899 for (size_t i = 0; i < message.size(); i += increment)
1900 EXPECT_EQ(KM_ERROR_OK,
1901 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1902 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001903 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001904
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001905 // Move TAG_NONCE into input_params
1906 input_params.Reinitialize(output_params);
1907 output_params.Clear();
1908
1909 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001910 string plaintext;
1911 for (size_t i = 0; i < ciphertext.size(); i += increment)
1912 EXPECT_EQ(KM_ERROR_OK,
1913 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1914 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001915 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001916 EXPECT_EQ(message, plaintext);
1917}
1918
1919TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001920 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001921 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001922 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
1923 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001924
1925 // Try various message lengths; all should work.
1926 for (int i = 0; i < 32; ++i) {
1927 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06001928 string iv;
1929 string ciphertext = EncryptMessage(message, &iv);
1930 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1931 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001932 EXPECT_EQ(message, plaintext);
1933 }
1934}
1935
Shawn Willdencd695822015-01-26 14:06:32 -07001936typedef KeymasterTest AddEntropyTest;
1937TEST_F(AddEntropyTest, AddEntropy) {
1938 // There's no obvious way to test that entropy is actually added, but we can test that the API
1939 // doesn't blow up or return an error.
1940 EXPECT_EQ(KM_ERROR_OK,
1941 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
1942}
1943
Shawn Willden5fad7852015-01-26 16:10:56 -07001944typedef KeymasterTest RescopingTest;
1945TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willden2c242002015-02-27 07:01:02 -07001946 ASSERT_EQ(
1947 KM_ERROR_OK,
1948 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Authorization(
1949 TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001950 // TODO(swillden): Add a better error code for this.
1951 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, BeginOperation(KM_PURPOSE_ENCRYPT));
1952}
1953
1954TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07001955 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07001956 .AesEncryptionKey(128)
1957 .OcbMode(4096, 16)
Shawn Willden2c242002015-02-27 07:01:02 -07001958 .Authorization(TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)
1959 .Authorization(TAG_RESCOPING_DEL, KM_TAG_MAC_LENGTH)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001960 EXPECT_FALSE(contains(sw_enforced(), TAG_MAC_LENGTH, 15));
1961 EXPECT_TRUE(contains(sw_enforced(), TAG_MAC_LENGTH, 16));
1962
1963 keymaster_key_blob_t rescoped_blob;
1964 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001965 AuthorizationSet new_params = AuthorizationSetBuilder()
1966 .AesEncryptionKey(128)
1967 .OcbMode(4096, 15 /* note changed */)
1968 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001969
1970 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
1971 ASSERT_TRUE(rescoped_characteristics != NULL);
1972
1973 EXPECT_EQ(0, rescoped_characteristics->hw_enforced.length);
1974 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
1975 keymaster_free_characteristics(rescoped_characteristics);
1976 free(rescoped_characteristics);
1977 free(const_cast<uint8_t*>(rescoped_blob.key_material));
1978
1979 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
1980 EXPECT_TRUE(contains(auths, TAG_MAC_LENGTH, 15));
1981 EXPECT_FALSE(contains(auths, TAG_MAC_LENGTH, 16));
1982}
1983
1984TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07001985 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1986 .RsaEncryptionKey(256, 3, KM_PAD_RSA_OAEP)
1987 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
1988 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07001989 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
1990 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
1991 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
1992 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
1993
1994 keymaster_key_blob_t rescoped_blob;
1995 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07001996 AuthorizationSet new_params = AuthorizationSetBuilder()
1997 .RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)
1998 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07001999
2000 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
2001 ASSERT_TRUE(rescoped_characteristics != NULL);
2002
2003 EXPECT_EQ(0, rescoped_characteristics->hw_enforced.length);
2004 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
2005 keymaster_free_characteristics(rescoped_characteristics);
2006 free(rescoped_characteristics);
2007 free(const_cast<uint8_t*>(rescoped_blob.key_material));
2008
2009 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
2010 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
2011 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
2012 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
2013}
2014
2015// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
2016// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
2017// may not be changed.
2018
Shawn Willden128ffe02014-08-06 12:31:33 -06002019} // namespace test
2020} // namespace keymaster