Home | History | Annotate | Download | only in support
      1 /*
      2  **
      3  ** Copyright 2017, The Android Open Source Project
      4  **
      5  ** Licensed under the Apache License, Version 2.0 (the "License");
      6  ** you may not use this file except in compliance with the License.
      7  ** You may obtain a copy of the License at
      8  **
      9  **     http://www.apache.org/licenses/LICENSE-2.0
     10  **
     11  ** Unless required by applicable law or agreed to in writing, software
     12  ** distributed under the License is distributed on an "AS IS" BASIS,
     13  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  ** See the License for the specific language governing permissions and
     15  ** limitations under the License.
     16  */
     17 
     18 #include <keymasterV4_0/Keymaster3.h>
     19 
     20 #include <android-base/logging.h>
     21 #include <keymasterV4_0/keymaster_utils.h>
     22 
     23 namespace android {
     24 namespace hardware {
     25 namespace keymaster {
     26 namespace V4_0 {
     27 namespace support {
     28 
     29 using android::hardware::details::StatusOf;
     30 
     31 namespace {
     32 
     33 ErrorCode convert(V3_0::ErrorCode error) {
     34     return static_cast<ErrorCode>(error);
     35 }
     36 
     37 V3_0::KeyPurpose convert(KeyPurpose purpose) {
     38     return static_cast<V3_0::KeyPurpose>(purpose);
     39 }
     40 
     41 V3_0::KeyFormat convert(KeyFormat purpose) {
     42     return static_cast<V3_0::KeyFormat>(purpose);
     43 }
     44 
     45 V3_0::KeyParameter convert(const KeyParameter& param) {
     46     V3_0::KeyParameter converted;
     47     converted.tag = static_cast<V3_0::Tag>(param.tag);
     48     static_assert(sizeof(converted.f) == sizeof(param.f), "This function assumes sizes match");
     49     memcpy(&converted.f, &param.f, sizeof(param.f));
     50     converted.blob = param.blob;
     51     return converted;
     52 }
     53 
     54 KeyParameter convert(const V3_0::KeyParameter& param) {
     55     KeyParameter converted;
     56     converted.tag = static_cast<Tag>(param.tag);
     57     static_assert(sizeof(converted.f) == sizeof(param.f), "This function assumes sizes match");
     58     memcpy(&converted.f, &param.f, sizeof(param.f));
     59     converted.blob = param.blob;
     60     return converted;
     61 }
     62 
     63 hidl_vec<V3_0::KeyParameter> convert(const hidl_vec<KeyParameter>& params) {
     64     hidl_vec<V3_0::KeyParameter> converted(params.size());
     65     for (size_t i = 0; i < params.size(); ++i) {
     66         converted[i] = convert(params[i]);
     67     }
     68     return converted;
     69 }
     70 
     71 hidl_vec<KeyParameter> convert(const hidl_vec<V3_0::KeyParameter>& params) {
     72     hidl_vec<KeyParameter> converted(params.size());
     73     for (size_t i = 0; i < params.size(); ++i) {
     74         converted[i] = convert(params[i]);
     75     }
     76     return converted;
     77 }
     78 
     79 template <typename T, typename OutIter>
     80 inline static OutIter copy_bytes_to_iterator(const T& value, OutIter dest) {
     81     const uint8_t* value_ptr = reinterpret_cast<const uint8_t*>(&value);
     82     return std::copy(value_ptr, value_ptr + sizeof(value), dest);
     83 }
     84 
     85 hidl_vec<V3_0::KeyParameter> convertAndAddAuthToken(const hidl_vec<KeyParameter>& params,
     86                                                     const HardwareAuthToken& authToken) {
     87     hidl_vec<V3_0::KeyParameter> converted(params.size() + 1);
     88     for (size_t i = 0; i < params.size(); ++i) {
     89         converted[i] = convert(params[i]);
     90     }
     91     converted[params.size()].tag = V3_0::Tag::AUTH_TOKEN;
     92     converted[params.size()].blob = authToken2HidlVec(authToken);
     93 
     94     return converted;
     95 }
     96 
     97 KeyCharacteristics convert(const V3_0::KeyCharacteristics& chars) {
     98     KeyCharacteristics converted;
     99     converted.hardwareEnforced = convert(chars.teeEnforced);
    100     converted.softwareEnforced = convert(chars.softwareEnforced);
    101     return converted;
    102 }
    103 
    104 }  // namespace
    105 
    106 void Keymaster3::getVersionIfNeeded() {
    107     if (haveVersion_) return;
    108 
    109     auto rc = km3_dev_->getHardwareFeatures(
    110         [&](bool isSecure, bool supportsEllipticCurve, bool supportsSymmetricCryptography,
    111             bool supportsAttestation, bool supportsAllDigests, const hidl_string& keymasterName,
    112             const hidl_string& keymasterAuthorName) {
    113             version_ = {keymasterName, keymasterAuthorName, 0 /* major version, filled below */,
    114                         isSecure ? SecurityLevel::TRUSTED_ENVIRONMENT : SecurityLevel::SOFTWARE,
    115                         supportsEllipticCurve};
    116             supportsSymmetricCryptography_ = supportsSymmetricCryptography;
    117             supportsAttestation_ = supportsAttestation;
    118             supportsAllDigests_ = supportsAllDigests;
    119         });
    120 
    121     CHECK(rc.isOk()) << "Got error " << rc.description() << " trying to get hardware features";
    122 
    123     if (version_.securityLevel == SecurityLevel::SOFTWARE) {
    124         version_.majorVersion = 3;
    125     } else if (supportsAttestation_) {
    126         version_.majorVersion = 3;  // Could be 2, doesn't matter.
    127     } else if (supportsSymmetricCryptography_) {
    128         version_.majorVersion = 1;
    129     } else {
    130         version_.majorVersion = 0;
    131     }
    132 }
    133 
    134 Return<void> Keymaster3::getHardwareInfo(Keymaster3::getHardwareInfo_cb _hidl_cb) {
    135     getVersionIfNeeded();
    136     _hidl_cb(version_.securityLevel,
    137              std::string(version_.keymasterName) + " (wrapped by keystore::Keymaster3)",
    138              version_.authorName);
    139     return Void();
    140 }
    141 
    142 Return<ErrorCode> Keymaster3::addRngEntropy(const hidl_vec<uint8_t>& data) {
    143     auto rc = km3_dev_->addRngEntropy(data);
    144     if (!rc.isOk()) {
    145         return StatusOf<V3_0::ErrorCode, ErrorCode>(rc);
    146     }
    147     return convert(rc);
    148 }
    149 
    150 Return<void> Keymaster3::generateKey(const hidl_vec<KeyParameter>& keyParams,
    151                                      generateKey_cb _hidl_cb) {
    152     auto cb = [&](V3_0::ErrorCode error, const hidl_vec<uint8_t>& keyBlob,
    153                   const V3_0::KeyCharacteristics& characteristics) {
    154         _hidl_cb(convert(error), keyBlob, convert(characteristics));
    155     };
    156     auto rc = km3_dev_->generateKey(convert(keyParams), cb);
    157     rc.isOk();  // move ctor prereq
    158     return rc;
    159 }
    160 
    161 Return<void> Keymaster3::getKeyCharacteristics(const hidl_vec<uint8_t>& keyBlob,
    162                                                const hidl_vec<uint8_t>& clientId,
    163                                                const hidl_vec<uint8_t>& appData,
    164                                                getKeyCharacteristics_cb _hidl_cb) {
    165     auto cb = [&](V3_0::ErrorCode error, const V3_0::KeyCharacteristics& chars) {
    166         _hidl_cb(convert(error), convert(chars));
    167     };
    168 
    169     auto rc = km3_dev_->getKeyCharacteristics(keyBlob, clientId, appData, cb);
    170     rc.isOk();  // move ctor prereq
    171     return rc;
    172 }
    173 
    174 Return<void> Keymaster3::importKey(const hidl_vec<KeyParameter>& params, KeyFormat keyFormat,
    175                                    const hidl_vec<uint8_t>& keyData, importKey_cb _hidl_cb) {
    176     auto cb = [&](V3_0::ErrorCode error, const hidl_vec<uint8_t>& keyBlob,
    177                   const V3_0::KeyCharacteristics& chars) {
    178         _hidl_cb(convert(error), keyBlob, convert(chars));
    179     };
    180     auto rc = km3_dev_->importKey(convert(params), convert(keyFormat), keyData, cb);
    181     rc.isOk();  // move ctor prereq
    182     return rc;
    183 }
    184 
    185 Return<void> Keymaster3::exportKey(KeyFormat exportFormat, const hidl_vec<uint8_t>& keyBlob,
    186                                    const hidl_vec<uint8_t>& clientId,
    187                                    const hidl_vec<uint8_t>& appData, exportKey_cb _hidl_cb) {
    188     auto cb = [&](V3_0::ErrorCode error, const hidl_vec<uint8_t>& keyMaterial) {
    189         _hidl_cb(convert(error), keyMaterial);
    190     };
    191     auto rc = km3_dev_->exportKey(convert(exportFormat), keyBlob, clientId, appData, cb);
    192     rc.isOk();  // move ctor prereq
    193     return rc;
    194 }
    195 
    196 Return<void> Keymaster3::attestKey(const hidl_vec<uint8_t>& keyToAttest,
    197                                    const hidl_vec<KeyParameter>& attestParams,
    198                                    attestKey_cb _hidl_cb) {
    199     auto cb = [&](V3_0::ErrorCode error, const hidl_vec<hidl_vec<uint8_t>>& certChain) {
    200         _hidl_cb(convert(error), certChain);
    201     };
    202     auto rc = km3_dev_->attestKey(keyToAttest, convert(attestParams), cb);
    203     rc.isOk();  // move ctor prereq
    204     return rc;
    205 }
    206 
    207 Return<void> Keymaster3::upgradeKey(const hidl_vec<uint8_t>& keyBlobToUpgrade,
    208                                     const hidl_vec<KeyParameter>& upgradeParams,
    209                                     upgradeKey_cb _hidl_cb) {
    210     auto cb = [&](V3_0::ErrorCode error, const hidl_vec<uint8_t>& upgradedKeyBlob) {
    211         _hidl_cb(convert(error), upgradedKeyBlob);
    212     };
    213     auto rc = km3_dev_->upgradeKey(keyBlobToUpgrade, convert(upgradeParams), cb);
    214     rc.isOk();  // move ctor prereq
    215     return rc;
    216 }
    217 
    218 Return<ErrorCode> Keymaster3::deleteKey(const hidl_vec<uint8_t>& keyBlob) {
    219     auto rc = km3_dev_->deleteKey(keyBlob);
    220     if (!rc.isOk()) return StatusOf<V3_0::ErrorCode, ErrorCode>(rc);
    221     return convert(rc);
    222 }
    223 
    224 Return<ErrorCode> Keymaster3::deleteAllKeys() {
    225     auto rc = km3_dev_->deleteAllKeys();
    226     if (!rc.isOk()) return StatusOf<V3_0::ErrorCode, ErrorCode>(rc);
    227     return convert(rc);
    228 }
    229 
    230 Return<ErrorCode> Keymaster3::destroyAttestationIds() {
    231     auto rc = km3_dev_->destroyAttestationIds();
    232     if (!rc.isOk()) return StatusOf<V3_0::ErrorCode, ErrorCode>(rc);
    233     return convert(rc);
    234 }
    235 
    236 Return<void> Keymaster3::begin(KeyPurpose purpose, const hidl_vec<uint8_t>& key,
    237                                const hidl_vec<KeyParameter>& inParams,
    238                                const HardwareAuthToken& authToken, begin_cb _hidl_cb) {
    239     auto cb = [&](V3_0::ErrorCode error, const hidl_vec<V3_0::KeyParameter>& outParams,
    240                   OperationHandle operationHandle) {
    241         _hidl_cb(convert(error), convert(outParams), operationHandle);
    242     };
    243 
    244     auto rc =
    245         km3_dev_->begin(convert(purpose), key, convertAndAddAuthToken(inParams, authToken), cb);
    246     rc.isOk();  // move ctor prereq
    247     return rc;
    248 }
    249 
    250 Return<void> Keymaster3::update(uint64_t operationHandle, const hidl_vec<KeyParameter>& inParams,
    251                                 const hidl_vec<uint8_t>& input, const HardwareAuthToken& authToken,
    252                                 const VerificationToken& /* verificationToken */,
    253                                 update_cb _hidl_cb) {
    254     auto cb = [&](V3_0::ErrorCode error, uint32_t inputConsumed,
    255                   const hidl_vec<V3_0::KeyParameter>& outParams, const hidl_vec<uint8_t>& output) {
    256         _hidl_cb(convert(error), inputConsumed, convert(outParams), output);
    257     };
    258 
    259     auto rc =
    260         km3_dev_->update(operationHandle, convertAndAddAuthToken(inParams, authToken), input, cb);
    261     rc.isOk();  // move ctor prereq
    262     return rc;
    263 }
    264 
    265 Return<void> Keymaster3::finish(uint64_t operationHandle, const hidl_vec<KeyParameter>& inParams,
    266                                 const hidl_vec<uint8_t>& input, const hidl_vec<uint8_t>& signature,
    267                                 const HardwareAuthToken& authToken,
    268                                 const VerificationToken& /* verificationToken */,
    269                                 finish_cb _hidl_cb) {
    270     auto cb = [&](V3_0::ErrorCode error, const hidl_vec<V3_0::KeyParameter>& outParams,
    271                   const hidl_vec<uint8_t>& output) {
    272         _hidl_cb(convert(error), convert(outParams), output);
    273     };
    274 
    275     auto rc = km3_dev_->finish(operationHandle, convertAndAddAuthToken(inParams, authToken), input,
    276                                signature, cb);
    277     rc.isOk();  // move ctor prereq
    278     return rc;
    279 }
    280 
    281 Return<ErrorCode> Keymaster3::abort(uint64_t operationHandle) {
    282     auto rc = km3_dev_->abort(operationHandle);
    283     if (!rc.isOk()) return StatusOf<V3_0::ErrorCode, ErrorCode>(rc);
    284     return convert(rc);
    285 }
    286 
    287 }  // namespace support
    288 }  // namespace V4_0
    289 }  // namespace keymaster
    290 }  // namespace hardware
    291 }  // namespace android
    292