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