Add RSA encryption and decryption support.

Change-Id: Iceefe0933c80a2169f87fbc01a6fa0fce9644649
diff --git a/google_keymaster.cpp b/google_keymaster.cpp
index 3eed818..1da78f3 100644
--- a/google_keymaster.cpp
+++ b/google_keymaster.cpp
@@ -79,10 +79,12 @@
     response->error = KM_ERROR_UNSUPPORTED_BLOCK_MODE;
 }
 
+keymaster_padding_t supported_rsa_crypt_padding[] = {KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT};
+keymaster_padding_t supported_rsa_sign_padding[] = {KM_PAD_NONE};
 keymaster_padding_t supported_padding[] = {KM_PAD_NONE};
 
 void GoogleKeymaster::SupportedPaddingModes(
-    keymaster_algorithm_t algorithm, keymaster_purpose_t /* purpose */,
+    keymaster_algorithm_t algorithm, keymaster_purpose_t purpose,
     SupportedResponse<keymaster_padding_t>* response) const {
     if (response == NULL || !check_supported(algorithm, response))
         return;
@@ -90,6 +92,17 @@
     response->error = KM_ERROR_OK;
     switch (algorithm) {
     case KM_ALGORITHM_RSA:
+        switch (purpose) {
+        case KM_PURPOSE_ENCRYPT:
+        case KM_PURPOSE_DECRYPT:
+            response->SetResults(supported_rsa_crypt_padding);
+            break;
+        case KM_PURPOSE_SIGN:
+        case KM_PURPOSE_VERIFY:
+            response->SetResults(supported_rsa_sign_padding);
+            break;
+        }
+        break;
     case KM_ALGORITHM_DSA:
     case KM_ALGORITHM_ECDSA:
         response->SetResults(supported_padding);