blob: 70201d434907647ab97dfec17d234346a03d4e73 [file] [log] [blame]
Shawn Willden128ffe02014-08-06 12:31:33 -06001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Shawn Willden437fbd12014-08-20 11:59:49 -060017#include <fstream>
Shawn Willden76076ab2014-12-18 08:36:35 -070018#include <string>
19#include <vector>
Shawn Willden437fbd12014-08-20 11:59:49 -060020
Shawn Willden128ffe02014-08-06 12:31:33 -060021#include <openssl/engine.h>
22
Shawn Willdend7a5c712015-04-09 16:33:52 -060023#include <hardware/keymaster0.h>
24
Shawn Willden98d9b922014-08-26 08:14:10 -060025#include <keymaster/google_keymaster_utils.h>
26#include <keymaster/keymaster_tags.h>
Shawn Willdenb7510332015-02-06 19:58:29 -070027#include <keymaster/soft_keymaster_device.h>
Shawn Willden98d9b922014-08-26 08:14:10 -060028
Shawn Willden76364712014-08-11 17:48:04 -060029#include "google_keymaster_test_utils.h"
Shawn Willden128ffe02014-08-06 12:31:33 -060030
Shawn Willden437fbd12014-08-20 11:59:49 -060031using std::ifstream;
32using std::istreambuf_iterator;
Shawn Willden76076ab2014-12-18 08:36:35 -070033using std::string;
34using std::vector;
Shawn Willden437fbd12014-08-20 11:59:49 -060035
Shawn Willden128ffe02014-08-06 12:31:33 -060036int main(int argc, char** argv) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -070037 ERR_load_crypto_strings();
Shawn Willden128ffe02014-08-06 12:31:33 -060038 ::testing::InitGoogleTest(&argc, argv);
39 int result = RUN_ALL_TESTS();
40 // Clean up stuff OpenSSL leaves around, so Valgrind doesn't complain.
41 CRYPTO_cleanup_all_ex_data();
Shawn Willden7c0a82b2014-09-17 12:57:32 -060042 ERR_remove_thread_state(NULL);
Shawn Willden128ffe02014-08-06 12:31:33 -060043 ERR_free_strings();
44 return result;
45}
46
Shawn Willden63ac0432014-12-29 14:07:08 -070047template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) {
48 os << "{ ";
49 bool first = true;
50 for (T t : vec) {
51 os << (first ? "" : ", ") << t;
52 if (first)
53 first = false;
54 }
55 os << " }";
56 return os;
57}
58
Shawn Willden128ffe02014-08-06 12:31:33 -060059namespace keymaster {
60namespace test {
61
Shawn Willden567a4a02014-12-31 12:14:46 -070062StdoutLogger logger;
63
Shawn Willden95dda362015-02-27 10:58:37 -070064class KeymasterTest : public Keymaster1Test {
Shawn Willden128ffe02014-08-06 12:31:33 -060065 protected:
Shawn Willden95dda362015-02-27 10:58:37 -070066 KeymasterTest() {
67 SoftKeymasterDevice* device = new SoftKeymasterDevice;
68 init(device->keymaster_device());
Shawn Willden5b53c992015-02-02 08:05:25 -070069 }
Shawn Willden128ffe02014-08-06 12:31:33 -060070};
71
Shawn Willden128ffe02014-08-06 12:31:33 -060072typedef KeymasterTest CheckSupported;
73TEST_F(CheckSupported, SupportedAlgorithms) {
Shawn Willden5b53c992015-02-02 08:05:25 -070074 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
75 device()->get_supported_algorithms(device(), NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060076
Shawn Willden5b53c992015-02-02 08:05:25 -070077 size_t len;
78 keymaster_algorithm_t* algorithms;
79 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
Shawn Willdena278f612014-12-23 11:22:21 -070080 EXPECT_TRUE(ResponseContains(
81 {KM_ALGORITHM_RSA, KM_ALGORITHM_ECDSA, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms,
82 len));
Shawn Willden5b53c992015-02-02 08:05:25 -070083 free(algorithms);
Shawn Willden128ffe02014-08-06 12:31:33 -060084}
85
86TEST_F(CheckSupported, SupportedBlockModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -070087 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
88 device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
89 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -060090
Shawn Willden5b53c992015-02-02 08:05:25 -070091 size_t len;
92 keymaster_block_mode_t* modes;
Shawn Willden63ac0432014-12-29 14:07:08 -070093 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
94 KM_PURPOSE_ENCRYPT, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -060095 EXPECT_EQ(0U, len);
Shawn Willden63ac0432014-12-29 14:07:08 -070096 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -060097
Shawn Willden76076ab2014-12-18 08:36:35 -070098 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
Shawn Willden5b53c992015-02-02 08:05:25 -070099 device()->get_supported_block_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_ENCRYPT,
100 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600101
Shawn Willden63ac0432014-12-29 14:07:08 -0700102 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
Shawn Willden5b53c992015-02-02 08:05:25 -0700103 device()->get_supported_block_modes(device(), KM_ALGORITHM_ECDSA, KM_PURPOSE_ENCRYPT,
104 &modes, &len));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600105
Shawn Willden63ac0432014-12-29 14:07:08 -0700106 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
107 KM_PURPOSE_ENCRYPT, &modes, &len));
Thai Duong20d725d2015-03-24 17:49:58 -0700108 EXPECT_TRUE(ResponseContains({KM_MODE_OCB, KM_MODE_ECB, KM_MODE_CBC, KM_MODE_CTR}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700109 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600110}
111
112TEST_F(CheckSupported, SupportedPaddingModes) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700113 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
114 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
115 NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600116
Shawn Willden5b53c992015-02-02 08:05:25 -0700117 size_t len;
118 keymaster_padding_t* modes;
119 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
120 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700121 EXPECT_TRUE(
122 ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700123 free(modes);
124
125 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
126 KM_PURPOSE_ENCRYPT, &modes, &len));
127 EXPECT_TRUE(ResponseContains({KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700128 free(modes);
Shawn Willden128ffe02014-08-06 12:31:33 -0600129
Shawn Willden76076ab2014-12-18 08:36:35 -0700130 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
131 device()->get_supported_padding_modes(device(), KM_ALGORITHM_DSA, KM_PURPOSE_SIGN,
132 &modes, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600133
Shawn Willden5b53c992015-02-02 08:05:25 -0700134 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_ECDSA,
135 KM_PURPOSE_SIGN, &modes, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600136 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700137 free(modes);
Shawn Willden63ac0432014-12-29 14:07:08 -0700138
139 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
140 device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
141 &modes, &len));
Shawn Willden128ffe02014-08-06 12:31:33 -0600142}
143
144TEST_F(CheckSupported, SupportedDigests) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700145 EXPECT_EQ(
146 KM_ERROR_OUTPUT_PARAMETER_NULL,
147 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600148
Shawn Willden5b53c992015-02-02 08:05:25 -0700149 size_t len;
150 keymaster_digest_t* digests;
151 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
152 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden61902362014-12-18 10:33:24 -0700153 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA_2_256}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700154 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600155
Shawn Willden76076ab2014-12-18 08:36:35 -0700156 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
157 device()->get_supported_digests(device(), KM_ALGORITHM_DSA, KM_PURPOSE_SIGN, &digests,
158 &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600159
Shawn Willden5b53c992015-02-02 08:05:25 -0700160 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_ECDSA,
161 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden84b8da52015-03-11 07:21:32 -0600162 EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE}, digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700163 free(digests);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600164
Shawn Willden63ac0432014-12-29 14:07:08 -0700165 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
166 device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
167 &len));
168
169 EXPECT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
Shawn Willden5b53c992015-02-02 08:05:25 -0700170 KM_PURPOSE_SIGN, &digests, &len));
Shawn Willden63ac0432014-12-29 14:07:08 -0700171 EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
172 KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
173 digests, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700174 free(digests);
Shawn Willden128ffe02014-08-06 12:31:33 -0600175}
176
177TEST_F(CheckSupported, SupportedImportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700178 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
179 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600180
Shawn Willden5b53c992015-02-02 08:05:25 -0700181 size_t len;
182 keymaster_key_format_t* formats;
183 EXPECT_EQ(KM_ERROR_OK,
184 device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700185 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700186 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700187
188 EXPECT_EQ(KM_ERROR_OK,
189 device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
190 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
191 free(formats);
192
193 EXPECT_EQ(KM_ERROR_OK,
194 device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
195 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
196 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600197}
198
199TEST_F(CheckSupported, SupportedExportFormats) {
Shawn Willden5b53c992015-02-02 08:05:25 -0700200 EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
201 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
Shawn Willden128ffe02014-08-06 12:31:33 -0600202
Shawn Willden5b53c992015-02-02 08:05:25 -0700203 size_t len;
204 keymaster_key_format_t* formats;
205 EXPECT_EQ(KM_ERROR_OK,
206 device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700207 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700208 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600209
Shawn Willden76076ab2014-12-18 08:36:35 -0700210 EXPECT_EQ(KM_ERROR_UNSUPPORTED_ALGORITHM,
Shawn Willden5b53c992015-02-02 08:05:25 -0700211 device()->get_supported_export_formats(device(), KM_ALGORITHM_DSA, &formats, &len));
Shawn Willden28e41472014-08-18 13:35:22 -0600212
Shawn Willden5b53c992015-02-02 08:05:25 -0700213 EXPECT_EQ(KM_ERROR_OK,
214 device()->get_supported_export_formats(device(), KM_ALGORITHM_ECDSA, &formats, &len));
Shawn Willden76076ab2014-12-18 08:36:35 -0700215 EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
Shawn Willden5b53c992015-02-02 08:05:25 -0700216 free(formats);
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600217
Shawn Willden5b53c992015-02-02 08:05:25 -0700218 EXPECT_EQ(KM_ERROR_OK,
219 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600220 EXPECT_EQ(0U, len);
Shawn Willden5b53c992015-02-02 08:05:25 -0700221 free(formats);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700222
223 EXPECT_EQ(KM_ERROR_OK,
224 device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600225 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700226 free(formats);
227
228 EXPECT_EQ(KM_ERROR_OK,
229 device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
Shawn Willdenc6096592015-03-17 15:53:14 -0600230 EXPECT_EQ(0U, len);
Shawn Willden7dad93b2015-02-05 10:20:47 -0700231 free(formats);
Shawn Willden128ffe02014-08-06 12:31:33 -0600232}
233
Shawn Willdend0772312014-09-18 12:27:57 -0600234class NewKeyGeneration : public KeymasterTest {
235 protected:
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700236 void CheckBaseParams() {
237 EXPECT_EQ(0U, hw_enforced().size());
238 EXPECT_EQ(12U, hw_enforced().SerializedSize());
Shawn Willdend0772312014-09-18 12:27:57 -0600239
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700240 AuthorizationSet auths = sw_enforced();
241 EXPECT_GT(auths.SerializedSize(), 12U);
242
Shawn Willden5b53c992015-02-02 08:05:25 -0700243 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
244 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
245 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
Shawn Willdeneb63b972015-03-14 08:01:12 -0600246 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
Shawn Willden5b53c992015-02-02 08:05:25 -0700247 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
Shawn Willdend0772312014-09-18 12:27:57 -0600248
249 // Verify that App ID, App data and ROT are NOT included.
Shawn Willden5b53c992015-02-02 08:05:25 -0700250 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
251 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
252 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
Shawn Willdend0772312014-09-18 12:27:57 -0600253
254 // Just for giggles, check that some unexpected tags/values are NOT present.
Shawn Willden5b53c992015-02-02 08:05:25 -0700255 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
256 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
257 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
Shawn Willdend0772312014-09-18 12:27:57 -0600258
259 // Now check that unspecified, defaulted tags are correct.
Shawn Willden5b53c992015-02-02 08:05:25 -0700260 EXPECT_TRUE(contains(auths, TAG_ORIGIN, KM_ORIGIN_SOFTWARE));
261 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
Shawn Willdend0772312014-09-18 12:27:57 -0600262 }
Shawn Willden2079ae82015-01-22 13:42:31 -0700263};
264
Shawn Willden128ffe02014-08-06 12:31:33 -0600265TEST_F(NewKeyGeneration, Rsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700266 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
267 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700268 CheckBaseParams();
Shawn Willden128ffe02014-08-06 12:31:33 -0600269
Shawn Willden5b53c992015-02-02 08:05:25 -0700270 // Check specified tags are all present in auths
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700271 AuthorizationSet auths(sw_enforced());
Shawn Willden5b53c992015-02-02 08:05:25 -0700272 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_RSA));
273 EXPECT_TRUE(contains(auths, TAG_KEY_SIZE, 256));
274 EXPECT_TRUE(contains(auths, TAG_RSA_PUBLIC_EXPONENT, 3));
Shawn Willden128ffe02014-08-06 12:31:33 -0600275}
276
Shawn Willden6bbe6782014-09-18 11:26:15 -0600277TEST_F(NewKeyGeneration, RsaDefaultSize) {
Shawn Willden3b4e1652015-02-27 13:33:01 -0700278 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
279 GenerateKey(AuthorizationSetBuilder()
280 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
281 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
282 .SigningKey()));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600283}
284
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600285TEST_F(NewKeyGeneration, Ecdsa) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600286 ASSERT_EQ(KM_ERROR_OK,
287 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700288 CheckBaseParams();
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600289
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700290 // Check specified tags are all present in unenforced characteristics
291 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
292 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willdenc3864dd2014-08-18 15:20:01 -0600293}
294
Shawn Willden6bbe6782014-09-18 11:26:15 -0600295TEST_F(NewKeyGeneration, EcdsaDefaultSize) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600296 ASSERT_EQ(KM_ERROR_OK,
297 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700298 CheckBaseParams();
Shawn Willden6bbe6782014-09-18 11:26:15 -0600299
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700300 // Check specified tags are all present in unenforced characteristics
301 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600302
303 // Now check that unspecified, defaulted tags are correct.
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700304 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 224));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600305}
306
307TEST_F(NewKeyGeneration, EcdsaInvalidSize) {
Shawn Willden2c242002015-02-27 07:01:02 -0700308 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden84b8da52015-03-11 07:21:32 -0600309 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190, KM_DIGEST_NONE)));
Shawn Willden6bbe6782014-09-18 11:26:15 -0600310}
311
312TEST_F(NewKeyGeneration, EcdsaAllValidSizes) {
Shawn Willden8c856c82014-09-26 09:34:36 -0600313 size_t valid_sizes[] = {224, 256, 384, 521};
Shawn Willden6bbe6782014-09-18 11:26:15 -0600314 for (size_t size : valid_sizes) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600315 EXPECT_EQ(KM_ERROR_OK,
316 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size, KM_DIGEST_NONE)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700317 << "Failed to generate size: " << size;
Shawn Willden6bbe6782014-09-18 11:26:15 -0600318 }
319}
320
Shawn Willden19fca882015-01-22 16:35:30 -0700321TEST_F(NewKeyGeneration, AesOcb) {
Shawn Willden2c242002015-02-27 07:01:02 -0700322 ASSERT_EQ(KM_ERROR_OK,
323 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700324}
325
326TEST_F(NewKeyGeneration, AesOcbInvalidKeySize) {
Shawn Willden7dad93b2015-02-05 10:20:47 -0700327 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
Shawn Willden2c242002015-02-27 07:01:02 -0700328 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(136).OcbMode(4096, 16)));
Shawn Willden19fca882015-01-22 16:35:30 -0700329}
330
331TEST_F(NewKeyGeneration, AesOcbAllValidSizes) {
Shawn Willden19fca882015-01-22 16:35:30 -0700332 size_t valid_sizes[] = {128, 192, 256};
333 for (size_t size : valid_sizes) {
Shawn Willden2c242002015-02-27 07:01:02 -0700334 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(size)))
Shawn Willden5b53c992015-02-02 08:05:25 -0700335 << "Failed to generate size: " << size;
Shawn Willden19fca882015-01-22 16:35:30 -0700336 }
337}
338
Shawn Willden0d560bf2014-12-15 17:44:02 -0700339TEST_F(NewKeyGeneration, HmacSha256) {
Shawn Willden2c242002015-02-27 07:01:02 -0700340 ASSERT_EQ(KM_ERROR_OK,
341 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700342}
343
Shawn Willden76364712014-08-11 17:48:04 -0600344typedef KeymasterTest GetKeyCharacteristics;
345TEST_F(GetKeyCharacteristics, SimpleRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -0700346 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
347 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700348 AuthorizationSet original(sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600349
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700350 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
351 EXPECT_EQ(original, sw_enforced());
Shawn Willden76364712014-08-11 17:48:04 -0600352}
353
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700354typedef KeymasterTest SigningOperationsTest;
Shawn Willden1615f2e2014-08-13 10:37:40 -0600355TEST_F(SigningOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700356 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
357 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700358 string message = "12345678901234567890123456789012";
359 string signature;
360 SignMessage(message, &signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600361}
362
Shawn Willden61902362014-12-18 10:33:24 -0700363TEST_F(SigningOperationsTest, RsaSha256DigestSuccess) {
364 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700365 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
366 256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700367 string message(1024, 'a');
368 string signature;
369 SignMessage(message, &signature);
370}
371
372TEST_F(SigningOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700373 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
374 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700375 // Use large message, which won't work without digesting.
376 string message(1024, 'a');
377 string signature;
378 SignMessage(message, &signature);
379}
380
Shawn Willdenf90f2352014-12-18 23:01:15 -0700381TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700382 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
383 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700384 string message(1024, 'a');
385 string signature;
386 SignMessage(message, &signature);
387}
388
389TEST_F(SigningOperationsTest, RsaPssSha256TooSmallKey) {
390 // Key must be at least 10 bytes larger than hash, to provide minimal random salt, so verify
391 // that 9 bytes larger than hash won't work.
Shawn Willden2c242002015-02-27 07:01:02 -0700392 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
393 256 + 9 * 8, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700394 string message(1024, 'a');
395 string signature;
396
397 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
398
399 string result;
400 size_t input_consumed;
401 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
402 EXPECT_EQ(message.size(), input_consumed);
403 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, FinishOperation(signature, &result));
404}
405
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600406TEST_F(SigningOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600407 ASSERT_EQ(KM_ERROR_OK,
408 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700409 string message = "123456789012345678901234567890123456789012345678";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700410 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700411 SignMessage(message, &signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600412}
413
Shawn Willden1615f2e2014-08-13 10:37:40 -0600414TEST_F(SigningOperationsTest, RsaAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -0700415 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
416 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdendfa1c032015-02-07 00:39:01 -0700417 AuthorizationSet input_params, output_params;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700418 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
419 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
420 // Another abort should fail
421 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
Shawn Willden1615f2e2014-08-13 10:37:40 -0600422}
423
424TEST_F(SigningOperationsTest, RsaUnsupportedDigest) {
Shawn Willden2c242002015-02-27 07:01:02 -0700425 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_MD5,
426 KM_PAD_RSA_PSS /* supported padding */));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700427 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600428}
429
430TEST_F(SigningOperationsTest, RsaUnsupportedPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -0700431 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
432 256, 3, KM_DIGEST_SHA_2_256 /* supported digest */, KM_PAD_PKCS7));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700433 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600434}
435
436TEST_F(SigningOperationsTest, RsaNoDigest) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700437 // Digest must be specified.
Shawn Willden2c242002015-02-27 07:01:02 -0700438 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey()));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700439 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700440 // PSS requires a digest.
Shawn Willden2c242002015-02-27 07:01:02 -0700441 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_NONE, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700442 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600443}
444
445TEST_F(SigningOperationsTest, RsaNoPadding) {
Shawn Willdenf90f2352014-12-18 23:01:15 -0700446 // Padding must be specified
Shawn Willden2c242002015-02-27 07:01:02 -0700447 ASSERT_EQ(KM_ERROR_OK,
448 GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Authorization(
449 TAG_DIGEST, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700450 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden1615f2e2014-08-13 10:37:40 -0600451}
452
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700453TEST_F(SigningOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700454 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 20));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700455 string message = "12345678901234567890123456789012";
456 string signature;
457 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600458 ASSERT_EQ(20U, signature.size());
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700459}
460
Shawn Willden62c22862014-12-17 08:36:20 -0700461TEST_F(SigningOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700462 ASSERT_EQ(KM_ERROR_OK,
463 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 28)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700464 string message = "12345678901234567890123456789012";
465 string signature;
466 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600467 ASSERT_EQ(28U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700468}
469
Shawn Willden0d560bf2014-12-15 17:44:02 -0700470TEST_F(SigningOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700471 ASSERT_EQ(KM_ERROR_OK,
472 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 32)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700473 string message = "12345678901234567890123456789012";
474 string signature;
475 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600476 ASSERT_EQ(32U, signature.size());
Shawn Willden0d560bf2014-12-15 17:44:02 -0700477}
478
Shawn Willden62c22862014-12-17 08:36:20 -0700479TEST_F(SigningOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700480 ASSERT_EQ(KM_ERROR_OK,
481 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 48)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700482 string message = "12345678901234567890123456789012";
483 string signature;
484 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600485 ASSERT_EQ(48U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700486}
487
488TEST_F(SigningOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700489 ASSERT_EQ(KM_ERROR_OK,
490 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 64)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700491 string message = "12345678901234567890123456789012";
Shawn Willden62c22862014-12-17 08:36:20 -0700492 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700493 SignMessage(message, &signature);
Shawn Willdenc6096592015-03-17 15:53:14 -0600494 ASSERT_EQ(64U, signature.size());
Shawn Willden62c22862014-12-17 08:36:20 -0700495}
496
Shawn Willden3b702e22015-02-05 10:26:47 -0700497TEST_F(SigningOperationsTest, HmacRfc4231TestCase1) {
498 uint8_t key_data[] = {
499 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
500 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
501 };
502 string message = "Hi There";
503 uint8_t sha_224_expected[] = {
504 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
505 0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
506 };
507 uint8_t sha_256_expected[] = {
508 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
509 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
510 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
511 };
512 uint8_t sha_384_expected[] = {
513 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
514 0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
515 0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
516 0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
517 };
518 uint8_t sha_512_expected[] = {
519 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
520 0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
521 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
522 0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
523 0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
524 };
525
526 string key = make_string(key_data);
527
528 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
529 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
530 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
531 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
532}
533
534TEST_F(SigningOperationsTest, HmacRfc4231TestCase2) {
535 string key = "Jefe";
536 string message = "what do ya want for nothing?";
537 uint8_t sha_224_expected[] = {
538 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
539 0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
540 };
541 uint8_t sha_256_expected[] = {
542 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
543 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
544 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
545 };
546 uint8_t sha_384_expected[] = {
547 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
548 0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
549 0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
550 0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
551 };
552 uint8_t sha_512_expected[] = {
553 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
554 0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
555 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
556 0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
557 0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
558 };
559
560 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
561 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
562 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
563 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
564}
565
566TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) {
567 string key(20, 0xaa);
568 string message(50, 0xdd);
569 uint8_t sha_224_expected[] = {
570 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
571 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
572 };
573 uint8_t sha_256_expected[] = {
574 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
575 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
576 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
577 };
578 uint8_t sha_384_expected[] = {
579 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
580 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
581 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
582 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
583 };
584 uint8_t sha_512_expected[] = {
585 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
586 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
587 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
588 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
589 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
590 };
591
592 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
593 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
594 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
595 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
596}
597
598TEST_F(SigningOperationsTest, HmacRfc4231TestCase4) {
599 uint8_t key_data[25] = {
600 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
601 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
602 };
603 string key = make_string(key_data);
604 string message(50, 0xcd);
605 uint8_t sha_224_expected[] = {
606 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
607 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
608 };
609 uint8_t sha_256_expected[] = {
610 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
611 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
612 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
613 };
614 uint8_t sha_384_expected[] = {
615 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
616 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
617 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
618 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
619 };
620 uint8_t sha_512_expected[] = {
621 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
622 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
623 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
624 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
625 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
626 };
627
628 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
629 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
630 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
631 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
632}
633
634TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) {
635 string key(20, 0x0c);
636 string message = "Test With Truncation";
637
638 uint8_t sha_224_expected[] = {
639 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
640 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
641 };
642 uint8_t sha_256_expected[] = {
643 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
644 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
645 };
646 uint8_t sha_384_expected[] = {
647 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
648 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
649 };
650 uint8_t sha_512_expected[] = {
651 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
652 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
653 };
654
655 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
656 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
657 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
658 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
659}
660
661TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) {
662 string key(131, 0xaa);
663 string message = "Test Using Larger Than Block-Size Key - Hash Key First";
664
665 uint8_t sha_224_expected[] = {
666 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
667 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
668 };
669 uint8_t sha_256_expected[] = {
670 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
671 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
672 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
673 };
674 uint8_t sha_384_expected[] = {
675 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
676 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
677 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
678 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
679 };
680 uint8_t sha_512_expected[] = {
681 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
682 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
683 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
684 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
685 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
686 };
687
688 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
689 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
690 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
691 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
692}
693
694TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) {
695 string key(131, 0xaa);
696 string message = "This is a test using a larger than block-size key and a larger than "
697 "block-size data. The key needs to be hashed before being used by the HMAC "
698 "algorithm.";
699
700 uint8_t sha_224_expected[] = {
701 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
702 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
703 };
704 uint8_t sha_256_expected[] = {
705 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
706 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
707 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
708 };
709 uint8_t sha_384_expected[] = {
710 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
711 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
712 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
713 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
714 };
715 uint8_t sha_512_expected[] = {
716 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
717 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
718 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
719 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
720 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
721 };
722
723 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
724 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
725 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
726 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
727}
Shawn Willden0d560bf2014-12-15 17:44:02 -0700728
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700729TEST_F(SigningOperationsTest, HmacSha256NoMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700730 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
731 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
732 .Authorization(TAG_KEY_SIZE, 128)
Shawn Willdenc24c1102014-12-22 15:30:09 -0700733 .SigningKey()
Shawn Willden2c242002015-02-27 07:01:02 -0700734 .Authorization(TAG_DIGEST, KM_DIGEST_SHA_2_256)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700735 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700736}
737
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700738TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -0700739 ASSERT_EQ(KM_ERROR_OK,
740 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 33)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700741 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willden0d560bf2014-12-15 17:44:02 -0700742}
743
Shawn Willden1615f2e2014-08-13 10:37:40 -0600744TEST_F(SigningOperationsTest, RsaTooShortMessage) {
Shawn Willden2c242002015-02-27 07:01:02 -0700745 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
746 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700747 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700748
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700749 string message = "1234567890123456789012345678901";
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700750 string result;
751 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700752 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700753 EXPECT_EQ(0U, result.size());
754 EXPECT_EQ(31U, input_consumed);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600755
Shawn Willdend6cd7e32014-12-17 08:01:26 -0700756 string signature;
757 ASSERT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&signature));
758 EXPECT_EQ(0U, signature.length());
Shawn Willden43e999e2014-08-13 13:29:50 -0600759}
760
Shawn Willden61902362014-12-18 10:33:24 -0700761// TODO(swillden): Add more verification failure tests.
762
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700763typedef KeymasterTest VerificationOperationsTest;
Shawn Willden43e999e2014-08-13 13:29:50 -0600764TEST_F(VerificationOperationsTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -0700765 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
766 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700767 string message = "12345678901234567890123456789012";
768 string signature;
769 SignMessage(message, &signature);
770 VerifyMessage(message, signature);
Shawn Willden1615f2e2014-08-13 10:37:40 -0600771}
772
Shawn Willden61902362014-12-18 10:33:24 -0700773TEST_F(VerificationOperationsTest, RsaSha256DigestSuccess) {
774 // Note that without padding, key size must exactly match digest size.
Shawn Willden2c242002015-02-27 07:01:02 -0700775 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700776 string message(1024, 'a');
777 string signature;
778 SignMessage(message, &signature);
779 VerifyMessage(message, signature);
780}
781
Shawn Willdenf90f2352014-12-18 23:01:15 -0700782TEST_F(VerificationOperationsTest, RsaSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700783 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_NONE));
Shawn Willden61902362014-12-18 10:33:24 -0700784 string message(1024, 'a');
785 string signature;
786 SignMessage(message, &signature);
787 ++signature[signature.size() / 2];
788
789 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
790
791 string result;
792 size_t input_consumed;
793 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
794 EXPECT_EQ(message.size(), input_consumed);
795 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
796}
797
Shawn Willdenf90f2352014-12-18 23:01:15 -0700798TEST_F(VerificationOperationsTest, RsaPssSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700799 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
800 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700801 // Use large message, which won't work without digesting.
802 string message(1024, 'a');
803 string signature;
804 SignMessage(message, &signature);
805 VerifyMessage(message, signature);
806}
807
808TEST_F(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700809 GenerateKey(
810 AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700811 string message(1024, 'a');
812 string signature;
813 SignMessage(message, &signature);
814 ++signature[signature.size() / 2];
815
816 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
817
818 string result;
819 size_t input_consumed;
820 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
821 EXPECT_EQ(message.size(), input_consumed);
822 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
823}
824
825TEST_F(VerificationOperationsTest, RsaPssSha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -0700826 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
827 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)));
Shawn Willden61902362014-12-18 10:33:24 -0700828 // Use large message, which won't work without digesting.
829 string message(1024, 'a');
830 string signature;
831 SignMessage(message, &signature);
832 ++message[message.size() / 2];
833
834 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
835
836 string result;
837 size_t input_consumed;
838 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
839 EXPECT_EQ(message.size(), input_consumed);
840 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
841}
842
Shawn Willdenf90f2352014-12-18 23:01:15 -0700843TEST_F(VerificationOperationsTest, RsaPkcs1Sha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700844 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
845 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700846 string message(1024, 'a');
847 string signature;
848 SignMessage(message, &signature);
849 VerifyMessage(message, signature);
850}
851
852TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
Shawn Willden2c242002015-02-27 07:01:02 -0700853 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(512, 3, KM_DIGEST_SHA_2_256,
854 KM_PAD_RSA_PKCS1_1_5_SIGN));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700855 string message(1024, 'a');
856 string signature;
857 SignMessage(message, &signature);
858 ++signature[signature.size() / 2];
859
860 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
861
862 string result;
863 size_t input_consumed;
864 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
865 EXPECT_EQ(message.size(), input_consumed);
866 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
867}
868
869TEST_F(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
Shawn Willden2c242002015-02-27 07:01:02 -0700870 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
871 512, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN)));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700872 // Use large message, which won't work without digesting.
873 string message(1024, 'a');
874 string signature;
875 SignMessage(message, &signature);
876 ++message[message.size() / 2];
877
878 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY));
879
880 string result;
881 size_t input_consumed;
882 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
883 EXPECT_EQ(message.size(), input_consumed);
884 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
885}
886
887template <typename T> vector<T> make_vector(const T* array, size_t len) {
888 return vector<T>(array, array + len);
889}
890
891TEST_F(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
892 // Get all supported digests and padding modes.
893 size_t digests_len;
894 keymaster_digest_t* digests;
895 EXPECT_EQ(KM_ERROR_OK,
896 device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
897 &digests_len));
898
899 size_t padding_modes_len;
900 keymaster_padding_t* padding_modes;
901 EXPECT_EQ(KM_ERROR_OK,
902 device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
903 &padding_modes, &padding_modes_len));
904
905 // Try them.
906 for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
907 for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
908 // Compute key & message size that will work.
909 size_t key_bits = 256;
910 size_t message_len = 1000;
911 switch (digest) {
912 case KM_DIGEST_NONE:
913 switch (padding_mode) {
914 case KM_PAD_NONE:
915 // Match key size.
916 message_len = key_bits / 8;
917 break;
918 case KM_PAD_RSA_PKCS1_1_5_SIGN:
919 message_len = key_bits / 8 - 11;
920 break;
921 case KM_PAD_RSA_PSS:
922 // PSS requires a digest.
923 continue;
924 default:
925 FAIL() << "Missing padding";
926 break;
927 }
928 break;
929
930 case KM_DIGEST_SHA_2_256:
931 switch (padding_mode) {
932 case KM_PAD_NONE:
933 // Key size matches digest size
934 break;
935 case KM_PAD_RSA_PKCS1_1_5_SIGN:
936 key_bits += 8 * 11;
937 break;
938 case KM_PAD_RSA_PSS:
939 key_bits += 8 * 10;
940 break;
941 default:
942 FAIL() << "Missing padding";
943 break;
944 }
945 break;
946 default:
947 FAIL() << "Missing digest";
948 }
949
Shawn Willden2c242002015-02-27 07:01:02 -0700950 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(key_bits, 3, digest, padding_mode));
Shawn Willdenf90f2352014-12-18 23:01:15 -0700951 string message(message_len, 'a');
952 string signature;
953 SignMessage(message, &signature);
954 VerifyMessage(message, signature);
955 }
956 }
957
958 free(padding_modes);
959 free(digests);
960}
961
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600962TEST_F(VerificationOperationsTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -0600963 ASSERT_EQ(KM_ERROR_OK,
964 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700965 string message = "123456789012345678901234567890123456789012345678";
966 string signature;
967 SignMessage(message, &signature);
968 VerifyMessage(message, signature);
Shawn Willden5ac2f8f2014-08-18 15:33:10 -0600969}
970
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700971TEST_F(VerificationOperationsTest, HmacSha1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700972 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA1, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700973 string message = "123456789012345678901234567890123456789012345678";
974 string signature;
975 SignMessage(message, &signature);
976 VerifyMessage(message, signature);
977}
978
979TEST_F(VerificationOperationsTest, HmacSha224Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700980 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_224, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700981 string message = "123456789012345678901234567890123456789012345678";
982 string signature;
983 SignMessage(message, &signature);
984 VerifyMessage(message, signature);
985}
986
Shawn Willden0d560bf2014-12-15 17:44:02 -0700987TEST_F(VerificationOperationsTest, HmacSha256Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700988 ASSERT_EQ(KM_ERROR_OK,
989 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_256, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700990 string message = "123456789012345678901234567890123456789012345678";
Shawn Willden0d560bf2014-12-15 17:44:02 -0700991 string signature;
Shawn Willdenb15d77e2014-12-17 16:44:29 -0700992 SignMessage(message, &signature);
993 VerifyMessage(message, signature);
Shawn Willden0d560bf2014-12-15 17:44:02 -0700994}
995
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700996TEST_F(VerificationOperationsTest, HmacSha384Success) {
Shawn Willden2c242002015-02-27 07:01:02 -0700997 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_384, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -0700998 string message = "123456789012345678901234567890123456789012345678";
999 string signature;
1000 SignMessage(message, &signature);
1001 VerifyMessage(message, signature);
1002}
1003
1004TEST_F(VerificationOperationsTest, HmacSha512Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001005 GenerateKey(AuthorizationSetBuilder().HmacKey(128, KM_DIGEST_SHA_2_512, 16));
Shawn Willden51d5e0e2014-12-18 10:44:03 -07001006 string message = "123456789012345678901234567890123456789012345678";
1007 string signature;
1008 SignMessage(message, &signature);
1009 VerifyMessage(message, signature);
1010}
1011
Shawn Willden5b53c992015-02-02 08:05:25 -07001012typedef VerificationOperationsTest ExportKeyTest;
Shawn Willdenffd790c2014-08-18 21:20:06 -06001013TEST_F(ExportKeyTest, RsaSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001014 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1015 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001016 string export_data;
1017 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001018 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001019
1020 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenffd790c2014-08-18 21:20:06 -06001021}
1022
Shawn Willdenf268d742014-08-19 15:36:26 -06001023TEST_F(ExportKeyTest, EcdsaSuccess) {
Shawn Willden84b8da52015-03-11 07:21:32 -06001024 ASSERT_EQ(KM_ERROR_OK,
1025 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224, KM_DIGEST_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001026 string export_data;
1027 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenc6096592015-03-17 15:53:14 -06001028 EXPECT_GT(export_data.length(), 0U);
Shawn Willdene46a43f2014-08-27 10:35:36 -06001029
1030 // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
Shawn Willdenf268d742014-08-19 15:36:26 -06001031}
1032
1033TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) {
Shawn Willden2c242002015-02-27 07:01:02 -07001034 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1035 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001036 string export_data;
1037 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001038}
1039
1040TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) {
Shawn Willden2c242002015-02-27 07:01:02 -07001041 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(
1042 256, 3, KM_DIGEST_NONE, KM_PAD_NONE)));
Shawn Willden5b53c992015-02-02 08:05:25 -07001043 corrupt_key_blob();
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001044 string export_data;
1045 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
Shawn Willdenf268d742014-08-19 15:36:26 -06001046}
1047
Shawn Willden7dad93b2015-02-05 10:20:47 -07001048TEST_F(ExportKeyTest, AesKeyExportFails) {
Shawn Willden2c242002015-02-27 07:01:02 -07001049 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
Shawn Willden7dad93b2015-02-05 10:20:47 -07001050 string export_data;
1051
1052 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1053 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1054 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1055}
1056
Shawn Willden437fbd12014-08-20 11:59:49 -06001057static string read_file(const string& file_name) {
1058 ifstream file_stream(file_name, std::ios::binary);
1059 istreambuf_iterator<char> file_begin(file_stream);
1060 istreambuf_iterator<char> file_end;
1061 return string(file_begin, file_end);
1062}
1063
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001064typedef VerificationOperationsTest ImportKeyTest;
Shawn Willden5b53c992015-02-02 08:05:25 -07001065TEST_F(ImportKeyTest, RsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001066 string pk8_key = read_file("rsa_privkey_pk8.der");
Shawn Willden437fbd12014-08-20 11:59:49 -06001067 ASSERT_EQ(633U, pk8_key.size());
1068
Shawn Willden2c242002015-02-27 07:01:02 -07001069 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().RsaSigningKey(
1070 1024, 65537, KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001071 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden437fbd12014-08-20 11:59:49 -06001072
1073 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001074 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
1075 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 1024));
1076 EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 65537U));
Shawn Willden437fbd12014-08-20 11:59:49 -06001077
1078 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001079 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1080 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden437fbd12014-08-20 11:59:49 -06001081
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001082 string message(1024 / 8, 'a');
1083 string signature;
1084 SignMessage(message, &signature);
1085 VerifyMessage(message, signature);
Shawn Willden437fbd12014-08-20 11:59:49 -06001086}
1087
Shawn Willdend7a5c712015-04-09 16:33:52 -06001088TEST_F(ImportKeyTest, OldApiRsaSuccess) {
1089 string pk8_key = read_file("rsa_privkey_pk8.der");
1090 ASSERT_EQ(633U, pk8_key.size());
1091
1092 // NOTE: This will break when the keymaster0 APIs are removed from keymaster1. But at that
1093 // point softkeymaster will no longer support keymaster0 APIs anyway.
1094 uint8_t* key_blob;
1095 size_t key_blob_length;
1096 ASSERT_EQ(0,
1097 device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1098 pk8_key.size(), &key_blob, &key_blob_length));
1099 set_key_blob(key_blob, key_blob_length);
1100
1101 string message(1024 / 8, 'a');
1102 string signature;
1103 SignMessage(message, &signature, false /* use_client_params */);
1104 VerifyMessage(message, signature, false /* use_client_params */);
1105}
1106
Shawn Willden6bbe6782014-09-18 11:26:15 -06001107TEST_F(ImportKeyTest, RsaKeySizeMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001108 string pk8_key = read_file("rsa_privkey_pk8.der");
1109 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001110 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001111 ImportKey(AuthorizationSetBuilder().RsaSigningKey(2048 /* Doesn't match key */, 3,
1112 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001113 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001114}
1115
1116TEST_F(ImportKeyTest, RsaPublicExponenMismatch) {
Shawn Willden6bbe6782014-09-18 11:26:15 -06001117 string pk8_key = read_file("rsa_privkey_pk8.der");
1118 ASSERT_EQ(633U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001119 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden2c242002015-02-27 07:01:02 -07001120 ImportKey(AuthorizationSetBuilder().RsaSigningKey(256, 3 /* Doesnt' match key */,
1121 KM_DIGEST_NONE, KM_PAD_NONE),
Shawn Willdenc24c1102014-12-22 15:30:09 -07001122 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001123}
1124
Shawn Willden81effc62014-08-27 10:08:46 -06001125TEST_F(ImportKeyTest, EcdsaSuccess) {
Shawn Willden81effc62014-08-27 10:08:46 -06001126 string pk8_key = read_file("ec_privkey_pk8.der");
1127 ASSERT_EQ(138U, pk8_key.size());
1128
Shawn Willden84b8da52015-03-11 07:21:32 -06001129 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001130 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden81effc62014-08-27 10:08:46 -06001131
1132 // Check values derived from the key.
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001133 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1134 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
Shawn Willden81effc62014-08-27 10:08:46 -06001135
1136 // And values provided by GoogleKeymaster
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001137 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1138 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
Shawn Willden81effc62014-08-27 10:08:46 -06001139
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001140 string message(1024 / 8, 'a');
1141 string signature;
1142 SignMessage(message, &signature);
1143 VerifyMessage(message, signature);
Shawn Willden81effc62014-08-27 10:08:46 -06001144}
1145
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001146TEST_F(ImportKeyTest, EcdsaSizeSpecified) {
1147 string pk8_key = read_file("ec_privkey_pk8.der");
1148 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden6bbe6782014-09-18 11:26:15 -06001149
Shawn Willden84b8da52015-03-11 07:21:32 -06001150 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256, KM_DIGEST_NONE),
Shawn Willden2c242002015-02-27 07:01:02 -07001151 KM_KEY_FORMAT_PKCS8, pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001152
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001153 // Check values derived from the key.
1154 EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_ECDSA));
1155 EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 256));
1156
1157 // And values provided by GoogleKeymaster
1158 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1159 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1160
1161 string message(1024 / 8, 'a');
1162 string signature;
1163 SignMessage(message, &signature);
1164 VerifyMessage(message, signature);
1165}
1166
1167TEST_F(ImportKeyTest, EcdsaSizeMismatch) {
1168 string pk8_key = read_file("ec_privkey_pk8.der");
1169 ASSERT_EQ(138U, pk8_key.size());
Shawn Willden5b53c992015-02-02 08:05:25 -07001170 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
Shawn Willden84b8da52015-03-11 07:21:32 -06001171 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(
1172 224, KM_DIGEST_NONE), // Size does not match key
1173 KM_KEY_FORMAT_PKCS8,
1174 pk8_key));
Shawn Willden6bbe6782014-09-18 11:26:15 -06001175}
1176
Shawn Willden3b702e22015-02-05 10:26:47 -07001177TEST_F(ImportKeyTest, AesKeySuccess) {
1178 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1179 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001180 ASSERT_EQ(KM_ERROR_OK,
1181 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16),
1182 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001183
1184 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1185 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1186
1187 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001188 string nonce;
1189 string ciphertext = EncryptMessage(message, &nonce);
1190 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden3b702e22015-02-05 10:26:47 -07001191 EXPECT_EQ(message, plaintext);
1192}
1193
1194TEST_F(ImportKeyTest, HmacSha256KeySuccess) {
1195 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1196 string key(key_data, sizeof(key_data));
Shawn Willden2c242002015-02-27 07:01:02 -07001197 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder().HmacKey(sizeof(key_data) * 8,
1198 KM_DIGEST_SHA_2_256, 32),
1199 KM_KEY_FORMAT_RAW, key));
Shawn Willden3b702e22015-02-05 10:26:47 -07001200
1201 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1202 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1203
1204 string message = "Hello World!";
1205 string signature;
1206 SignMessage(message, &signature);
1207 VerifyMessage(message, signature);
1208}
1209
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001210typedef KeymasterTest EncryptionOperationsTest;
Shawn Willden4200f212014-12-02 07:01:21 -07001211TEST_F(EncryptionOperationsTest, RsaOaepSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001212 ASSERT_EQ(KM_ERROR_OK,
1213 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001214
1215 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001216 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001217 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001218
Shawn Willden6dde87c2014-12-11 14:08:48 -07001219 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001220 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001221
1222 // OAEP randomizes padding so every result should be different.
1223 EXPECT_NE(ciphertext1, ciphertext2);
1224}
1225
1226TEST_F(EncryptionOperationsTest, RsaOaepRoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001227 ASSERT_EQ(KM_ERROR_OK,
1228 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001229 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001230 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001231 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001232
Shawn Willden6dde87c2014-12-11 14:08:48 -07001233 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001234 EXPECT_EQ(message, plaintext);
1235}
1236
1237TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) {
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 = "12345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001241 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001242 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001243
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001244 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1245 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001246 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001247 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001248}
1249
1250TEST_F(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001251 ASSERT_EQ(KM_ERROR_OK,
1252 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3, KM_PAD_RSA_OAEP)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001253 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001254 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001255 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001256
1257 // Corrupt the ciphertext
1258 ciphertext[512 / 8 / 2]++;
1259
Shawn Willden4200f212014-12-02 07:01:21 -07001260 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001261 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001262 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1263 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001264 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001265 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001266}
1267
1268TEST_F(EncryptionOperationsTest, RsaPkcs1Success) {
Shawn Willden2c242002015-02-27 07:01:02 -07001269 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1270 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001271 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001272 string ciphertext1 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001273 EXPECT_EQ(512U / 8, ciphertext1.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001274
Shawn Willden6dde87c2014-12-11 14:08:48 -07001275 string ciphertext2 = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001276 EXPECT_EQ(512U / 8, ciphertext2.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001277
1278 // PKCS1 v1.5 randomizes padding so every result should be different.
1279 EXPECT_NE(ciphertext1, ciphertext2);
1280}
1281
1282TEST_F(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
Shawn Willden2c242002015-02-27 07:01:02 -07001283 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1284 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001285 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001286 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001287 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001288
Shawn Willden6dde87c2014-12-11 14:08:48 -07001289 string plaintext = DecryptMessage(ciphertext);
Shawn Willden4200f212014-12-02 07:01:21 -07001290 EXPECT_EQ(message, plaintext);
1291}
1292
1293TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) {
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 = "12345678901234567890123456789012345678901234567890123";
Shawn Willden4200f212014-12-02 07:01:21 -07001297 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001298 size_t input_consumed;
Shawn Willden4200f212014-12-02 07:01:21 -07001299
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001300 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1301 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001302 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001303 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001304}
1305
1306TEST_F(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
Shawn Willden2c242002015-02-27 07:01:02 -07001307 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(
1308 512, 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001309 string message = "Hello World!";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001310 string ciphertext = EncryptMessage(string(message));
Shawn Willdenc6096592015-03-17 15:53:14 -06001311 EXPECT_EQ(512U / 8, ciphertext.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001312
1313 // Corrupt the ciphertext
1314 ciphertext[512 / 8 / 2]++;
1315
Shawn Willden4200f212014-12-02 07:01:21 -07001316 string result;
Shawn Willdenb7361132014-12-08 08:15:14 -07001317 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001318 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1319 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001320 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
Shawn Willdenc6096592015-03-17 15:53:14 -06001321 EXPECT_EQ(0U, result.size());
Shawn Willden4200f212014-12-02 07:01:21 -07001322}
1323
Shawn Willden907c3012014-12-08 15:51:55 -07001324TEST_F(EncryptionOperationsTest, AesOcbSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001325 ASSERT_EQ(KM_ERROR_OK,
1326 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001327 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001328 string nonce1;
1329 string ciphertext1 = EncryptMessage(message, &nonce1);
Shawn Willdenc6096592015-03-17 15:53:14 -06001330 EXPECT_EQ(12U, nonce1.size());
Shawn Willdendfa1c032015-02-07 00:39:01 -07001331 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext1.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001332
Shawn Willdendfa1c032015-02-07 00:39:01 -07001333 string nonce2;
1334 string ciphertext2 = EncryptMessage(message, &nonce2);
Shawn Willdenc6096592015-03-17 15:53:14 -06001335 EXPECT_EQ(12U, nonce2.size());
Shawn Willdendfa1c032015-02-07 00:39:01 -07001336 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext2.size());
Shawn Willden907c3012014-12-08 15:51:55 -07001337
Shawn Willdendfa1c032015-02-07 00:39:01 -07001338 // Nonces should be random
1339 EXPECT_NE(nonce1, nonce2);
1340
1341 // Therefore ciphertexts are different
Shawn Willden907c3012014-12-08 15:51:55 -07001342 EXPECT_NE(ciphertext1, ciphertext2);
1343}
1344
Shawn Willden6dde87c2014-12-11 14:08:48 -07001345TEST_F(EncryptionOperationsTest, AesOcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001346 ASSERT_EQ(KM_ERROR_OK,
1347 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001348 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001349 string nonce;
1350 string ciphertext = EncryptMessage(message, &nonce);
Shawn Willdenc6096592015-03-17 15:53:14 -06001351 EXPECT_EQ(12U, nonce.size());
Shawn Willdendfa1c032015-02-07 00:39:01 -07001352 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001353
Shawn Willdendfa1c032015-02-07 00:39:01 -07001354 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001355 EXPECT_EQ(message, plaintext);
1356}
1357
1358TEST_F(EncryptionOperationsTest, AesOcbRoundTripCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001359 ASSERT_EQ(KM_ERROR_OK,
1360 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001361 string message = "Hello World!";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001362 string nonce;
1363 string ciphertext = EncryptMessage(message, &nonce);
1364 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001365
1366 ciphertext[ciphertext.size() / 2]++;
1367
Shawn Willdendfa1c032015-02-07 00:39:01 -07001368 AuthorizationSet input_set, output_set;
1369 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1370 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set, &output_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001371
1372 string result;
1373 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001374 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001375 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001376 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001377}
1378
1379TEST_F(EncryptionOperationsTest, AesDecryptGarbage) {
Shawn Willden2c242002015-02-27 07:01:02 -07001380 ASSERT_EQ(KM_ERROR_OK,
1381 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001382 string ciphertext(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001383 AuthorizationSet input_params;
1384 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaa", 12);
1385 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001386
1387 string result;
1388 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001389 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001390 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001391 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001392}
1393
Shawn Willdendfa1c032015-02-07 00:39:01 -07001394TEST_F(EncryptionOperationsTest, AesDecryptTooShortNonce) {
Shawn Willden2c242002015-02-27 07:01:02 -07001395 ASSERT_EQ(KM_ERROR_OK,
1396 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001397
Shawn Willdendfa1c032015-02-07 00:39:01 -07001398 // Try decrypting garbage ciphertext with too-short nonce
1399 string ciphertext(15, 'a');
1400 AuthorizationSet input_params;
1401 input_params.push_back(TAG_NONCE, "aaaaaaaaaaa", 11);
Shawn Willdenf01329d2015-03-11 21:51:38 -06001402 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_DECRYPT, input_params));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001403}
1404
1405TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptySuccess) {
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);
Shawn Willdenc6096592015-03-17 15:53:14 -06001411 EXPECT_EQ(12U, nonce.size());
Shawn Willdendfa1c032015-02-07 00:39:01 -07001412 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001413
Shawn Willdendfa1c032015-02-07 00:39:01 -07001414 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001415 EXPECT_EQ(message, plaintext);
1416}
1417
1418TEST_F(EncryptionOperationsTest, AesOcbRoundTripEmptyCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001419 ASSERT_EQ(KM_ERROR_OK,
1420 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001421 string message = "";
Shawn Willdendfa1c032015-02-07 00:39:01 -07001422 string nonce;
1423 string ciphertext = EncryptMessage(message, &nonce);
Shawn Willdenc6096592015-03-17 15:53:14 -06001424 EXPECT_EQ(12U, nonce.size());
Shawn Willdendfa1c032015-02-07 00:39:01 -07001425 EXPECT_EQ(message.size() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001426
1427 ciphertext[ciphertext.size() / 2]++;
1428
Shawn Willdendfa1c032015-02-07 00:39:01 -07001429 AuthorizationSet input_set;
1430 input_set.push_back(TAG_NONCE, nonce.data(), nonce.size());
1431 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_set));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001432
1433 string result;
1434 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001435 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001436 EXPECT_EQ(ciphertext.length(), input_consumed);
Shawn Willdend6cd7e32014-12-17 08:01:26 -07001437 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&result));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001438}
1439
1440TEST_F(EncryptionOperationsTest, AesOcbFullChunk) {
Shawn Willden2c242002015-02-27 07:01:02 -07001441 ASSERT_EQ(KM_ERROR_OK,
1442 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001443 string message(4096, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001444 string nonce;
1445 string ciphertext = EncryptMessage(message, &nonce);
1446 EXPECT_EQ(message.length() + 16 /* tag */, ciphertext.size());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001447
Shawn Willdendfa1c032015-02-07 00:39:01 -07001448 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001449 EXPECT_EQ(message, plaintext);
1450}
1451
1452TEST_F(EncryptionOperationsTest, AesOcbVariousChunkLengths) {
1453 for (unsigned chunk_length = 1; chunk_length <= 128; ++chunk_length) {
Shawn Willden2c242002015-02-27 07:01:02 -07001454 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(
1455 chunk_length, 16)));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001456 string message(128, 'a');
Shawn Willdendfa1c032015-02-07 00:39:01 -07001457 string nonce;
1458 string ciphertext = EncryptMessage(message, &nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001459 int expected_tag_count = (message.length() + chunk_length - 1) / chunk_length;
Shawn Willdendfa1c032015-02-07 00:39:01 -07001460 EXPECT_EQ(message.length() + 16 * expected_tag_count, ciphertext.size())
Shawn Willden6dde87c2014-12-11 14:08:48 -07001461 << "Unexpected ciphertext size for chunk length " << chunk_length
1462 << " expected tag count was " << expected_tag_count
1463 << " but actual tag count was probably "
1464 << (ciphertext.size() - message.length() - 12) / 16;
1465
Shawn Willdendfa1c032015-02-07 00:39:01 -07001466 string plaintext = DecryptMessage(ciphertext, nonce);
Shawn Willden6dde87c2014-12-11 14:08:48 -07001467 EXPECT_EQ(message, plaintext);
1468 }
1469}
1470
1471TEST_F(EncryptionOperationsTest, AesOcbAbort) {
Shawn Willden2c242002015-02-27 07:01:02 -07001472 ASSERT_EQ(KM_ERROR_OK,
1473 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001474 string message = "Hello";
Shawn Willden6dde87c2014-12-11 14:08:48 -07001475
Shawn Willdendfa1c032015-02-07 00:39:01 -07001476 AuthorizationSet input_set, output_set;
1477 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_set, &output_set));
Shawn Willdenc6096592015-03-17 15:53:14 -06001478 EXPECT_EQ(1U, output_set.size());
Shawn Willdendfa1c032015-02-07 00:39:01 -07001479 EXPECT_EQ(0, output_set.find(TAG_NONCE));
Shawn Willden6dde87c2014-12-11 14:08:48 -07001480
1481 string result;
1482 size_t input_consumed;
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001483 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1484 EXPECT_EQ(message.length(), input_consumed);
1485 EXPECT_EQ(KM_ERROR_OK, AbortOperation());
Shawn Willden6dde87c2014-12-11 14:08:48 -07001486}
1487
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001488TEST_F(EncryptionOperationsTest, AesOcbNoChunkLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001489 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenc24c1102014-12-22 15:30:09 -07001490 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001491 .Authorization(TAG_BLOCK_MODE, KM_MODE_OCB)
1492 .Authorization(TAG_MAC_LENGTH, 16)));
Shawn Willdenf01329d2015-03-11 21:51:38 -06001493 EXPECT_EQ(KM_ERROR_UNSUPPORTED_CHUNK_LENGTH, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001494}
1495
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001496TEST_F(EncryptionOperationsTest, AesOcbPaddingUnsupported) {
Shawn Willden2c242002015-02-27 07:01:02 -07001497 ASSERT_EQ(
1498 KM_ERROR_OK,
1499 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Authorization(
1500 TAG_PADDING, KM_PAD_ZERO)));
Shawn Willdenb15d77e2014-12-17 16:44:29 -07001501 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001502}
1503
1504TEST_F(EncryptionOperationsTest, AesOcbInvalidMacLength) {
Shawn Willden2c242002015-02-27 07:01:02 -07001505 ASSERT_EQ(KM_ERROR_OK,
1506 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 17)));
Shawn Willdenf01329d2015-03-11 21:51:38 -06001507 EXPECT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willdenbe4a2a32014-12-15 14:51:10 -07001508}
1509
Shawn Willdendfa1c032015-02-07 00:39:01 -07001510uint8_t rfc_7523_test_key_data[] = {
1511 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1512};
1513string rfc_7523_test_key = make_string(rfc_7523_test_key_data);
1514
1515TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector1) {
1516 uint8_t nonce[] = {
1517 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
1518 };
1519 uint8_t expected_ciphertext[] = {
1520 0x78, 0x54, 0x07, 0xBF, 0xFF, 0xC8, 0xAD, 0x9E,
1521 0xDC, 0xC5, 0x52, 0x0A, 0xC9, 0x11, 0x1E, 0xE6,
1522 };
1523 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1524 "" /* plaintext */, make_string(expected_ciphertext));
1525}
1526
1527TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector2) {
1528 uint8_t nonce[] = {
1529 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x01,
1530 };
1531 uint8_t associated_data[] = {
1532 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1533 };
1534 uint8_t plaintext[] = {
1535 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1536 };
1537 uint8_t expected_ciphertext[] = {
1538 0x68, 0x20, 0xB3, 0x65, 0x7B, 0x6F, 0x61, 0x5A, 0x57, 0x25, 0xBD, 0xA0,
1539 0xD3, 0xB4, 0xEB, 0x3A, 0x25, 0x7C, 0x9A, 0xF1, 0xF8, 0xF0, 0x30, 0x09,
1540 };
1541 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1542 make_string(plaintext), make_string(expected_ciphertext));
1543}
1544
1545TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector3) {
1546 uint8_t nonce[] = {
1547 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x02,
1548 };
1549 uint8_t associated_data[] = {
1550 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1551 };
1552 uint8_t expected_ciphertext[] = {
1553 0x81, 0x01, 0x7F, 0x82, 0x03, 0xF0, 0x81, 0x27,
1554 0x71, 0x52, 0xFA, 0xDE, 0x69, 0x4A, 0x0A, 0x00,
1555 };
1556 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1557 "" /* plaintext */, make_string(expected_ciphertext));
1558}
1559
1560TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector4) {
1561 uint8_t nonce[] = {
1562 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x03,
1563 };
1564 uint8_t plaintext[] = {
1565 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1566 };
1567 uint8_t expected_ciphertext[] = {
1568 0x45, 0xDD, 0x69, 0xF8, 0xF5, 0xAA, 0xE7, 0x24, 0x14, 0x05, 0x4C, 0xD1,
1569 0xF3, 0x5D, 0x82, 0x76, 0x0B, 0x2C, 0xD0, 0x0D, 0x2F, 0x99, 0xBF, 0xA9,
1570 };
1571 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1572 make_string(plaintext), make_string(expected_ciphertext));
1573}
1574
1575TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector5) {
1576 uint8_t nonce[] = {
1577 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x04,
1578 };
1579 uint8_t associated_data[] = {
1580 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1581 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1582 };
1583 uint8_t plaintext[] = {
1584 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1585 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1586 };
1587 uint8_t expected_ciphertext[] = {
1588 0x57, 0x1D, 0x53, 0x5B, 0x60, 0xB2, 0x77, 0x18, 0x8B, 0xE5, 0x14,
1589 0x71, 0x70, 0xA9, 0xA2, 0x2C, 0x3A, 0xD7, 0xA4, 0xFF, 0x38, 0x35,
1590 0xB8, 0xC5, 0x70, 0x1C, 0x1C, 0xCE, 0xC8, 0xFC, 0x33, 0x58,
1591 };
1592 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1593 make_string(plaintext), make_string(expected_ciphertext));
1594}
1595
1596TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector6) {
1597 uint8_t nonce[] = {
1598 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x05,
1599 };
1600 uint8_t associated_data[] = {
1601 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1602 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1603 };
1604 uint8_t expected_ciphertext[] = {
1605 0x8C, 0xF7, 0x61, 0xB6, 0x90, 0x2E, 0xF7, 0x64,
1606 0x46, 0x2A, 0xD8, 0x64, 0x98, 0xCA, 0x6B, 0x97,
1607 };
1608 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1609 "" /* plaintext */, make_string(expected_ciphertext));
1610}
1611
1612TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector7) {
1613 uint8_t nonce[] = {
1614 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x06,
1615 };
1616 uint8_t plaintext[] = {
1617 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1618 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
1619 };
1620 uint8_t expected_ciphertext[] = {
1621 0x5C, 0xE8, 0x8E, 0xC2, 0xE0, 0x69, 0x27, 0x06, 0xA9, 0x15, 0xC0,
1622 0x0A, 0xEB, 0x8B, 0x23, 0x96, 0xF4, 0x0E, 0x1C, 0x74, 0x3F, 0x52,
1623 0x43, 0x6B, 0xDF, 0x06, 0xD8, 0xFA, 0x1E, 0xCA, 0x34, 0x3D,
1624 };
1625 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1626 make_string(plaintext), make_string(expected_ciphertext));
1627}
1628
1629TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector8) {
1630 uint8_t nonce[] = {
1631 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x07,
1632 };
1633 uint8_t associated_data[] = {
1634 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1635 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1636 };
1637 uint8_t plaintext[] = {
1638 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1639 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1640 };
1641 uint8_t expected_ciphertext[] = {
1642 0x1C, 0xA2, 0x20, 0x73, 0x08, 0xC8, 0x7C, 0x01, 0x07, 0x56, 0x10, 0x4D, 0x88, 0x40,
1643 0xCE, 0x19, 0x52, 0xF0, 0x96, 0x73, 0xA4, 0x48, 0xA1, 0x22, 0xC9, 0x2C, 0x62, 0x24,
1644 0x10, 0x51, 0xF5, 0x73, 0x56, 0xD7, 0xF3, 0xC9, 0x0B, 0xB0, 0xE0, 0x7F,
1645 };
1646 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1647 make_string(plaintext), make_string(expected_ciphertext));
1648}
1649
1650TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector9) {
1651 uint8_t nonce[] = {
1652 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x08,
1653 };
1654 uint8_t associated_data[] = {
1655 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1656 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1657 };
1658 uint8_t expected_ciphertext[] = {
1659 0x6D, 0xC2, 0x25, 0xA0, 0x71, 0xFC, 0x1B, 0x9F,
1660 0x7C, 0x69, 0xF9, 0x3B, 0x0F, 0x1E, 0x10, 0xDE,
1661 };
1662 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1663 "" /* plaintext */, make_string(expected_ciphertext));
1664}
1665
1666TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector10) {
1667 uint8_t nonce[] = {
1668 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x09,
1669 };
1670 uint8_t plaintext[] = {
1671 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
1672 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1673 };
1674 uint8_t expected_ciphertext[] = {
1675 0x22, 0x1B, 0xD0, 0xDE, 0x7F, 0xA6, 0xFE, 0x99, 0x3E, 0xCC, 0xD7, 0x69, 0x46, 0x0A,
1676 0x0A, 0xF2, 0xD6, 0xCD, 0xED, 0x0C, 0x39, 0x5B, 0x1C, 0x3C, 0xE7, 0x25, 0xF3, 0x24,
1677 0x94, 0xB9, 0xF9, 0x14, 0xD8, 0x5C, 0x0B, 0x1E, 0xB3, 0x83, 0x57, 0xFF,
1678 };
1679 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1680 make_string(plaintext), make_string(expected_ciphertext));
1681}
1682
1683TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector11) {
1684 uint8_t nonce[] = {
1685 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0A,
1686 };
1687 uint8_t associated_data[] = {
1688 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1689 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1690 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1691 };
1692 uint8_t plaintext[] = {
1693 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1694 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1695 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1696 };
1697 uint8_t expected_ciphertext[] = {
1698 0xBD, 0x6F, 0x6C, 0x49, 0x62, 0x01, 0xC6, 0x92, 0x96, 0xC1, 0x1E, 0xFD,
1699 0x13, 0x8A, 0x46, 0x7A, 0xBD, 0x3C, 0x70, 0x79, 0x24, 0xB9, 0x64, 0xDE,
1700 0xAF, 0xFC, 0x40, 0x31, 0x9A, 0xF5, 0xA4, 0x85, 0x40, 0xFB, 0xBA, 0x18,
1701 0x6C, 0x55, 0x53, 0xC6, 0x8A, 0xD9, 0xF5, 0x92, 0xA7, 0x9A, 0x42, 0x40,
1702 };
1703 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1704 make_string(plaintext), make_string(expected_ciphertext));
1705}
1706
1707TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector12) {
1708 uint8_t nonce[] = {
1709 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0B,
1710 };
1711 uint8_t associated_data[] = {
1712 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1713 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1714 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1715 };
1716 uint8_t plaintext[] = {};
1717 uint8_t expected_ciphertext[] = {
1718 0xFE, 0x80, 0x69, 0x0B, 0xEE, 0x8A, 0x48, 0x5D,
1719 0x11, 0xF3, 0x29, 0x65, 0xBC, 0x9D, 0x2A, 0x32,
1720 };
1721 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1722 "" /* plaintext */, make_string(expected_ciphertext));
1723}
1724
1725TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector13) {
1726 uint8_t nonce[] = {
1727 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0C,
1728 };
1729 uint8_t associated_data[] = {};
1730 uint8_t plaintext[] = {
1731 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
1732 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
1733 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
1734 };
1735 uint8_t expected_ciphertext[] = {
1736 0x29, 0x42, 0xBF, 0xC7, 0x73, 0xBD, 0xA2, 0x3C, 0xAB, 0xC6, 0xAC, 0xFD,
1737 0x9B, 0xFD, 0x58, 0x35, 0xBD, 0x30, 0x0F, 0x09, 0x73, 0x79, 0x2E, 0xF4,
1738 0x60, 0x40, 0xC5, 0x3F, 0x14, 0x32, 0xBC, 0xDF, 0xB5, 0xE1, 0xDD, 0xE3,
1739 0xBC, 0x18, 0xA5, 0xF8, 0x40, 0xB5, 0x2E, 0x65, 0x34, 0x44, 0xD5, 0xDF,
1740 };
1741 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1742 make_string(plaintext), make_string(expected_ciphertext));
1743}
1744
1745TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector14) {
1746 uint8_t nonce[] = {
1747 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0D,
1748 };
1749 uint8_t associated_data[] = {
1750 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1751 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1752 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1753 };
1754 uint8_t plaintext[] = {
1755 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1756 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1757 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1758 };
1759 uint8_t expected_ciphertext[] = {
1760 0xD5, 0xCA, 0x91, 0x74, 0x84, 0x10, 0xC1, 0x75, 0x1F, 0xF8, 0xA2, 0xF6, 0x18, 0x25,
1761 0x5B, 0x68, 0xA0, 0xA1, 0x2E, 0x09, 0x3F, 0xF4, 0x54, 0x60, 0x6E, 0x59, 0xF9, 0xC1,
1762 0xD0, 0xDD, 0xC5, 0x4B, 0x65, 0xE8, 0x62, 0x8E, 0x56, 0x8B, 0xAD, 0x7A, 0xED, 0x07,
1763 0xBA, 0x06, 0xA4, 0xA6, 0x94, 0x83, 0xA7, 0x03, 0x54, 0x90, 0xC5, 0x76, 0x9E, 0x60,
1764 };
1765 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1766 make_string(plaintext), make_string(expected_ciphertext));
1767}
1768
1769TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector15) {
1770 uint8_t nonce[] = {
1771 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0E,
1772 };
1773 uint8_t associated_data[] = {
1774 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1775 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1776 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1777 };
1778 uint8_t plaintext[] = {};
1779 uint8_t expected_ciphertext[] = {
1780 0xC5, 0xCD, 0x9D, 0x18, 0x50, 0xC1, 0x41, 0xE3,
1781 0x58, 0x64, 0x99, 0x94, 0xEE, 0x70, 0x1B, 0x68,
1782 };
1783 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), make_string(associated_data),
1784 "" /* plaintext */, make_string(expected_ciphertext));
1785}
1786
1787TEST_F(EncryptionOperationsTest, AesOcbRfc7253TestVector16) {
1788 uint8_t nonce[] = {
1789 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x0F,
1790 };
1791 uint8_t associated_data[] = {};
1792 uint8_t plaintext[] = {
1793 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
1794 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
1795 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1796 };
1797 uint8_t expected_ciphertext[] = {
1798 0x44, 0x12, 0x92, 0x34, 0x93, 0xC5, 0x7D, 0x5D, 0xE0, 0xD7, 0x00, 0xF7, 0x53, 0xCC,
1799 0xE0, 0xD1, 0xD2, 0xD9, 0x50, 0x60, 0x12, 0x2E, 0x9F, 0x15, 0xA5, 0xDD, 0xBF, 0xC5,
1800 0x78, 0x7E, 0x50, 0xB5, 0xCC, 0x55, 0xEE, 0x50, 0x7B, 0xCB, 0x08, 0x4E, 0x47, 0x9A,
1801 0xD3, 0x63, 0xAC, 0x36, 0x6B, 0x95, 0xA9, 0x8C, 0xA5, 0xF3, 0x00, 0x0B, 0x14, 0x79,
1802 };
1803 CheckAesOcbTestVector(rfc_7523_test_key, make_string(nonce), "" /* associated_data */,
1804 make_string(plaintext), make_string(expected_ciphertext));
1805}
1806
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001807TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07001808 ASSERT_EQ(KM_ERROR_OK,
1809 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1810 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001811 // Two-block message.
1812 string message = "12345678901234567890123456789012";
1813 string ciphertext1 = EncryptMessage(message);
1814 EXPECT_EQ(message.size(), ciphertext1.size());
1815
1816 string ciphertext2 = EncryptMessage(string(message));
1817 EXPECT_EQ(message.size(), ciphertext2.size());
1818
1819 // ECB is deterministic.
1820 EXPECT_EQ(ciphertext1, ciphertext2);
1821
1822 string plaintext = DecryptMessage(ciphertext1);
1823 EXPECT_EQ(message, plaintext);
1824}
1825
1826TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
Shawn Willden2c242002015-02-27 07:01:02 -07001827 ASSERT_EQ(KM_ERROR_OK,
1828 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1829 TAG_BLOCK_MODE, KM_MODE_ECB)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001830 // Message is slightly shorter than two blocks.
1831 string message = "1234567890123456789012345678901";
1832
1833 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT));
1834 string ciphertext;
1835 size_t input_consumed;
1836 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
1837 EXPECT_EQ(message.size(), input_consumed);
1838 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
1839}
1840
1841TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07001842 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001843 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001844 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1845 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001846
1847 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06001848 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001849 string message(i, 'a');
1850 string ciphertext = EncryptMessage(message);
1851 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
1852 string plaintext = DecryptMessage(ciphertext);
1853 EXPECT_EQ(message, plaintext);
1854 }
1855}
1856
1857TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
Shawn Willden2c242002015-02-27 07:01:02 -07001858 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001859 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07001860 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
1861 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001862
1863 string message = "a";
1864 string ciphertext = EncryptMessage(message);
Shawn Willdenc6096592015-03-17 15:53:14 -06001865 EXPECT_EQ(16U, ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07001866 EXPECT_NE(ciphertext, message);
1867 ++ciphertext[ciphertext.size() / 2];
1868
1869 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT));
1870 string plaintext;
1871 size_t input_consumed;
1872 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
1873 EXPECT_EQ(ciphertext.size(), input_consumed);
1874 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
1875}
1876
Thai Duong20d725d2015-03-24 17:49:58 -07001877TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
1878 ASSERT_EQ(KM_ERROR_OK,
1879 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1880 TAG_BLOCK_MODE, KM_MODE_CTR)));
1881 string message = "123";
1882 string iv1;
1883 string ciphertext1 = EncryptMessage(message, &iv1);
1884 EXPECT_EQ(message.size(), ciphertext1.size());
1885 EXPECT_EQ(16, iv1.size());
1886
1887 string iv2;
1888 string ciphertext2 = EncryptMessage(message, &iv2);
1889 EXPECT_EQ(message.size(), ciphertext2.size());
1890 EXPECT_EQ(16, iv2.size());
1891
1892 // IVs should be random, so ciphertexts should differ.
1893 EXPECT_NE(iv1, iv2);
1894 EXPECT_NE(ciphertext1, ciphertext2);
1895
1896 string plaintext = DecryptMessage(ciphertext1, iv1);
1897 EXPECT_EQ(message, plaintext);
1898}
1899
1900TEST_F(EncryptionOperationsTest, AesCtrIncremental) {
1901 ASSERT_EQ(KM_ERROR_OK,
1902 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
1903 TAG_BLOCK_MODE, KM_MODE_CTR)));
1904
1905 int increment = 15;
1906 string message(239, 'a');
1907 AuthorizationSet input_params;
1908 AuthorizationSet output_params;
1909 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
1910
1911 string ciphertext;
1912 size_t input_consumed;
1913 for (size_t i = 0; i < message.size(); i += increment)
1914 EXPECT_EQ(KM_ERROR_OK,
1915 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
1916 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
1917 EXPECT_EQ(message.size(), ciphertext.size());
1918
1919 // Move TAG_NONCE into input_params
1920 input_params.Reinitialize(output_params);
1921 output_params.Clear();
1922
1923 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
1924 string plaintext;
1925 for (size_t i = 0; i < ciphertext.size(); i += increment)
1926 EXPECT_EQ(KM_ERROR_OK,
1927 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
1928 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
1929 EXPECT_EQ(ciphertext.size(), plaintext.size());
1930 EXPECT_EQ(message, plaintext);
1931}
1932
1933struct AesCtrSp80038aTestVector {
1934 const char* key;
1935 const char* nonce;
1936 const char* plaintext;
1937 const char* ciphertext;
1938};
1939
1940// These test vectors are taken from
1941// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
1942static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
1943 // AES-128
1944 {
1945 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1946 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1947 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1948 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
1949 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
1950 },
1951 // AES-192
1952 {
1953 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1954 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1955 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1956 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
1957 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
1958 },
1959 // AES-256
1960 {
1961 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
1962 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
1963 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
1964 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
1965 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
1966 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
1967 },
1968};
1969
1970TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
1971 for (size_t i = 0; i < 3; i++) {
1972 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
1973 const string key = hex2str(test.key);
1974 const string nonce = hex2str(test.nonce);
1975 const string plaintext = hex2str(test.plaintext);
1976 const string ciphertext = hex2str(test.ciphertext);
1977 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
1978 }
1979}
1980
1981TEST_F(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
1982 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1983 .AesEncryptionKey(128)
1984 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1985 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
1986
1987 EXPECT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT));
1988}
1989
1990TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
1991 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1992 .AesEncryptionKey(128)
1993 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
1994 .Authorization(TAG_CALLER_NONCE)));
1995
1996 AuthorizationSet input_params;
1997 input_params.push_back(TAG_NONCE, "123", 3);
1998 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
1999}
2000
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002001TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
Shawn Willden2c242002015-02-27 07:01:02 -07002002 ASSERT_EQ(KM_ERROR_OK,
2003 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
2004 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002005 // Two-block message.
2006 string message = "12345678901234567890123456789012";
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002007 string iv1;
2008 string ciphertext1 = EncryptMessage(message, &iv1);
2009 EXPECT_EQ(message.size(), ciphertext1.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002010
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002011 string iv2;
2012 string ciphertext2 = EncryptMessage(message, &iv2);
2013 EXPECT_EQ(message.size(), ciphertext2.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002014
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002015 // IVs should be random, so ciphertexts should differ.
2016 EXPECT_NE(iv1, iv2);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002017 EXPECT_NE(ciphertext1, ciphertext2);
2018
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002019 string plaintext = DecryptMessage(ciphertext1, iv1);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002020 EXPECT_EQ(message, plaintext);
2021}
2022
2023TEST_F(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002024 ASSERT_EQ(KM_ERROR_OK,
2025 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
2026 TAG_BLOCK_MODE, KM_MODE_CBC)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002027
2028 int increment = 15;
2029 string message(240, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002030 AuthorizationSet input_params;
2031 AuthorizationSet output_params;
2032 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2033
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002034 string ciphertext;
2035 size_t input_consumed;
2036 for (size_t i = 0; i < message.size(); i += increment)
2037 EXPECT_EQ(KM_ERROR_OK,
2038 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2039 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002040 EXPECT_EQ(message.size(), ciphertext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002041
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002042 // Move TAG_NONCE into input_params
2043 input_params.Reinitialize(output_params);
2044 output_params.Clear();
2045
2046 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002047 string plaintext;
2048 for (size_t i = 0; i < ciphertext.size(); i += increment)
2049 EXPECT_EQ(KM_ERROR_OK,
2050 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2051 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002052 EXPECT_EQ(ciphertext.size(), plaintext.size());
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002053 EXPECT_EQ(message, plaintext);
2054}
2055
2056TEST_F(EncryptionOperationsTest, AesCbcPkcs7Padding) {
Shawn Willden2c242002015-02-27 07:01:02 -07002057 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002058 .AesEncryptionKey(128)
Shawn Willden2c242002015-02-27 07:01:02 -07002059 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2060 .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002061
2062 // Try various message lengths; all should work.
Shawn Willdenc6096592015-03-17 15:53:14 -06002063 for (size_t i = 0; i < 32; ++i) {
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002064 string message(i, 'a');
Shawn Willden7a62f5e2015-03-10 12:59:20 -06002065 string iv;
2066 string ciphertext = EncryptMessage(message, &iv);
2067 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
2068 string plaintext = DecryptMessage(ciphertext, iv);
Shawn Willdenf0f68b92014-12-30 16:03:28 -07002069 EXPECT_EQ(message, plaintext);
2070 }
2071}
2072
Shawn Willdencd695822015-01-26 14:06:32 -07002073typedef KeymasterTest AddEntropyTest;
2074TEST_F(AddEntropyTest, AddEntropy) {
2075 // There's no obvious way to test that entropy is actually added, but we can test that the API
2076 // doesn't blow up or return an error.
2077 EXPECT_EQ(KM_ERROR_OK,
2078 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
2079}
2080
Shawn Willden5fad7852015-01-26 16:10:56 -07002081typedef KeymasterTest RescopingTest;
2082TEST_F(RescopingTest, KeyWithRescopingNotUsable) {
Shawn Willden2c242002015-02-27 07:01:02 -07002083 ASSERT_EQ(
2084 KM_ERROR_OK,
2085 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).OcbMode(4096, 16).Authorization(
2086 TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)));
Shawn Willden5fad7852015-01-26 16:10:56 -07002087 // TODO(swillden): Add a better error code for this.
Shawn Willdenf01329d2015-03-11 21:51:38 -06002088 EXPECT_EQ(KM_ERROR_RESCOPABLE_KEY_NOT_USABLE, BeginOperation(KM_PURPOSE_ENCRYPT));
Shawn Willden5fad7852015-01-26 16:10:56 -07002089}
2090
2091TEST_F(RescopingTest, RescopeSymmetric) {
Shawn Willden2c242002015-02-27 07:01:02 -07002092 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
Shawn Willden5fad7852015-01-26 16:10:56 -07002093 .AesEncryptionKey(128)
2094 .OcbMode(4096, 16)
Shawn Willden2c242002015-02-27 07:01:02 -07002095 .Authorization(TAG_RESCOPING_ADD, KM_TAG_MAC_LENGTH)
2096 .Authorization(TAG_RESCOPING_DEL, KM_TAG_MAC_LENGTH)));
Shawn Willden5fad7852015-01-26 16:10:56 -07002097 EXPECT_FALSE(contains(sw_enforced(), TAG_MAC_LENGTH, 15));
2098 EXPECT_TRUE(contains(sw_enforced(), TAG_MAC_LENGTH, 16));
2099
2100 keymaster_key_blob_t rescoped_blob;
2101 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07002102 AuthorizationSet new_params = AuthorizationSetBuilder()
2103 .AesEncryptionKey(128)
2104 .OcbMode(4096, 15 /* note changed */)
2105 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07002106
2107 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
2108 ASSERT_TRUE(rescoped_characteristics != NULL);
2109
Shawn Willdenc6096592015-03-17 15:53:14 -06002110 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07002111 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
2112 keymaster_free_characteristics(rescoped_characteristics);
2113 free(rescoped_characteristics);
2114 free(const_cast<uint8_t*>(rescoped_blob.key_material));
2115
2116 EXPECT_TRUE(contains(auths, TAG_ALGORITHM, KM_ALGORITHM_AES));
2117 EXPECT_TRUE(contains(auths, TAG_MAC_LENGTH, 15));
2118 EXPECT_FALSE(contains(auths, TAG_MAC_LENGTH, 16));
2119}
2120
2121TEST_F(RescopingTest, RescopeRsa) {
Shawn Willden2c242002015-02-27 07:01:02 -07002122 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2123 .RsaEncryptionKey(256, 3, KM_PAD_RSA_OAEP)
2124 .Authorization(TAG_RESCOPING_ADD, KM_TAG_PURPOSE)
2125 .Authorization(TAG_RESCOPING_DEL, KM_TAG_PURPOSE)));
Shawn Willden5fad7852015-01-26 16:10:56 -07002126 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
2127 EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_DECRYPT));
2128 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
2129 EXPECT_FALSE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
2130
2131 keymaster_key_blob_t rescoped_blob;
2132 keymaster_key_characteristics_t* rescoped_characteristics;
Shawn Willden2c242002015-02-27 07:01:02 -07002133 AuthorizationSet new_params = AuthorizationSetBuilder()
2134 .RsaSigningKey(256, 3, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS)
2135 .build();
Shawn Willden5fad7852015-01-26 16:10:56 -07002136
2137 ASSERT_EQ(KM_ERROR_OK, Rescope(new_params, &rescoped_blob, &rescoped_characteristics));
2138 ASSERT_TRUE(rescoped_characteristics != NULL);
2139
Shawn Willdenc6096592015-03-17 15:53:14 -06002140 EXPECT_EQ(0U, rescoped_characteristics->hw_enforced.length);
Shawn Willden5fad7852015-01-26 16:10:56 -07002141 AuthorizationSet auths(rescoped_characteristics->sw_enforced);
2142 keymaster_free_characteristics(rescoped_characteristics);
2143 free(rescoped_characteristics);
2144 free(const_cast<uint8_t*>(rescoped_blob.key_material));
2145
2146 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
2147 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
2148 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
2149 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
2150}
2151
2152// TODO(swillden): When adding rescoping enforcement, include tests that verify that tags
2153// corresponding to intrinsic attributes of keys, like RSA public exponent, or symmetric key size,
2154// may not be changed.
2155
Shawn Willden128ffe02014-08-06 12:31:33 -06002156} // namespace test
2157} // namespace keymaster