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
1723560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willdenstd::ostream& operator<<(std::ostream& os, const InstanceCreatorPtr& instance_creator) {
1733560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden    return os << instance_creator->name();
1743560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden}
1753560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden
1761937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenKeymaster2Test::Keymaster2Test() : op_handle_(OP_HANDLE_SENTINEL) {
1771937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    memset(&characteristics_, 0, sizeof(characteristics_));
1781937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    blob_.key_material = nullptr;
17995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    RAND_seed("foobar", 6);
18095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    blob_.key_material = 0;
18158427c44b9261035351d2eee604a299c0b46dbb4Shawn Willden    device_ = GetParam()->CreateDevice();
18295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
18395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
1841937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenKeymaster2Test::~Keymaster2Test() {
18595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeCharacteristics();
18695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeKeyBlob();
18795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    device_->common.close(reinterpret_cast<hw_device_t*>(device_));
18895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
18995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
1901937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster2_device_t* Keymaster2Test::device() {
19195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return device_;
19295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
19395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
1941937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::GenerateKey(const AuthorizationSetBuilder& builder) {
19595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet params(builder.build());
19695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    params.push_back(UserAuthParams());
19795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    params.push_back(ClientParams());
19895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
19995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeKeyBlob();
20095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeCharacteristics();
2010e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    return device()->generate_key(device(), &params, &blob_, &characteristics_);
20295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
20395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2041937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::DeleteKey() {
20501d8f24c45067bc3d909e3aae9a72582f3c985a1Shawn Willden    return device()->delete_key(device(), &blob_);
20601d8f24c45067bc3d909e3aae9a72582f3c985a1Shawn Willden}
20701d8f24c45067bc3d909e3aae9a72582f3c985a1Shawn Willden
2081937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::ImportKey(const AuthorizationSetBuilder& builder,
20995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                            keymaster_key_format_t format,
21095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                            const string& key_material) {
21195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet params(builder.build());
21295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    params.push_back(UserAuthParams());
21395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    params.push_back(ClientParams());
21495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
21595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeKeyBlob();
21695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeCharacteristics();
2170e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t key = {reinterpret_cast<const uint8_t*>(key_material.c_str()),
2180e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden                            key_material.length()};
2190e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    return device()->import_key(device(), &params, format, &key, &blob_, &characteristics_);
22095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
22195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2221937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenAuthorizationSet Keymaster2Test::UserAuthParams() {
22395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet set;
22495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    set.push_back(TAG_USER_ID, 7);
225eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden    set.push_back(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD);
22695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    set.push_back(TAG_AUTH_TIMEOUT, 300);
22795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return set;
22895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
22995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2301937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenAuthorizationSet Keymaster2Test::ClientParams() {
23195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet set;
23295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    set.push_back(TAG_APPLICATION_ID, "app_id", 6);
23395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return set;
23495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
23595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2361937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::BeginOperation(keymaster_purpose_t purpose) {
2370e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    AuthorizationSet in_params(client_params());
2380e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_key_param_set_t out_params;
23995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    keymaster_error_t error =
2400e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        device()->begin(device(), purpose, &blob_, &in_params, &out_params, &op_handle_);
2410e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    EXPECT_EQ(0U, out_params.length);
2420e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    EXPECT_TRUE(out_params.params == nullptr);
24395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
24495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
24595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2461937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::BeginOperation(keymaster_purpose_t purpose,
24795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                 const AuthorizationSet& input_set,
24809f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden                                                 AuthorizationSet* output_set) {
2490e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_key_param_set_t out_params;
25095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    keymaster_error_t error =
2510e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        device()->begin(device(), purpose, &blob_, &input_set, &out_params, &op_handle_);
25295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    if (error == KM_ERROR_OK) {
25395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        if (output_set) {
2540e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden            output_set->Reinitialize(out_params);
25595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        } else {
2560e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden            EXPECT_EQ(0U, out_params.length);
2570e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden            EXPECT_TRUE(out_params.params == nullptr);
25895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        }
2590e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        keymaster_free_param_set(&out_params);
26095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    }
26195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
26295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
26395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2641937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::UpdateOperation(const string& message, string* output,
26595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                  size_t* input_consumed) {
26695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_NE(op_handle_, OP_HANDLE_SENTINEL);
2670e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t input = {reinterpret_cast<const uint8_t*>(message.c_str()), message.length()};
2680e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t out_tmp;
2690e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_key_param_set_t out_params;
2700e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_error_t error = device()->update(device(), op_handle_, nullptr /* params */, &input,
2710e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden                                               input_consumed, &out_params, &out_tmp);
2720e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    if (error == KM_ERROR_OK && out_tmp.data)
2730e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        output->append(reinterpret_cast<const char*>(out_tmp.data), out_tmp.data_length);
2740e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    free(const_cast<uint8_t*>(out_tmp.data));
27595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
27695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
27795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2781937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::UpdateOperation(const AuthorizationSet& additional_params,
2790f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                                  const string& message,
2800f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                                  AuthorizationSet* output_params, string* output,
28195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                  size_t* input_consumed) {
28295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    EXPECT_NE(op_handle_, OP_HANDLE_SENTINEL);
2830e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t input = {reinterpret_cast<const uint8_t*>(message.c_str()), message.length()};
2840e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t out_tmp;
2850e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_key_param_set_t out_params;
2860e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_error_t error = device()->update(device(), op_handle_, &additional_params, &input,
2870e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden                                               input_consumed, &out_params, &out_tmp);
2880e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    if (error == KM_ERROR_OK && out_tmp.data)
2890e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        output->append(reinterpret_cast<const char*>(out_tmp.data), out_tmp.data_length);
2900e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    free((void*)out_tmp.data);
2910f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    if (output_params)
2920f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden        output_params->Reinitialize(out_params);
2930f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    keymaster_free_param_set(&out_params);
29495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
29595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
29695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
2971937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::FinishOperation(string* output) {
2983560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden    return FinishOperation("", "", output);
29995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
30095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
3013560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willdenkeymaster_error_t Keymaster2Test::FinishOperation(const string& input, const string& signature,
3023560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden                                                  string* output) {
30395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet additional_params;
3040f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    AuthorizationSet output_params;
3053560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden    return FinishOperation(additional_params, input, signature, &output_params, output);
30695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
30795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
3081937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::FinishOperation(const AuthorizationSet& additional_params,
3093560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden                                                  const string& input, const string& signature,
3100f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                                  AuthorizationSet* output_params, string* output) {
3113560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden    keymaster_blob_t inp = {reinterpret_cast<const uint8_t*>(input.c_str()), input.length()};
3120e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t sig = {reinterpret_cast<const uint8_t*>(signature.c_str()),
3130e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden                            signature.length()};
3140e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t out_tmp;
3150e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_key_param_set_t out_params;
3163560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden    keymaster_error_t error = device()->finish(device(), op_handle_, &additional_params, &inp, &sig,
3173560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden                                               &out_params, &out_tmp);
3180e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    if (error != KM_ERROR_OK) {
3190e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        EXPECT_TRUE(out_tmp.data == nullptr);
3200e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        EXPECT_TRUE(out_params.params == nullptr);
3210e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        return error;
3220e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    }
3230e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden
3240e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    if (out_tmp.data)
3250e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden        output->append(reinterpret_cast<const char*>(out_tmp.data), out_tmp.data_length);
3260e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    free((void*)out_tmp.data);
3270f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    if (output_params)
3280f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden        output_params->Reinitialize(out_params);
3290f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    keymaster_free_param_set(&out_params);
33095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
33195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
33295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
3331937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::AbortOperation() {
33495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return device()->abort(device(), op_handle_);
33595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
33695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
33722dcdb75fc2d1aa9a25b9aadb65d4dcb31e8c647Shawn Willdenkeymaster_error_t Keymaster2Test::AttestKey(const string& attest_challenge,
338f4724998100e9eaa43e72dc8d42186d4c33863f2Shawn Willden                                            const string& attest_app_id,
33986a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden                                            keymaster_cert_chain_t* cert_chain) {
34022dcdb75fc2d1aa9a25b9aadb65d4dcb31e8c647Shawn Willden    AuthorizationSet attest_params;
34186a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden    attest_params.push_back(UserAuthParams());
34286a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden    attest_params.push_back(ClientParams());
34322dcdb75fc2d1aa9a25b9aadb65d4dcb31e8c647Shawn Willden    attest_params.push_back(TAG_ATTESTATION_CHALLENGE, attest_challenge.data(),
34422dcdb75fc2d1aa9a25b9aadb65d4dcb31e8c647Shawn Willden                            attest_challenge.length());
345f4724998100e9eaa43e72dc8d42186d4c33863f2Shawn Willden    attest_params.push_back(TAG_ATTESTATION_APPLICATION_ID, attest_app_id.data(),
346f4724998100e9eaa43e72dc8d42186d4c33863f2Shawn Willden                            attest_app_id.length());
34786a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden    return device()->attest_key(device(), &blob_, &attest_params, cert_chain);
34886a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden}
34986a0b87bcc77bd24cedbcdc82699414de7345030Shawn Willden
350c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willdenkeymaster_error_t Keymaster2Test::UpgradeKey(const AuthorizationSet& upgrade_params) {
351c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden    keymaster_key_blob_t upgraded_blob;
352c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden    keymaster_error_t error =
353c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        device()->upgrade_key(device(), &blob_, &upgrade_params, &upgraded_blob);
354c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden    if (error == KM_ERROR_OK) {
355c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        FreeKeyBlob();
356c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden        blob_ = upgraded_blob;
357c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden    }
358c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden    return error;
359c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden}
360c636e187cb4cb6c5b07fab9bb5d27878690376deShawn Willden
3611937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::ProcessMessage(keymaster_purpose_t purpose, const string& message) {
362226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, client_params(), NULL /* output_params */));
36395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
36495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    string result;
3653560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden    EXPECT_EQ(KM_ERROR_OK, FinishOperation(message, "" /* signature */, &result));
36695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return result;
36795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
36895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
3691937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::ProcessMessage(keymaster_purpose_t purpose, const string& message,
37095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                      const AuthorizationSet& begin_params,
37195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                      const AuthorizationSet& update_params,
3720f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden                                      AuthorizationSet* begin_out_params) {
3730f39256c68dc689b2eb8b604c4d39f17b9300363Shawn Willden    EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, begin_params, begin_out_params));
37495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
37595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    string result;
3763560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden    EXPECT_EQ(KM_ERROR_OK, FinishOperation(update_params, message, "" /* signature */, &result));
37795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return result;
37895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
37995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
3801937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::ProcessMessage(keymaster_purpose_t purpose, const string& message,
381226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                      const string& signature, const AuthorizationSet& begin_params,
382226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                      const AuthorizationSet& update_params,
383226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                      AuthorizationSet* output_params) {
384226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, begin_params, output_params));
385226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden
386226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    string result;
3873560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden    EXPECT_EQ(KM_ERROR_OK, FinishOperation(update_params, message, signature, &result));
388226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    return result;
389226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden}
390226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden
3911937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::ProcessMessage(keymaster_purpose_t purpose, const string& message,
392226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                      const string& signature) {
393226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, client_params(), NULL /* output_params */));
39495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
39595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    string result;
3963560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden    EXPECT_EQ(KM_ERROR_OK, FinishOperation(message, signature, &result));
39795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return result;
39895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
39995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
4001937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::SignMessage(const string& message, string* signature,
401226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                 keymaster_digest_t digest) {
40295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("SignMessage");
403226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet input_params(AuthorizationSet(client_params_, array_length(client_params_)));
404226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    input_params.push_back(TAG_DIGEST, digest);
405226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet update_params;
406226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet output_params;
407226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    *signature =
408226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden        ProcessMessage(KM_PURPOSE_SIGN, message, input_params, update_params, &output_params);
40972a5fdde1095cc012b232987d1f02de9b0507b89Shawn Willden    EXPECT_GT(signature->size(), 0U);
41095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
41195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
4121937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::SignMessage(const string& message, string* signature,
4133ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                                 keymaster_digest_t digest, keymaster_padding_t padding) {
4143ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    SCOPED_TRACE("SignMessage");
4153ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet input_params(AuthorizationSet(client_params_, array_length(client_params_)));
4163ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    input_params.push_back(TAG_DIGEST, digest);
4173ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    input_params.push_back(TAG_PADDING, padding);
4183ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet update_params;
4193ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet output_params;
4203ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    *signature =
4213ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden        ProcessMessage(KM_PURPOSE_SIGN, message, input_params, update_params, &output_params);
4223ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    EXPECT_GT(signature->size(), 0U);
4233ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden}
4243ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden
4251937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::MacMessage(const string& message, string* signature, size_t mac_length) {
42609f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    SCOPED_TRACE("SignMessage");
42709f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet input_params(AuthorizationSet(client_params_, array_length(client_params_)));
42809f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    input_params.push_back(TAG_MAC_LENGTH, mac_length);
42909f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet update_params;
43009f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet output_params;
43109f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    *signature =
43209f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden        ProcessMessage(KM_PURPOSE_SIGN, message, input_params, update_params, &output_params);
43309f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    EXPECT_GT(signature->size(), 0U);
43409f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden}
43509f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden
4361937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::VerifyMessage(const string& message, const string& signature,
437226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                                   keymaster_digest_t digest) {
43895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("VerifyMessage");
439226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet input_params(client_params());
440226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    input_params.push_back(TAG_DIGEST, digest);
441226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet update_params;
442226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    AuthorizationSet output_params;
443226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden    ProcessMessage(KM_PURPOSE_VERIFY, message, signature, input_params, update_params,
444226746bfb5f79857145d5f3ebdfd6f49b6c114acShawn Willden                   &output_params);
44595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
44695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
4471937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::VerifyMessage(const string& message, const string& signature,
4483ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                                   keymaster_digest_t digest, keymaster_padding_t padding) {
4493ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    SCOPED_TRACE("VerifyMessage");
4503ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet input_params(client_params());
4513ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    input_params.push_back(TAG_DIGEST, digest);
4523ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    input_params.push_back(TAG_PADDING, padding);
45395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet update_params;
4543ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet output_params;
4553ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    ProcessMessage(KM_PURPOSE_VERIFY, message, signature, input_params, update_params,
4563ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                   &output_params);
45795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
45895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
4591937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::VerifyMac(const string& message, const string& signature) {
46033ab0389e908b98702806c746e7babc0d46eb452Shawn Willden    SCOPED_TRACE("VerifyMac");
46133ab0389e908b98702806c746e7babc0d46eb452Shawn Willden    ProcessMessage(KM_PURPOSE_VERIFY, message, signature);
46233ab0389e908b98702806c746e7babc0d46eb452Shawn Willden}
46333ab0389e908b98702806c746e7babc0d46eb452Shawn Willden
4641937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessage(const string& message, keymaster_padding_t padding,
46595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                      string* generated_nonce) {
4660afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    SCOPED_TRACE("EncryptMessage");
4670afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    AuthorizationSet begin_params(client_params()), output_params;
4680afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_PADDING, padding);
4693ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet update_params;
4700afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    string ciphertext =
4710afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden        ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params, &output_params);
4720afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    if (generated_nonce) {
4730afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden        keymaster_blob_t nonce_blob;
4740afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden        EXPECT_TRUE(output_params.GetTagValue(TAG_NONCE, &nonce_blob));
4750afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden        *generated_nonce = make_string(nonce_blob.data, nonce_blob.data_length);
4760afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    } else {
4770afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden        EXPECT_EQ(-1, output_params.find(TAG_NONCE));
4780afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    }
4790afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    return ciphertext;
4800afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden}
4810afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden
4821937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessage(const string& message, keymaster_digest_t digest,
4830afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      keymaster_padding_t padding, string* generated_nonce) {
4840afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    AuthorizationSet update_params;
4850afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    return EncryptMessage(update_params, message, digest, padding, generated_nonce);
4863ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden}
4873ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden
4881937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessage(const string& message, keymaster_block_mode_t block_mode,
48931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden                                      keymaster_padding_t padding, string* generated_nonce) {
49031e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet update_params;
49131e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    return EncryptMessage(update_params, message, block_mode, padding, generated_nonce);
49231e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden}
49331e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden
4941937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessage(const AuthorizationSet& update_params, const string& message,
4950afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      keymaster_digest_t digest, keymaster_padding_t padding,
4960afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      string* generated_nonce) {
49731e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    SCOPED_TRACE("EncryptMessage");
49831e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet begin_params(client_params()), output_params;
49931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_PADDING, padding);
5000afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_DIGEST, digest);
50131e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    string ciphertext =
50231e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden        ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params, &output_params);
50331e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    if (generated_nonce) {
50431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden        keymaster_blob_t nonce_blob;
50531e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden        EXPECT_TRUE(output_params.GetTagValue(TAG_NONCE, &nonce_blob));
50631e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden        *generated_nonce = make_string(nonce_blob.data, nonce_blob.data_length);
50731e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    } else {
50831e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden        EXPECT_EQ(-1, output_params.find(TAG_NONCE));
50931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    }
51031e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    return ciphertext;
51131e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden}
51231e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden
5131937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessage(const AuthorizationSet& update_params, const string& message,
51431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden                                      keymaster_block_mode_t block_mode,
5153ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                                      keymaster_padding_t padding, string* generated_nonce) {
51695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("EncryptMessage");
51709f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet begin_params(client_params()), output_params;
5183ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    begin_params.push_back(TAG_PADDING, padding);
51931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_BLOCK_MODE, block_mode);
52095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    string ciphertext =
52195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params, &output_params);
52295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    if (generated_nonce) {
52395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        keymaster_blob_t nonce_blob;
52495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        EXPECT_TRUE(output_params.GetTagValue(TAG_NONCE, &nonce_blob));
52595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        *generated_nonce = make_string(nonce_blob.data, nonce_blob.data_length);
52695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    } else {
52795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        EXPECT_EQ(-1, output_params.find(TAG_NONCE));
52895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    }
52995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return ciphertext;
53095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
53195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
5321937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::EncryptMessageWithParams(const string& message,
53395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                const AuthorizationSet& begin_params,
53495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                const AuthorizationSet& update_params,
53595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                                AuthorizationSet* output_params) {
53695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("EncryptMessageWithParams");
53795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return ProcessMessage(KM_PURPOSE_ENCRYPT, message, begin_params, update_params, output_params);
53895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
53995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
5401937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const string& ciphertext, keymaster_padding_t padding) {
54195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("DecryptMessage");
5423ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet begin_params(client_params());
5433ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    begin_params.push_back(TAG_PADDING, padding);
5443ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet update_params;
5453ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
54695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
54795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
5481937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const string& ciphertext, keymaster_digest_t digest,
5490afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      keymaster_padding_t padding) {
5500afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    SCOPED_TRACE("DecryptMessage");
5510afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    AuthorizationSet begin_params(client_params());
5520afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_PADDING, padding);
5530afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_DIGEST, digest);
5540afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    AuthorizationSet update_params;
5550afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
5560afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden}
5570afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden
5581937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const string& ciphertext, keymaster_block_mode_t block_mode,
55931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden                                      keymaster_padding_t padding) {
56031e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    SCOPED_TRACE("DecryptMessage");
56131e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet begin_params(client_params());
56231e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_PADDING, padding);
56331e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_BLOCK_MODE, block_mode);
56431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet update_params;
56531e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
56631e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden}
56731e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden
5681937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const string& ciphertext, keymaster_digest_t digest,
5690afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      keymaster_padding_t padding, const string& nonce) {
57095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("DecryptMessage");
5713ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    AuthorizationSet begin_params(client_params());
5723ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    begin_params.push_back(TAG_PADDING, padding);
5730afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_DIGEST, digest);
5743ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
57595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    AuthorizationSet update_params;
5763ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
57795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
57895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
5791937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const string& ciphertext, keymaster_block_mode_t block_mode,
58031e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden                                      keymaster_padding_t padding, const string& nonce) {
58131e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    SCOPED_TRACE("DecryptMessage");
58231e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet begin_params(client_params());
58331e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_PADDING, padding);
58431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_BLOCK_MODE, block_mode);
58531e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
58631e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    AuthorizationSet update_params;
58731e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
58831e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden}
58931e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden
5901937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenstring Keymaster2Test::DecryptMessage(const AuthorizationSet& update_params,
5910afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      const string& ciphertext, keymaster_digest_t digest,
5920afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden                                      keymaster_padding_t padding, const string& nonce) {
59395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    SCOPED_TRACE("DecryptMessage");
59409f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet begin_params(client_params());
5953ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden    begin_params.push_back(TAG_PADDING, padding);
5960afa3c8a03fc817279bdf0f46abe3dc7a3fd53e1Shawn Willden    begin_params.push_back(TAG_DIGEST, digest);
59795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
59895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, begin_params, update_params);
59995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
60095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6011937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::GetCharacteristics() {
60295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    FreeCharacteristics();
60395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return device()->get_key_characteristics(device(), &blob_, &client_id_, NULL /* app_data */,
60495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden                                             &characteristics_);
60595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
60695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6071937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenkeymaster_error_t Keymaster2Test::ExportKey(keymaster_key_format_t format, string* export_data) {
6080e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_blob_t export_tmp;
6090e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    keymaster_error_t error = device()->export_key(device(), format, &blob_, &client_id_,
6100e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden                                                   NULL /* app_data */, &export_tmp);
61195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
61295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    if (error != KM_ERROR_OK)
61395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden        return error;
61495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6150e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    *export_data = string(reinterpret_cast<const char*>(export_tmp.data), export_tmp.data_length);
6160e2ee44913880a582488a9cb7e1ffe0711111891Shawn Willden    free((void*)export_tmp.data);
61795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    return error;
61895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
61995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6203560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willdenvoid Keymaster2Test::CheckHmacTestVector(const string& key, const string& message,
6213560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden                                         keymaster_digest_t digest, string expected_mac) {
62233ab0389e908b98702806c746e7babc0d46eb452Shawn Willden    ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
62333ab0389e908b98702806c746e7babc0d46eb452Shawn Willden                                         .HmacKey(key.size() * 8)
62433ab0389e908b98702806c746e7babc0d46eb452Shawn Willden                                         .Authorization(TAG_MIN_MAC_LENGTH, expected_mac.size() * 8)
62533ab0389e908b98702806c746e7babc0d46eb452Shawn Willden                                         .Digest(digest),
62633ab0389e908b98702806c746e7babc0d46eb452Shawn Willden                                     KM_KEY_FORMAT_RAW, key));
62795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    string signature;
62833ab0389e908b98702806c746e7babc0d46eb452Shawn Willden    MacMessage(message, &signature, expected_mac.size() * 8);
62972a5fdde1095cc012b232987d1f02de9b0507b89Shawn Willden    EXPECT_EQ(expected_mac, signature) << "Test vector didn't match for digest " << (int)digest;
63095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
63195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6321937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::CheckAesCtrTestVector(const string& key, const string& nonce,
63320d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong                                           const string& message,
63420d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong                                           const string& expected_ciphertext) {
63520d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder()
63620d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong                                         .AesEncryptionKey(key.size() * 8)
63720d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong                                         .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR)
6383ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                                         .Authorization(TAG_CALLER_NONCE)
6393ad5f05e1ae2ca4beb1d0b2104c742de869841bcShawn Willden                                         .Padding(KM_PAD_NONE),
64020d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong                                     KM_KEY_FORMAT_RAW, key));
64120d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong
64209f25270e27ed7b04be6a557c8fe6482d882e7d1Shawn Willden    AuthorizationSet begin_params(client_params()), update_params, output_params;
64320d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    begin_params.push_back(TAG_NONCE, nonce.data(), nonce.size());
64431e063f8ed913369eb30648537fb5827dfd7a0d3Shawn Willden    begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR);
645c442467181d8a9427c83fea4f0a272c8a7b46043Shawn Willden    begin_params.push_back(TAG_PADDING, KM_PAD_NONE);
64620d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    string ciphertext =
64720d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong        EncryptMessageWithParams(message, begin_params, update_params, &output_params);
64820d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong    EXPECT_EQ(expected_ciphertext, ciphertext);
64920d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong}
65020d725d20a2ba8eba06caaf5d11e113e069161c0Thai Duong
6511937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenAuthorizationSet Keymaster2Test::hw_enforced() {
6521937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    return AuthorizationSet(characteristics_.hw_enforced);
65395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
65495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6551937c715b39044e024e9eda98a09dee84142e9b2Shawn WilldenAuthorizationSet Keymaster2Test::sw_enforced() {
6561937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    return AuthorizationSet(characteristics_.sw_enforced);
65795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
65895dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6591937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::FreeCharacteristics() {
6601937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden    keymaster_free_characteristics(&characteristics_);
66195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
66295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6631937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::FreeKeyBlob() {
66495dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    free(const_cast<uint8_t*>(blob_.key_material));
66595dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    blob_.key_material = NULL;
66695dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
66795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
6681937c715b39044e024e9eda98a09dee84142e9b2Shawn Willdenvoid Keymaster2Test::corrupt_key_blob() {
66995dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    assert(blob_.key_material);
67095dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    uint8_t* tmp = const_cast<uint8_t*>(blob_.key_material);
67195dda36620149d1b8de57d175df9ba34a64e895dShawn Willden    ++tmp[blob_.key_material_size / 2];
67295dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}
67395dda36620149d1b8de57d175df9ba34a64e895dShawn Willden
674d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willdenclass Sha256OnlyWrapper {
675d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden  public:
6763560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden    explicit Sha256OnlyWrapper(const keymaster1_device_t* wrapped_device)
6773560f7be392fa7f59844b8c5c54c2d75a62aad7bShawn Willden        : wrapped_device_(wrapped_device) {
678d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
679d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        new_module = *wrapped_device_->common.module;
680d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        new_module_name = std::string("SHA 256-only ") + wrapped_device_->common.module->name;
681d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        new_module.name = new_module_name.c_str();
682d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
683d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        memset(&device_, 0, sizeof(device_));
684d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.common.module = &new_module;
685d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
686d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.common.close = close_device;
687d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_algorithms = get_supported_algorithms;
688d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_block_modes = get_supported_block_modes;
689d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_padding_modes = get_supported_padding_modes;
690d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_digests = get_supported_digests;
691d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_import_formats = get_supported_import_formats;
692d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_supported_export_formats = get_supported_export_formats;
693d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.add_rng_entropy = add_rng_entropy;
694d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.generate_key = generate_key;
695d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.get_key_characteristics = get_key_characteristics;
696d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.import_key = import_key;
697d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.export_key = export_key;
698d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.begin = begin;
699d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.update = update;
700d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.finish = finish;
701d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        device_.abort = abort;
702d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
703d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
704d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    keymaster1_device_t* keymaster_device() { return &device_; }
705d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
706d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static bool is_supported(keymaster_digest_t digest) {
707d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return digest == KM_DIGEST_NONE || digest == KM_DIGEST_SHA_2_256;
708d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
709d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
710d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static bool all_digests_supported(const keymaster_key_param_set_t* params) {
711d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        for (size_t i = 0; i < params->length; ++i)
712d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            if (params->params[i].tag == TAG_DIGEST)
713d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                if (!is_supported(static_cast<keymaster_digest_t>(params->params[i].enumerated)))
714d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                    return false;
715d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return true;
716d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
717d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
718d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static const keymaster_key_param_t*
719d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    get_algorithm_param(const keymaster_key_param_set_t* params) {
720d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        keymaster_key_param_t* end = params->params + params->length;
721d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        auto alg_ptr = std::find_if(params->params, end, [](keymaster_key_param_t& p) {
722d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return p.tag == KM_TAG_ALGORITHM;
723d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        });
724d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (alg_ptr == end)
725d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return nullptr;
726d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return alg_ptr;
727d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
728d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
729d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static int close_device(hw_device_t* dev) {
730d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        Sha256OnlyWrapper* wrapper = reinterpret_cast<Sha256OnlyWrapper*>(dev);
731d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        const keymaster1_device_t* wrapped_device = wrapper->wrapped_device_;
732d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        delete wrapper;
733d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return wrapped_device->common.close(const_cast<hw_device_t*>(&wrapped_device->common));
734d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
735d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
736d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static const keymaster1_device_t* unwrap(const keymaster1_device_t* dev) {
737d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return reinterpret_cast<const Sha256OnlyWrapper*>(dev)->wrapped_device_;
738d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
739d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
740d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_algorithms(const struct keymaster1_device* dev,
741d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                      keymaster_algorithm_t** algorithms,
742d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                      size_t* algorithms_length) {
743d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->get_supported_algorithms(unwrap(dev), algorithms, algorithms_length);
744d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
745d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_block_modes(const struct keymaster1_device* dev,
746d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                       keymaster_algorithm_t algorithm,
747d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                       keymaster_purpose_t purpose,
748d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                       keymaster_block_mode_t** modes,
749d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                       size_t* modes_length) {
7501937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->get_supported_block_modes(unwrap(dev), algorithm, purpose, modes,
7511937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                                      modes_length);
752d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
753d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_padding_modes(const struct keymaster1_device* dev,
754d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                         keymaster_algorithm_t algorithm,
755d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                         keymaster_purpose_t purpose,
756d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                         keymaster_padding_t** modes,
757d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                         size_t* modes_length) {
7581937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->get_supported_padding_modes(unwrap(dev), algorithm, purpose, modes,
7591937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                                        modes_length);
760d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
761d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
762d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_digests(const keymaster1_device_t* dev,
763d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                   keymaster_algorithm_t algorithm,
764d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                   keymaster_purpose_t purpose,
765d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                   keymaster_digest_t** digests,
766d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                   size_t* digests_length) {
767d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        keymaster_error_t error = unwrap(dev)->get_supported_digests(
768d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            unwrap(dev), algorithm, purpose, digests, digests_length);
769d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (error != KM_ERROR_OK)
770d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return error;
771d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
772d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        std::vector<keymaster_digest_t> filtered_digests;
773d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        std::copy_if(*digests, *digests + *digests_length, std::back_inserter(filtered_digests),
774d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                     [](keymaster_digest_t digest) { return is_supported(digest); });
775d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
776d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        free(*digests);
777d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        *digests_length = filtered_digests.size();
778d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        *digests = reinterpret_cast<keymaster_digest_t*>(
779d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            malloc(*digests_length * sizeof(keymaster_digest_t)));
780d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        std::copy(filtered_digests.begin(), filtered_digests.end(), *digests);
781d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
782d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return KM_ERROR_OK;
783d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
784d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
785d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_import_formats(const struct keymaster1_device* dev,
786d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          keymaster_algorithm_t algorithm,
787d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          keymaster_key_format_t** formats,
788d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          size_t* formats_length) {
7891937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->get_supported_import_formats(unwrap(dev), algorithm, formats,
7901937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                                         formats_length);
791d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
792d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t get_supported_export_formats(const struct keymaster1_device* dev,
793d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          keymaster_algorithm_t algorithm,
794d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          keymaster_key_format_t** formats,
795d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                          size_t* formats_length) {
7961937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->get_supported_export_formats(unwrap(dev), algorithm, formats,
7971937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                                         formats_length);
798d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
799d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t add_rng_entropy(const struct keymaster1_device* dev,
800d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                             const uint8_t* data, size_t data_length) {
801d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->add_rng_entropy(unwrap(dev), data, data_length);
802d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
803d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
804d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t generate_key(const keymaster1_device_t* dev,
805d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                          const keymaster_key_param_set_t* params,
806d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                          keymaster_key_blob_t* key_blob,
807d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                          keymaster_key_characteristics_t** characteristics) {
808d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        auto alg_ptr = get_algorithm_param(params);
809d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (!alg_ptr)
810d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return KM_ERROR_UNSUPPORTED_ALGORITHM;
811d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (alg_ptr->enumerated == KM_ALGORITHM_HMAC && !all_digests_supported(params))
812d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return KM_ERROR_UNSUPPORTED_DIGEST;
813d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
814d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->generate_key(unwrap(dev), params, key_blob, characteristics);
815d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
816d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
817d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t
818d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    get_key_characteristics(const struct keymaster1_device* dev,
819d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                            const keymaster_key_blob_t* key_blob, const keymaster_blob_t* client_id,
820d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                            const keymaster_blob_t* app_data,
821d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                            keymaster_key_characteristics_t** characteristics) {
8221937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->get_key_characteristics(unwrap(dev), key_blob, client_id, app_data,
8231937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                                    characteristics);
824d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
825d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
826d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t
827d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    import_key(const keymaster1_device_t* dev, const keymaster_key_param_set_t* params,
828d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden               keymaster_key_format_t key_format, const keymaster_blob_t* key_data,
829d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden               keymaster_key_blob_t* key_blob, keymaster_key_characteristics_t** characteristics) {
830d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        auto alg_ptr = get_algorithm_param(params);
831d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (!alg_ptr)
832d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return KM_ERROR_UNSUPPORTED_ALGORITHM;
833d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (alg_ptr->enumerated == KM_ALGORITHM_HMAC && !all_digests_supported(params))
834d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return KM_ERROR_UNSUPPORTED_DIGEST;
835d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
8361937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->import_key(unwrap(dev), params, key_format, key_data, key_blob,
8371937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                       characteristics);
838d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
839d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
840d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t export_key(const struct keymaster1_device* dev,  //
841d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                        keymaster_key_format_t export_format,
842d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                        const keymaster_key_blob_t* key_to_export,
843d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                        const keymaster_blob_t* client_id,
844d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                        const keymaster_blob_t* app_data,
845d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                        keymaster_blob_t* export_data) {
846d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->export_key(unwrap(dev), export_format, key_to_export, client_id,
847d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                       app_data, export_data);
848d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
849d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
850d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t begin(const keymaster1_device_t* dev,  //
851d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   keymaster_purpose_t purpose, const keymaster_key_blob_t* key,
852d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   const keymaster_key_param_set_t* in_params,
853d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   keymaster_key_param_set_t* out_params,
854d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   keymaster_operation_handle_t* operation_handle) {
855d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        if (!all_digests_supported(in_params))
856d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden            return KM_ERROR_UNSUPPORTED_DIGEST;
8571937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->begin(unwrap(dev), purpose, key, in_params, out_params,
8581937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                  operation_handle);
859d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
860d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
861d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t update(const keymaster1_device_t* dev,
862d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_operation_handle_t operation_handle,
863d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    const keymaster_key_param_set_t* in_params,
864d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    const keymaster_blob_t* input, size_t* input_consumed,
865d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_key_param_set_t* out_params,
866d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_blob_t* output) {
867d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->update(unwrap(dev), operation_handle, in_params, input, input_consumed,
868d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   out_params, output);
869d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
870d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
871d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t finish(const struct keymaster1_device* dev,  //
872d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_operation_handle_t operation_handle,
873d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    const keymaster_key_param_set_t* in_params,
874d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    const keymaster_blob_t* signature,
875d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_key_param_set_t* out_params,
876d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                    keymaster_blob_t* output) {
8771937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden        return unwrap(dev)->finish(unwrap(dev), operation_handle, in_params, signature, out_params,
8781937c715b39044e024e9eda98a09dee84142e9b2Shawn Willden                                   output);
879d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
880d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
881d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    static keymaster_error_t abort(const struct keymaster1_device* dev,
882d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                   keymaster_operation_handle_t operation_handle) {
883d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return unwrap(dev)->abort(unwrap(dev), operation_handle);
884d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    }
885d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
886d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden  private:
887d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    keymaster1_device_t device_;
888d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    const keymaster1_device_t* wrapped_device_;
889d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    hw_module_t new_module;
890d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    string new_module_name;
891d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden};
892d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
893d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willdenkeymaster1_device_t* make_device_sha256_only(keymaster1_device_t* device) {
894d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    return (new Sha256OnlyWrapper(device))->keymaster_device();
895d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden}
896d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden
89795dda36620149d1b8de57d175df9ba34a64e895dShawn Willden}  // namespace test
8987636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden}  // namespace keymaster
899