Push padding and digest handling down to specific key types.

AsymmetricKey handled checking for digest and padding, but that doesn't
make sense because not all asymmetric key types need both.  This is in
preparation for adding asymmetric encryption/decryption support.

Change-Id: I7b9a4fc37b6d31ab25c56015c1df7d114affe882
diff --git a/dsa_key.cpp b/dsa_key.cpp
index 65c05b7..973879b 100644
--- a/dsa_key.cpp
+++ b/dsa_key.cpp
@@ -190,18 +190,23 @@
         *error = LoadKey(blob);
 }
 
-Operation* DsaKey::CreateOperation(keymaster_purpose_t purpose, keymaster_digest_t digest,
-                                   keymaster_padding_t padding, keymaster_error_t* error) {
+Operation* DsaKey::CreateOperation(keymaster_purpose_t purpose, keymaster_error_t* error) {
+    keymaster_digest_t digest = KM_DIGEST_NONE;
+    if (!authorizations().GetTagValue(TAG_DIGEST, &digest) || digest != KM_DIGEST_NONE) {
+        *error = KM_ERROR_UNSUPPORTED_DIGEST;
+        return NULL;
+    }
+
     Operation* op;
     switch (purpose) {
     case KM_PURPOSE_SIGN:
-        op = new DsaSignOperation(purpose, logger_, digest, padding, dsa_key_.release());
+        op = new DsaSignOperation(purpose, logger_, digest, dsa_key_.release());
         break;
     case KM_PURPOSE_VERIFY:
-        op = new DsaVerifyOperation(purpose, logger_, digest, padding, dsa_key_.release());
+        op = new DsaVerifyOperation(purpose, logger_, digest, dsa_key_.release());
         break;
     default:
-        *error = KM_ERROR_UNIMPLEMENTED;
+        *error = KM_ERROR_INCOMPATIBLE_PURPOSE;
         return NULL;
     }
     *error = op ? KM_ERROR_OK : KM_ERROR_MEMORY_ALLOCATION_FAILED;