1/*
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
17#include <fstream>
18#include <string>
19#include <vector>
20
21#include <hardware/keymaster0.h>
22#include <keymaster/key_factory.h>
23#include <keymaster/soft_keymaster_context.h>
24#include <keymaster/soft_keymaster_device.h>
25#include <keymaster/softkeymaster.h>
26
27#include "android_keymaster_test_utils.h"
28#include "keymaster0_engine.h"
29#include "openssl_utils.h"
30
31using std::ifstream;
32using std::istreambuf_iterator;
33using std::string;
34using std::vector;
35using std::unique_ptr;
36
37extern "C" {
38int __android_log_print(int prio, const char* tag, const char* fmt);
39int __android_log_print(int prio, const char* tag, const char* fmt) {
40    (void)prio, (void)tag, (void)fmt;
41    return 0;
42}
43}  // extern "C"
44
45namespace keymaster {
46namespace test {
47
48StdoutLogger logger;
49
50template <typename T> vector<T> make_vector(const T* array, size_t len) {
51    return vector<T>(array, array + len);
52}
53
54class TestKeymasterEnforcement : public KeymasterEnforcement {
55  public:
56    TestKeymasterEnforcement() : KeymasterEnforcement(3, 3) {}
57
58    virtual bool activation_date_valid(uint64_t /* activation_date */) const { return true; }
59    virtual bool expiration_date_passed(uint64_t /* expiration_date */) const { return false; }
60    virtual bool auth_token_timed_out(const hw_auth_token_t& /* token */,
61                                      uint32_t /* timeout */) const {
62        return false;
63    }
64    virtual uint32_t get_current_time() const { return 0; }
65    virtual bool ValidateTokenSignature(const hw_auth_token_t& /* token */) const { return true; }
66};
67
68class TestKeymasterContext : public SoftKeymasterContext {
69  public:
70    TestKeymasterContext(keymaster0_device_t* keymaster0 = nullptr)
71        : SoftKeymasterContext(keymaster0) {}
72
73    KeymasterEnforcement* enforcement_policy() override { return &test_policy_; }
74
75  private:
76    TestKeymasterEnforcement test_policy_;
77};
78
79class SoftKeymasterTestInstanceCreator : public Keymaster1TestInstanceCreator {
80  public:
81    keymaster1_device_t* CreateDevice() const override {
82        std::cerr << "Creating software-only device" << std::endl;
83        SoftKeymasterDevice* device = new SoftKeymasterDevice(new TestKeymasterContext);
84        return device->keymaster_device();
85    }
86
87    bool algorithm_in_hardware(keymaster_algorithm_t) const override { return false; }
88    int keymaster0_calls() const override { return 0; }
89};
90
91class Keymaster0AdapterTestInstanceCreator : public Keymaster1TestInstanceCreator {
92  public:
93    Keymaster0AdapterTestInstanceCreator(bool support_ec) : support_ec_(support_ec) {}
94
95    keymaster1_device_t* CreateDevice() const {
96        std::cerr << "Creating keymaster0-backed device (with ec: " << std::boolalpha << support_ec_
97                  << ")." << std::endl;
98        hw_device_t* softkeymaster_device;
99        EXPECT_EQ(0, openssl_open(&softkeymaster_module.common, KEYSTORE_KEYMASTER,
100                                  &softkeymaster_device));
101        // Make the software device pretend to be hardware
102        keymaster0_device_t* keymaster0_device =
103            reinterpret_cast<keymaster0_device_t*>(softkeymaster_device);
104        keymaster0_device->flags &= ~KEYMASTER_SOFTWARE_ONLY;
105
106        if (!support_ec_) {
107            // Make the software device pretend not to support EC
108            keymaster0_device->flags &= ~KEYMASTER_SUPPORTS_EC;
109        }
110
111        counting_keymaster0_device_ = new Keymaster0CountingWrapper(keymaster0_device);
112
113        SoftKeymasterDevice* keymaster =
114            new SoftKeymasterDevice(new TestKeymasterContext(counting_keymaster0_device_));
115        return keymaster->keymaster_device();
116    }
117
118    bool algorithm_in_hardware(keymaster_algorithm_t algorithm) const override {
119        switch (algorithm) {
120        case KM_ALGORITHM_RSA:
121            return true;
122        case KM_ALGORITHM_EC:
123            return support_ec_;
124        default:
125            return false;
126        }
127    }
128    int keymaster0_calls() const override { return counting_keymaster0_device_->count(); }
129
130  private:
131    mutable Keymaster0CountingWrapper* counting_keymaster0_device_;
132    bool support_ec_;
133};
134
135static auto test_params = testing::Values(
136    InstanceCreatorPtr(new SoftKeymasterTestInstanceCreator),
137    InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(true /* support_ec */)),
138    InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(false /* support_ec */)));
139
140typedef Keymaster1Test CheckSupported;
141INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, CheckSupported, test_params);
142
143TEST_P(CheckSupported, SupportedAlgorithms) {
144    EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
145              device()->get_supported_algorithms(device(), NULL, NULL));
146
147    size_t len;
148    keymaster_algorithm_t* algorithms;
149    EXPECT_EQ(KM_ERROR_OK, device()->get_supported_algorithms(device(), &algorithms, &len));
150    EXPECT_TRUE(ResponseContains(
151        {KM_ALGORITHM_RSA, KM_ALGORITHM_EC, KM_ALGORITHM_AES, KM_ALGORITHM_HMAC}, algorithms, len));
152    free(algorithms);
153
154    EXPECT_EQ(0, GetParam()->keymaster0_calls());
155}
156
157TEST_P(CheckSupported, SupportedBlockModes) {
158    EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
159              device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
160                                                  NULL, NULL));
161
162    size_t len;
163    keymaster_block_mode_t* modes;
164    ASSERT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_RSA,
165                                                               KM_PURPOSE_ENCRYPT, &modes, &len));
166    EXPECT_EQ(0U, len);
167    free(modes);
168
169    EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
170              device()->get_supported_block_modes(device(), KM_ALGORITHM_EC, KM_PURPOSE_ENCRYPT,
171                                                  &modes, &len));
172
173    ASSERT_EQ(KM_ERROR_OK, device()->get_supported_block_modes(device(), KM_ALGORITHM_AES,
174                                                               KM_PURPOSE_ENCRYPT, &modes, &len));
175    EXPECT_TRUE(ResponseContains({KM_MODE_ECB, KM_MODE_CBC, KM_MODE_CTR, KM_MODE_GCM}, modes, len));
176    free(modes);
177
178    EXPECT_EQ(0, GetParam()->keymaster0_calls());
179}
180
181TEST_P(CheckSupported, SupportedPaddingModes) {
182    EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
183              device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_ENCRYPT,
184                                                    NULL, NULL));
185
186    size_t len;
187    keymaster_padding_t* modes;
188    ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
189                                                                 KM_PURPOSE_SIGN, &modes, &len));
190    EXPECT_TRUE(
191        ResponseContains({KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS}, modes, len));
192    free(modes);
193
194    ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA,
195                                                                 KM_PURPOSE_ENCRYPT, &modes, &len));
196    EXPECT_TRUE(
197        ResponseContains({KM_PAD_NONE, KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}, modes, len));
198    free(modes);
199
200    ASSERT_EQ(KM_ERROR_OK, device()->get_supported_padding_modes(device(), KM_ALGORITHM_EC,
201                                                                 KM_PURPOSE_SIGN, &modes, &len));
202    EXPECT_EQ(0U, len);
203    free(modes);
204
205    EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
206              device()->get_supported_padding_modes(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN,
207                                                    &modes, &len));
208
209    EXPECT_EQ(0, GetParam()->keymaster0_calls());
210}
211
212TEST_P(CheckSupported, SupportedDigests) {
213    EXPECT_EQ(
214        KM_ERROR_OUTPUT_PARAMETER_NULL,
215        device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, NULL, NULL));
216
217    size_t len;
218    keymaster_digest_t* digests;
219    ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_RSA,
220                                                           KM_PURPOSE_SIGN, &digests, &len));
221    EXPECT_TRUE(
222        ResponseContains({KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224,
223                          KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512},
224                         digests, len));
225    free(digests);
226
227    ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
228                                                           KM_PURPOSE_SIGN, &digests, &len));
229    EXPECT_TRUE(ResponseContains({KM_DIGEST_NONE, KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224,
230                                  KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512},
231                                 digests, len));
232    free(digests);
233
234    EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
235              device()->get_supported_digests(device(), KM_ALGORITHM_AES, KM_PURPOSE_SIGN, &digests,
236                                              &len));
237
238    ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_HMAC,
239                                                           KM_PURPOSE_SIGN, &digests, &len));
240    EXPECT_TRUE(ResponseContains({KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384,
241                                  KM_DIGEST_SHA_2_512, KM_DIGEST_SHA1},
242                                 digests, len));
243    free(digests);
244
245    EXPECT_EQ(0, GetParam()->keymaster0_calls());
246}
247
248TEST_P(CheckSupported, SupportedImportFormats) {
249    EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
250              device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
251
252    size_t len;
253    keymaster_key_format_t* formats;
254    ASSERT_EQ(KM_ERROR_OK,
255              device()->get_supported_import_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
256    EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_PKCS8, formats, len));
257    free(formats);
258
259    ASSERT_EQ(KM_ERROR_OK,
260              device()->get_supported_import_formats(device(), KM_ALGORITHM_AES, &formats, &len));
261    EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
262    free(formats);
263
264    ASSERT_EQ(KM_ERROR_OK,
265              device()->get_supported_import_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
266    EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_RAW, formats, len));
267    free(formats);
268
269    EXPECT_EQ(0, GetParam()->keymaster0_calls());
270}
271
272TEST_P(CheckSupported, SupportedExportFormats) {
273    EXPECT_EQ(KM_ERROR_OUTPUT_PARAMETER_NULL,
274              device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, NULL, NULL));
275
276    size_t len;
277    keymaster_key_format_t* formats;
278    ASSERT_EQ(KM_ERROR_OK,
279              device()->get_supported_export_formats(device(), KM_ALGORITHM_RSA, &formats, &len));
280    EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
281    free(formats);
282
283    ASSERT_EQ(KM_ERROR_OK,
284              device()->get_supported_export_formats(device(), KM_ALGORITHM_EC, &formats, &len));
285    EXPECT_TRUE(ResponseContains(KM_KEY_FORMAT_X509, formats, len));
286    free(formats);
287
288    ASSERT_EQ(KM_ERROR_OK,
289              device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
290    EXPECT_EQ(0U, len);
291    free(formats);
292
293    ASSERT_EQ(KM_ERROR_OK,
294              device()->get_supported_export_formats(device(), KM_ALGORITHM_AES, &formats, &len));
295    EXPECT_EQ(0U, len);
296    free(formats);
297
298    ASSERT_EQ(KM_ERROR_OK,
299              device()->get_supported_export_formats(device(), KM_ALGORITHM_HMAC, &formats, &len));
300    EXPECT_EQ(0U, len);
301    free(formats);
302
303    EXPECT_EQ(0, GetParam()->keymaster0_calls());
304}
305
306class NewKeyGeneration : public Keymaster1Test {
307  protected:
308    void CheckBaseParams() {
309        AuthorizationSet auths = sw_enforced();
310        EXPECT_GT(auths.SerializedSize(), 12U);
311
312        EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN));
313        EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY));
314        EXPECT_TRUE(contains(auths, TAG_USER_ID, 7));
315        EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
316        EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300));
317
318        // Verify that App ID, App data and ROT are NOT included.
319        EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST));
320        EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID));
321        EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA));
322
323        // Just for giggles, check that some unexpected tags/values are NOT present.
324        EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT));
325        EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT));
326        EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301));
327
328        // Now check that unspecified, defaulted tags are correct.
329        EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME));
330    }
331};
332INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, NewKeyGeneration, test_params);
333
334TEST_P(NewKeyGeneration, Rsa) {
335    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
336                                           .RsaSigningKey(256, 3)
337                                           .Digest(KM_DIGEST_NONE)
338                                           .Padding(KM_PAD_NONE)));
339    CheckBaseParams();
340
341    // Check specified tags are all present, and in the right set.
342    AuthorizationSet crypto_params;
343    AuthorizationSet non_crypto_params;
344    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA)) {
345        EXPECT_NE(0U, hw_enforced().size());
346        EXPECT_NE(0U, sw_enforced().size());
347        crypto_params.push_back(hw_enforced());
348        non_crypto_params.push_back(sw_enforced());
349    } else {
350        EXPECT_EQ(0U, hw_enforced().size());
351        EXPECT_NE(0U, sw_enforced().size());
352        crypto_params.push_back(sw_enforced());
353    }
354
355    EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
356    EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA));
357    EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 256));
358    EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 256));
359    EXPECT_TRUE(contains(crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
360    EXPECT_FALSE(contains(non_crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3));
361
362    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
363        EXPECT_EQ(1, GetParam()->keymaster0_calls());
364}
365
366TEST_P(NewKeyGeneration, RsaDefaultSize) {
367    ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
368              GenerateKey(AuthorizationSetBuilder()
369                              .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
370                              .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
371                              .SigningKey()));
372
373    EXPECT_EQ(0, GetParam()->keymaster0_calls());
374}
375
376TEST_P(NewKeyGeneration, Ecdsa) {
377    ASSERT_EQ(KM_ERROR_OK,
378              GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
379    CheckBaseParams();
380
381    // Check specified tags are all present, and in the right set.
382    AuthorizationSet crypto_params;
383    AuthorizationSet non_crypto_params;
384    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC)) {
385        EXPECT_NE(0U, hw_enforced().size());
386        EXPECT_NE(0U, sw_enforced().size());
387        crypto_params.push_back(hw_enforced());
388        non_crypto_params.push_back(sw_enforced());
389    } else {
390        EXPECT_EQ(0U, hw_enforced().size());
391        EXPECT_NE(0U, sw_enforced().size());
392        crypto_params.push_back(sw_enforced());
393    }
394
395    EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC));
396    EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC));
397    EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 224));
398    EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 224));
399
400    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
401        EXPECT_EQ(1, GetParam()->keymaster0_calls());
402}
403
404TEST_P(NewKeyGeneration, EcdsaDefaultSize) {
405    ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE,
406              GenerateKey(AuthorizationSetBuilder()
407                              .Authorization(TAG_ALGORITHM, KM_ALGORITHM_EC)
408                              .SigningKey()
409                              .Digest(KM_DIGEST_NONE)));
410
411    EXPECT_EQ(0, GetParam()->keymaster0_calls());
412}
413
414TEST_P(NewKeyGeneration, EcdsaInvalidSize) {
415    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
416        ASSERT_EQ(
417            KM_ERROR_UNKNOWN_ERROR,
418            GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
419    else
420        ASSERT_EQ(
421            KM_ERROR_UNSUPPORTED_KEY_SIZE,
422            GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE)));
423
424    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
425        EXPECT_EQ(1, GetParam()->keymaster0_calls());
426}
427
428TEST_P(NewKeyGeneration, EcdsaAllValidSizes) {
429    size_t valid_sizes[] = {224, 256, 384, 521};
430    for (size_t size : valid_sizes) {
431        EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(
432                                   KM_DIGEST_NONE)))
433            << "Failed to generate size: " << size;
434    }
435
436    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
437        EXPECT_EQ(4, GetParam()->keymaster0_calls());
438}
439
440TEST_P(NewKeyGeneration, HmacSha256) {
441    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
442                                           .HmacKey(128)
443                                           .Digest(KM_DIGEST_SHA_2_256)
444                                           .Authorization(TAG_MIN_MAC_LENGTH, 256)));
445
446    EXPECT_EQ(0, GetParam()->keymaster0_calls());
447}
448
449TEST_P(NewKeyGeneration, HmacMultipleDigests) {
450    ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST,
451              GenerateKey(AuthorizationSetBuilder()
452                              .HmacKey(128)
453                              .Digest(KM_DIGEST_SHA1)
454                              .Digest(KM_DIGEST_SHA_2_256)
455                              .Authorization(TAG_MIN_MAC_LENGTH, 128)));
456
457    EXPECT_EQ(0, GetParam()->keymaster0_calls());
458}
459
460TEST_P(NewKeyGeneration, HmacDigestNone) {
461    ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST,
462              GenerateKey(AuthorizationSetBuilder()
463                              .HmacKey(128)
464                              .Digest(KM_DIGEST_NONE)
465                              .Authorization(TAG_MIN_MAC_LENGTH, 128)));
466
467    EXPECT_EQ(0, GetParam()->keymaster0_calls());
468}
469
470TEST_P(NewKeyGeneration, HmacSha256TooShortMacLength) {
471    ASSERT_EQ(KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH,
472              GenerateKey(AuthorizationSetBuilder()
473                              .HmacKey(128)
474                              .Digest(KM_DIGEST_SHA_2_256)
475                              .Authorization(TAG_MIN_MAC_LENGTH, 48)));
476
477    EXPECT_EQ(0, GetParam()->keymaster0_calls());
478}
479
480TEST_P(NewKeyGeneration, HmacSha256NonIntegralOctetMacLength) {
481    ASSERT_EQ(KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH,
482              GenerateKey(AuthorizationSetBuilder()
483                              .HmacKey(128)
484                              .Digest(KM_DIGEST_SHA_2_256)
485                              .Authorization(TAG_MIN_MAC_LENGTH, 130)));
486
487    EXPECT_EQ(0, GetParam()->keymaster0_calls());
488}
489
490TEST_P(NewKeyGeneration, HmacSha256TooLongMacLength) {
491    ASSERT_EQ(KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH,
492              GenerateKey(AuthorizationSetBuilder()
493                              .HmacKey(128)
494                              .Digest(KM_DIGEST_SHA_2_256)
495                              .Authorization(TAG_MIN_MAC_LENGTH, 384)));
496
497    EXPECT_EQ(0, GetParam()->keymaster0_calls());
498}
499
500typedef Keymaster1Test GetKeyCharacteristics;
501INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, GetKeyCharacteristics, test_params);
502
503TEST_P(GetKeyCharacteristics, SimpleRsa) {
504    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
505                                           .RsaSigningKey(256, 3)
506                                           .Digest(KM_DIGEST_NONE)
507                                           .Padding(KM_PAD_NONE)));
508    AuthorizationSet original(sw_enforced());
509
510    ASSERT_EQ(KM_ERROR_OK, GetCharacteristics());
511    EXPECT_EQ(original, sw_enforced());
512
513    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
514        EXPECT_EQ(1, GetParam()->keymaster0_calls());
515}
516
517typedef Keymaster1Test SigningOperationsTest;
518INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, SigningOperationsTest, test_params);
519
520TEST_P(SigningOperationsTest, RsaSuccess) {
521    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
522                                           .RsaSigningKey(256, 3)
523                                           .Digest(KM_DIGEST_NONE)
524                                           .Padding(KM_PAD_NONE)));
525    string message = "12345678901234567890123456789012";
526    string signature;
527    SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
528
529    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
530        EXPECT_EQ(3, GetParam()->keymaster0_calls());
531}
532
533TEST_P(SigningOperationsTest, RsaPssSha256Success) {
534    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
535                                           .RsaSigningKey(512, 3)
536                                           .Digest(KM_DIGEST_SHA_2_256)
537                                           .Padding(KM_PAD_RSA_PSS)));
538    // Use large message, which won't work without digesting.
539    string message(1024, 'a');
540    string signature;
541    SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
542
543    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
544        EXPECT_EQ(3, GetParam()->keymaster0_calls());
545}
546
547TEST_P(SigningOperationsTest, RsaPaddingNoneDoesNotAllowOther) {
548    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
549                                           .RsaSigningKey(512, 3)
550                                           .Digest(KM_DIGEST_NONE)
551                                           .Padding(KM_PAD_NONE)));
552    string message = "12345678901234567890123456789012";
553    string signature;
554
555    AuthorizationSet begin_params(client_params());
556    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
557    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
558    EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
559}
560
561TEST_P(SigningOperationsTest, RsaPkcs1Sha256Success) {
562    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
563                                           .RsaSigningKey(512, 3)
564                                           .Digest(KM_DIGEST_SHA_2_256)
565                                           .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
566    string message(1024, 'a');
567    string signature;
568    SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
569
570    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
571        EXPECT_EQ(3, GetParam()->keymaster0_calls());
572}
573
574TEST_P(SigningOperationsTest, RsaPkcs1NoDigestSuccess) {
575    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
576                                           .RsaSigningKey(512, 3)
577                                           .Digest(KM_DIGEST_NONE)
578                                           .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
579    string message(53, 'a');
580    string signature;
581    SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN);
582
583    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
584        EXPECT_EQ(3, GetParam()->keymaster0_calls());
585}
586
587TEST_P(SigningOperationsTest, RsaPkcs1NoDigestTooLarge) {
588    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
589                                           .RsaSigningKey(512, 3)
590                                           .Digest(KM_DIGEST_NONE)
591                                           .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
592    string message(54, 'a');
593
594    AuthorizationSet begin_params(client_params());
595    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
596    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
597    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
598    string result;
599    size_t input_consumed;
600    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
601    string signature;
602    EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&signature));
603
604    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
605        EXPECT_EQ(2, GetParam()->keymaster0_calls());
606}
607
608TEST_P(SigningOperationsTest, RsaPssSha256TooSmallKey) {
609    // Key must be at least 10 bytes larger than hash, to provide eight bytes of random salt, so
610    // verify that nine bytes larger than hash won't work.
611    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
612                                           .RsaSigningKey(256 + 9 * 8, 3)
613                                           .Digest(KM_DIGEST_SHA_2_256)
614                                           .Padding(KM_PAD_RSA_PSS)));
615    string message(1024, 'a');
616    string signature;
617
618    AuthorizationSet begin_params(client_params());
619    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
620    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
621    EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
622}
623
624TEST_P(SigningOperationsTest, RsaNoPaddingHugeData) {
625    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
626                                           .RsaSigningKey(256, 3)
627                                           .Digest(KM_DIGEST_NONE)
628                                           .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
629    string message(64 * 1024, 'a');
630    string signature;
631    AuthorizationSet begin_params(client_params());
632    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
633    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
634    ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
635    string result;
636    size_t input_consumed;
637    EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &result, &input_consumed));
638
639    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
640        EXPECT_EQ(2, GetParam()->keymaster0_calls());
641}
642
643TEST_P(SigningOperationsTest, RsaAbort) {
644    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
645                                           .RsaSigningKey(256, 3)
646                                           .Digest(KM_DIGEST_NONE)
647                                           .Padding(KM_PAD_NONE)));
648    AuthorizationSet begin_params(client_params());
649    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
650    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
651    ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
652    EXPECT_EQ(KM_ERROR_OK, AbortOperation());
653    // Another abort should fail
654    EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation());
655
656    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
657        EXPECT_EQ(2, GetParam()->keymaster0_calls());
658}
659
660TEST_P(SigningOperationsTest, RsaUnsupportedPadding) {
661    GenerateKey(AuthorizationSetBuilder()
662                    .RsaSigningKey(256, 3)
663                    .Digest(KM_DIGEST_SHA_2_256 /* supported digest */)
664                    .Padding(KM_PAD_PKCS7));
665    AuthorizationSet begin_params(client_params());
666    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
667    ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
668
669    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
670        EXPECT_EQ(2, GetParam()->keymaster0_calls());
671}
672
673TEST_P(SigningOperationsTest, RsaNoDigest) {
674    // PSS requires a digest.
675    GenerateKey(AuthorizationSetBuilder()
676                    .RsaSigningKey(256, 3)
677                    .Digest(KM_DIGEST_NONE)
678                    .Padding(KM_PAD_RSA_PSS));
679    AuthorizationSet begin_params(client_params());
680    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
681    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
682    ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params));
683
684    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
685        EXPECT_EQ(2, GetParam()->keymaster0_calls());
686}
687
688TEST_P(SigningOperationsTest, RsaNoPadding) {
689    // Padding must be specified
690    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest(
691                               KM_DIGEST_NONE)));
692    AuthorizationSet begin_params(client_params());
693    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
694    ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
695
696    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
697        EXPECT_EQ(2, GetParam()->keymaster0_calls());
698}
699
700TEST_P(SigningOperationsTest, RsaTooShortMessage) {
701    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
702                                           .RsaSigningKey(256, 3)
703                                           .Digest(KM_DIGEST_NONE)
704                                           .Padding(KM_PAD_NONE)));
705    string message = "1234567890123456789012345678901";
706    string signature;
707    SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
708
709    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
710        EXPECT_EQ(3, GetParam()->keymaster0_calls());
711}
712
713TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) {
714    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
715                                           .RsaEncryptionKey(256, 3)
716                                           .Digest(KM_DIGEST_NONE)
717                                           .Padding(KM_PAD_NONE)));
718    AuthorizationSet begin_params(client_params());
719    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
720    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
721    ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN, begin_params));
722
723    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
724        EXPECT_EQ(2, GetParam()->keymaster0_calls());
725}
726
727TEST_P(SigningOperationsTest, EcdsaSuccess) {
728    ASSERT_EQ(KM_ERROR_OK,
729              GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
730    string message(224 / 8, 'a');
731    string signature;
732    SignMessage(message, &signature, KM_DIGEST_NONE);
733
734    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
735        EXPECT_EQ(3, GetParam()->keymaster0_calls());
736}
737
738TEST_P(SigningOperationsTest, EcdsaSha256Success) {
739    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(
740                               KM_DIGEST_SHA_2_256)));
741    string message(1024, 'a');
742    string signature;
743    SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
744
745    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
746        EXPECT_EQ(3, GetParam()->keymaster0_calls());
747}
748
749TEST_P(SigningOperationsTest, EcdsaNoPaddingHugeData) {
750    ASSERT_EQ(KM_ERROR_OK,
751              GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
752    string message(64 * 1024, 'a');
753    string signature;
754    AuthorizationSet begin_params(client_params());
755    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
756    ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
757    string result;
758    size_t input_consumed;
759    EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &result, &input_consumed));
760
761    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
762        EXPECT_EQ(2, GetParam()->keymaster0_calls());
763}
764
765TEST_P(SigningOperationsTest, EcsdaAllSizesAndHashes) {
766    size_t len;
767    keymaster_digest_t* digest_arr;
768    ASSERT_EQ(KM_ERROR_OK, device()->get_supported_digests(device(), KM_ALGORITHM_EC,
769                                                           KM_PURPOSE_SIGN, &digest_arr, &len));
770    vector<int> key_sizes = {224, 256, 384, 521};
771    vector<keymaster_digest_t> digests = make_vector(digest_arr, len);
772    free(digest_arr);
773
774    for (int key_size : key_sizes) {
775        for (keymaster_digest_t digest : digests) {
776            ASSERT_EQ(
777                KM_ERROR_OK,
778                GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(key_size).Digest(digest)));
779
780            string message(1024, 'a');
781            string signature;
782            if (digest == KM_DIGEST_NONE)
783                message.resize(key_size / 8);
784            SignMessage(message, &signature, digest);
785        }
786    }
787
788    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
789        EXPECT_EQ(digests.size() * key_sizes.size() * 3,
790                  static_cast<size_t>(GetParam()->keymaster0_calls()));
791}
792
793TEST_P(SigningOperationsTest, AesEcbSign) {
794    ASSERT_EQ(KM_ERROR_OK,
795              GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization(
796                  TAG_BLOCK_MODE, KM_MODE_ECB)));
797    ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_SIGN));
798    ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY));
799
800    EXPECT_EQ(0, GetParam()->keymaster0_calls());
801}
802
803TEST_P(SigningOperationsTest, HmacSha1Success) {
804    GenerateKey(AuthorizationSetBuilder()
805                    .HmacKey(128)
806                    .Digest(KM_DIGEST_SHA1)
807                    .Authorization(TAG_MIN_MAC_LENGTH, 160));
808    string message = "12345678901234567890123456789012";
809    string signature;
810    MacMessage(message, &signature, 160);
811    ASSERT_EQ(20U, signature.size());
812
813    EXPECT_EQ(0, GetParam()->keymaster0_calls());
814}
815
816TEST_P(SigningOperationsTest, HmacSha224Success) {
817    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
818                                           .HmacKey(128)
819                                           .Digest(KM_DIGEST_SHA_2_224)
820                                           .Authorization(TAG_MIN_MAC_LENGTH, 160)));
821    string message = "12345678901234567890123456789012";
822    string signature;
823    MacMessage(message, &signature, 224);
824    ASSERT_EQ(28U, signature.size());
825
826    EXPECT_EQ(0, GetParam()->keymaster0_calls());
827}
828
829TEST_P(SigningOperationsTest, HmacSha256Success) {
830    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
831                                           .HmacKey(128)
832                                           .Digest(KM_DIGEST_SHA_2_256)
833                                           .Authorization(TAG_MIN_MAC_LENGTH, 256)));
834    string message = "12345678901234567890123456789012";
835    string signature;
836    MacMessage(message, &signature, 256);
837    ASSERT_EQ(32U, signature.size());
838
839    EXPECT_EQ(0, GetParam()->keymaster0_calls());
840}
841
842TEST_P(SigningOperationsTest, HmacSha384Success) {
843    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
844                                           .HmacKey(128)
845                                           .Digest(KM_DIGEST_SHA_2_384)
846                                           .Authorization(TAG_MIN_MAC_LENGTH, 384)));
847
848    string message = "12345678901234567890123456789012";
849    string signature;
850    MacMessage(message, &signature, 384);
851    ASSERT_EQ(48U, signature.size());
852
853    EXPECT_EQ(0, GetParam()->keymaster0_calls());
854}
855
856TEST_P(SigningOperationsTest, HmacSha512Success) {
857    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
858                                           .HmacKey(128)
859                                           .Digest(KM_DIGEST_SHA_2_512)
860                                           .Authorization(TAG_MIN_MAC_LENGTH, 384)));
861    string message = "12345678901234567890123456789012";
862    string signature;
863    MacMessage(message, &signature, 512);
864    ASSERT_EQ(64U, signature.size());
865
866    EXPECT_EQ(0, GetParam()->keymaster0_calls());
867}
868
869TEST_P(SigningOperationsTest, HmacLengthInKey) {
870    // TODO(swillden): unified API should generate an error on key generation.
871    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
872                                           .HmacKey(128)
873                                           .Digest(KM_DIGEST_SHA_2_512)
874                                           .Authorization(TAG_MIN_MAC_LENGTH, 512)));
875    string message = "12345678901234567890123456789012";
876    string signature;
877    MacMessage(message, &signature, 512);
878    ASSERT_EQ(64U, signature.size());
879
880    EXPECT_EQ(0, GetParam()->keymaster0_calls());
881}
882
883TEST_P(SigningOperationsTest, HmacRfc4231TestCase1) {
884    uint8_t key_data[] = {
885        0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
886        0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
887    };
888    string message = "Hi There";
889    uint8_t sha_224_expected[] = {
890        0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19, 0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d,
891        0xf3, 0x3f, 0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f, 0x53, 0x68, 0x4b, 0x22,
892    };
893    uint8_t sha_256_expected[] = {
894        0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf,
895        0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83,
896        0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7,
897    };
898    uint8_t sha_384_expected[] = {
899        0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62, 0x6b, 0x08, 0x25, 0xf4,
900        0xab, 0x46, 0x90, 0x7f, 0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
901        0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c, 0xfa, 0xea, 0x9e, 0xa9,
902        0x07, 0x6e, 0xde, 0x7f, 0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6,
903    };
904    uint8_t sha_512_expected[] = {
905        0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d, 0x4f, 0xf0, 0xb4, 0x24, 0x1a,
906        0x1d, 0x6c, 0xb0, 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78, 0x7a, 0xd0,
907        0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde, 0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7,
908        0x02, 0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4, 0xbe, 0x9d, 0x91, 0x4e,
909        0xeb, 0x61, 0xf1, 0x70, 0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54,
910    };
911
912    string key = make_string(key_data);
913
914    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
915    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
916    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
917    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
918
919    EXPECT_EQ(0, GetParam()->keymaster0_calls());
920}
921
922TEST_P(SigningOperationsTest, HmacRfc4231TestCase2) {
923    string key = "Jefe";
924    string message = "what do ya want for nothing?";
925    uint8_t sha_224_expected[] = {
926        0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf, 0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e,
927        0x6d, 0x0f, 0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00, 0x8f, 0xd0, 0x5e, 0x44,
928    };
929    uint8_t sha_256_expected[] = {
930        0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24,
931        0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27,
932        0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43,
933    };
934    uint8_t sha_384_expected[] = {
935        0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31, 0x61, 0x7f, 0x78, 0xd2,
936        0xb5, 0x8a, 0x6b, 0x1b, 0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
937        0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e, 0x8e, 0x22, 0x40, 0xca,
938        0x5e, 0x69, 0xe2, 0xc7, 0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49,
939    };
940    uint8_t sha_512_expected[] = {
941        0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2, 0xe3, 0x95, 0xfb, 0xe7, 0x3b,
942        0x56, 0xe0, 0xa3, 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6, 0x10, 0x27,
943        0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54, 0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99,
944        0x4a, 0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd, 0xca, 0xea, 0xb1, 0xa3,
945        0x4d, 0x4a, 0x6b, 0x4b, 0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37,
946    };
947
948    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
949    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
950    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
951    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
952
953    EXPECT_EQ(0, GetParam()->keymaster0_calls());
954}
955
956TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) {
957    string key(20, 0xaa);
958    string message(50, 0xdd);
959    uint8_t sha_224_expected[] = {
960        0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a,
961        0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea,
962    };
963    uint8_t sha_256_expected[] = {
964        0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8,
965        0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8,
966        0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe,
967    };
968    uint8_t sha_384_expected[] = {
969        0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0,
970        0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
971        0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d,
972        0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27,
973    };
974    uint8_t sha_512_expected[] = {
975        0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c,
976        0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8,
977        0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22,
978        0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37,
979        0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb,
980    };
981
982    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
983    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
984    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
985    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
986
987    EXPECT_EQ(0, GetParam()->keymaster0_calls());
988}
989
990TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) {
991    uint8_t key_data[25] = {
992        0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
993        0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
994    };
995    string key = make_string(key_data);
996    string message(50, 0xcd);
997    uint8_t sha_224_expected[] = {
998        0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82,
999        0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a,
1000    };
1001    uint8_t sha_256_expected[] = {
1002        0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81,
1003        0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78,
1004        0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b,
1005    };
1006    uint8_t sha_384_expected[] = {
1007        0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62,
1008        0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
1009        0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23,
1010        0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb,
1011    };
1012    uint8_t sha_512_expected[] = {
1013        0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6,
1014        0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f,
1015        0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e,
1016        0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41,
1017        0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd,
1018    };
1019
1020    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1021    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1022    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1023    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1024
1025    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1026}
1027
1028TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) {
1029    string key(20, 0x0c);
1030    string message = "Test With Truncation";
1031
1032    uint8_t sha_224_expected[] = {
1033        0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37,
1034        0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8,
1035    };
1036    uint8_t sha_256_expected[] = {
1037        0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0,
1038        0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b,
1039    };
1040    uint8_t sha_384_expected[] = {
1041        0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23,
1042        0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97,
1043    };
1044    uint8_t sha_512_expected[] = {
1045        0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53,
1046        0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6,
1047    };
1048
1049    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1050    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1051    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1052    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1053
1054    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1055}
1056
1057TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) {
1058    string key(131, 0xaa);
1059    string message = "Test Using Larger Than Block-Size Key - Hash Key First";
1060
1061    uint8_t sha_224_expected[] = {
1062        0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d,
1063        0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e,
1064    };
1065    uint8_t sha_256_expected[] = {
1066        0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26,
1067        0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28,
1068        0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54,
1069    };
1070    uint8_t sha_384_expected[] = {
1071        0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a,
1072        0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
1073        0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab,
1074        0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52,
1075    };
1076    uint8_t sha_512_expected[] = {
1077        0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd,
1078        0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b,
1079        0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25,
1080        0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73,
1081        0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98,
1082    };
1083
1084    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1085    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1086    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1087    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1088
1089    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1090}
1091
1092TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) {
1093    string key(131, 0xaa);
1094    string message = "This is a test using a larger than block-size key and a larger than "
1095                     "block-size data. The key needs to be hashed before being used by the HMAC "
1096                     "algorithm.";
1097
1098    uint8_t sha_224_expected[] = {
1099        0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3,
1100        0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1,
1101    };
1102    uint8_t sha_256_expected[] = {
1103        0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f,
1104        0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07,
1105        0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2,
1106    };
1107    uint8_t sha_384_expected[] = {
1108        0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25,
1109        0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
1110        0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31,
1111        0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e,
1112    };
1113    uint8_t sha_512_expected[] = {
1114        0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e,
1115        0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5,
1116        0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82,
1117        0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb,
1118        0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58,
1119    };
1120
1121    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected));
1122    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected));
1123    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected));
1124    CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected));
1125
1126    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1127}
1128
1129TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) {
1130    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1131                                           .HmacKey(128)
1132                                           .Digest(KM_DIGEST_SHA_2_256)
1133                                           .Authorization(TAG_MIN_MAC_LENGTH, 256)));
1134    AuthorizationSet begin_params(client_params());
1135    begin_params.push_back(TAG_MAC_LENGTH, 264);
1136    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
1137    ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH,
1138              BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
1139
1140    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1141}
1142
1143TEST_P(SigningOperationsTest, HmacSha256TooSmallMacLength) {
1144    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1145                                           .HmacKey(128)
1146                                           .Digest(KM_DIGEST_SHA_2_256)
1147                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
1148    AuthorizationSet begin_params(client_params());
1149    begin_params.push_back(TAG_MAC_LENGTH, 120);
1150    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
1151    ASSERT_EQ(KM_ERROR_INVALID_MAC_LENGTH,
1152              BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */));
1153
1154    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1155}
1156
1157// TODO(swillden): Add more verification failure tests.
1158
1159typedef Keymaster1Test VerificationOperationsTest;
1160INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params);
1161
1162TEST_P(VerificationOperationsTest, RsaSuccess) {
1163    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1164                                           .RsaSigningKey(256, 3)
1165                                           .Digest(KM_DIGEST_NONE)
1166                                           .Padding(KM_PAD_NONE)));
1167    string message = "12345678901234567890123456789012";
1168    string signature;
1169    SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1170    VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
1171
1172    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1173        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1174}
1175
1176TEST_P(VerificationOperationsTest, RsaPssSha256Success) {
1177    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1178                                           .RsaSigningKey(512, 3)
1179                                           .Digest(KM_DIGEST_SHA_2_256)
1180                                           .Padding(KM_PAD_RSA_PSS)));
1181    // Use large message, which won't work without digesting.
1182    string message(1024, 'a');
1183    string signature;
1184    SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
1185    VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
1186
1187    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1188        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1189}
1190
1191TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) {
1192    GenerateKey(AuthorizationSetBuilder()
1193                    .RsaSigningKey(512, 3)
1194                    .Digest(KM_DIGEST_SHA_2_256)
1195                    .Padding(KM_PAD_RSA_PSS));
1196    string message(1024, 'a');
1197    string signature;
1198    SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
1199    ++signature[signature.size() / 2];
1200
1201    AuthorizationSet begin_params(client_params());
1202    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
1203    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
1204    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1205
1206    string result;
1207    size_t input_consumed;
1208    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1209    EXPECT_EQ(message.size(), input_consumed);
1210    EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1211
1212    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1213        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1214}
1215
1216TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) {
1217    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1218                                           .RsaSigningKey(512, 3)
1219                                           .Digest(KM_DIGEST_SHA_2_256)
1220                                           .Padding(KM_PAD_RSA_PSS)));
1221    // Use large message, which won't work without digesting.
1222    string message(1024, 'a');
1223    string signature;
1224    SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS);
1225    ++message[message.size() / 2];
1226
1227    AuthorizationSet begin_params(client_params());
1228    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
1229    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS);
1230    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1231
1232    string result;
1233    size_t input_consumed;
1234    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1235    EXPECT_EQ(message.size(), input_consumed);
1236    EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1237
1238    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1239        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1240}
1241
1242TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) {
1243    GenerateKey(AuthorizationSetBuilder()
1244                    .RsaSigningKey(512, 3)
1245                    .Digest(KM_DIGEST_SHA_2_256)
1246                    .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
1247    string message(1024, 'a');
1248    string signature;
1249    SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1250    VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1251
1252    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1253        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1254}
1255
1256TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) {
1257    GenerateKey(AuthorizationSetBuilder()
1258                    .RsaSigningKey(512, 3)
1259                    .Digest(KM_DIGEST_SHA_2_256)
1260                    .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN));
1261    string message(1024, 'a');
1262    string signature;
1263    SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1264    ++signature[signature.size() / 2];
1265
1266    AuthorizationSet begin_params(client_params());
1267    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
1268    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
1269    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1270
1271    string result;
1272    size_t input_consumed;
1273    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1274    EXPECT_EQ(message.size(), input_consumed);
1275    EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1276
1277    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1278        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1279}
1280
1281TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) {
1282    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1283                                           .RsaSigningKey(512, 3)
1284                                           .Digest(KM_DIGEST_SHA_2_256)
1285                                           .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)));
1286    // Use large message, which won't work without digesting.
1287    string message(1024, 'a');
1288    string signature;
1289    SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN);
1290    ++message[message.size() / 2];
1291
1292    AuthorizationSet begin_params(client_params());
1293    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
1294    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN);
1295    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1296
1297    string result;
1298    size_t input_consumed;
1299    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1300    EXPECT_EQ(message.size(), input_consumed);
1301    EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1302
1303    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1304        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1305}
1306
1307TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) {
1308    // Get all supported digests and padding modes.
1309    size_t digests_len;
1310    keymaster_digest_t* digests;
1311    ASSERT_EQ(KM_ERROR_OK,
1312              device()->get_supported_digests(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN, &digests,
1313                                              &digests_len));
1314
1315    size_t padding_modes_len;
1316    keymaster_padding_t* padding_modes;
1317    ASSERT_EQ(KM_ERROR_OK,
1318              device()->get_supported_padding_modes(device(), KM_ALGORITHM_RSA, KM_PURPOSE_SIGN,
1319                                                    &padding_modes, &padding_modes_len));
1320
1321    // Try them.
1322    int trial_count = 0;
1323    for (keymaster_padding_t padding_mode : make_vector(padding_modes, padding_modes_len)) {
1324        for (keymaster_digest_t digest : make_vector(digests, digests_len)) {
1325            if (digest != KM_DIGEST_NONE && padding_mode == KM_PAD_NONE)
1326                // Digesting requires padding
1327                continue;
1328
1329            // Compute key & message size that will work.
1330            size_t key_bits = 0;
1331            size_t message_len = 1000;
1332
1333            if (digest == KM_DIGEST_NONE) {
1334                key_bits = 256;
1335                switch (padding_mode) {
1336                case KM_PAD_NONE:
1337                    // Match key size.
1338                    message_len = key_bits / 8;
1339                    break;
1340                case KM_PAD_RSA_PKCS1_1_5_SIGN:
1341                    message_len = key_bits / 8 - 11;
1342                    break;
1343                case KM_PAD_RSA_PSS:
1344                    // PSS requires a digest.
1345                    continue;
1346                default:
1347                    FAIL() << "Missing padding";
1348                    break;
1349                }
1350            } else {
1351                size_t digest_bits;
1352                switch (digest) {
1353                case KM_DIGEST_MD5:
1354                    digest_bits = 128;
1355                    break;
1356                case KM_DIGEST_SHA1:
1357                    digest_bits = 160;
1358                    break;
1359                case KM_DIGEST_SHA_2_224:
1360                    digest_bits = 224;
1361                    break;
1362                case KM_DIGEST_SHA_2_256:
1363                    digest_bits = 256;
1364                    break;
1365                case KM_DIGEST_SHA_2_384:
1366                    digest_bits = 384;
1367                    break;
1368                case KM_DIGEST_SHA_2_512:
1369                    digest_bits = 512;
1370                    break;
1371                default:
1372                    FAIL() << "Missing digest";
1373                }
1374
1375                switch (padding_mode) {
1376                case KM_PAD_RSA_PKCS1_1_5_SIGN:
1377                    key_bits = digest_bits + 8 * (11 + 19);
1378                    break;
1379                case KM_PAD_RSA_PSS:
1380                    key_bits = digest_bits + 22 * 8;
1381                    break;
1382                default:
1383                    FAIL() << "Missing padding";
1384                    break;
1385                }
1386            }
1387
1388            GenerateKey(AuthorizationSetBuilder()
1389                            .RsaSigningKey(key_bits, 3)
1390                            .Digest(digest)
1391                            .Padding(padding_mode));
1392            string message(message_len, 'a');
1393            string signature;
1394            SignMessage(message, &signature, digest, padding_mode);
1395            VerifyMessage(message, signature, digest, padding_mode);
1396            ++trial_count;
1397        }
1398    }
1399
1400    free(padding_modes);
1401    free(digests);
1402
1403    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1404        EXPECT_EQ(trial_count * 4, GetParam()->keymaster0_calls());
1405}
1406
1407TEST_P(VerificationOperationsTest, EcdsaSuccess) {
1408    ASSERT_EQ(KM_ERROR_OK,
1409              GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
1410    string message = "12345678901234567890123456789012";
1411    string signature;
1412    SignMessage(message, &signature, KM_DIGEST_NONE);
1413    VerifyMessage(message, signature, KM_DIGEST_NONE);
1414
1415    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1416        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1417}
1418
1419TEST_P(VerificationOperationsTest, EcdsaTooShort) {
1420    ASSERT_EQ(KM_ERROR_OK,
1421              GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
1422    string message = "12345678901234567890";
1423    string signature;
1424    SignMessage(message, &signature, KM_DIGEST_NONE);
1425    VerifyMessage(message, signature, KM_DIGEST_NONE);
1426
1427    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1428        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1429}
1430
1431TEST_P(VerificationOperationsTest, EcdsaTooLong) {
1432    ASSERT_EQ(KM_ERROR_OK,
1433              GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE)));
1434    string message = "1234567890123456789012345678901234";
1435    string signature;
1436
1437    AuthorizationSet begin_params(client_params());
1438    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
1439    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params));
1440    string output;
1441    size_t input_consumed;
1442    EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &output, &input_consumed));
1443
1444    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1445        EXPECT_EQ(2, GetParam()->keymaster0_calls());
1446}
1447
1448TEST_P(VerificationOperationsTest, EcdsaSlightlyTooLong) {
1449    ASSERT_EQ(KM_ERROR_OK,
1450              GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(521).Digest(KM_DIGEST_NONE)));
1451
1452    string message(66, 'a');
1453    string signature;
1454    SignMessage(message, &signature, KM_DIGEST_NONE);
1455    VerifyMessage(message, signature, KM_DIGEST_NONE);
1456
1457    // Modifying low-order bits doesn't matter, because they didn't get signed.  Ugh.
1458    message[65] ^= 7;
1459    VerifyMessage(message, signature, KM_DIGEST_NONE);
1460
1461    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1462        EXPECT_EQ(5, GetParam()->keymaster0_calls());
1463}
1464
1465TEST_P(VerificationOperationsTest, EcdsaSha256Success) {
1466    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1467                                           .EcdsaSigningKey(256)
1468                                           .Digest(KM_DIGEST_SHA_2_256)
1469                                           .Digest(KM_DIGEST_NONE)));
1470    string message = "12345678901234567890123456789012";
1471    string signature;
1472    SignMessage(message, &signature, KM_DIGEST_SHA_2_256);
1473    VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
1474
1475    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1476        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1477
1478    // Just for giggles, try verifying with the wrong digest.
1479    AuthorizationSet begin_params(client_params());
1480    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
1481    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1482
1483    string result;
1484    size_t input_consumed;
1485    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1486    EXPECT_EQ(message.size(), input_consumed);
1487    EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(signature, &result));
1488}
1489
1490TEST_P(VerificationOperationsTest, HmacSha1Success) {
1491    GenerateKey(AuthorizationSetBuilder()
1492                    .HmacKey(128)
1493                    .Digest(KM_DIGEST_SHA1)
1494                    .Authorization(TAG_MIN_MAC_LENGTH, 128));
1495    string message = "123456789012345678901234567890123456789012345678";
1496    string signature;
1497    MacMessage(message, &signature, 160);
1498    VerifyMac(message, signature);
1499
1500    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1501}
1502
1503TEST_P(VerificationOperationsTest, HmacSha224Success) {
1504    GenerateKey(AuthorizationSetBuilder()
1505                    .HmacKey(128)
1506                    .Digest(KM_DIGEST_SHA_2_224)
1507                    .Authorization(TAG_MIN_MAC_LENGTH, 128));
1508    string message = "123456789012345678901234567890123456789012345678";
1509    string signature;
1510    MacMessage(message, &signature, 224);
1511    VerifyMac(message, signature);
1512
1513    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1514}
1515
1516TEST_P(VerificationOperationsTest, HmacSha256Success) {
1517    GenerateKey(AuthorizationSetBuilder()
1518                    .HmacKey(128)
1519                    .Digest(KM_DIGEST_SHA_2_256)
1520                    .Authorization(TAG_MIN_MAC_LENGTH, 128));
1521    string message = "123456789012345678901234567890123456789012345678";
1522    string signature;
1523    MacMessage(message, &signature, 256);
1524    VerifyMac(message, signature);
1525
1526    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1527}
1528
1529TEST_P(VerificationOperationsTest, HmacSha256TooShortMac) {
1530    GenerateKey(AuthorizationSetBuilder()
1531                    .HmacKey(128)
1532                    .Digest(KM_DIGEST_SHA_2_256)
1533                    .Authorization(TAG_MIN_MAC_LENGTH, 128));
1534    string message = "123456789012345678901234567890123456789012345678";
1535    string signature;
1536    MacMessage(message, &signature, 256);
1537
1538    // Shorten to 128 bits, should still work.
1539    signature.resize(128 / 8);
1540    VerifyMac(message, signature);
1541
1542    // Drop one more byte.
1543    signature.resize(signature.length() - 1);
1544
1545    AuthorizationSet begin_params(client_params());
1546    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params));
1547    string result;
1548    size_t input_consumed;
1549    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1550    EXPECT_EQ(KM_ERROR_INVALID_MAC_LENGTH, FinishOperation(signature, &result));
1551
1552    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1553}
1554
1555TEST_P(VerificationOperationsTest, HmacSha384Success) {
1556    GenerateKey(AuthorizationSetBuilder()
1557                    .HmacKey(128)
1558                    .Digest(KM_DIGEST_SHA_2_384)
1559                    .Authorization(TAG_MIN_MAC_LENGTH, 128));
1560    string message = "123456789012345678901234567890123456789012345678";
1561    string signature;
1562    MacMessage(message, &signature, 384);
1563    VerifyMac(message, signature);
1564
1565    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1566}
1567
1568TEST_P(VerificationOperationsTest, HmacSha512Success) {
1569    GenerateKey(AuthorizationSetBuilder()
1570                    .HmacKey(128)
1571                    .Digest(KM_DIGEST_SHA_2_512)
1572                    .Authorization(TAG_MIN_MAC_LENGTH, 128));
1573    string message = "123456789012345678901234567890123456789012345678";
1574    string signature;
1575    MacMessage(message, &signature, 512);
1576    VerifyMac(message, signature);
1577
1578    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1579}
1580
1581typedef Keymaster1Test ExportKeyTest;
1582INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params);
1583
1584TEST_P(ExportKeyTest, RsaSuccess) {
1585    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1586                                           .RsaSigningKey(256, 3)
1587                                           .Digest(KM_DIGEST_NONE)
1588                                           .Padding(KM_PAD_NONE)));
1589    string export_data;
1590    ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1591    EXPECT_GT(export_data.length(), 0U);
1592
1593    // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
1594
1595    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1596        EXPECT_EQ(2, GetParam()->keymaster0_calls());
1597}
1598
1599TEST_P(ExportKeyTest, EcdsaSuccess) {
1600    ASSERT_EQ(KM_ERROR_OK,
1601              GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
1602    string export_data;
1603    ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1604    EXPECT_GT(export_data.length(), 0U);
1605
1606    // TODO(swillden): Verify that the exported key is actually usable to verify signatures.
1607
1608    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1609        EXPECT_EQ(2, GetParam()->keymaster0_calls());
1610}
1611
1612TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) {
1613    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1614                                           .RsaSigningKey(256, 3)
1615                                           .Digest(KM_DIGEST_NONE)
1616                                           .Padding(KM_PAD_NONE)));
1617    string export_data;
1618    ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1619
1620    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1621        EXPECT_EQ(2, GetParam()->keymaster0_calls());
1622}
1623
1624TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) {
1625    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1626                                           .RsaSigningKey(256, 3)
1627                                           .Digest(KM_DIGEST_NONE)
1628                                           .Padding(KM_PAD_NONE)));
1629    corrupt_key_blob();
1630    string export_data;
1631    ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1632
1633    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1634        EXPECT_EQ(2, GetParam()->keymaster0_calls());
1635}
1636
1637TEST_P(ExportKeyTest, AesKeyExportFails) {
1638    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128)));
1639    string export_data;
1640
1641    EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data));
1642    EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data));
1643    EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data));
1644
1645    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1646}
1647
1648static string read_file(const string& file_name) {
1649    ifstream file_stream(file_name, std::ios::binary);
1650    istreambuf_iterator<char> file_begin(file_stream);
1651    istreambuf_iterator<char> file_end;
1652    return string(file_begin, file_end);
1653}
1654
1655typedef Keymaster1Test ImportKeyTest;
1656INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params);
1657
1658TEST_P(ImportKeyTest, RsaSuccess) {
1659    string pk8_key = read_file("rsa_privkey_pk8.der");
1660    ASSERT_EQ(633U, pk8_key.size());
1661
1662    ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1663                                         .RsaSigningKey(1024, 65537)
1664                                         .Digest(KM_DIGEST_NONE)
1665                                         .Padding(KM_PAD_NONE),
1666                                     KM_KEY_FORMAT_PKCS8, pk8_key));
1667
1668    // Check values derived from the key.
1669    EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1670                                                                             : sw_enforced(),
1671                         TAG_ALGORITHM, KM_ALGORITHM_RSA));
1672    EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1673                                                                             : sw_enforced(),
1674                         TAG_KEY_SIZE, 1024));
1675    EXPECT_TRUE(contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA) ? hw_enforced()
1676                                                                             : sw_enforced(),
1677                         TAG_RSA_PUBLIC_EXPONENT, 65537U));
1678
1679    // And values provided by AndroidKeymaster
1680    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1681        EXPECT_TRUE(contains(hw_enforced(), TAG_ORIGIN, KM_ORIGIN_UNKNOWN));
1682    else
1683        EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1684    EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1685
1686    string message(1024 / 8, 'a');
1687    string signature;
1688    SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
1689    VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
1690
1691    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1692        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1693}
1694
1695TEST_P(ImportKeyTest, OldApiRsaSuccess) {
1696    string pk8_key = read_file("rsa_privkey_pk8.der");
1697    ASSERT_EQ(633U, pk8_key.size());
1698
1699    // NOTE: This will break when the keymaster0 APIs are removed from keymaster1.  But at that
1700    // point softkeymaster will no longer support keymaster0 APIs anyway.
1701    uint8_t* key_blob;
1702    size_t key_blob_length;
1703    ASSERT_EQ(0,
1704              device()->import_keypair(device(), reinterpret_cast<const uint8_t*>(pk8_key.data()),
1705                                       pk8_key.size(), &key_blob, &key_blob_length));
1706    set_key_blob(key_blob, key_blob_length);
1707
1708    string message(1024 / 8, 'a');
1709    AuthorizationSet begin_params;  // Don't use client data.
1710    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
1711    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
1712    AuthorizationSet update_params;
1713    AuthorizationSet output_params;
1714    string signature =
1715        ProcessMessage(KM_PURPOSE_SIGN, message, begin_params, update_params, &output_params);
1716    ProcessMessage(KM_PURPOSE_VERIFY, message, signature, begin_params, update_params,
1717                   &output_params);
1718
1719    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1720        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1721}
1722
1723TEST_P(ImportKeyTest, RsaKeySizeMismatch) {
1724    string pk8_key = read_file("rsa_privkey_pk8.der");
1725    ASSERT_EQ(633U, pk8_key.size());
1726    ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
1727              ImportKey(AuthorizationSetBuilder()
1728                            .RsaSigningKey(2048 /* Doesn't match key */, 3)
1729                            .Digest(KM_DIGEST_NONE)
1730                            .Padding(KM_PAD_NONE),
1731                        KM_KEY_FORMAT_PKCS8, pk8_key));
1732
1733    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1734}
1735
1736TEST_P(ImportKeyTest, RsaPublicExponenMismatch) {
1737    string pk8_key = read_file("rsa_privkey_pk8.der");
1738    ASSERT_EQ(633U, pk8_key.size());
1739    ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
1740              ImportKey(AuthorizationSetBuilder()
1741                            .RsaSigningKey(256, 3 /* Doesnt' match key */)
1742                            .Digest(KM_DIGEST_NONE)
1743                            .Padding(KM_PAD_NONE),
1744                        KM_KEY_FORMAT_PKCS8, pk8_key));
1745
1746    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1747}
1748
1749TEST_P(ImportKeyTest, EcdsaSuccess) {
1750    string pk8_key = read_file("ec_privkey_pk8.der");
1751    ASSERT_EQ(138U, pk8_key.size());
1752
1753    ASSERT_EQ(KM_ERROR_OK,
1754              ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1755                        KM_KEY_FORMAT_PKCS8, pk8_key));
1756
1757    // Check values derived from the key.
1758    EXPECT_TRUE(
1759        contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1760                 TAG_ALGORITHM, KM_ALGORITHM_EC));
1761    EXPECT_TRUE(
1762        contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1763                 TAG_KEY_SIZE, 256));
1764
1765    // And values provided by AndroidKeymaster
1766    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1767        EXPECT_TRUE(contains(hw_enforced(), TAG_ORIGIN, KM_ORIGIN_UNKNOWN));
1768    else
1769        EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1770    EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1771
1772    string message(32, 'a');
1773    string signature;
1774    SignMessage(message, &signature, KM_DIGEST_NONE);
1775    VerifyMessage(message, signature, KM_DIGEST_NONE);
1776
1777    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1778        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1779}
1780
1781TEST_P(ImportKeyTest, EcdsaSizeSpecified) {
1782    string pk8_key = read_file("ec_privkey_pk8.der");
1783    ASSERT_EQ(138U, pk8_key.size());
1784
1785    ASSERT_EQ(KM_ERROR_OK,
1786              ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE),
1787                        KM_KEY_FORMAT_PKCS8, pk8_key));
1788
1789    // Check values derived from the key.
1790    EXPECT_TRUE(
1791        contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1792                 TAG_ALGORITHM, KM_ALGORITHM_EC));
1793    EXPECT_TRUE(
1794        contains(GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC) ? hw_enforced() : sw_enforced(),
1795                 TAG_KEY_SIZE, 256));
1796
1797    // And values provided by AndroidKeymaster
1798    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1799        EXPECT_TRUE(contains(hw_enforced(), TAG_ORIGIN, KM_ORIGIN_UNKNOWN));
1800    else
1801        EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1802    EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1803
1804    string message(32, 'a');
1805    string signature;
1806    SignMessage(message, &signature, KM_DIGEST_NONE);
1807    VerifyMessage(message, signature, KM_DIGEST_NONE);
1808
1809    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
1810        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1811}
1812
1813TEST_P(ImportKeyTest, EcdsaSizeMismatch) {
1814    string pk8_key = read_file("ec_privkey_pk8.der");
1815    ASSERT_EQ(138U, pk8_key.size());
1816    ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH,
1817              ImportKey(AuthorizationSetBuilder()
1818                            .EcdsaSigningKey(224 /* Doesn't match key */)
1819                            .Digest(KM_DIGEST_NONE),
1820                        KM_KEY_FORMAT_PKCS8, pk8_key));
1821
1822    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1823}
1824
1825TEST_P(ImportKeyTest, AesKeySuccess) {
1826    char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1827    string key(key_data, sizeof(key_data));
1828    ASSERT_EQ(KM_ERROR_OK,
1829              ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization(
1830                            TAG_PADDING, KM_PAD_PKCS7),
1831                        KM_KEY_FORMAT_RAW, key));
1832
1833    EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1834    EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1835
1836    string message = "Hello World!";
1837    string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
1838    string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
1839    EXPECT_EQ(message, plaintext);
1840
1841    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1842}
1843
1844TEST_P(ImportKeyTest, HmacSha256KeySuccess) {
1845    char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1846    string key(key_data, sizeof(key_data));
1847    ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
1848                                         .HmacKey(sizeof(key_data) * 8)
1849                                         .Digest(KM_DIGEST_SHA_2_256)
1850                                         .Authorization(TAG_MIN_MAC_LENGTH, 256),
1851                                     KM_KEY_FORMAT_RAW, key));
1852
1853    EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED));
1854    EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME));
1855
1856    string message = "Hello World!";
1857    string signature;
1858    MacMessage(message, &signature, 256);
1859    VerifyMessage(message, signature, KM_DIGEST_SHA_2_256);
1860
1861    EXPECT_EQ(0, GetParam()->keymaster0_calls());
1862}
1863
1864typedef Keymaster1Test EncryptionOperationsTest;
1865INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params);
1866
1867TEST_P(EncryptionOperationsTest, RsaNoPaddingSuccess) {
1868    ASSERT_EQ(KM_ERROR_OK,
1869              GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1870
1871    string message = "12345678901234567890123456789012";
1872    string ciphertext1 = EncryptMessage(string(message), KM_PAD_NONE);
1873    EXPECT_EQ(256U / 8, ciphertext1.size());
1874
1875    string ciphertext2 = EncryptMessage(string(message), KM_PAD_NONE);
1876    EXPECT_EQ(256U / 8, ciphertext2.size());
1877
1878    // Unpadded RSA is deterministic
1879    EXPECT_EQ(ciphertext1, ciphertext2);
1880
1881    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1882        EXPECT_EQ(3, GetParam()->keymaster0_calls());
1883}
1884
1885TEST_P(EncryptionOperationsTest, RsaNoPaddingTooShort) {
1886    ASSERT_EQ(KM_ERROR_OK,
1887              GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1888
1889    string message = "1";
1890
1891    string ciphertext = EncryptMessage(message, KM_PAD_NONE);
1892    EXPECT_EQ(256U / 8, ciphertext.size());
1893
1894    string expected_plaintext = string(256 / 8 - 1, 0) + message;
1895    string plaintext = DecryptMessage(ciphertext, KM_PAD_NONE);
1896
1897    EXPECT_EQ(expected_plaintext, plaintext);
1898
1899    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1900        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1901}
1902
1903TEST_P(EncryptionOperationsTest, RsaNoPaddingTooLong) {
1904    ASSERT_EQ(KM_ERROR_OK,
1905              GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1906
1907    string message = "123456789012345678901234567890123";
1908
1909    AuthorizationSet begin_params(client_params());
1910    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
1911    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1912
1913    string result;
1914    size_t input_consumed;
1915    EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &result, &input_consumed));
1916
1917    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1918        EXPECT_EQ(2, GetParam()->keymaster0_calls());
1919}
1920
1921TEST_P(EncryptionOperationsTest, RsaNoPaddingLargerThanModulus) {
1922    ASSERT_EQ(KM_ERROR_OK,
1923              GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE)));
1924
1925    string exported;
1926    ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &exported));
1927
1928    const uint8_t* p = reinterpret_cast<const uint8_t*>(exported.data());
1929    unique_ptr<EVP_PKEY, EVP_PKEY_Delete> pkey(
1930        d2i_PUBKEY(nullptr /* alloc new */, &p, exported.size()));
1931    unique_ptr<RSA, RSA_Delete> rsa(EVP_PKEY_get1_RSA(pkey.get()));
1932
1933    size_t modulus_len = BN_num_bytes(rsa->n);
1934    ASSERT_EQ(256U / 8, modulus_len);
1935    unique_ptr<uint8_t> modulus_buf(new uint8_t[modulus_len]);
1936    BN_bn2bin(rsa->n, modulus_buf.get());
1937
1938    // The modulus is too big to encrypt.
1939    string message(reinterpret_cast<const char*>(modulus_buf.get()), modulus_len);
1940
1941    AuthorizationSet begin_params(client_params());
1942    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
1943    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1944
1945    string result;
1946    size_t input_consumed;
1947    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1948    EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&result));
1949
1950    // One smaller than the modulus is okay.
1951    BN_sub(rsa->n, rsa->n, BN_value_one());
1952    modulus_len = BN_num_bytes(rsa->n);
1953    ASSERT_EQ(256U / 8, modulus_len);
1954    BN_bn2bin(rsa->n, modulus_buf.get());
1955    message = string(reinterpret_cast<const char*>(modulus_buf.get()), modulus_len);
1956    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
1957    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
1958    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&result));
1959
1960    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1961        EXPECT_EQ(4, GetParam()->keymaster0_calls());
1962}
1963
1964TEST_P(EncryptionOperationsTest, RsaOaepSuccess) {
1965    size_t key_size = 768;
1966    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1967                                           .RsaEncryptionKey(key_size, 3)
1968                                           .Padding(KM_PAD_RSA_OAEP)
1969                                           .Digest(KM_DIGEST_SHA_2_256)));
1970
1971    string message = "Hello";
1972    string ciphertext1 = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
1973    EXPECT_EQ(key_size / 8, ciphertext1.size());
1974
1975    string ciphertext2 = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
1976    EXPECT_EQ(key_size / 8, ciphertext2.size());
1977
1978    // OAEP randomizes padding so every result should be different.
1979    EXPECT_NE(ciphertext1, ciphertext2);
1980
1981    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1982        EXPECT_EQ(3, GetParam()->keymaster0_calls());
1983}
1984
1985TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) {
1986    size_t key_size = 768;
1987    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
1988                                           .RsaEncryptionKey(key_size, 3)
1989                                           .Padding(KM_PAD_RSA_OAEP)
1990                                           .Digest(KM_DIGEST_SHA_2_256)));
1991    string message = "Hello World!";
1992    string ciphertext = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
1993    EXPECT_EQ(key_size / 8, ciphertext.size());
1994
1995    string plaintext = DecryptMessage(ciphertext, KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
1996    EXPECT_EQ(message, plaintext);
1997
1998    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
1999        EXPECT_EQ(4, GetParam()->keymaster0_calls());
2000}
2001
2002TEST_P(EncryptionOperationsTest, RsaOaepInvalidDigest) {
2003    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2004                                           .RsaEncryptionKey(512, 3)
2005                                           .Padding(KM_PAD_RSA_OAEP)
2006                                           .Digest(KM_DIGEST_NONE)));
2007    string message = "Hello World!";
2008
2009    AuthorizationSet begin_params(client_params());
2010    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
2011    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);
2012    EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
2013
2014    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2015        EXPECT_EQ(2, GetParam()->keymaster0_calls());
2016}
2017
2018TEST_P(EncryptionOperationsTest, RsaOaepUnauthorizedDigest) {
2019    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2020                                           .RsaEncryptionKey(512, 3)
2021                                           .Padding(KM_PAD_RSA_OAEP)
2022                                           .Digest(KM_DIGEST_SHA_2_256)));
2023    string message = "Hello World!";
2024    // Works because encryption is a public key operation.
2025    EncryptMessage(string(message), KM_DIGEST_SHA1, KM_PAD_RSA_OAEP);
2026
2027    AuthorizationSet begin_params(client_params());
2028    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
2029    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA1);
2030    EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2031
2032    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2033        EXPECT_EQ(3, GetParam()->keymaster0_calls());
2034}
2035
2036TEST_P(EncryptionOperationsTest, RsaOaepDecryptWithWrongDigest) {
2037    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2038                                           .RsaEncryptionKey(768, 3)
2039                                           .Padding(KM_PAD_RSA_OAEP)
2040                                           .Digest(KM_DIGEST_SHA_2_256)
2041                                           .Digest(KM_DIGEST_SHA_2_384)));
2042    string message = "Hello World!";
2043    string ciphertext = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
2044
2045    string result;
2046    size_t input_consumed;
2047    AuthorizationSet begin_params(client_params());
2048    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
2049    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_384);
2050    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2051    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
2052    EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
2053    EXPECT_EQ(0U, result.size());
2054
2055    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2056        EXPECT_EQ(4, GetParam()->keymaster0_calls());
2057}
2058
2059TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) {
2060    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2061                                           .RsaEncryptionKey(512, 3)
2062                                           .Padding(KM_PAD_RSA_OAEP)
2063                                           .Digest(KM_DIGEST_SHA1)));
2064    string message = "12345678901234567890123";
2065    string result;
2066    size_t input_consumed;
2067
2068    AuthorizationSet begin_params(client_params());
2069    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
2070    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA1);
2071    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
2072    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
2073    EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
2074    EXPECT_EQ(0U, result.size());
2075
2076    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2077        EXPECT_EQ(2, GetParam()->keymaster0_calls());
2078}
2079
2080TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) {
2081    size_t key_size = 768;
2082    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2083                                           .RsaEncryptionKey(768, 3)
2084                                           .Padding(KM_PAD_RSA_OAEP)
2085                                           .Digest(KM_DIGEST_SHA_2_256)));
2086    string message = "Hello World!";
2087    string ciphertext = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP);
2088    EXPECT_EQ(key_size / 8, ciphertext.size());
2089
2090    // Corrupt the ciphertext
2091    ciphertext[key_size / 8 / 2]++;
2092
2093    string result;
2094    size_t input_consumed;
2095    AuthorizationSet begin_params(client_params());
2096    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP);
2097    begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256);
2098    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2099    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
2100    EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
2101    EXPECT_EQ(0U, result.size());
2102
2103    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2104        EXPECT_EQ(4, GetParam()->keymaster0_calls());
2105}
2106
2107TEST_P(EncryptionOperationsTest, RsaPkcs1Success) {
2108    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
2109                               KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
2110    string message = "Hello World!";
2111    string ciphertext1 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
2112    EXPECT_EQ(512U / 8, ciphertext1.size());
2113
2114    string ciphertext2 = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
2115    EXPECT_EQ(512U / 8, ciphertext2.size());
2116
2117    // PKCS1 v1.5 randomizes padding so every result should be different.
2118    EXPECT_NE(ciphertext1, ciphertext2);
2119
2120    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2121        EXPECT_EQ(3, GetParam()->keymaster0_calls());
2122}
2123
2124TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) {
2125    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
2126                               KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
2127    string message = "Hello World!";
2128    string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
2129    EXPECT_EQ(512U / 8, ciphertext.size());
2130
2131    string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
2132    EXPECT_EQ(message, plaintext);
2133
2134    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2135        EXPECT_EQ(4, GetParam()->keymaster0_calls());
2136}
2137
2138TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) {
2139    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
2140                               KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
2141    string message = "123456789012345678901234567890123456789012345678901234";
2142    string result;
2143    size_t input_consumed;
2144
2145    AuthorizationSet begin_params(client_params());
2146    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
2147    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
2148    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
2149    EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&result));
2150    EXPECT_EQ(0U, result.size());
2151
2152    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2153        EXPECT_EQ(2, GetParam()->keymaster0_calls());
2154}
2155
2156TEST_P(EncryptionOperationsTest, RsaPkcs1InvalidDigest) {
2157    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2158                                           .RsaEncryptionKey(512, 3)
2159                                           .Padding(KM_PAD_RSA_PKCS1_1_5_ENCRYPT)
2160                                           .Digest(KM_DIGEST_NONE)));
2161    string message = "Hello World!";
2162    string result;
2163
2164    AuthorizationSet begin_params(client_params());
2165    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
2166    begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE);  // Any digest is invalid
2167    EXPECT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
2168
2169    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2170        EXPECT_EQ(2, GetParam()->keymaster0_calls());
2171}
2172
2173TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) {
2174    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding(
2175                               KM_PAD_RSA_PKCS1_1_5_ENCRYPT)));
2176    string message = "Hello World!";
2177    string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
2178    EXPECT_EQ(512U / 8, ciphertext.size());
2179
2180    // Corrupt the ciphertext
2181    ciphertext[512 / 8 / 2]++;
2182
2183    string result;
2184    size_t input_consumed;
2185    AuthorizationSet begin_params(client_params());
2186    begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT);
2187    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2188    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed));
2189    EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result));
2190    EXPECT_EQ(0U, result.size());
2191
2192    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2193        EXPECT_EQ(4, GetParam()->keymaster0_calls());
2194}
2195
2196TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) {
2197    ASSERT_EQ(KM_ERROR_OK,
2198              GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3).Padding(KM_PAD_NONE)));
2199
2200    AuthorizationSet begin_params(client_params());
2201    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2202    ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2203
2204    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_RSA))
2205        EXPECT_EQ(2, GetParam()->keymaster0_calls());
2206}
2207
2208TEST_P(EncryptionOperationsTest, EcdsaEncrypt) {
2209    ASSERT_EQ(KM_ERROR_OK,
2210              GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE)));
2211    ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
2212    ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
2213
2214    if (GetParam()->algorithm_in_hardware(KM_ALGORITHM_EC))
2215        EXPECT_EQ(3, GetParam()->keymaster0_calls());
2216}
2217
2218TEST_P(EncryptionOperationsTest, HmacEncrypt) {
2219    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2220                                           .HmacKey(128)
2221                                           .Digest(KM_DIGEST_SHA_2_256)
2222                                           .Padding(KM_PAD_NONE)
2223                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
2224    ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT));
2225    ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT));
2226
2227    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2228}
2229
2230TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) {
2231    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2232                                           .AesEncryptionKey(128)
2233                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
2234                                           .Padding(KM_PAD_NONE)));
2235    // Two-block message.
2236    string message = "12345678901234567890123456789012";
2237    string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
2238    EXPECT_EQ(message.size(), ciphertext1.size());
2239
2240    string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE);
2241    EXPECT_EQ(message.size(), ciphertext2.size());
2242
2243    // ECB is deterministic.
2244    EXPECT_EQ(ciphertext1, ciphertext2);
2245
2246    string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE);
2247    EXPECT_EQ(message, plaintext);
2248
2249    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2250}
2251
2252TEST_P(EncryptionOperationsTest, AesEcbNotAuthorized) {
2253    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2254                                           .AesEncryptionKey(128)
2255                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2256                                           .Padding(KM_PAD_NONE)));
2257    // Two-block message.
2258    string message = "12345678901234567890123456789012";
2259    AuthorizationSet begin_params(client_params());
2260    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
2261    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2262    EXPECT_EQ(KM_ERROR_INCOMPATIBLE_BLOCK_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
2263
2264    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2265}
2266
2267TEST_P(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) {
2268    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2269                                           .AesEncryptionKey(128)
2270                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
2271                                           .Padding(KM_PAD_NONE)));
2272    // Message is slightly shorter than two blocks.
2273    string message = "1234567890123456789012345678901";
2274
2275    AuthorizationSet begin_params(client_params());
2276    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
2277    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2278    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
2279    string ciphertext;
2280    size_t input_consumed;
2281    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &ciphertext, &input_consumed));
2282    EXPECT_EQ(message.size(), input_consumed);
2283    EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(&ciphertext));
2284
2285    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2286}
2287
2288TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) {
2289    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2290                                           .AesEncryptionKey(128)
2291                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
2292                                           .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
2293
2294    // Try various message lengths; all should work.
2295    for (size_t i = 0; i < 32; ++i) {
2296        string message(i, 'a');
2297        string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
2298        EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
2299        string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7);
2300        EXPECT_EQ(message, plaintext);
2301    }
2302
2303    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2304}
2305
2306TEST_P(EncryptionOperationsTest, AesEcbNoPaddingKeyWithPkcs7Padding) {
2307    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2308                                           .AesEncryptionKey(128)
2309                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
2310                                           .Authorization(TAG_PADDING, KM_PAD_NONE)));
2311
2312    // Try various message lengths; all should fail.
2313    for (size_t i = 0; i < 32; ++i) {
2314        AuthorizationSet begin_params(client_params());
2315        begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
2316        begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
2317        EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE,
2318                  BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
2319    }
2320
2321    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2322}
2323
2324TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) {
2325    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2326                                           .AesEncryptionKey(128)
2327                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB)
2328                                           .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
2329
2330    string message = "a";
2331    string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7);
2332    EXPECT_EQ(16U, ciphertext.size());
2333    EXPECT_NE(ciphertext, message);
2334    ++ciphertext[ciphertext.size() / 2];
2335
2336    AuthorizationSet begin_params(client_params());
2337    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
2338    begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7);
2339    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2340    string plaintext;
2341    size_t input_consumed;
2342    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed));
2343    EXPECT_EQ(ciphertext.size(), input_consumed);
2344    EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext));
2345
2346    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2347}
2348
2349TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) {
2350    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2351                                           .AesEncryptionKey(128)
2352                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
2353                                           .Padding(KM_PAD_NONE)));
2354    string message = "123";
2355    string iv1;
2356    string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1);
2357    EXPECT_EQ(message.size(), ciphertext1.size());
2358    EXPECT_EQ(16U, iv1.size());
2359
2360    string iv2;
2361    string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2);
2362    EXPECT_EQ(message.size(), ciphertext2.size());
2363    EXPECT_EQ(16U, iv2.size());
2364
2365    // IVs should be random, so ciphertexts should differ.
2366    EXPECT_NE(iv1, iv2);
2367    EXPECT_NE(ciphertext1, ciphertext2);
2368
2369    string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1);
2370    EXPECT_EQ(message, plaintext);
2371
2372    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2373}
2374
2375TEST_P(EncryptionOperationsTest, AesCtrIncremental) {
2376    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2377                                           .AesEncryptionKey(128)
2378                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
2379                                           .Padding(KM_PAD_NONE)));
2380
2381    int increment = 15;
2382    string message(239, 'a');
2383    AuthorizationSet input_params(client_params());
2384    input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
2385    input_params.push_back(TAG_PADDING, KM_PAD_NONE);
2386    AuthorizationSet output_params;
2387    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2388
2389    string ciphertext;
2390    size_t input_consumed;
2391    for (size_t i = 0; i < message.size(); i += increment)
2392        EXPECT_EQ(KM_ERROR_OK,
2393                  UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2394    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2395    EXPECT_EQ(message.size(), ciphertext.size());
2396
2397    // Move TAG_NONCE into input_params
2398    input_params.Reinitialize(output_params);
2399    input_params.push_back(client_params());
2400    input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
2401    input_params.push_back(TAG_PADDING, KM_PAD_NONE);
2402    output_params.Clear();
2403
2404    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
2405    string plaintext;
2406    for (size_t i = 0; i < ciphertext.size(); i += increment)
2407        EXPECT_EQ(KM_ERROR_OK,
2408                  UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2409    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2410    EXPECT_EQ(ciphertext.size(), plaintext.size());
2411    EXPECT_EQ(message, plaintext);
2412
2413    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2414}
2415
2416struct AesCtrSp80038aTestVector {
2417    const char* key;
2418    const char* nonce;
2419    const char* plaintext;
2420    const char* ciphertext;
2421};
2422
2423// These test vectors are taken from
2424// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5.
2425static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = {
2426    // AES-128
2427    {
2428        "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2429        "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2430        "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2431        "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff"
2432        "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee",
2433    },
2434    // AES-192
2435    {
2436        "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2437        "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2438        "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2439        "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94"
2440        "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050",
2441    },
2442    // AES-256
2443    {
2444        "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
2445        "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
2446        "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51"
2447        "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
2448        "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5"
2449        "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6",
2450    },
2451};
2452
2453TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) {
2454    for (size_t i = 0; i < 3; i++) {
2455        const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]);
2456        const string key = hex2str(test.key);
2457        const string nonce = hex2str(test.nonce);
2458        const string plaintext = hex2str(test.plaintext);
2459        const string ciphertext = hex2str(test.ciphertext);
2460        CheckAesCtrTestVector(key, nonce, plaintext, ciphertext);
2461    }
2462
2463    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2464}
2465
2466TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) {
2467    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2468                                           .AesEncryptionKey(128)
2469                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
2470                                           .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
2471    AuthorizationSet begin_params(client_params());
2472    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
2473    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2474    EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
2475
2476    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2477}
2478
2479TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) {
2480    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2481                                           .AesEncryptionKey(128)
2482                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
2483                                           .Authorization(TAG_CALLER_NONCE)
2484                                           .Padding(KM_PAD_NONE)));
2485
2486    AuthorizationSet input_params(client_params());
2487    input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
2488    input_params.push_back(TAG_PADDING, KM_PAD_NONE);
2489    input_params.push_back(TAG_NONCE, "123", 3);
2490    EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params));
2491
2492    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2493}
2494
2495TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) {
2496    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2497                                           .AesEncryptionKey(128)
2498                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2499                                           .Padding(KM_PAD_NONE)));
2500    // Two-block message.
2501    string message = "12345678901234567890123456789012";
2502    string iv1;
2503    string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
2504    EXPECT_EQ(message.size(), ciphertext1.size());
2505
2506    string iv2;
2507    string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2);
2508    EXPECT_EQ(message.size(), ciphertext2.size());
2509
2510    // IVs should be random, so ciphertexts should differ.
2511    EXPECT_NE(iv1, iv2);
2512    EXPECT_NE(ciphertext1, ciphertext2);
2513
2514    string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
2515    EXPECT_EQ(message, plaintext);
2516
2517    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2518}
2519
2520TEST_P(EncryptionOperationsTest, AesCallerNonce) {
2521    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2522                                           .AesEncryptionKey(128)
2523                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2524                                           .Authorization(TAG_CALLER_NONCE)
2525                                           .Padding(KM_PAD_NONE)));
2526    string message = "12345678901234567890123456789012";
2527    string iv1;
2528    // Don't specify nonce, should get a random one.
2529    string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
2530    EXPECT_EQ(message.size(), ciphertext1.size());
2531    EXPECT_EQ(16U, iv1.size());
2532
2533    string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
2534    EXPECT_EQ(message, plaintext);
2535
2536    // Now specify a nonce, should also work.
2537    AuthorizationSet input_params(client_params());
2538    AuthorizationSet update_params;
2539    AuthorizationSet output_params;
2540    input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
2541    input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
2542    input_params.push_back(TAG_PADDING, KM_PAD_NONE);
2543    string ciphertext2 =
2544        ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params);
2545
2546    // Decrypt with correct nonce.
2547    plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2548                               &output_params);
2549    EXPECT_EQ(message, plaintext);
2550
2551    // Now try with wrong nonce.
2552    input_params.Reinitialize(client_params());
2553    input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
2554    input_params.push_back(TAG_PADDING, KM_PAD_NONE);
2555    input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16);
2556    plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params,
2557                               &output_params);
2558    EXPECT_NE(message, plaintext);
2559
2560    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2561}
2562
2563TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) {
2564    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2565                                           .AesEncryptionKey(128)
2566                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2567                                           .Padding(KM_PAD_NONE)));
2568
2569    string message = "12345678901234567890123456789012";
2570    string iv1;
2571    // Don't specify nonce, should get a random one.
2572    string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1);
2573    EXPECT_EQ(message.size(), ciphertext1.size());
2574    EXPECT_EQ(16U, iv1.size());
2575
2576    string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1);
2577    EXPECT_EQ(message, plaintext);
2578
2579    // Now specify a nonce, should fail.
2580    AuthorizationSet input_params(client_params());
2581    AuthorizationSet update_params;
2582    AuthorizationSet output_params;
2583    input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16);
2584    input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
2585    input_params.push_back(TAG_PADDING, KM_PAD_NONE);
2586
2587    EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
2588              BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2589
2590    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2591}
2592
2593TEST_P(EncryptionOperationsTest, AesCbcIncrementalNoPadding) {
2594    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2595                                           .AesEncryptionKey(128)
2596                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2597                                           .Padding(KM_PAD_NONE)));
2598
2599    int increment = 15;
2600    string message(240, 'a');
2601    AuthorizationSet input_params(client_params());
2602    input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
2603    input_params.push_back(TAG_PADDING, KM_PAD_NONE);
2604    AuthorizationSet output_params;
2605    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params));
2606
2607    string ciphertext;
2608    size_t input_consumed;
2609    for (size_t i = 0; i < message.size(); i += increment)
2610        EXPECT_EQ(KM_ERROR_OK,
2611                  UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed));
2612    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2613    EXPECT_EQ(message.size(), ciphertext.size());
2614
2615    // Move TAG_NONCE into input_params
2616    input_params.Reinitialize(output_params);
2617    input_params.push_back(client_params());
2618    input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC);
2619    input_params.push_back(TAG_PADDING, KM_PAD_NONE);
2620    output_params.Clear();
2621
2622    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params));
2623    string plaintext;
2624    for (size_t i = 0; i < ciphertext.size(); i += increment)
2625        EXPECT_EQ(KM_ERROR_OK,
2626                  UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed));
2627    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2628    EXPECT_EQ(ciphertext.size(), plaintext.size());
2629    EXPECT_EQ(message, plaintext);
2630
2631    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2632}
2633
2634TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) {
2635    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2636                                           .AesEncryptionKey(128)
2637                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC)
2638                                           .Authorization(TAG_PADDING, KM_PAD_PKCS7)));
2639
2640    // Try various message lengths; all should work.
2641    for (size_t i = 0; i < 32; ++i) {
2642        string message(i, 'a');
2643        string iv;
2644        string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv);
2645        EXPECT_EQ(i + 16 - (i % 16), ciphertext.size());
2646        string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv);
2647        EXPECT_EQ(message, plaintext);
2648    }
2649
2650    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2651}
2652
2653TEST_P(EncryptionOperationsTest, AesGcmRoundTripSuccess) {
2654    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2655                                           .AesEncryptionKey(128)
2656                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2657                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
2658                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
2659    string aad = "foobar";
2660    string message = "123456789012345678901234567890123456";
2661    AuthorizationSet begin_params(client_params());
2662    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2663    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2664    begin_params.push_back(TAG_MAC_LENGTH, 128);
2665
2666    AuthorizationSet update_params;
2667    update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
2668
2669    // Encrypt
2670    AuthorizationSet begin_out_params;
2671    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2672    string ciphertext;
2673    size_t input_consumed;
2674    AuthorizationSet update_out_params;
2675    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2676                                           &input_consumed));
2677    EXPECT_EQ(message.size(), input_consumed);
2678    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2679
2680    // Grab nonce
2681    EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2682    begin_params.push_back(begin_out_params);
2683
2684    // Decrypt.
2685    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2686    string plaintext;
2687    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2688                                           &plaintext, &input_consumed));
2689    EXPECT_EQ(ciphertext.size(), input_consumed);
2690    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2691
2692    EXPECT_EQ(message, plaintext);
2693    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2694}
2695
2696TEST_P(EncryptionOperationsTest, AesGcmTooShortTag) {
2697    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2698                                           .AesEncryptionKey(128)
2699                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2700                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
2701                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
2702    string aad = "foobar";
2703    string message = "123456789012345678901234567890123456";
2704    AuthorizationSet begin_params(client_params());
2705    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2706    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2707    begin_params.push_back(TAG_MAC_LENGTH, 96);
2708
2709    AuthorizationSet update_params;
2710    update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
2711
2712    AuthorizationSet begin_out_params;
2713    EXPECT_EQ(KM_ERROR_INVALID_MAC_LENGTH,
2714              BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2715
2716    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2717}
2718
2719TEST_P(EncryptionOperationsTest, AesGcmTooShortTagOnDecrypt) {
2720    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2721                                           .AesEncryptionKey(128)
2722                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2723                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
2724                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
2725    string aad = "foobar";
2726    string message = "123456789012345678901234567890123456";
2727    AuthorizationSet begin_params(client_params());
2728    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2729    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2730    begin_params.push_back(TAG_MAC_LENGTH, 128);
2731
2732    AuthorizationSet update_params;
2733    update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
2734
2735    // Encrypt
2736    AuthorizationSet begin_out_params;
2737    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2738    string ciphertext;
2739    size_t input_consumed;
2740    AuthorizationSet update_out_params;
2741    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2742                                           &input_consumed));
2743    EXPECT_EQ(message.size(), input_consumed);
2744    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2745
2746    // Grab nonce
2747    EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2748    begin_params.Reinitialize(client_params());
2749    begin_params.push_back(begin_out_params);
2750    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2751    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2752    begin_params.push_back(TAG_MAC_LENGTH, 96);
2753
2754    // Decrypt.
2755    EXPECT_EQ(KM_ERROR_INVALID_MAC_LENGTH, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2756
2757    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2758}
2759
2760TEST_P(EncryptionOperationsTest, AesGcmCorruptKey) {
2761    uint8_t nonce[] = {
2762        0xb7, 0x94, 0x37, 0xae, 0x08, 0xff, 0x35, 0x5d, 0x7d, 0x8a, 0x4d, 0x0f,
2763    };
2764    uint8_t ciphertext[] = {
2765        0xb3, 0xf6, 0x79, 0x9e, 0x8f, 0x93, 0x26, 0xf2, 0xdf, 0x1e, 0x80, 0xfc, 0xd2, 0xcb, 0x16,
2766        0xd7, 0x8c, 0x9d, 0xc7, 0xcc, 0x14, 0xbb, 0x67, 0x78, 0x62, 0xdc, 0x6c, 0x63, 0x9b, 0x3a,
2767        0x63, 0x38, 0xd2, 0x4b, 0x31, 0x2d, 0x39, 0x89, 0xe5, 0x92, 0x0b, 0x5d, 0xbf, 0xc9, 0x76,
2768        0x76, 0x5e, 0xfb, 0xfe, 0x57, 0xbb, 0x38, 0x59, 0x40, 0xa7, 0xa4, 0x3b, 0xdf, 0x05, 0xbd,
2769        0xda, 0xe3, 0xc9, 0xd6, 0xa2, 0xfb, 0xbd, 0xfc, 0xc0, 0xcb, 0xa0,
2770    };
2771    string ciphertext_str(reinterpret_cast<char*>(ciphertext), sizeof(ciphertext));
2772
2773    AuthorizationSet begin_params(client_params());
2774    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2775    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2776    begin_params.push_back(TAG_MAC_LENGTH, 128);
2777    begin_params.push_back(TAG_NONCE, nonce, sizeof(nonce));
2778
2779    string plaintext;
2780    size_t input_consumed;
2781
2782    // Import correct key and decrypt
2783    uint8_t good_key[] = {
2784        0xba, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d,
2785        0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb,
2786    };
2787    string good_key_str(reinterpret_cast<char*>(good_key), sizeof(good_key));
2788    ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
2789                                         .AesEncryptionKey(128)
2790                                         .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2791                                         .Authorization(TAG_PADDING, KM_PAD_NONE)
2792                                         .Authorization(TAG_CALLER_NONCE)
2793                                         .Authorization(TAG_MIN_MAC_LENGTH, 128),
2794                                     KM_KEY_FORMAT_RAW, good_key_str));
2795    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2796    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext_str, &plaintext, &input_consumed));
2797    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2798
2799    // Import bad key and decrypt
2800    uint8_t bad_key[] = {
2801        0xbb, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d,
2802        0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb,
2803    };
2804    string bad_key_str(reinterpret_cast<char*>(bad_key), sizeof(bad_key));
2805    ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
2806                                         .AesEncryptionKey(128)
2807                                         .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2808                                         .Authorization(TAG_PADDING, KM_PAD_NONE)
2809                                         .Authorization(TAG_MIN_MAC_LENGTH, 128),
2810                                     KM_KEY_FORMAT_RAW, bad_key_str));
2811    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2812    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext_str, &plaintext, &input_consumed));
2813    EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
2814
2815    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2816}
2817
2818TEST_P(EncryptionOperationsTest, AesGcmAadNoData) {
2819    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2820                                           .AesEncryptionKey(128)
2821                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2822                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
2823                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
2824    string aad = "123456789012345678";
2825    string empty_message;
2826    AuthorizationSet begin_params(client_params());
2827    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2828    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2829    begin_params.push_back(TAG_MAC_LENGTH, 128);
2830
2831    AuthorizationSet update_params;
2832    update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
2833
2834    // Encrypt
2835    AuthorizationSet begin_out_params;
2836    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2837    string ciphertext;
2838    size_t input_consumed;
2839    AuthorizationSet update_out_params;
2840    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, empty_message, &update_out_params,
2841                                           &ciphertext, &input_consumed));
2842    EXPECT_EQ(0U, input_consumed);
2843    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2844
2845    // Grab nonce
2846    EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2847    begin_params.push_back(begin_out_params);
2848
2849    // Decrypt.
2850    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2851    string plaintext;
2852    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2853                                           &plaintext, &input_consumed));
2854    EXPECT_EQ(ciphertext.size(), input_consumed);
2855    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2856
2857    EXPECT_EQ(empty_message, plaintext);
2858    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2859}
2860
2861TEST_P(EncryptionOperationsTest, AesGcmIncremental) {
2862    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2863                                           .AesEncryptionKey(128)
2864                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2865                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
2866                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
2867    AuthorizationSet begin_params(client_params());
2868    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2869    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2870    begin_params.push_back(TAG_MAC_LENGTH, 128);
2871
2872    AuthorizationSet update_params;
2873    update_params.push_back(TAG_ASSOCIATED_DATA, "b", 1);
2874
2875    // Encrypt
2876    AuthorizationSet begin_out_params;
2877    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2878    string ciphertext;
2879    size_t input_consumed;
2880    AuthorizationSet update_out_params;
2881
2882    // Send AAD, incrementally
2883    for (int i = 0; i < 1000; ++i) {
2884        EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "", &update_out_params, &ciphertext,
2885                                               &input_consumed));
2886        EXPECT_EQ(0U, input_consumed);
2887        EXPECT_EQ(0U, ciphertext.size());
2888    }
2889
2890    // Now send data, incrementally, no data.
2891    AuthorizationSet empty_params;
2892    for (int i = 0; i < 1000; ++i) {
2893        EXPECT_EQ(KM_ERROR_OK, UpdateOperation(empty_params, "a", &update_out_params, &ciphertext,
2894                                               &input_consumed));
2895        EXPECT_EQ(1U, input_consumed);
2896    }
2897    EXPECT_EQ(1000U, ciphertext.size());
2898
2899    // And finish.
2900    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2901    EXPECT_EQ(1016U, ciphertext.size());
2902
2903    // Grab nonce
2904    EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2905    begin_params.push_back(begin_out_params);
2906
2907    // Decrypt.
2908    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2909    string plaintext;
2910
2911    // Send AAD, incrementally, no data
2912    for (int i = 0; i < 1000; ++i) {
2913        EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "", &update_out_params, &plaintext,
2914                                               &input_consumed));
2915        EXPECT_EQ(0U, input_consumed);
2916        EXPECT_EQ(0U, plaintext.size());
2917    }
2918
2919    // Now send data, incrementally.
2920    for (size_t i = 0; i < ciphertext.length(); ++i) {
2921        EXPECT_EQ(KM_ERROR_OK, UpdateOperation(empty_params, string(ciphertext.data() + i, 1),
2922                                               &update_out_params, &plaintext, &input_consumed));
2923        EXPECT_EQ(1U, input_consumed);
2924    }
2925    EXPECT_EQ(1000U, plaintext.size());
2926    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2927
2928    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2929}
2930
2931TEST_P(EncryptionOperationsTest, AesGcmMultiPartAad) {
2932    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2933                                           .AesEncryptionKey(128)
2934                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2935                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
2936                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
2937    string message = "123456789012345678901234567890123456";
2938    AuthorizationSet begin_params(client_params());
2939    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2940    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2941    begin_params.push_back(TAG_MAC_LENGTH, 128);
2942    AuthorizationSet begin_out_params;
2943
2944    AuthorizationSet update_params;
2945    update_params.push_back(TAG_ASSOCIATED_DATA, "foo", 3);
2946
2947    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
2948
2949    // No data, AAD only.
2950    string ciphertext;
2951    size_t input_consumed;
2952    AuthorizationSet update_out_params;
2953    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "" /* message */, &update_out_params,
2954                                           &ciphertext, &input_consumed));
2955    EXPECT_EQ(0U, input_consumed);
2956
2957    // AAD and data.
2958    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
2959                                           &input_consumed));
2960    EXPECT_EQ(message.size(), input_consumed);
2961    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
2962
2963    // Grab nonce.
2964    EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
2965    begin_params.push_back(begin_out_params);
2966
2967    // Decrypt
2968    update_params.Clear();
2969    update_params.push_back(TAG_ASSOCIATED_DATA, "foofoo", 6);
2970
2971    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params));
2972    string plaintext;
2973    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
2974                                           &plaintext, &input_consumed));
2975    EXPECT_EQ(ciphertext.size(), input_consumed);
2976    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext));
2977
2978    EXPECT_EQ(message, plaintext);
2979    EXPECT_EQ(0, GetParam()->keymaster0_calls());
2980}
2981
2982TEST_P(EncryptionOperationsTest, AesGcmBadAad) {
2983    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
2984                                           .AesEncryptionKey(128)
2985                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
2986                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
2987                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
2988    string message = "12345678901234567890123456789012";
2989    AuthorizationSet begin_params(client_params());
2990    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
2991    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
2992    begin_params.push_back(TAG_MAC_LENGTH, 128);
2993
2994    AuthorizationSet update_params;
2995    update_params.push_back(TAG_ASSOCIATED_DATA, "foobar", 6);
2996
2997    AuthorizationSet finish_params;
2998    AuthorizationSet finish_out_params;
2999
3000    // Encrypt
3001    AuthorizationSet begin_out_params;
3002    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
3003    AuthorizationSet update_out_params;
3004    string ciphertext;
3005    size_t input_consumed;
3006    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
3007                                           &input_consumed));
3008    EXPECT_EQ(message.size(), input_consumed);
3009    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
3010
3011    // Grab nonce
3012    EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
3013    begin_params.push_back(begin_out_params);
3014
3015    update_params.Clear();
3016    update_params.push_back(TAG_ASSOCIATED_DATA, "barfoo" /* Wrong AAD */, 6);
3017
3018    // Decrypt.
3019    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
3020    string plaintext;
3021    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
3022                                           &plaintext, &input_consumed));
3023    EXPECT_EQ(ciphertext.size(), input_consumed);
3024    EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
3025
3026    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3027}
3028
3029TEST_P(EncryptionOperationsTest, AesGcmWrongNonce) {
3030    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
3031                                           .AesEncryptionKey(128)
3032                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
3033                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
3034                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
3035    string message = "12345678901234567890123456789012";
3036    AuthorizationSet begin_params(client_params());
3037    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
3038    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
3039    begin_params.push_back(TAG_MAC_LENGTH, 128);
3040
3041    AuthorizationSet update_params;
3042    update_params.push_back(TAG_ASSOCIATED_DATA, "foobar", 6);
3043
3044    // Encrypt
3045    AuthorizationSet begin_out_params;
3046    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
3047    AuthorizationSet update_out_params;
3048    string ciphertext;
3049    size_t input_consumed;
3050    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
3051                                           &input_consumed));
3052    EXPECT_EQ(message.size(), input_consumed);
3053    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
3054
3055    begin_params.push_back(TAG_NONCE, "123456789012", 12);
3056
3057    // Decrypt
3058    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
3059    string plaintext;
3060    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
3061                                           &plaintext, &input_consumed));
3062    EXPECT_EQ(ciphertext.size(), input_consumed);
3063    EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
3064
3065    // With wrong nonce, should have gotten garbage plaintext.
3066    EXPECT_NE(message, plaintext);
3067    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3068}
3069
3070TEST_P(EncryptionOperationsTest, AesGcmCorruptTag) {
3071    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
3072                                           .AesEncryptionKey(128)
3073                                           .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM)
3074                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
3075                                           .Authorization(TAG_MIN_MAC_LENGTH, 128)));
3076    string aad = "foobar";
3077    string message = "123456789012345678901234567890123456";
3078    AuthorizationSet begin_params(client_params());
3079    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM);
3080    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
3081    begin_params.push_back(TAG_MAC_LENGTH, 128);
3082    AuthorizationSet begin_out_params;
3083
3084    AuthorizationSet update_params;
3085    update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size());
3086
3087    // Encrypt
3088    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params));
3089    AuthorizationSet update_out_params;
3090    string ciphertext;
3091    size_t input_consumed;
3092    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext,
3093                                           &input_consumed));
3094    EXPECT_EQ(message.size(), input_consumed);
3095    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext));
3096
3097    // Corrupt tag
3098    (*ciphertext.rbegin())++;
3099
3100    // Grab nonce.
3101    EXPECT_NE(-1, begin_out_params.find(TAG_NONCE));
3102    begin_params.push_back(begin_out_params);
3103
3104    // Decrypt.
3105    EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params));
3106    string plaintext;
3107    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params,
3108                                           &plaintext, &input_consumed));
3109    EXPECT_EQ(ciphertext.size(), input_consumed);
3110    EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext));
3111
3112    EXPECT_EQ(message, plaintext);
3113    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3114}
3115
3116typedef Keymaster1Test MaxOperationsTest;
3117INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, MaxOperationsTest, test_params);
3118
3119TEST_P(MaxOperationsTest, TestLimit) {
3120    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
3121                                           .AesEncryptionKey(128)
3122                                           .EcbMode()
3123                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
3124                                           .Authorization(TAG_MAX_USES_PER_BOOT, 3)));
3125
3126    string message = "1234567890123456";
3127    string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
3128    string ciphertext2 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
3129    string ciphertext3 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
3130
3131    // Fourth time should fail.
3132    AuthorizationSet begin_params(client_params());
3133    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
3134    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
3135    EXPECT_EQ(KM_ERROR_KEY_MAX_OPS_EXCEEDED, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
3136
3137    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3138}
3139
3140TEST_P(MaxOperationsTest, TestAbort) {
3141    ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder()
3142                                           .AesEncryptionKey(128)
3143                                           .EcbMode()
3144                                           .Authorization(TAG_PADDING, KM_PAD_NONE)
3145                                           .Authorization(TAG_MAX_USES_PER_BOOT, 3)));
3146
3147    string message = "1234567890123456";
3148    string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
3149    string ciphertext2 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
3150    string ciphertext3 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE);
3151
3152    // Fourth time should fail.
3153    AuthorizationSet begin_params(client_params());
3154    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB);
3155    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
3156    EXPECT_EQ(KM_ERROR_KEY_MAX_OPS_EXCEEDED, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params));
3157
3158    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3159}
3160
3161typedef Keymaster1Test AddEntropyTest;
3162INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params);
3163
3164TEST_P(AddEntropyTest, AddEntropy) {
3165    // There's no obvious way to test that entropy is actually added, but we can test that the API
3166    // doesn't blow up or return an error.
3167    EXPECT_EQ(KM_ERROR_OK,
3168              device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3));
3169
3170    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3171}
3172
3173typedef Keymaster1Test Keymaster0AdapterTest;
3174INSTANTIATE_TEST_CASE_P(
3175    AndroidKeymasterTest, Keymaster0AdapterTest,
3176    ::testing::Values(
3177        InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(true /* support_ec */)),
3178        InstanceCreatorPtr(new Keymaster0AdapterTestInstanceCreator(false /* support_ec */))));
3179
3180TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1RsaBlob) {
3181    // Load and use an old-style Keymaster1 software key blob.  These blobs contain OCB-encrypted
3182    // key data.
3183    string km1_sw = read_file("km1_sw_rsa_512.blob");
3184    EXPECT_EQ(486U, km1_sw.length());
3185
3186    uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
3187    memcpy(key_data, km1_sw.data(), km1_sw.length());
3188    set_key_blob(key_data, km1_sw.length());
3189
3190    string message(64, 'a');
3191    string signature;
3192    SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
3193
3194    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3195}
3196
3197TEST_P(Keymaster0AdapterTest, UnversionedSoftwareKeymaster1RsaBlob) {
3198    // Load and use an old-style Keymaster1 software key blob, without the version byte.  These
3199    // blobs contain OCB-encrypted key data.
3200    string km1_sw = read_file("km1_sw_rsa_512_unversioned.blob");
3201    EXPECT_EQ(477U, km1_sw.length());
3202
3203    uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
3204    memcpy(key_data, km1_sw.data(), km1_sw.length());
3205    set_key_blob(key_data, km1_sw.length());
3206
3207    string message(64, 'a');
3208    string signature;
3209    SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
3210
3211    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3212}
3213
3214TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster1EcdsaBlob) {
3215    // Load and use an old-style Keymaster1 software key blob.  These blobs contain OCB-encrypted
3216    // key data.
3217    string km1_sw = read_file("km1_sw_ecdsa_256.blob");
3218    EXPECT_EQ(270U, km1_sw.length());
3219
3220    uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km1_sw.length()));
3221    memcpy(key_data, km1_sw.data(), km1_sw.length());
3222    set_key_blob(key_data, km1_sw.length());
3223
3224    string message(32, static_cast<char>(0xFF));
3225    string signature;
3226    SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
3227
3228    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3229}
3230
3231struct Malloc_Delete {
3232    void operator()(void* p) { free(p); }
3233};
3234
3235TEST_P(Keymaster0AdapterTest, OldSoftwareKeymaster0RsaBlob) {
3236    // Load and use an old softkeymaster blob.  These blobs contain PKCS#8 key data.
3237    string km0_sw = read_file("km0_sw_rsa_512.blob");
3238    EXPECT_EQ(333U, km0_sw.length());
3239
3240    uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
3241    memcpy(key_data, km0_sw.data(), km0_sw.length());
3242    set_key_blob(key_data, km0_sw.length());
3243
3244    string message(64, 'a');
3245    string signature;
3246    SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
3247
3248    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3249}
3250
3251TEST_P(Keymaster0AdapterTest, OldSwKeymaster0RsaBlobGetCharacteristics) {
3252    // Load and use an old softkeymaster blob.  These blobs contain PKCS#8 key data.
3253    string km0_sw = read_file("km0_sw_rsa_512.blob");
3254    EXPECT_EQ(333U, km0_sw.length());
3255
3256    uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
3257    memcpy(key_data, km0_sw.data(), km0_sw.length());
3258    set_key_blob(key_data, km0_sw.length());
3259
3260    EXPECT_EQ(KM_ERROR_OK, GetCharacteristics());
3261    EXPECT_TRUE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
3262    EXPECT_TRUE(contains(sw_enforced(), TAG_KEY_SIZE, 512));
3263    EXPECT_TRUE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
3264    EXPECT_TRUE(contains(sw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
3265    EXPECT_TRUE(contains(sw_enforced(), TAG_PADDING, KM_PAD_NONE));
3266    EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
3267    EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
3268    EXPECT_TRUE(sw_enforced().GetTagValue(TAG_ALL_USERS));
3269    EXPECT_TRUE(sw_enforced().GetTagValue(TAG_NO_AUTH_REQUIRED));
3270
3271    EXPECT_EQ(0, GetParam()->keymaster0_calls());
3272}
3273
3274TEST_P(Keymaster0AdapterTest, OldHwKeymaster0RsaBlob) {
3275    // Load and use an old softkeymaster blob.  These blobs contain PKCS#8 key data.
3276    string km0_sw = read_file("km0_sw_rsa_512.blob");
3277    EXPECT_EQ(333U, km0_sw.length());
3278
3279    // The keymaster0 wrapper swaps the old softkeymaster leading 'P' for a 'Q' to make the key not
3280    // be recognized as a software key.  Do the same here to pretend this is a hardware key.
3281    EXPECT_EQ('P', km0_sw[0]);
3282    km0_sw[0] = 'Q';
3283
3284    uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
3285    memcpy(key_data, km0_sw.data(), km0_sw.length());
3286    set_key_blob(key_data, km0_sw.length());
3287
3288    string message(64, 'a');
3289    string signature;
3290    SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE);
3291    VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE);
3292
3293    EXPECT_EQ(5, GetParam()->keymaster0_calls());
3294}
3295
3296TEST_P(Keymaster0AdapterTest, OldHwKeymaster0RsaBlobGetCharacteristics) {
3297    // Load and use an old softkeymaster blob.  These blobs contain PKCS#8 key data.
3298    string km0_sw = read_file("km0_sw_rsa_512.blob");
3299    EXPECT_EQ(333U, km0_sw.length());
3300
3301    // The keymaster0 wrapper swaps the old softkeymaster leading 'P' for a 'Q' to make the key not
3302    // be recognized as a software key.  Do the same here to pretend this is a hardware key.
3303    EXPECT_EQ('P', km0_sw[0]);
3304    km0_sw[0] = 'Q';
3305
3306    uint8_t* key_data = reinterpret_cast<uint8_t*>(malloc(km0_sw.length()));
3307    memcpy(key_data, km0_sw.data(), km0_sw.length());
3308    set_key_blob(key_data, km0_sw.length());
3309
3310    EXPECT_EQ(KM_ERROR_OK, GetCharacteristics());
3311    EXPECT_TRUE(contains(hw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
3312    EXPECT_TRUE(contains(hw_enforced(), TAG_KEY_SIZE, 512));
3313    EXPECT_TRUE(contains(hw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
3314    EXPECT_TRUE(contains(hw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
3315    EXPECT_TRUE(contains(hw_enforced(), TAG_DIGEST, KM_DIGEST_MD5));
3316    EXPECT_TRUE(contains(hw_enforced(), TAG_DIGEST, KM_DIGEST_SHA1));
3317    EXPECT_TRUE(contains(hw_enforced(), TAG_DIGEST, KM_DIGEST_SHA_2_224));
3318    EXPECT_TRUE(contains(hw_enforced(), TAG_DIGEST, KM_DIGEST_SHA_2_256));
3319    EXPECT_TRUE(contains(hw_enforced(), TAG_DIGEST, KM_DIGEST_SHA_2_384));
3320    EXPECT_TRUE(contains(hw_enforced(), TAG_DIGEST, KM_DIGEST_SHA_2_512));
3321    EXPECT_TRUE(contains(hw_enforced(), TAG_PADDING, KM_PAD_NONE));
3322    EXPECT_TRUE(contains(hw_enforced(), TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT));
3323    EXPECT_TRUE(contains(hw_enforced(), TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN));
3324    EXPECT_TRUE(contains(hw_enforced(), TAG_PADDING, KM_PAD_RSA_OAEP));
3325    EXPECT_TRUE(contains(hw_enforced(), TAG_PADDING, KM_PAD_RSA_PSS));
3326    EXPECT_EQ(15U, hw_enforced().size());
3327
3328    EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_SIGN));
3329    EXPECT_TRUE(contains(sw_enforced(), TAG_PURPOSE, KM_PURPOSE_VERIFY));
3330    EXPECT_TRUE(sw_enforced().GetTagValue(TAG_ALL_USERS));
3331    EXPECT_TRUE(sw_enforced().GetTagValue(TAG_NO_AUTH_REQUIRED));
3332
3333    EXPECT_FALSE(contains(sw_enforced(), TAG_ALGORITHM, KM_ALGORITHM_RSA));
3334    EXPECT_FALSE(contains(sw_enforced(), TAG_KEY_SIZE, 512));
3335    EXPECT_FALSE(contains(sw_enforced(), TAG_RSA_PUBLIC_EXPONENT, 3));
3336    EXPECT_FALSE(contains(sw_enforced(), TAG_DIGEST, KM_DIGEST_NONE));
3337    EXPECT_FALSE(contains(sw_enforced(), TAG_PADDING, KM_PAD_NONE));
3338
3339    EXPECT_EQ(1, GetParam()->keymaster0_calls());
3340}
3341
3342}  // namespace test
3343}  // namespace keymaster
3344