Update to OAEP support.
authorDr. Stephen Henson <steve@openssl.org>
Thu, 20 Jun 2013 16:02:14 +0000 (17:02 +0100)
committerDr. Stephen Henson <steve@openssl.org>
Fri, 21 Jun 2013 20:33:00 +0000 (21:33 +0100)
Add OAEP ctrls to retrieve MD and label. Return errors if
an attempt is made to set or retrieve OAEP parameters when
padding mode is not OAEP.

crypto/rsa/rsa.h
crypto/rsa/rsa_pmeth.c

index d829cd52c39db2c8e7dad6383a27f38ef08efed6..38771fbafb69940dd5991d3095e5f2656e07ec53 100644 (file)
@@ -262,10 +262,18 @@ struct rsa_st
                        EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \
                                EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)pmd)
 
                        EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \
                                EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)pmd)
 
+#define         EVP_PKEY_CTX_get_rsa_oaep_md(ctx, pmd) \
+               EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT,  \
+                               EVP_PKEY_CTRL_GET_RSA_OAEP_MD, 0, (void *)pmd)
+
 #define         EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, l, llen) \
                EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT,  \
                                EVP_PKEY_CTRL_RSA_OAEP_LABEL, llen, (void *)l)
 
 #define         EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, l, llen) \
                EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT,  \
                                EVP_PKEY_CTRL_RSA_OAEP_LABEL, llen, (void *)l)
 
+#define         EVP_PKEY_CTX_get0_rsa_oaep_label(ctx, l)       \
+               EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT,  \
+                               EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL, 0, (void *)l)
+
 #define EVP_PKEY_CTRL_RSA_PADDING      (EVP_PKEY_ALG_CTRL + 1)
 #define EVP_PKEY_CTRL_RSA_PSS_SALTLEN  (EVP_PKEY_ALG_CTRL + 2)
 
 #define EVP_PKEY_CTRL_RSA_PADDING      (EVP_PKEY_ALG_CTRL + 1)
 #define EVP_PKEY_CTRL_RSA_PSS_SALTLEN  (EVP_PKEY_ALG_CTRL + 2)
 
@@ -280,6 +288,9 @@ struct rsa_st
 #define EVP_PKEY_CTRL_RSA_OAEP_MD      (EVP_PKEY_ALG_CTRL + 9)
 #define EVP_PKEY_CTRL_RSA_OAEP_LABEL   (EVP_PKEY_ALG_CTRL + 10)
 
 #define EVP_PKEY_CTRL_RSA_OAEP_MD      (EVP_PKEY_ALG_CTRL + 9)
 #define EVP_PKEY_CTRL_RSA_OAEP_LABEL   (EVP_PKEY_ALG_CTRL + 10)
 
+#define EVP_PKEY_CTRL_GET_RSA_OAEP_MD  (EVP_PKEY_ALG_CTRL + 11)
+#define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12)
+
 #define RSA_PKCS1_PADDING      1
 #define RSA_SSLV23_PADDING     2
 #define RSA_NO_PADDING         3
 #define RSA_PKCS1_PADDING      1
 #define RSA_SSLV23_PADDING     2
 #define RSA_NO_PADDING         3
index 085c73e8985f2318ce4edb251a2be164fc8727ba..ed1eb4922cfee095089affdc04acfeecfed5f114 100644 (file)
@@ -520,12 +520,16 @@ static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
                return 1;
 
                case EVP_PKEY_CTRL_RSA_OAEP_MD:
                return 1;
 
                case EVP_PKEY_CTRL_RSA_OAEP_MD:
+               case EVP_PKEY_CTRL_GET_RSA_OAEP_MD:
                if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING)
                        {
                        RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
                if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING)
                        {
                        RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
-                       return 0;
+                       return -2;
                        }
                        }
-               rctx->md = p2;
+               if (type == EVP_PKEY_CTRL_GET_RSA_OAEP_MD)
+                       *(const EVP_MD **)p2 = rctx->md;
+               else
+                       rctx->md = p2;
                return 1;
 
                case EVP_PKEY_CTRL_MD:
                return 1;
 
                case EVP_PKEY_CTRL_MD:
@@ -558,11 +562,34 @@ static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
                return 1;
 
                case EVP_PKEY_CTRL_RSA_OAEP_LABEL:
                return 1;
 
                case EVP_PKEY_CTRL_RSA_OAEP_LABEL:
-               OPENSSL_free(rctx->oaep_label);
-               rctx->oaep_label = p2;
-               rctx->oaep_labellen = p1;
+               if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING)
+                       {
+                       RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
+                       return -2;
+                       }
+               if (rctx->oaep_label)
+                       OPENSSL_free(rctx->oaep_label);
+               if (p2 && p1 > 0)
+                       {
+                       rctx->oaep_label = p2;
+                       rctx->oaep_labellen = p1;
+                       }
+               else
+                       {
+                       rctx->oaep_label = NULL;
+                       rctx->oaep_labellen = 0;
+                       }
                return 1;
 
                return 1;
 
+               case EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL:
+               if (rctx->pad_mode != RSA_PKCS1_OAEP_PADDING)
+                       {
+                       RSAerr(RSA_F_PKEY_RSA_CTRL, RSA_R_INVALID_PADDING_MODE);
+                       return -2;
+                       }
+               *(unsigned char **)p2 = rctx->oaep_label;
+               return rctx->oaep_labellen;
+
                case EVP_PKEY_CTRL_DIGESTINIT:
                case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
                case EVP_PKEY_CTRL_PKCS7_DECRYPT:
                case EVP_PKEY_CTRL_DIGESTINIT:
                case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
                case EVP_PKEY_CTRL_PKCS7_DECRYPT: