195e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden/* 295e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * Copyright 2014 The Android Open Source Project 395e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * 495e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * Licensed under the Apache License, Version 2.0 (the "License"); 595e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * you may not use this file except in compliance with the License. 695e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * You may obtain a copy of the License at 795e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * 895e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * http://www.apache.org/licenses/LICENSE-2.0 995e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * 1095e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * Unless required by applicable law or agreed to in writing, software 1195e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * distributed under the License is distributed on an "AS IS" BASIS, 1295e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1395e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * See the License for the specific language governing permissions and 1495e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden * limitations under the License. 1595e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden */ 1695e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden 1795e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden#ifndef SYSTEM_KEYMASTER_SYMMETRIC_KEY_H_ 1895e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden#define SYSTEM_KEYMASTER_SYMMETRIC_KEY_H_ 1995e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden 20398c158a0206217025f327c2d26bb6c86659f5a0Shawn Willden#include <keymaster/key_factory.h> 21398c158a0206217025f327c2d26bb6c86659f5a0Shawn Willden 2295e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden#include "key.h" 2395e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden 2495e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willdennamespace keymaster { 2595e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden 26a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willdenclass SymmetricKey; 27a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden 28a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willdenclass SymmetricKeyFactory : public KeyFactory { 290cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden public: 305d5e42b081646208e134a96d0cb500e6b6e8f043Chih-Hung Hsieh explicit SymmetricKeyFactory(const KeymasterContext* context) : KeyFactory(context) {} 310cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden 320cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden keymaster_error_t GenerateKey(const AuthorizationSet& key_description, 330cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden KeymasterKeyBlob* key_blob, AuthorizationSet* hw_enforced, 340629810b145187575bc26c910dded0d24c64569dShawn Willden AuthorizationSet* sw_enforced) const override; 350cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden keymaster_error_t ImportKey(const AuthorizationSet& key_description, 360cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden keymaster_key_format_t input_key_material_format, 370cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden const KeymasterKeyBlob& input_key_material, 380cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden KeymasterKeyBlob* output_key_blob, AuthorizationSet* hw_enforced, 390629810b145187575bc26c910dded0d24c64569dShawn Willden AuthorizationSet* sw_enforced) const override; 40a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden 414800ad2a7575a31c5a5518963fae66ee44d166ceRoberto Pereira virtual const keymaster_key_format_t* SupportedImportFormats(size_t* format_count) const override; 424800ad2a7575a31c5a5518963fae66ee44d166ceRoberto Pereira virtual const keymaster_key_format_t* SupportedExportFormats(size_t* format_count) const override { 43a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden return NoFormats(format_count); 44a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden }; 45a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden 46a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden private: 470cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden virtual bool key_size_supported(size_t key_size_bits) const = 0; 4833ab0389e908b98702806c746e7babc0d46eb452Shawn Willden virtual keymaster_error_t 4933ab0389e908b98702806c746e7babc0d46eb452Shawn Willden validate_algorithm_specific_new_key_params(const AuthorizationSet& key_description) const = 0; 507dad93b6552a2253ad6e7a493ddf0c9113806712Shawn Willden 510629810b145187575bc26c910dded0d24c64569dShawn Willden const keymaster_key_format_t* NoFormats(size_t* format_count) const { 52a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden *format_count = 0; 53a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden return NULL; 54a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden } 55a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden}; 56a278f6156b9e57e1de8ca380b14fef113ad10be8Shawn Willden 5795e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willdenclass SymmetricKey : public Key { 5895e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden public: 5995e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden ~SymmetricKey(); 6095e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden 6195e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden virtual keymaster_error_t key_material(UniquePtr<uint8_t[]>* key_material, size_t* size) const; 6295e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden virtual keymaster_error_t formatted_key_material(keymaster_key_format_t, UniquePtr<uint8_t[]>*, 6395e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden size_t*) const { 647dad93b6552a2253ad6e7a493ddf0c9113806712Shawn Willden return KM_ERROR_UNSUPPORTED_KEY_FORMAT; 6595e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden } 6695e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden 677dad93b6552a2253ad6e7a493ddf0c9113806712Shawn Willden const uint8_t* key_data() const { return key_data_.get(); } 6895e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden size_t key_data_size() const { return key_data_size_; } 6995e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden 7063ac043f81f8e2a15bbadcb6628b92096295ab6aShawn Willden protected: 710cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden SymmetricKey(const KeymasterKeyBlob& key_material, const AuthorizationSet& hw_enforced, 720cb6942d3efb6c056f96321c82a4b3d86af601d6Shawn Willden const AuthorizationSet& sw_enforced, keymaster_error_t* error); 7395e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden 7495e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden private: 7595e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden size_t key_data_size_; 767dad93b6552a2253ad6e7a493ddf0c9113806712Shawn Willden UniquePtr<uint8_t[]> key_data_; 7795e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden}; 7895e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden 7995e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden} // namespace keymaster 8095e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden 8195e1382b75bab7d8b4cce3c1267fa23df2006957Shawn Willden#endif // SYSTEM_KEYMASTER_AES_KEY_H_ 82