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_;