12beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden/*
22beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * Copyright 2015 The Android Open Source Project
32beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden *
42beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * Licensed under the Apache License, Version 2.0 (the "License");
52beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * you may not use this file except in compliance with the License.
62beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * You may obtain a copy of the License at
72beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden *
82beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden *      http://www.apache.org/licenses/LICENSE-2.0
92beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden *
102beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * Unless required by applicable law or agreed to in writing, software
112beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * distributed under the License is distributed on an "AS IS" BASIS,
122beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * See the License for the specific language governing permissions and
142beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * limitations under the License.
152beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden */
162beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
172beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden#include "rsa_keymaster0_key.h"
182beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
192beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden#include <memory>
202beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
210629810b145187575bc26c910dded0d24c64569dShawn Willden#include <keymaster/android_keymaster_utils.h>
220629810b145187575bc26c910dded0d24c64569dShawn Willden#include <keymaster/logger.h>
232beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden#include <keymaster/soft_keymaster_context.h>
242beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
252beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden#include "keymaster0_engine.h"
262beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden#include "openssl_utils.h"
272beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
282beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenusing std::unique_ptr;
292beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
302beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdennamespace keymaster {
312beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
322beb628bfefae72fa6bb84a6235da7e3de532823Shawn WilldenRsaKeymaster0KeyFactory::RsaKeymaster0KeyFactory(const SoftKeymasterContext* context,
332beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                                 const Keymaster0Engine* engine)
34d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden    : RsaKeyFactory(context), engine_(engine) {}
352beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
362beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenkeymaster_error_t RsaKeymaster0KeyFactory::GenerateKey(const AuthorizationSet& key_description,
372beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                                       KeymasterKeyBlob* key_blob,
382beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                                       AuthorizationSet* hw_enforced,
390629810b145187575bc26c910dded0d24c64569dShawn Willden                                                       AuthorizationSet* sw_enforced) const {
402beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    if (!key_blob || !hw_enforced || !sw_enforced)
412beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        return KM_ERROR_OUTPUT_PARAMETER_NULL;
422beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
432beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    uint64_t public_exponent;
442beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    if (!key_description.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &public_exponent)) {
452beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        LOG_E("%s", "No public exponent specified for RSA key generation");
462beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        return KM_ERROR_INVALID_ARGUMENT;
472beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    }
482beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
492beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    uint32_t key_size;
502beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    if (!key_description.GetTagValue(TAG_KEY_SIZE, &key_size)) {
512beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        LOG_E("%s", "No key size specified for RSA key generation");
522beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        return KM_ERROR_UNSUPPORTED_KEY_SIZE;
532beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    }
542beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
552beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    KeymasterKeyBlob key_material;
562beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    if (!engine_->GenerateRsaKey(public_exponent, key_size, &key_material))
572beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        return KM_ERROR_UNKNOWN_ERROR;
582beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
592beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    // These tags are hardware-enforced.  Putting them in the hw_enforced set here will ensure that
602beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    // context_->CreateKeyBlob doesn't put them in sw_enforced.
612beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    hw_enforced->push_back(TAG_ALGORITHM, KM_ALGORITHM_RSA);
622beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    hw_enforced->push_back(TAG_RSA_PUBLIC_EXPONENT, public_exponent);
632beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    hw_enforced->push_back(TAG_KEY_SIZE, key_size);
6434f09c52b08e654b8b76d9796240a5104c13a4a8Shawn Willden    hw_enforced->push_back(TAG_ORIGIN, KM_ORIGIN_UNKNOWN);
652beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
6634f09c52b08e654b8b76d9796240a5104c13a4a8Shawn Willden    return context_->CreateKeyBlob(key_description, KM_ORIGIN_UNKNOWN, key_material, key_blob,
672beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                   hw_enforced, sw_enforced);
682beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden}
692beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
702beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenkeymaster_error_t RsaKeymaster0KeyFactory::ImportKey(
712beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    const AuthorizationSet& key_description, keymaster_key_format_t input_key_material_format,
722beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    const KeymasterKeyBlob& input_key_material, KeymasterKeyBlob* output_key_blob,
730629810b145187575bc26c910dded0d24c64569dShawn Willden    AuthorizationSet* hw_enforced, AuthorizationSet* sw_enforced) const {
742beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    if (!output_key_blob || !hw_enforced || !sw_enforced)
752beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        return KM_ERROR_OUTPUT_PARAMETER_NULL;
762beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
772beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    AuthorizationSet authorizations;
782beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    uint64_t public_exponent;
792beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    uint32_t key_size;
802beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    keymaster_error_t error =
812beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        UpdateImportKeyDescription(key_description, input_key_material_format, input_key_material,
822beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                   &authorizations, &public_exponent, &key_size);
832beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    if (error != KM_ERROR_OK)
842beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        return error;
852beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
862beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    KeymasterKeyBlob imported_hw_key;
876270aca8571399aca8ea538acd7386ddecdcc112Shawn Willden    if (!engine_->ImportKey(input_key_material_format, input_key_material, &imported_hw_key))
882beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        return KM_ERROR_UNKNOWN_ERROR;
892beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
902beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    // These tags are hardware-enforced.  Putting them in the hw_enforced set here will ensure that
912beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    // context_->CreateKeyBlob doesn't put them in sw_enforced.
922beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    hw_enforced->push_back(TAG_ALGORITHM, KM_ALGORITHM_RSA);
932beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    hw_enforced->push_back(TAG_RSA_PUBLIC_EXPONENT, public_exponent);
942beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    hw_enforced->push_back(TAG_KEY_SIZE, key_size);
9534f09c52b08e654b8b76d9796240a5104c13a4a8Shawn Willden    hw_enforced->push_back(TAG_ORIGIN, KM_ORIGIN_UNKNOWN);
962beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
9734f09c52b08e654b8b76d9796240a5104c13a4a8Shawn Willden    return context_->CreateKeyBlob(authorizations, KM_ORIGIN_UNKNOWN, imported_hw_key,
982beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                   output_key_blob, hw_enforced, sw_enforced);
992beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden}
1002beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
1012beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenkeymaster_error_t RsaKeymaster0KeyFactory::LoadKey(const KeymasterKeyBlob& key_material,
102d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                                                   const AuthorizationSet& additional_params,
1032beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                                   const AuthorizationSet& hw_enforced,
1042beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                                   const AuthorizationSet& sw_enforced,
1050629810b145187575bc26c910dded0d24c64569dShawn Willden                                                   UniquePtr<Key>* key) const {
1062beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    if (!key)
1072beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        return KM_ERROR_OUTPUT_PARAMETER_NULL;
1082beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
1092beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    if (sw_enforced.GetTagCount(TAG_ALGORITHM) == 1)
110d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden        return super::LoadKey(key_material, additional_params, hw_enforced, sw_enforced, key);
1112beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
1122beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    unique_ptr<RSA, RSA_Delete> rsa(engine_->BlobToRsaKey(key_material));
1132beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    if (!rsa)
1142beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        return KM_ERROR_UNKNOWN_ERROR;
1152beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
1162beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    keymaster_error_t error;
1170f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden    key->reset(new (std::nothrow)
1184fc15704d86aab977c2bdbb14345a2c417be2babShawn Willden                   RsaKeymaster0Key(rsa.release(), hw_enforced, sw_enforced, &error));
119d530305019e1ccc1e30a4f8edeb88db3d126e235Shawn Willden    if (!key->get())
1200f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden        error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
1210f906ec40f6ade7955c6b967ea522aade54ea2e4Shawn Willden
1222beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    if (error != KM_ERROR_OK)
1232beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden        return error;
1242beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
1252beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    return KM_ERROR_OK;
1262beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden}
1272beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
1282beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden}  // namespace keymaster
129