Move key factory registration into SoftKeymasterDevice.

So we can do it differently in the keymaster0 adapter.

Cherry-picked from internal.

Bug: 20912868
Change-Id: Icfcc96ba10c5fdcb5617987b01b643c8c2c14086
diff --git a/aes_key.cpp b/aes_key.cpp
index 2519f61..8b2c3fd 100644
--- a/aes_key.cpp
+++ b/aes_key.cpp
@@ -26,16 +26,12 @@
 
 namespace keymaster {
 
-class AesKeyFactory : public SymmetricKeyFactory {
-  public:
-    keymaster_algorithm_t registry_key() const { return KM_ALGORITHM_AES; }
+Key* AesKeyFactory::LoadKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error) {
+    return new AesKey(blob, error);
+}
 
-    virtual Key* LoadKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error) {
-        return new AesKey(blob, error);
-    }
-
-    virtual SymmetricKey* CreateKey(const AuthorizationSet& auths) { return new AesKey(auths); }
-};
-static KeyFactoryRegistry::Registration<AesKeyFactory> registration;
+SymmetricKey* AesKeyFactory::CreateKey(const AuthorizationSet& auths) {
+    return new AesKey(auths);
+}
 
 }  // namespace keymaster
diff --git a/aes_key.h b/aes_key.h
index 6aeb113..fa615f6 100644
--- a/aes_key.h
+++ b/aes_key.h
@@ -23,13 +23,21 @@
 
 namespace keymaster {
 
+class AesKeyFactory : public SymmetricKeyFactory {
+  public:
+    keymaster_algorithm_t registry_key() const { return KM_ALGORITHM_AES; }
+
+    Key* LoadKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error) override;
+    SymmetricKey* CreateKey(const AuthorizationSet& auths) override;
+};
+
 class AesKey : public SymmetricKey {
   public:
     AesKey(const AuthorizationSet& auths) : SymmetricKey(auths) {}
     AesKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error) : SymmetricKey(blob, error) {}
 
   private:
-    virtual bool size_supported(size_t key_size) {
+    bool size_supported(size_t key_size) const override {
         // AES keys only come in three sizes, 128, 192 and 256 bits.
         return key_size == 128 / 8 || key_size == 192 / 8 || key_size == 256 / 8;
     }
diff --git a/ec_key.cpp b/ec_key.cpp
index e989f0a..456ffb8 100644
--- a/ec_key.cpp
+++ b/ec_key.cpp
@@ -22,8 +22,6 @@
 
 namespace keymaster {
 
-static KeyFactoryRegistry::Registration<EcdsaKeyFactory> registration;
-
 Key* EcKeyFactory::LoadKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error) {
     return new EcKey(blob, error);
 }
diff --git a/hmac_key.cpp b/hmac_key.cpp
index 0f43640..294832d 100644
--- a/hmac_key.cpp
+++ b/hmac_key.cpp
@@ -23,17 +23,12 @@
 
 namespace keymaster {
 
-class HmacKeyFactory : public SymmetricKeyFactory {
-  public:
-    keymaster_algorithm_t registry_key() const { return KM_ALGORITHM_HMAC; }
+Key* HmacKeyFactory::LoadKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error) {
+    return new HmacKey(blob, error);
+}
 
-    virtual Key* LoadKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error) {
-        return new HmacKey(blob, error);
-    }
-
-    virtual SymmetricKey* CreateKey(const AuthorizationSet& auths) { return new HmacKey(auths); }
-};
-
-static KeyFactoryRegistry::Registration<HmacKeyFactory> registration;
+SymmetricKey* HmacKeyFactory::CreateKey(const AuthorizationSet& auths) {
+    return new HmacKey(auths);
+}
 
 }  // namespace keymaster
diff --git a/hmac_key.h b/hmac_key.h
index 6c482bb..065effc 100644
--- a/hmac_key.h
+++ b/hmac_key.h
@@ -21,6 +21,14 @@
 
 namespace keymaster {
 
+class HmacKeyFactory : public SymmetricKeyFactory {
+  public:
+    keymaster_algorithm_t registry_key() const override { return KM_ALGORITHM_HMAC; }
+
+    Key* LoadKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error) override;
+    SymmetricKey* CreateKey(const AuthorizationSet& auths) override;
+};
+
 class HmacKey : public SymmetricKey {
     static const size_t MAX_HMAC_KEY_SIZE = 256; /* Arbitrary limit, for DoS prevention */
 
@@ -29,7 +37,7 @@
     HmacKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error) : SymmetricKey(blob, error) {}
 
   private:
-    virtual bool size_supported(size_t key_size) { return key_size < MAX_HMAC_KEY_SIZE; }
+    bool size_supported(size_t key_size) const override { return key_size < MAX_HMAC_KEY_SIZE; }
 };
 
 }  // namespace keymaster
diff --git a/include/keymaster/soft_keymaster_device.h b/include/keymaster/soft_keymaster_device.h
index 18b1aaf..58dd2d9 100644
--- a/include/keymaster/soft_keymaster_device.h
+++ b/include/keymaster/soft_keymaster_device.h
@@ -65,7 +65,7 @@
      * keymaster_device.
      */
 
-    // Version 0.3 and below APIs
+    // keymaster0 APIs
     static int generate_keypair(const keymaster1_device_t* dev, const keymaster_keypair_t key_type,
                                 const void* key_params, uint8_t** keyBlob, size_t* keyBlobLength);
     static int import_keypair(const struct keymaster1_device* dev, const uint8_t* key,
@@ -82,7 +82,7 @@
                            const uint8_t* signed_data, const size_t signed_data_length,
                            const uint8_t* signature, const size_t signature_length);
 
-    // Version 0.4 APIs.
+    // keymaster1 APIs.
     static keymaster_error_t get_supported_algorithms(const keymaster1_device_t* dev,
                                                       keymaster_algorithm_t** algorithms,
                                                       size_t* algorithms_length);
diff --git a/rsa_key.cpp b/rsa_key.cpp
index 0f7ff44..5150588 100644
--- a/rsa_key.cpp
+++ b/rsa_key.cpp
@@ -29,8 +29,6 @@
 
 namespace keymaster {
 
-static KeyFactoryRegistry::Registration<RsaKeyFactory> registration;
-
 Key* RsaKeyFactory::LoadKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error) {
     return new RsaKey(blob, error);
 }
diff --git a/soft_keymaster_device.cpp b/soft_keymaster_device.cpp
index 46fa5c9..18ac3e6 100644
--- a/soft_keymaster_device.cpp
+++ b/soft_keymaster_device.cpp
@@ -38,7 +38,11 @@
 #include <keymaster/key_blob.h>
 #include <keymaster/soft_keymaster_logger.h>
 
+#include "aes_key.h"
+#include "ec_key.h"
 #include "android_softkeymaster.h"
+#include "hmac_key.h"
+#include "rsa_key.h"
 
 struct keystore_module soft_keymaster_device_module = {
     .common =
@@ -57,6 +61,11 @@
 
 namespace keymaster {
 
+static KeyFactoryRegistry::Registration<AesKeyFactory> aes_registration;
+static KeyFactoryRegistry::Registration<EcdsaKeyFactory> ec_registration;
+static KeyFactoryRegistry::Registration<HmacKeyFactory> hmac_registration;
+static KeyFactoryRegistry::Registration<RsaKeyFactory> rsa_registration;
+
 SoftKeymasterDevice::SoftKeymasterDevice() : impl_(new AndroidSoftKeymaster(16)) {
 #if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
     static_assert(std::is_standard_layout<SoftKeymasterDevice>::value,
diff --git a/symmetric_key.h b/symmetric_key.h
index 85dbce3..7662a4a 100644
--- a/symmetric_key.h
+++ b/symmetric_key.h
@@ -70,7 +70,7 @@
 
     keymaster_error_t LoadKey(const UnencryptedKeyBlob& blob);
     keymaster_error_t set_size(size_t key_size);
-    virtual bool size_supported(size_t key_size) = 0;
+    virtual bool size_supported(size_t key_size) const = 0;
 
     size_t key_data_size_;
     UniquePtr<uint8_t[]> key_data_;