Add support for DSA and ECDSA key types

(cherry picked from commit 6e1683f5d508a4c1ff761a9a3508619ac5ac6ed7)

Bug: 10600582
Change-Id: I8e5b66baa70b37031198260853bb5355df75e23d
diff --git a/include/hardware/keymaster.h b/include/hardware/keymaster.h
index e0014c8..968beb9 100644
--- a/include/hardware/keymaster.h
+++ b/include/hardware/keymaster.h
@@ -37,7 +37,7 @@
  * module to recognize which API level of the client it is dealing with in
  * the case of pre-compiled binary clients.
  */
-#define KEYMASTER_API_VERSION 1
+#define KEYMASTER_API_VERSION 2
 
 /**
  * Flags for keymaster_device::flags
@@ -62,6 +62,8 @@
  */
 typedef enum {
     TYPE_RSA = 1,
+    TYPE_DSA = 2,
+    TYPE_EC = 3,
 } keymaster_keypair_t;
 
 /**
@@ -73,11 +75,42 @@
 } keymaster_rsa_keygen_params_t;
 
 /**
- * Digest type used for RSA operations.
+ * Parameters needed to generate a DSA key.
+ */
+typedef struct {
+    uint32_t key_size;
+    uint32_t generator_len;
+    uint32_t prime_p_len;
+    uint32_t prime_q_len;
+    const uint8_t* generator;
+    const uint8_t* prime_p;
+    const uint8_t* prime_q;
+} keymaster_dsa_keygen_params_t;
+
+/**
+ * Parameters needed to generate an EC key.
+ *
+ * Field size is the only parameter in version 2. The sizes correspond to these required curves:
+ *
+ * 192 = NIST P-192
+ * 224 = NIST P-224
+ * 256 = NIST P-256
+ * 384 = NIST P-384
+ * 521 = NIST P-521
+ *
+ * The parameters for these curves are available at: http://www.nsa.gov/ia/_files/nist-routines.pdf
+ * in Chapter 4.
+ */
+typedef struct {
+    uint32_t field_size;
+} keymaster_ec_keygen_params_t;
+
+/**
+ * Digest type.
  */
 typedef enum {
     DIGEST_NONE,
-} keymaster_rsa_digest_t;
+} keymaster_digest_t;
 
 /**
  * Type of padding used for RSA operations.
@@ -86,8 +119,17 @@
     PADDING_NONE,
 } keymaster_rsa_padding_t;
 
+
 typedef struct {
-    keymaster_rsa_digest_t digest_type;
+    keymaster_digest_t digest_type;
+} keymaster_dsa_sign_params_t;
+
+typedef struct {
+    keymaster_digest_t digest_type;
+} keymaster_ec_sign_params_t;
+
+typedef struct {
+    keymaster_digest_t digest_type;
     keymaster_rsa_padding_t padding_type;
 } keymaster_rsa_sign_params_t;