+
+
+/*
+ * RSA implementation
+ */
+static int dasync_rsa_init(EVP_PKEY_CTX *ctx)
+{
+ static int (*pinit)(EVP_PKEY_CTX *ctx);
+
+ if (pinit == NULL)
+ EVP_PKEY_meth_get_init(dasync_rsa_orig, &pinit);
+ return pinit(ctx);
+}
+
+static void dasync_rsa_cleanup(EVP_PKEY_CTX *ctx)
+{
+ static void (*pcleanup)(EVP_PKEY_CTX *ctx);
+
+ if (pcleanup == NULL)
+ EVP_PKEY_meth_get_cleanup(dasync_rsa_orig, &pcleanup);
+ pcleanup(ctx);
+}
+
+static int dasync_rsa_paramgen_init(EVP_PKEY_CTX *ctx)
+{
+ static int (*pparamgen_init)(EVP_PKEY_CTX *ctx);
+
+ if (pparamgen_init == NULL)
+ EVP_PKEY_meth_get_paramgen(dasync_rsa_orig, &pparamgen_init, NULL);
+ return pparamgen_init(ctx);
+}
+
+static int dasync_rsa_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
+{
+ static int (*pparamgen)(EVP_PKEY_CTX *c, EVP_PKEY *pkey);
+
+ if (pparamgen == NULL)
+ EVP_PKEY_meth_get_paramgen(dasync_rsa_orig, NULL, &pparamgen);
+ return pparamgen(ctx, pkey);
+}
+
+static int dasync_rsa_keygen_init(EVP_PKEY_CTX *ctx)
+{
+ static int (*pkeygen_init)(EVP_PKEY_CTX *ctx);
+
+ if (pkeygen_init == NULL)
+ EVP_PKEY_meth_get_keygen(dasync_rsa_orig, &pkeygen_init, NULL);
+ return pkeygen_init(ctx);
+}
+
+static int dasync_rsa_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
+{
+ static int (*pkeygen)(EVP_PKEY_CTX *c, EVP_PKEY *pkey);
+
+ if (pkeygen == NULL)
+ EVP_PKEY_meth_get_keygen(dasync_rsa_orig, NULL, &pkeygen);
+ return pkeygen(ctx, pkey);
+}
+
+static int dasync_rsa_encrypt_init(EVP_PKEY_CTX *ctx)
+{
+ static int (*pencrypt_init)(EVP_PKEY_CTX *ctx);
+
+ if (pencrypt_init == NULL)
+ EVP_PKEY_meth_get_encrypt(dasync_rsa_orig, &pencrypt_init, NULL);
+ return pencrypt_init(ctx);
+}
+
+static int dasync_rsa_encrypt(EVP_PKEY_CTX *ctx, unsigned char *out,
+ size_t *outlen, const unsigned char *in,
+ size_t inlen)
+{
+ static int (*pencryptfn)(EVP_PKEY_CTX *ctx, unsigned char *out,
+ size_t *outlen, const unsigned char *in,
+ size_t inlen);
+
+ if (pencryptfn == NULL)
+ EVP_PKEY_meth_get_encrypt(dasync_rsa_orig, NULL, &pencryptfn);
+ return pencryptfn(ctx, out, outlen, in, inlen);
+}
+
+static int dasync_rsa_decrypt_init(EVP_PKEY_CTX *ctx)
+{
+ static int (*pdecrypt_init)(EVP_PKEY_CTX *ctx);
+
+ if (pdecrypt_init == NULL)
+ EVP_PKEY_meth_get_decrypt(dasync_rsa_orig, &pdecrypt_init, NULL);
+ return pdecrypt_init(ctx);
+}
+
+static int dasync_rsa_decrypt(EVP_PKEY_CTX *ctx, unsigned char *out,
+ size_t *outlen, const unsigned char *in,
+ size_t inlen)
+{
+ static int (*pdecrypt)(EVP_PKEY_CTX *ctx, unsigned char *out,
+ size_t *outlen, const unsigned char *in,
+ size_t inlen);
+
+ if (pdecrypt == NULL)
+ EVP_PKEY_meth_get_encrypt(dasync_rsa_orig, NULL, &pdecrypt);
+ return pdecrypt(ctx, out, outlen, in, inlen);
+}
+
+static int dasync_rsa_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
+{
+ static int (*pctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2);
+
+ if (pctrl == NULL)
+ EVP_PKEY_meth_get_ctrl(dasync_rsa_orig, &pctrl, NULL);
+ return pctrl(ctx, type, p1, p2);
+}
+
+static int dasync_rsa_ctrl_str(EVP_PKEY_CTX *ctx, const char *type,
+ const char *value)
+{
+ static int (*pctrl_str)(EVP_PKEY_CTX *ctx, const char *type,
+ const char *value);
+
+ if (pctrl_str == NULL)
+ EVP_PKEY_meth_get_ctrl(dasync_rsa_orig, NULL, &pctrl_str);
+ return pctrl_str(ctx, type, value);
+}