Add RSA encryption and decryption support.

This change was already reviewed, merged and reverted, so I'm skipping
the review step this time.

Change-Id: Ie5b7dba86a7ae7f62eedbdb6eec7b61ef83d0c73
diff --git a/rsa_operation.h b/rsa_operation.h
index 4697866..fb417a7 100644
--- a/rsa_operation.h
+++ b/rsa_operation.h
@@ -27,9 +27,9 @@
 
 class RsaOperation : public Operation {
   public:
-    RsaOperation(keymaster_purpose_t purpose, const Logger& logger, keymaster_digest_t digest,
-                 keymaster_padding_t padding, RSA* key)
-        : Operation(purpose, logger), rsa_key_(key), digest_(digest), padding_(padding) {}
+    RsaOperation(keymaster_purpose_t purpose, const Logger& logger, keymaster_padding_t padding,
+                 RSA* key)
+        : Operation(purpose, logger), rsa_key_(key), padding_(padding) {}
     ~RsaOperation();
 
     virtual keymaster_error_t Begin() { return KM_ERROR_OK; }
@@ -40,24 +40,43 @@
     keymaster_error_t StoreData(const Buffer& input);
 
     RSA* rsa_key_;
-    keymaster_digest_t digest_;
     keymaster_padding_t padding_;
     Buffer data_;
 };
 
 class RsaSignOperation : public RsaOperation {
   public:
-    RsaSignOperation(keymaster_purpose_t purpose, const Logger& logger, keymaster_digest_t digest,
-                     keymaster_padding_t padding, RSA* key)
-        : RsaOperation(purpose, logger, digest, padding, key) {}
+    RsaSignOperation(const Logger& logger, keymaster_digest_t digest, keymaster_padding_t padding,
+                     RSA* key)
+        : RsaOperation(KM_PURPOSE_SIGN, logger, padding, key), digest_(digest) {}
     virtual keymaster_error_t Finish(const Buffer& signature, Buffer* output);
+
+  private:
+    keymaster_digest_t digest_;
 };
 
 class RsaVerifyOperation : public RsaOperation {
   public:
-    RsaVerifyOperation(keymaster_purpose_t purpose, const Logger& logger, keymaster_digest_t digest,
-                       keymaster_padding_t padding, RSA* key)
-        : RsaOperation(purpose, logger, digest, padding, key) {}
+    RsaVerifyOperation(const Logger& logger, keymaster_digest_t digest, keymaster_padding_t padding,
+                       RSA* key)
+        : RsaOperation(KM_PURPOSE_VERIFY, logger, padding, key), digest_(digest) {}
+    virtual keymaster_error_t Finish(const Buffer& signature, Buffer* output);
+
+  private:
+    keymaster_digest_t digest_;
+};
+
+class RsaEncryptOperation : public RsaOperation {
+  public:
+    RsaEncryptOperation(const Logger& logger, keymaster_padding_t padding, RSA* key)
+        : RsaOperation(KM_PURPOSE_ENCRYPT, logger, padding, key) {}
+    virtual keymaster_error_t Finish(const Buffer& signature, Buffer* output);
+};
+
+class RsaDecryptOperation : public RsaOperation {
+  public:
+    RsaDecryptOperation(const Logger& logger, keymaster_padding_t padding, RSA* key)
+        : RsaOperation(KM_PURPOSE_DECRYPT, logger, padding, key) {}
     virtual keymaster_error_t Finish(const Buffer& signature, Buffer* output);
 };