PSA crypto: asymmetric signature (RSA PKCS#1v1.5 only)

Define hash algorithms and RSA signature algorithms.

New function psa_asymmetric_sign.

Implement psa_asymmetric_sign for RSA PKCS#1 v1.5.
diff --git a/include/psa/crypto.h b/include/psa/crypto.h
index 7e61565..3eee382 100644
--- a/include/psa/crypto.h
+++ b/include/psa/crypto.h
@@ -136,7 +136,39 @@
 #define PSA_KEY_TYPE_IS_ECC(type)                                       \
     (((type) & PSA_KEY_TYPE_ECC_TEST_MASK) == PSA_KEY_TYPE_ECC_TEST_VALUE)
 
-typedef uint32_t psa_algorithm_type_t;
+typedef uint32_t psa_algorithm_t;
+
+#define PSA_ALG_HASH_BITS                       0x01000000
+#define PSA_ALG_RSA_HASH_MASK                   0x000000ff
+#define PSA_ALG_MD2                             0x01000001
+#define PSA_ALG_MD4                             0x01000002
+#define PSA_ALG_MD5                             0x01000003
+#define PSA_ALG_SHA_256_128                     0x01000004
+#define PSA_ALG_RIPEMD160                       0x01000005
+#define PSA_ALG_SHA_1                           0x01000006
+#define PSA_ALG_SHA_256_160                     0x01000007
+#define PSA_ALG_SHA_224                         0x01000008
+#define PSA_ALG_SHA_256                         0x01000009
+#define PSA_ALG_SHA_384                         0x0100000a
+#define PSA_ALG_SHA_512                         0x0100000b
+#define PSA_ALG_SHA_512_224                     0x0100000c
+#define PSA_ALG_SHA_512_256                     0x0100000d
+#define PSA_ALG_SHA3_224                        0x01000010
+#define PSA_ALG_SHA3_256                        0x01000011
+#define PSA_ALG_SHA3_384                        0x01000012
+#define PSA_ALG_SHA3_512                        0x01000013
+
+#define PSA_ALG_RSA_PKCS1V15_RAW                0x40000100
+#define PSA_ALG_RSA_PSS_MGF1                    0x40000200
+#define PSA_ALG_RSA_OAEP                        0x40000300
+#define PSA_ALG_RSA_PKCS1V15(hash_alg)          \
+    (PSA_ALG_RSA_PKCS1V15_RAW | ((hash_alg) & PSA_ALG_RSA_HASH_MASK))
+#define PSA_ALG_IS_RSA_PKCS1V15(alg)            \
+    (((alg) & 0x7fffff00) == PSA_ALG_RSA_PKCS1V15_RAW)
+#define PSA_ALG_RSA_GET_HASH(alg)               \
+    (((alg) & PSA_ALG_RSA_HASH_MASK) | PSA_ALG_HASH_BITS)
+
+#define PSA_ALG_VENDOR_FLAG                     0x80000000
 
 /**@}*/
 
@@ -208,6 +240,40 @@
                             size_t data_size,
                             size_t *data_length);
 
+
+/**@}*/
+
+/** \defgroup asymmetric Asymmetric cryptography
+ * @{
+ */
+
+/**
+ * \brief Sign a hash or short message with a private key.
+ *
+ */
+psa_status_t psa_asymmetric_sign(psa_key_slot_t key,
+                                 psa_algorithm_t alg,
+                                 const uint8_t *hash,
+                                 size_t hash_length,
+                                 const uint8_t *salt,
+                                 size_t salt_length,
+                                 uint8_t *signature,
+                                 size_t signature_size,
+                                 size_t *signature_length);
+
+/**
+ * \brief Verify the signature a hash or short message using a public key.
+ *
+ */
+psa_status_t psa_asymmetric_verify(psa_key_slot_t key,
+                                   psa_algorithm_t alg,
+                                   const uint8_t *hash,
+                                   size_t hash_length,
+                                   const uint8_t *salt,
+                                   size_t salt_length,
+                                   uint8_t *signature,
+                                   size_t signature_size);
+
 /**@}*/
 
 #ifdef __cplusplus