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#ifndef SYSTEM_KEYMASTER_RSA_KEYMASTER0_KEY_H_
182beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden#define SYSTEM_KEYMASTER_RSA_KEYMASTER0_KEY_H_
192beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
202beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden#include <openssl/rsa.h>
212beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
22f54cc93ccf57a94f9a2c660dbf3e06494adf178dJanis Danisevskis#include <keymaster/km_openssl/rsa_key.h>
23f54cc93ccf57a94f9a2c660dbf3e06494adf178dJanis Danisevskis#include <keymaster/km_openssl/rsa_key_factory.h>
242beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
252beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdennamespace keymaster {
262beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
272beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenclass Keymaster0Engine;
282beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
292beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden/**
302beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * An RsaKeyFactory which can delegate key generation, importing and loading operations to a
312beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * keymaster0-backed OpenSSL engine.
322beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden */
332beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenclass RsaKeymaster0KeyFactory : public RsaKeyFactory {
342beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    typedef RsaKeyFactory super;
352beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
362beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden  public:
37da157a3b17b315c1c36f346c18037656946755aaJanis Danisevskis    RsaKeymaster0KeyFactory(const SoftwareKeyBlobMaker* blob_maker,
38da157a3b17b315c1c36f346c18037656946755aaJanis Danisevskis                            const Keymaster0Engine* engine);
392beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
402beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    keymaster_error_t GenerateKey(const AuthorizationSet& key_description,
412beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                  KeymasterKeyBlob* key_blob, AuthorizationSet* hw_enforced,
420629810b145187575bc26c910dded0d24c64569dShawn Willden                                  AuthorizationSet* sw_enforced) const override;
432beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
442beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    keymaster_error_t ImportKey(const AuthorizationSet& key_description,
452beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                keymaster_key_format_t input_key_material_format,
462beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                const KeymasterKeyBlob& input_key_material,
472beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                KeymasterKeyBlob* output_key_blob, AuthorizationSet* hw_enforced,
480629810b145187575bc26c910dded0d24c64569dShawn Willden                                AuthorizationSet* sw_enforced) const override;
492beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
5059c6af81b6b510dd991ab04b8d65f1bab966d0c8Janis Danisevskis    keymaster_error_t LoadKey(KeymasterKeyBlob&& key_material,
51d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                              const AuthorizationSet& additional_params,
5259c6af81b6b510dd991ab04b8d65f1bab966d0c8Janis Danisevskis                              AuthorizationSet&& hw_enforced,
5359c6af81b6b510dd991ab04b8d65f1bab966d0c8Janis Danisevskis                              AuthorizationSet&& sw_enforced,
540629810b145187575bc26c910dded0d24c64569dShawn Willden                              UniquePtr<Key>* key) const override;
552beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
562beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden  private:
572beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    const Keymaster0Engine* engine_;
582beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden};
592beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
602beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenclass RsaKeymaster0Key : public RsaKey {
612beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden  public:
6259c6af81b6b510dd991ab04b8d65f1bab966d0c8Janis Danisevskis    RsaKeymaster0Key(RSA* rsa_key, AuthorizationSet&& hw_enforced,
6359c6af81b6b510dd991ab04b8d65f1bab966d0c8Janis Danisevskis                     AuthorizationSet&& sw_enforced,
6459c6af81b6b510dd991ab04b8d65f1bab966d0c8Janis Danisevskis                     const KeyFactory* key_factory)
6559c6af81b6b510dd991ab04b8d65f1bab966d0c8Janis Danisevskis        : RsaKey(rsa_key, move(hw_enforced), move(sw_enforced), key_factory) {}
662beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden};
672beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
682beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden}  // namespace keymaster
692beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
702beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden#endif  // SYSTEM_KEYMASTER_RSA_KEYMASTER0_KEY_H_
71