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
22398c158a0206217025f327c2d26bb6c86659f5a0Shawn Willden#include <keymaster/rsa_key_factory.h>
23398c158a0206217025f327c2d26bb6c86659f5a0Shawn Willden
242beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden#include "rsa_key.h"
252beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
262beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdennamespace keymaster {
272beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
282beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenclass Keymaster0Engine;
292beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenclass SoftKeymasterContext;
302beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
312beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden/**
322beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * An RsaKeyFactory which can delegate key generation, importing and loading operations to a
332beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden * keymaster0-backed OpenSSL engine.
342beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden */
352beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenclass RsaKeymaster0KeyFactory : public RsaKeyFactory {
362beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    typedef RsaKeyFactory super;
372beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
382beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden  public:
390629810b145187575bc26c910dded0d24c64569dShawn Willden    RsaKeymaster0KeyFactory(const SoftKeymasterContext* context, const Keymaster0Engine* engine);
402beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
412beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    keymaster_error_t GenerateKey(const AuthorizationSet& key_description,
422beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                  KeymasterKeyBlob* key_blob, AuthorizationSet* hw_enforced,
430629810b145187575bc26c910dded0d24c64569dShawn Willden                                  AuthorizationSet* sw_enforced) const override;
442beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
452beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    keymaster_error_t ImportKey(const AuthorizationSet& key_description,
462beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                keymaster_key_format_t input_key_material_format,
472beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                const KeymasterKeyBlob& input_key_material,
482beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                                KeymasterKeyBlob* output_key_blob, AuthorizationSet* hw_enforced,
490629810b145187575bc26c910dded0d24c64569dShawn Willden                                AuthorizationSet* sw_enforced) const override;
502beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
512beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    keymaster_error_t LoadKey(const KeymasterKeyBlob& key_material,
52d599b15c0693950bdc72fb867872044fdc484ef5Shawn Willden                              const AuthorizationSet& additional_params,
532beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden                              const AuthorizationSet& hw_enforced,
540629810b145187575bc26c910dded0d24c64569dShawn Willden                              const AuthorizationSet& sw_enforced,
550629810b145187575bc26c910dded0d24c64569dShawn Willden                              UniquePtr<Key>* key) const override;
562beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
572beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden  private:
582beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    const Keymaster0Engine* engine_;
592beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden};
602beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
612beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willdenclass RsaKeymaster0Key : public RsaKey {
622beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden  public:
632beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden    RsaKeymaster0Key(RSA* rsa_key, const AuthorizationSet& hw_enforced,
644fc15704d86aab977c2bdbb14345a2c417be2babShawn Willden                     const AuthorizationSet& sw_enforced, keymaster_error_t* error)
654fc15704d86aab977c2bdbb14345a2c417be2babShawn Willden        : RsaKey(rsa_key, hw_enforced, sw_enforced, error) {}
662beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden};
672beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
682beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden}  // namespace keymaster
692beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden
702beb628bfefae72fa6bb84a6235da7e3de532823Shawn Willden#endif  // SYSTEM_KEYMASTER_RSA_KEYMASTER0_KEY_H_
71