Refactor operation creation to use an operation factory registry.
Also modify GoogleKeymaster to query the operation factories to get
lists of supported modes and digests.
Change-Id: Ied30185df5dddaeaeb1106df63237757896d77db
diff --git a/rsa_key.cpp b/rsa_key.cpp
index 35fe82e..f060274 100644
--- a/rsa_key.cpp
+++ b/rsa_key.cpp
@@ -155,46 +155,8 @@
*error = LoadKey(blob);
}
-Operation* RsaKey::CreateOperation(keymaster_purpose_t purpose, keymaster_error_t* error) {
- *error = KM_ERROR_OK;
-
- keymaster_padding_t padding = static_cast<keymaster_padding_t>(-1);
- authorizations().GetTagValue(TAG_PADDING, &padding);
- if (!SupportedMode(purpose, padding)) {
- *error = KM_ERROR_UNSUPPORTED_PADDING_MODE;
- return NULL;
- }
-
- keymaster_digest_t digest = static_cast<keymaster_digest_t>(-1);
- authorizations().GetTagValue(TAG_DIGEST, &digest);
- if (!SupportedMode(purpose, digest)) {
- *error = KM_ERROR_UNSUPPORTED_DIGEST;
- return NULL;
- }
-
- Operation* op = NULL;
- switch (purpose) {
- case KM_PURPOSE_SIGN:
- op = new RsaSignOperation(logger_, digest, padding, rsa_key_.release());
- break;
- case KM_PURPOSE_VERIFY:
- op = new RsaVerifyOperation(logger_, digest, padding, rsa_key_.release());
- break;
- case KM_PURPOSE_ENCRYPT:
- op = new RsaEncryptOperation(logger_, padding, rsa_key_.release());
- break;
- case KM_PURPOSE_DECRYPT:
- op = new RsaDecryptOperation(logger_, padding, rsa_key_.release());
- break;
- default:
- *error = KM_ERROR_UNSUPPORTED_PURPOSE;
- return NULL;
- }
-
- if (!op)
- *error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
-
- return op;
+RSA* RsaKey::key() const {
+ return rsa_key_.get();
}
bool RsaKey::EvpToInternal(const EVP_PKEY* pkey) {