17636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden/*
27636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden * Copyright 2014 The Android Open Source Project
37636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden *
47636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden * Licensed under the Apache License, Version 2.0 (the "License");
57636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden * you may not use this file except in compliance with the License.
67636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden * You may obtain a copy of the License at
77636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden *
87636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden *      http://www.apache.org/licenses/LICENSE-2.0
97636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden *
107636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden * Unless required by applicable law or agreed to in writing, software
117636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden * distributed under the License is distributed on an "AS IS" BASIS,
127636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden * See the License for the specific language governing permissions and
147636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden * limitations under the License.
157636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden */
167636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden
17b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include "android_keymaster_test_utils.h"
187636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden
1995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden#include <algorithm>
2095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden#include <openssl/rand.h>
2295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
23b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include <keymaster/android_keymaster_messages.h>
24b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include <keymaster/android_keymaster_utils.h>
2595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
26d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willdenusing std::copy_if;
27d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willdenusing std::find_if;
2895dda36620149d1b8de57d175df9ba34a64e895dShawn Willdenusing std::is_permutation;
2995dda36620149d1b8de57d175df9ba34a64e895dShawn Willdenusing std::ostream;
3095dda36620149d1b8de57d175df9ba34a64e895dShawn Willdenusing std::string;
3195dda36620149d1b8de57d175df9ba34a64e895dShawn Willdenusing std::vector;
3295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
3378c5d8796c560deb2a0194f581f13a833437f012Shawn Willden#ifndef KEYMASTER_NAME_TAGS
3478c5d8796c560deb2a0194f581f13a833437f012Shawn Willden#error Keymaster test code requires that KEYMASTER_NAME_TAGS is defined
3578c5d8796c560deb2a0194f581f13a833437f012Shawn Willden#endif
3678c5d8796c560deb2a0194f581f13a833437f012Shawn Willden
377636471bd1c553ac179f0dddc17133491d0e1fafShawn Willdenstd::ostream& operator<<(std::ostream& os, const keymaster_key_param_t& param) {
3878c5d8796c560deb2a0194f581f13a833437f012Shawn Willden    os << "Tag: " << keymaster::StringifyTag(param.tag);
397636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    switch (keymaster_tag_get_type(param.tag)) {
407636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_INVALID:
417636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << " Invalid";
427636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        break;
43c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willden    case KM_UINT_REP:
447636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << " (Rep)";
457636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    /* Falls through */
46c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willden    case KM_UINT:
477636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << " Int: " << param.integer;
487636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        break;
497636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_ENUM_REP:
507636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << " (Rep)";
517636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    /* Falls through */
527636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_ENUM:
537636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << " Enum: " << param.enumerated;
547636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        break;
55c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willden    case KM_ULONG_REP:
56eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        os << " (Rep)";
57eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden    /* Falls through */
58c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willden    case KM_ULONG:
597636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << " Long: " << param.long_integer;
607636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        break;
617636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_DATE:
627636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << " Date: " << param.date_time;
637636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        break;
647636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_BOOL:
657636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << " Bool: " << param.boolean;
667636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        break;
677636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_BIGNUM:
687636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << " Bignum: ";
691937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        if (!param.blob.data)
701937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden            os << "(null)";
711937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        else
721937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden            for (size_t i = 0; i < param.blob.data_length; ++i)
731937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                os << std::hex << std::setw(2) << static_cast<int>(param.blob.data[i]) << std::dec;
747636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        break;
757636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_BYTES:
767636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << " Bytes: ";
771937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        if (!param.blob.data)
781937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden            os << "(null)";
791937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        else
801937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden            for (size_t i = 0; i < param.blob.data_length; ++i)
811937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                os << std::hex << std::setw(2) << static_cast<int>(param.blob.data[i]) << std::dec;
827636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        break;
837636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    }
847636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    return os;
857636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden}
867636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden
877636471bd1c553ac179f0dddc17133491d0e1fafShawn Willdenbool operator==(const keymaster_key_param_t& a, const keymaster_key_param_t& b) {
887636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    if (a.tag != b.tag) {
897636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        return false;
907636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    }
917636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden
927636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    switch (keymaster_tag_get_type(a.tag)) {
937636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_INVALID:
947636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        return true;
95c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willden    case KM_UINT_REP:
96c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willden    case KM_UINT:
977636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        return a.integer == b.integer;
987636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_ENUM_REP:
997636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_ENUM:
1007636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        return a.enumerated == b.enumerated;
101c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willden    case KM_ULONG:
102c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willden    case KM_ULONG_REP:
1037636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        return a.long_integer == b.long_integer;
1047636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_DATE:
1057636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        return a.date_time == b.date_time;
1067636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_BOOL:
1077636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        return a.boolean == b.boolean;
1087636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_BIGNUM:
1097636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    case KM_BYTES:
1107636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        if ((a.blob.data == NULL || b.blob.data == NULL) && a.blob.data != b.blob.data)
1117636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden            return false;
1127636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        return a.blob.data_length == b.blob.data_length &&
1137636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden               (memcmp(a.blob.data, b.blob.data, a.blob.data_length) == 0);
1147636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    }
11582114e7cbf97f65348d32b2685dd52427525146dShawn Willden
11682114e7cbf97f65348d32b2685dd52427525146dShawn Willden    return false;
1177636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden}
1187636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden
1197689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duongstatic char hex_value[256] = {
12020d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,
12120d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,
12220d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 1,  2,  3,  4,  5,  6,  7, 8, 9, 0, 0, 0, 0, 0, 0,  // '0'..'9'
1237689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 'A'..'F'
12420d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 0,
12520d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 0,  0,  0,  0,  0,  0,  0,  // 'a'..'f'
12620d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,
12720d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,
12820d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,
12920d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,
13020d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,
13120d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    0, 0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0};
1327689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
1337689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duongstring hex2str(string a) {
1347689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    string b;
13520d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    size_t num = a.size() / 2;
1367689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    b.resize(num);
1377689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    for (size_t i = 0; i < num; i++) {
1387689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong        b[i] = (hex_value[a[i * 2] & 0xFF] << 4) + (hex_value[a[i * 2 + 1] & 0xFF]);
1397689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    }
1407689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong    return b;
1417689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong}
1427689ed6e95e5cb712c4983cb30ad383520cfaa33Thai Duong
1437636471bd1c553ac179f0dddc17133491d0e1fafShawn Willdennamespace keymaster {
1447636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden
1457636471bd1c553ac179f0dddc17133491d0e1fafShawn Willdenbool operator==(const AuthorizationSet& a, const AuthorizationSet& b) {
1467636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    if (a.size() != b.size())
1477636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        return false;
1487636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden
1497636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    for (size_t i = 0; i < a.size(); ++i)
1507636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        if (!(a[i] == b[i]))
1517636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden            return false;
1527636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    return true;
1537636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden}
1547636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden
1552c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willdenbool operator!=(const AuthorizationSet& a, const AuthorizationSet& b) {
1562c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    return !(a == b);
1572c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden}
1582c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
1597636471bd1c553ac179f0dddc17133491d0e1fafShawn Willdenstd::ostream& operator<<(std::ostream& os, const AuthorizationSet& set) {
1607636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    if (set.size() == 0)
1617636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden        os << "(Empty)" << std::endl;
1621937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    else {
1631937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        os << "\n";
16478c5d8796c560deb2a0194f581f13a833437f012Shawn Willden        for (size_t i = 0; i < set.size(); ++i)
16578c5d8796c560deb2a0194f581f13a833437f012Shawn Willden            os << set[i] << std::endl;
1667636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    }
1677636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    return os;
1687636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden}
1697636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden
17095dda36620149d1b8de57d175df9ba34a64e895dShawn Willdennamespace test {
17195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
1721937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenKeymaster2Test::Keymaster2Test() : op_handle_(OP_HANDLE_SENTINEL) {
1731937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    memset(&characteristics_, 0, sizeof(characteristics_));
1741937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    blob_.key_material = nullptr;
17595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    RAND_seed("foobar", 6);
17695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    blob_.key_material = 0;
17758427c44b9261035351d2eee604a299c0b46dbb4Shawn Willden    device_ = GetParam()->CreateDevice();
17895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
17995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
1801937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenKeymaster2Test::~Keymaster2Test() {
18195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeCharacteristics();
18295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeKeyBlob();
18395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    device_->common.close(reinterpret_cast<hw_device_t*>(device_));
18495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
18595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
1861937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster2_device_t* Keymaster2Test::device() {
18795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return device_;
18895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
18995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
1901937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::GenerateKey(const AuthorizationSetBuilder& builder) {
19195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet params(builder.build());
19295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    params.push_back(UserAuthParams());
19395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    params.push_back(ClientParams());
19495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
19595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeKeyBlob();
19695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeCharacteristics();
1970e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    return device()->generate_key(device(), &params, &blob_, &characteristics_);
19895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
19995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2001937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::DeleteKey() {
20101d8f24c45067bc3d909e3aae9a72582f3c985a1Shawn Willden    return device()->delete_key(device(), &blob_);
20201d8f24c45067bc3d909e3aae9a72582f3c985a1Shawn Willden}
20301d8f24c45067bc3d909e3aae9a72582f3c985a1Shawn Willden
2041937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::ImportKey(const AuthorizationSetBuilder& builder,
20595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                            keymaster_key_format_t format,
20695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                            const string& key_material) {
20795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet params(builder.build());
20895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    params.push_back(UserAuthParams());
20995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    params.push_back(ClientParams());
21095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
21195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeKeyBlob();
21295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeCharacteristics();
2130e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t key = {reinterpret_cast<const uint8_t*>(key_material.c_str()),
2140e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden                            key_material.length()};
2150e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    return device()->import_key(device(), &params, format, &key, &blob_, &characteristics_);
21695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
21795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2181937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenAuthorizationSet Keymaster2Test::UserAuthParams() {
21995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet set;
22095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    set.push_back(TAG_USER_ID, 7);
221eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden    set.push_back(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD);
22295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    set.push_back(TAG_AUTH_TIMEOUT, 300);
22395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return set;
22495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
22595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2261937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenAuthorizationSet Keymaster2Test::ClientParams() {
22795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet set;
22895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    set.push_back(TAG_APPLICATION_ID, "app_id", 6);
22995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return set;
23095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
23195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2321937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::BeginOperation(keymaster_purpose_t purpose) {
2330e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    AuthorizationSet in_params(client_params());
2340e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_key_param_set_t out_params;
23595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    keymaster_error_t error =
2360e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        device()->begin(device(), purpose, &blob_, &in_params, &out_params, &op_handle_);
2370e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    EXPECT_EQ(0U, out_params.length);
2380e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    EXPECT_TRUE(out_params.params == nullptr);
23995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
24095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
24195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2421937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::BeginOperation(keymaster_purpose_t purpose,
24395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                 const AuthorizationSet& input_set,
24409f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden                                                 AuthorizationSet* output_set) {
2450e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_key_param_set_t out_params;
24695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    keymaster_error_t error =
2470e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        device()->begin(device(), purpose, &blob_, &input_set, &out_params, &op_handle_);
24895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    if (error == KM_ERROR_OK) {
24995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        if (output_set) {
2500e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden            output_set->Reinitialize(out_params);
25195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        } else {
2520e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden            EXPECT_EQ(0U, out_params.length);
2530e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden            EXPECT_TRUE(out_params.params == nullptr);
25495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        }
2550e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        keymaster_free_param_set(&out_params);
25695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    }
25795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
25895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
25995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2601937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::UpdateOperation(const string& message, string* output,
26195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                  size_t* input_consumed) {
26295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_NE(op_handle_, OP_HANDLE_SENTINEL);
2630e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t input = {reinterpret_cast<const uint8_t*>(message.c_str()), message.length()};
2640e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t out_tmp;
2650e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_key_param_set_t out_params;
2660e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_error_t error = device()->update(device(), op_handle_, nullptr /* params */, &input,
2670e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden                                               input_consumed, &out_params, &out_tmp);
2680e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    if (error == KM_ERROR_OK && out_tmp.data)
2690e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        output->append(reinterpret_cast<const char*>(out_tmp.data), out_tmp.data_length);
2700e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    free(const_cast<uint8_t*>(out_tmp.data));
27195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
27295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
27395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2741937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::UpdateOperation(const AuthorizationSet& additional_params,
2750f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                                  const string& message,
2760f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                                  AuthorizationSet* output_params, string* output,
27795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                  size_t* input_consumed) {
27895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_NE(op_handle_, OP_HANDLE_SENTINEL);
2790e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t input = {reinterpret_cast<const uint8_t*>(message.c_str()), message.length()};
2800e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t out_tmp;
2810e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_key_param_set_t out_params;
2820e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_error_t error = device()->update(device(), op_handle_, &additional_params, &input,
2830e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden                                               input_consumed, &out_params, &out_tmp);
2840e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    if (error == KM_ERROR_OK && out_tmp.data)
2850e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        output->append(reinterpret_cast<const char*>(out_tmp.data), out_tmp.data_length);
2860e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    free((void*)out_tmp.data);
2870f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    if (output_params)
2880f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden        output_params->Reinitialize(out_params);
2890f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    keymaster_free_param_set(&out_params);
29095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
29195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
29295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2931937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::FinishOperation(string* output) {
29495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return FinishOperation("", output);
29595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
29695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2971937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::FinishOperation(const string& signature, string* output) {
29895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet additional_params;
2990f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    AuthorizationSet output_params;
3000f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    return FinishOperation(additional_params, signature, &output_params, output);
30195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
30295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
3031937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::FinishOperation(const AuthorizationSet& additional_params,
3040f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                                  const string& signature,
3050f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                                  AuthorizationSet* output_params, string* output) {
3060e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t sig = {reinterpret_cast<const uint8_t*>(signature.c_str()),
3070e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden                            signature.length()};
3080e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t out_tmp;
3090e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_key_param_set_t out_params;
3101937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    keymaster_error_t error = device()->finish(device(), op_handle_, &additional_params,
3111937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                               nullptr /* input */, &sig, &out_params, &out_tmp);
3120e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    if (error != KM_ERROR_OK) {
3130e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        EXPECT_TRUE(out_tmp.data == nullptr);
3140e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        EXPECT_TRUE(out_params.params == nullptr);
3150e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        return error;
3160e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    }
3170e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden
3180e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    if (out_tmp.data)
3190e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        output->append(reinterpret_cast<const char*>(out_tmp.data), out_tmp.data_length);
3200e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    free((void*)out_tmp.data);
3210f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    if (output_params)
3220f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden        output_params->Reinitialize(out_params);
3230f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    keymaster_free_param_set(&out_params);
32495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
32595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
32695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
3271937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::AbortOperation() {
32895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return device()->abort(device(), op_handle_);
32995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
33095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
33122dcdb75fc2d1aa9a25b9aadb65d4dcb31e8c647Shawn Willdenkeymaster_error_t Keymaster2Test::AttestKey(const string& attest_challenge,
33286a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden                                            keymaster_cert_chain_t* cert_chain) {
33322dcdb75fc2d1aa9a25b9aadb65d4dcb31e8c647Shawn Willden    AuthorizationSet attest_params;
33486a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden    attest_params.push_back(UserAuthParams());
33586a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden    attest_params.push_back(ClientParams());
33622dcdb75fc2d1aa9a25b9aadb65d4dcb31e8c647Shawn Willden    attest_params.push_back(TAG_ATTESTATION_CHALLENGE, attest_challenge.data(),
33722dcdb75fc2d1aa9a25b9aadb65d4dcb31e8c647Shawn Willden                            attest_challenge.length());
33886a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden    return device()->attest_key(device(), &blob_, &attest_params, cert_chain);
33986a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden}
34086a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden
341c15af1910d8f451341d0068b5533816ace5defecShawn Willdenkeymaster_error_t Keymaster2Test::UpgradeKey(const AuthorizationSet& upgrade_params) {
342c15af1910d8f451341d0068b5533816ace5defecShawn Willden    keymaster_key_blob_t upgraded_blob;
343c15af1910d8f451341d0068b5533816ace5defecShawn Willden    keymaster_error_t error =
344c15af1910d8f451341d0068b5533816ace5defecShawn Willden        device()->upgrade_key(device(), &blob_, &upgrade_params, &upgraded_blob);
345c15af1910d8f451341d0068b5533816ace5defecShawn Willden    if (error == KM_ERROR_OK) {
346c15af1910d8f451341d0068b5533816ace5defecShawn Willden        FreeKeyBlob();
347c15af1910d8f451341d0068b5533816ace5defecShawn Willden        blob_ = upgraded_blob;
348c15af1910d8f451341d0068b5533816ace5defecShawn Willden    }
349c15af1910d8f451341d0068b5533816ace5defecShawn Willden    return error;
350c15af1910d8f451341d0068b5533816ace5defecShawn Willden}
351c15af1910d8f451341d0068b5533816ace5defecShawn Willden
3521937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::ProcessMessage(keymaster_purpose_t purpose, const string& message) {
353226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, client_params(), NULL /* output_params */));
35495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
35595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    string result;
35695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    size_t input_consumed;
35795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
35895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_EQ(message.size(), input_consumed);
35995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_EQ(KM_ERROR_OK, FinishOperation(&result));
36095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return result;
36195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
36295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
3631937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::ProcessMessage(keymaster_purpose_t purpose, const string& message,
36495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                      const AuthorizationSet& begin_params,
36595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                      const AuthorizationSet& update_params,
3660f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                      AuthorizationSet* begin_out_params) {
3670f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, begin_params, begin_out_params));
36895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
36995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    string result;
37095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    size_t input_consumed;
3710f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, nullptr /* output_params */,
3720f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                           &result, &input_consumed));
37395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_EQ(message.size(), input_consumed);
37495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_EQ(KM_ERROR_OK, FinishOperation(update_params, "", &result));
37595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return result;
37695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
37795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
3781937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::ProcessMessage(keymaster_purpose_t purpose, const string& message,
379226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                      const string& signature, const AuthorizationSet& begin_params,
380226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                      const AuthorizationSet& update_params,
381226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                      AuthorizationSet* output_params) {
382226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, begin_params, output_params));
383226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden
384226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    string result;
385226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    size_t input_consumed;
3860f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, nullptr /* output_params */,
3870f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                           &result, &input_consumed));
388226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    EXPECT_EQ(message.size(), input_consumed);
389226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    EXPECT_EQ(KM_ERROR_OK, FinishOperation(update_params, signature, &result));
390226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    return result;
391226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden}
392226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden
3931937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::ProcessMessage(keymaster_purpose_t purpose, const string& message,
394226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                      const string& signature) {
395226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, client_params(), NULL /* output_params */));
39695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
39795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    string result;
39895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    size_t input_consumed;
39995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed));
40095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_EQ(message.size(), input_consumed);
40195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_EQ(KM_ERROR_OK, FinishOperation(signature, &result));
40295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return result;
40395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
40495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
4051937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::SignMessage(const string& message, string* signature,
406226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                 keymaster_digest_t digest) {
40795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("SignMessage");
408226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet input_params(AuthorizationSet(client_params_, array_length(client_params_)));
409226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    input_params.push_back(TAG_DIGEST, digest);
410226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet update_params;
411226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet output_params;
412226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    *signature =
413226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden        ProcessMessage(KM_PURPOSE_SIGN, message, input_params, update_params, &output_params);
41472a5fdde1095cc012b232987d1f02de9b0507b89Shawn Willden    EXPECT_GT(signature->size(), 0U);
41595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
41695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
4171937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::SignMessage(const string& message, string* signature,
4183ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                                 keymaster_digest_t digest, keymaster_padding_t padding) {
4193ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    SCOPED_TRACE("SignMessage");
4203ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet input_params(AuthorizationSet(client_params_, array_length(client_params_)));
4213ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    input_params.push_back(TAG_DIGEST, digest);
4223ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    input_params.push_back(TAG_PADDING, padding);
4233ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet update_params;
4243ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet output_params;
4253ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    *signature =
4263ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden        ProcessMessage(KM_PURPOSE_SIGN, message, input_params, update_params, &output_params);
4273ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    EXPECT_GT(signature->size(), 0U);
4283ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden}
4293ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden
4301937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::MacMessage(const string& message, string* signature, size_t mac_length) {
43109f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    SCOPED_TRACE("SignMessage");
43209f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet input_params(AuthorizationSet(client_params_, array_length(client_params_)));
43309f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    input_params.push_back(TAG_MAC_LENGTH, mac_length);
43409f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet update_params;
43509f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet output_params;
43609f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    *signature =
43709f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden        ProcessMessage(KM_PURPOSE_SIGN, message, input_params, update_params, &output_params);
43809f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    EXPECT_GT(signature->size(), 0U);
43909f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden}
44009f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden
4411937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::VerifyMessage(const string& message, const string& signature,
442226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                   keymaster_digest_t digest) {
44395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("VerifyMessage");
444226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet input_params(client_params());
445226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    input_params.push_back(TAG_DIGEST, digest);
446226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet update_params;
447226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet output_params;
448226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    ProcessMessage(KM_PURPOSE_VERIFY, message, signature, input_params, update_params,
449226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                   &output_params);
45095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
45195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
4521937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::VerifyMessage(const string& message, const string& signature,
4533ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                                   keymaster_digest_t digest, keymaster_padding_t padding) {
4543ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    SCOPED_TRACE("VerifyMessage");
4553ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet input_params(client_params());
4563ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    input_params.push_back(TAG_DIGEST, digest);
4573ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    input_params.push_back(TAG_PADDING, padding);
45895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet update_params;
4593ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet output_params;
4603ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    ProcessMessage(KM_PURPOSE_VERIFY, message, signature, input_params, update_params,
4613ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                   &output_params);
46295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
46395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
4641937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::VerifyMac(const string& message, const string& signature) {
46533ab0389e908b98702806c746e7babc0d46eb452Shawn Willden    SCOPED_TRACE("VerifyMac");
46633ab0389e908b98702806c746e7babc0d46eb452Shawn Willden    ProcessMessage(KM_PURPOSE_VERIFY, message, signature);
46733ab0389e908b98702806c746e7babc0d46eb452Shawn Willden}
46833ab0389e908b98702806c746e7babc0d46eb452Shawn Willden
4691937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessage(const string& message, keymaster_padding_t padding,
47095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                      string* generated_nonce) {
4710afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    SCOPED_TRACE("EncryptMessage");
4720afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    AuthorizationSet begin_params(client_params()), output_params;
4730afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_PADDING, padding);
4743ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet update_params;
4750afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    string ciphertext =
4760afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden        ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params, &output_params);
4770afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    if (generated_nonce) {
4780afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden        keymaster_blob_t nonce_blob;
4790afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden        EXPECT_TRUE(output_params.GetTagValue(TAG_NONCE, &nonce_blob));
4800afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden        *generated_nonce = make_string(nonce_blob.data, nonce_blob.data_length);
4810afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    } else {
4820afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden        EXPECT_EQ(-1, output_params.find(TAG_NONCE));
4830afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    }
4840afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    return ciphertext;
4850afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden}
4860afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden
4871937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessage(const string& message, keymaster_digest_t digest,
4880afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      keymaster_padding_t padding, string* generated_nonce) {
4890afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    AuthorizationSet update_params;
4900afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    return EncryptMessage(update_params, message, digest, padding, generated_nonce);
4913ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden}
4923ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden
4931937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessage(const string& message, keymaster_block_mode_t block_mode,
49431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden                                      keymaster_padding_t padding, string* generated_nonce) {
49531e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet update_params;
49631e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    return EncryptMessage(update_params, message, block_mode, padding, generated_nonce);
49731e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden}
49831e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden
4991937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessage(const AuthorizationSet& update_params, const string& message,
5000afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      keymaster_digest_t digest, keymaster_padding_t padding,
5010afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      string* generated_nonce) {
50231e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    SCOPED_TRACE("EncryptMessage");
50331e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet begin_params(client_params()), output_params;
50431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_PADDING, padding);
5050afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_DIGEST, digest);
50631e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    string ciphertext =
50731e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden        ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params, &output_params);
50831e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    if (generated_nonce) {
50931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden        keymaster_blob_t nonce_blob;
51031e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden        EXPECT_TRUE(output_params.GetTagValue(TAG_NONCE, &nonce_blob));
51131e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden        *generated_nonce = make_string(nonce_blob.data, nonce_blob.data_length);
51231e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    } else {
51331e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden        EXPECT_EQ(-1, output_params.find(TAG_NONCE));
51431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    }
51531e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    return ciphertext;
51631e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden}
51731e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden
5181937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessage(const AuthorizationSet& update_params, const string& message,
51931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden                                      keymaster_block_mode_t block_mode,
5203ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                                      keymaster_padding_t padding, string* generated_nonce) {
52195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("EncryptMessage");
52209f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet begin_params(client_params()), output_params;
5233ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    begin_params.push_back(TAG_PADDING, padding);
52431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_BLOCK_MODE, block_mode);
52595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    string ciphertext =
52695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params, &output_params);
52795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    if (generated_nonce) {
52895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        keymaster_blob_t nonce_blob;
52995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        EXPECT_TRUE(output_params.GetTagValue(TAG_NONCE, &nonce_blob));
53095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        *generated_nonce = make_string(nonce_blob.data, nonce_blob.data_length);
53195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    } else {
53295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        EXPECT_EQ(-1, output_params.find(TAG_NONCE));
53395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    }
53495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return ciphertext;
53595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
53695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
5371937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessageWithParams(const string& message,
53895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                const AuthorizationSet& begin_params,
53995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                const AuthorizationSet& update_params,
54095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                AuthorizationSet* output_params) {
54195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("EncryptMessageWithParams");
54295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params, output_params);
54395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
54495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
5451937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const string& ciphertext, keymaster_padding_t padding) {
54695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("DecryptMessage");
5473ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet begin_params(client_params());
5483ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    begin_params.push_back(TAG_PADDING, padding);
5493ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet update_params;
5503ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
55195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
55295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
5531937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const string& ciphertext, keymaster_digest_t digest,
5540afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      keymaster_padding_t padding) {
5550afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    SCOPED_TRACE("DecryptMessage");
5560afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    AuthorizationSet begin_params(client_params());
5570afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_PADDING, padding);
5580afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_DIGEST, digest);
5590afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    AuthorizationSet update_params;
5600afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
5610afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden}
5620afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden
5631937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const string& ciphertext, keymaster_block_mode_t block_mode,
56431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden                                      keymaster_padding_t padding) {
56531e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    SCOPED_TRACE("DecryptMessage");
56631e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet begin_params(client_params());
56731e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_PADDING, padding);
56831e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_BLOCK_MODE, block_mode);
56931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet update_params;
57031e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
57131e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden}
57231e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden
5731937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const string& ciphertext, keymaster_digest_t digest,
5740afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      keymaster_padding_t padding, const string& nonce) {
57595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("DecryptMessage");
5763ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet begin_params(client_params());
5773ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    begin_params.push_back(TAG_PADDING, padding);
5780afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_DIGEST, digest);
5793ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
58095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet update_params;
5813ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
58295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
58395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
5841937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const string& ciphertext, keymaster_block_mode_t block_mode,
58531e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden                                      keymaster_padding_t padding, const string& nonce) {
58631e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    SCOPED_TRACE("DecryptMessage");
58731e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet begin_params(client_params());
58831e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_PADDING, padding);
58931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_BLOCK_MODE, block_mode);
59031e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
59131e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet update_params;
59231e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
59331e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden}
59431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden
5951937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const AuthorizationSet& update_params,
5960afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      const string& ciphertext, keymaster_digest_t digest,
5970afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      keymaster_padding_t padding, const string& nonce) {
59895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("DecryptMessage");
59909f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet begin_params(client_params());
6003ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    begin_params.push_back(TAG_PADDING, padding);
6010afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_DIGEST, digest);
60295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
60395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
60495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
60595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6061937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::GetCharacteristics() {
60795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeCharacteristics();
60895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return device()->get_key_characteristics(device(), &blob_, &client_id_, NULL /* app_data */,
60995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                             &characteristics_);
61095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
61195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6121937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::ExportKey(keymaster_key_format_t format, string* export_data) {
6130e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t export_tmp;
6140e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_error_t error = device()->export_key(device(), format, &blob_, &client_id_,
6150e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden                                                   NULL /* app_data */, &export_tmp);
61695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
61795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    if (error != KM_ERROR_OK)
61895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        return error;
61995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6200e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    *export_data = string(reinterpret_cast<const char*>(export_tmp.data), export_tmp.data_length);
6210e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    free((void*)export_tmp.data);
62295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
62395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
62495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6251937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::CheckHmacTestVector(string key, string message, keymaster_digest_t digest,
62695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                         string expected_mac) {
62733ab0389e908b98702806c746e7babc0d46eb452Shawn Willden    ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
62833ab0389e908b98702806c746e7babc0d46eb452Shawn Willden                                         .HmacKey(key.size() * 8)
62933ab0389e908b98702806c746e7babc0d46eb452Shawn Willden                                         .Authorization(TAG_MIN_MAC_LENGTH, expected_mac.size() * 8)
63033ab0389e908b98702806c746e7babc0d46eb452Shawn Willden                                         .Digest(digest),
63133ab0389e908b98702806c746e7babc0d46eb452Shawn Willden                                     KM_KEY_FORMAT_RAW, key));
63295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    string signature;
63333ab0389e908b98702806c746e7babc0d46eb452Shawn Willden    MacMessage(message, &signature, expected_mac.size() * 8);
63472a5fdde1095cc012b232987d1f02de9b0507b89Shawn Willden    EXPECT_EQ(expected_mac, signature) << "Test vector didn't match for digest " << (int)digest;
63595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
63695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6371937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::CheckAesCtrTestVector(const string& key, const string& nonce,
63820d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong                                           const string& message,
63920d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong                                           const string& expected_ciphertext) {
64020d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
64120d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong                                         .AesEncryptionKey(key.size() * 8)
64220d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong                                         .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
6433ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                                         .Authorization(TAG_CALLER_NONCE)
6443ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                                         .Padding(KM_PAD_NONE),
64520d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong                                     KM_KEY_FORMAT_RAW, key));
64620d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong
64709f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet begin_params(client_params()), update_params, output_params;
64820d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
64931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
650c442467181d8a9427c83fea4f0a272c8a7b46043Shawn Willden    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
65120d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    string ciphertext =
65220d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong        EncryptMessageWithParams(message, begin_params, update_params, &output_params);
65320d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    EXPECT_EQ(expected_ciphertext, ciphertext);
65420d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong}
65520d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong
6561937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenAuthorizationSet Keymaster2Test::hw_enforced() {
6571937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    return AuthorizationSet(characteristics_.hw_enforced);
65895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
65995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6601937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenAuthorizationSet Keymaster2Test::sw_enforced() {
6611937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    return AuthorizationSet(characteristics_.sw_enforced);
66295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
66395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6641937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::FreeCharacteristics() {
6651937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    keymaster_free_characteristics(&characteristics_);
66695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
66795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6681937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::FreeKeyBlob() {
66995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    free(const_cast<uint8_t*>(blob_.key_material));
67095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    blob_.key_material = NULL;
67195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
67295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6731937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::corrupt_key_blob() {
67495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    assert(blob_.key_material);
67595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    uint8_t* tmp = const_cast<uint8_t*>(blob_.key_material);
67695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    ++tmp[blob_.key_material_size / 2];
67795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
67895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
679d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willdenclass Sha256OnlyWrapper {
680d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden  public:
681d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    Sha256OnlyWrapper(const keymaster1_device_t* wrapped_device) : wrapped_device_(wrapped_device) {
682d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
683d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        new_module = *wrapped_device_->common.module;
684d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        new_module_name = std::string("SHA 256-only ") + wrapped_device_->common.module->name;
685d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        new_module.name = new_module_name.c_str();
686d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
687d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        memset(&device_, 0, sizeof(device_));
688d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.common.module = &new_module;
689d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
690d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.common.close = close_device;
691d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_algorithms = get_supported_algorithms;
692d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_block_modes = get_supported_block_modes;
693d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_padding_modes = get_supported_padding_modes;
694d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_digests = get_supported_digests;
695d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_import_formats = get_supported_import_formats;
696d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_export_formats = get_supported_export_formats;
697d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.add_rng_entropy = add_rng_entropy;
698d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.generate_key = generate_key;
699d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_key_characteristics = get_key_characteristics;
700d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.import_key = import_key;
701d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.export_key = export_key;
702d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.begin = begin;
703d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.update = update;
704d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.finish = finish;
705d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.abort = abort;
706d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
707d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
708d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    keymaster1_device_t* keymaster_device() { return &device_; }
709d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
710d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static bool is_supported(keymaster_digest_t digest) {
711d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return digest == KM_DIGEST_NONE || digest == KM_DIGEST_SHA_2_256;
712d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
713d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
714d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static bool all_digests_supported(const keymaster_key_param_set_t* params) {
715d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        for (size_t i = 0; i < params->length; ++i)
716d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            if (params->params[i].tag == TAG_DIGEST)
717d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                if (!is_supported(static_cast<keymaster_digest_t>(params->params[i].enumerated)))
718d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                    return false;
719d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return true;
720d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
721d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
722d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static const keymaster_key_param_t*
723d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    get_algorithm_param(const keymaster_key_param_set_t* params) {
724d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        keymaster_key_param_t* end = params->params + params->length;
725d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        auto alg_ptr = std::find_if(params->params, end, [](keymaster_key_param_t& p) {
726d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return p.tag == KM_TAG_ALGORITHM;
727d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        });
728d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (alg_ptr == end)
729d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return nullptr;
730d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return alg_ptr;
731d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
732d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
733d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static int close_device(hw_device_t* dev) {
734d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        Sha256OnlyWrapper* wrapper = reinterpret_cast<Sha256OnlyWrapper*>(dev);
735d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        const keymaster1_device_t* wrapped_device = wrapper->wrapped_device_;
736d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        delete wrapper;
737d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return wrapped_device->common.close(const_cast<hw_device_t*>(&wrapped_device->common));
738d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
739d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
740d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static const keymaster1_device_t* unwrap(const keymaster1_device_t* dev) {
741d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return reinterpret_cast<const Sha256OnlyWrapper*>(dev)->wrapped_device_;
742d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
743d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
744d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_algorithms(const struct keymaster1_device* dev,
745d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                      keymaster_algorithm_t** algorithms,
746d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                      size_t* algorithms_length) {
747d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->get_supported_algorithms(unwrap(dev), algorithms, algorithms_length);
748d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
749d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_block_modes(const struct keymaster1_device* dev,
750d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                       keymaster_algorithm_t algorithm,
751d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                       keymaster_purpose_t purpose,
752d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                       keymaster_block_mode_t** modes,
753d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                       size_t* modes_length) {
7541937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->get_supported_block_modes(unwrap(dev), algorithm, purpose, modes,
7551937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                                      modes_length);
756d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
757d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_padding_modes(const struct keymaster1_device* dev,
758d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                         keymaster_algorithm_t algorithm,
759d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                         keymaster_purpose_t purpose,
760d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                         keymaster_padding_t** modes,
761d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                         size_t* modes_length) {
7621937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->get_supported_padding_modes(unwrap(dev), algorithm, purpose, modes,
7631937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                                        modes_length);
764d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
765d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
766d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_digests(const keymaster1_device_t* dev,
767d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                   keymaster_algorithm_t algorithm,
768d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                   keymaster_purpose_t purpose,
769d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                   keymaster_digest_t** digests,
770d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                   size_t* digests_length) {
771d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        keymaster_error_t error = unwrap(dev)->get_supported_digests(
772d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            unwrap(dev), algorithm, purpose, digests, digests_length);
773d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (error != KM_ERROR_OK)
774d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return error;
775d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
776d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        std::vector<keymaster_digest_t> filtered_digests;
777d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        std::copy_if(*digests, *digests + *digests_length, std::back_inserter(filtered_digests),
778d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                     [](keymaster_digest_t digest) { return is_supported(digest); });
779d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
780d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        free(*digests);
781d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        *digests_length = filtered_digests.size();
782d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        *digests = reinterpret_cast<keymaster_digest_t*>(
783d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            malloc(*digests_length * sizeof(keymaster_digest_t)));
784d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        std::copy(filtered_digests.begin(), filtered_digests.end(), *digests);
785d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
786d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return KM_ERROR_OK;
787d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
788d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
789d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_import_formats(const struct keymaster1_device* dev,
790d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          keymaster_algorithm_t algorithm,
791d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          keymaster_key_format_t** formats,
792d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          size_t* formats_length) {
7931937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->get_supported_import_formats(unwrap(dev), algorithm, formats,
7941937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                                         formats_length);
795d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
796d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_export_formats(const struct keymaster1_device* dev,
797d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          keymaster_algorithm_t algorithm,
798d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          keymaster_key_format_t** formats,
799d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          size_t* formats_length) {
8001937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->get_supported_export_formats(unwrap(dev), algorithm, formats,
8011937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                                         formats_length);
802d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
803d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t add_rng_entropy(const struct keymaster1_device* dev,
804d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                             const uint8_t* data, size_t data_length) {
805d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->add_rng_entropy(unwrap(dev), data, data_length);
806d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
807d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
808d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t generate_key(const keymaster1_device_t* dev,
809d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                          const keymaster_key_param_set_t* params,
810d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                          keymaster_key_blob_t* key_blob,
811d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                          keymaster_key_characteristics_t** characteristics) {
812d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        auto alg_ptr = get_algorithm_param(params);
813d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (!alg_ptr)
814d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return KM_ERROR_UNSUPPORTED_ALGORITHM;
815d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (alg_ptr->enumerated == KM_ALGORITHM_HMAC && !all_digests_supported(params))
816d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return KM_ERROR_UNSUPPORTED_DIGEST;
817d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
818d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->generate_key(unwrap(dev), params, key_blob, characteristics);
819d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
820d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
821d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t
822d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    get_key_characteristics(const struct keymaster1_device* dev,
823d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                            const keymaster_key_blob_t* key_blob, const keymaster_blob_t* client_id,
824d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                            const keymaster_blob_t* app_data,
825d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                            keymaster_key_characteristics_t** characteristics) {
8261937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->get_key_characteristics(unwrap(dev), key_blob, client_id, app_data,
8271937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                                    characteristics);
828d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
829d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
830d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t
831d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    import_key(const keymaster1_device_t* dev, const keymaster_key_param_set_t* params,
832d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden               keymaster_key_format_t key_format, const keymaster_blob_t* key_data,
833d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden               keymaster_key_blob_t* key_blob, keymaster_key_characteristics_t** characteristics) {
834d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        auto alg_ptr = get_algorithm_param(params);
835d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (!alg_ptr)
836d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return KM_ERROR_UNSUPPORTED_ALGORITHM;
837d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (alg_ptr->enumerated == KM_ALGORITHM_HMAC && !all_digests_supported(params))
838d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return KM_ERROR_UNSUPPORTED_DIGEST;
839d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
8401937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->import_key(unwrap(dev), params, key_format, key_data, key_blob,
8411937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                       characteristics);
842d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
843d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
844d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t export_key(const struct keymaster1_device* dev,  //
845d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                        keymaster_key_format_t export_format,
846d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                        const keymaster_key_blob_t* key_to_export,
847d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                        const keymaster_blob_t* client_id,
848d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                        const keymaster_blob_t* app_data,
849d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                        keymaster_blob_t* export_data) {
850d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->export_key(unwrap(dev), export_format, key_to_export, client_id,
851d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                       app_data, export_data);
852d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
853d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
854d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t begin(const keymaster1_device_t* dev,  //
855d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   keymaster_purpose_t purpose, const keymaster_key_blob_t* key,
856d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   const keymaster_key_param_set_t* in_params,
857d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   keymaster_key_param_set_t* out_params,
858d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   keymaster_operation_handle_t* operation_handle) {
859d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (!all_digests_supported(in_params))
860d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return KM_ERROR_UNSUPPORTED_DIGEST;
8611937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->begin(unwrap(dev), purpose, key, in_params, out_params,
8621937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                  operation_handle);
863d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
864d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
865d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t update(const keymaster1_device_t* dev,
866d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_operation_handle_t operation_handle,
867d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    const keymaster_key_param_set_t* in_params,
868d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    const keymaster_blob_t* input, size_t* input_consumed,
869d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_key_param_set_t* out_params,
870d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_blob_t* output) {
871d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->update(unwrap(dev), operation_handle, in_params, input, input_consumed,
872d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   out_params, output);
873d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
874d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
875d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t finish(const struct keymaster1_device* dev,  //
876d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_operation_handle_t operation_handle,
877d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    const keymaster_key_param_set_t* in_params,
878d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    const keymaster_blob_t* signature,
879d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_key_param_set_t* out_params,
880d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_blob_t* output) {
8811937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->finish(unwrap(dev), operation_handle, in_params, signature, out_params,
8821937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                   output);
883d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
884d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
885d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t abort(const struct keymaster1_device* dev,
886d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   keymaster_operation_handle_t operation_handle) {
887d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->abort(unwrap(dev), operation_handle);
888d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
889d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
890d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden  private:
891d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    keymaster1_device_t device_;
892d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    const keymaster1_device_t* wrapped_device_;
893d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    hw_module_t new_module;
894d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    string new_module_name;
895d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden};
896d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
897d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willdenkeymaster1_device_t* make_device_sha256_only(keymaster1_device_t* device) {
898d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    return (new Sha256OnlyWrapper(device))->keymaster_device();
899d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden}
900d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
90195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}  // namespace test
9027636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden}  // namespace keymaster
903