Update PKCS#7 enveloped data to new API.
[openssl.git] / crypto / rsa / rsa_pmeth.c
index 56759b5..01a4030 100644 (file)
@@ -1,3 +1,4 @@
+/* crypto/rsa/rsa_pmeth.c */
 /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
  * project 2006.
  */
@@ -127,8 +128,8 @@ static void pkey_rsa_cleanup(EVP_PKEY_CTX *ctx)
                        BN_free(rctx->pub_exp);
                if (rctx->tbuf)
                        OPENSSL_free(rctx->tbuf);
+               OPENSSL_free(rctx);
                }
-       OPENSSL_free(rctx);
        }
 
 static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, int *siglen,
@@ -330,7 +331,7 @@ static int check_padding_md(const EVP_MD *md, int padding)
 
        if (padding == RSA_NO_PADDING)
                {
-               RSAerr(RSA_F_CHECK_PADDING_NID, RSA_R_INVALID_PADDING_MODE);
+               RSAerr(RSA_F_CHECK_PADDING_MD, RSA_R_INVALID_PADDING_MODE);
                return 0;
                }
 
@@ -338,7 +339,7 @@ static int check_padding_md(const EVP_MD *md, int padding)
                {
                if (RSA_X931_hash_id(EVP_MD_type(md)) == -1)
                        {
-                       RSAerr(RSA_F_CHECK_PADDING_NID,
+                       RSAerr(RSA_F_CHECK_PADDING_MD,
                                                RSA_R_INVALID_X931_DIGEST);
                        return 0;
                        }
@@ -386,12 +387,28 @@ static int pkey_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
                rctx->saltlen = p1;
                return 1;
 
+               case EVP_PKEY_CTRL_RSA_KEYGEN_BITS:
+               if (p1 < 256)
+                       return -2;
+               rctx->nbits = p1;
+               return 1;
+
+               case EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP:
+               if (!p2)
+                       return -2;
+               rctx->pub_exp = p2;
+               return 1;
+
                case EVP_PKEY_CTRL_MD:
                if (!check_padding_md(p2, rctx->pad_mode))
                        return 0;
                rctx->md = p2;
                return 1;
 
+               case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
+               case EVP_PKEY_CTRL_PKCS7_DECRYPT:
+               return 1;
+
                default:
                return -2;
 
@@ -422,12 +439,33 @@ static int pkey_rsa_ctrl_str(EVP_PKEY_CTX *ctx,
                        return -2;
                return EVP_PKEY_CTX_set_rsa_padding(ctx, pm);
                }
+
        if (!strcmp(type, "rsa_pss_saltlen"))
                {
                int saltlen;
                saltlen = atoi(value);
                return EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, saltlen);
                }
+
+       if (!strcmp(type, "rsa_keygen_bits"))
+               {
+               int nbits;
+               nbits = atoi(value);
+               return EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, nbits);
+               }
+
+       if (!strcmp(type, "rsa_keygen_pubexp"))
+               {
+               int ret;
+               BIGNUM *pubexp = NULL;
+               if (!BN_asc2bn(&pubexp, value))
+                       return 0;
+               ret = EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp);
+               if (ret <= 0)
+                       BN_free(pubexp);
+               return ret;
+               }
+
        return -2;
        }
 
@@ -464,7 +502,7 @@ static int pkey_rsa_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
 const EVP_PKEY_METHOD rsa_pkey_meth = 
        {
        EVP_PKEY_RSA,
-       0,
+       EVP_PKEY_FLAG_AUTOARGLEN,
        pkey_rsa_init,
        pkey_rsa_cleanup,
 
@@ -491,6 +529,8 @@ const EVP_PKEY_METHOD rsa_pkey_meth =
        0,
        pkey_rsa_decrypt,
 
+       0,0,
+
        pkey_rsa_ctrl,
        pkey_rsa_ctrl_str