Refactor key creation to use a registry of key factories.
Change-Id: I6ebab7b44e4a5dbea282397ab8aca437e71bdca0
diff --git a/key.h b/key.h
index fab7816..77a8d96 100644
--- a/key.h
+++ b/key.h
@@ -21,22 +21,48 @@
#include <keymaster/authorization_set.h>
#include <keymaster/logger.h>
+#include "abstract_factory_registry.h"
+#include "unencrypted_key_blob.h"
+
namespace keymaster {
+class Key;
+
+/**
+ * KeyFactory is a pure interface whose subclasses know how to construct a specific subclass of Key.
+ * There is a one to one correspondence between Key subclasses and KeyFactory subclasses.
+ */
+class KeyFactory {
+ public:
+ virtual ~KeyFactory() {}
+
+ // Required for registry
+ typedef keymaster_algorithm_t KeyType;
+ virtual keymaster_algorithm_t registry_key() const = 0;
+
+ // Factory methods.
+ virtual Key* GenerateKey(const AuthorizationSet& key_description, const Logger& logger,
+ keymaster_error_t* error) = 0;
+ virtual Key* ImportKey(const AuthorizationSet& key_description,
+ keymaster_key_format_t key_format, const uint8_t* key_data,
+ size_t key_data_length, const Logger& logger,
+ keymaster_error_t* error) = 0;
+ virtual Key* LoadKey(const UnencryptedKeyBlob& blob, const Logger& logger,
+ keymaster_error_t* error) = 0;
+
+ // Informational methods.
+ virtual const keymaster_key_format_t* SupportedImportFormats(size_t* format_count) = 0;
+ virtual const keymaster_key_format_t* SupportedExportFormats(size_t* format_count) = 0;
+};
+
+typedef AbstractFactoryRegistry<KeyFactory> KeyFactoryRegistry;
+
class KeyBlob;
class Operation;
class UnencryptedKeyBlob;
class Key {
public:
- static Key* CreateKey(const UnencryptedKeyBlob& blob, const Logger& logger,
- keymaster_error_t* error);
- static Key* GenerateKey(const AuthorizationSet& key_description, const Logger& logger,
- keymaster_error_t* error);
- static Key* ImportKey(const AuthorizationSet& key_description,
- keymaster_key_format_t key_format, const uint8_t* key_data,
- size_t key_data_length, const Logger& logger, keymaster_error_t* error);
-
virtual ~Key() {}
virtual Operation* CreateOperation(keymaster_purpose_t purpose, keymaster_error_t* error) = 0;