summaryrefslogtreecommitdiffstats
path: root/crypto/evp/pmeth_fn.c
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2006-04-13 12:56:41 +0000
committerDr. Stephen Henson <steve@openssl.org>2006-04-13 12:56:41 +0000
commitd87e615209f63035bee85ad17b8ec01fc425db6e (patch)
tree5e731345bcb88e3094e68f198b4d196b24f14eef /crypto/evp/pmeth_fn.c
parent92511cff4831eb29023b85f033e00055a038b3c2 (diff)
Add key derivation support.
Diffstat (limited to 'crypto/evp/pmeth_fn.c')
-rw-r--r--crypto/evp/pmeth_fn.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/crypto/evp/pmeth_fn.c b/crypto/evp/pmeth_fn.c
index c7e21485e9..0ad8098718 100644
--- a/crypto/evp/pmeth_fn.c
+++ b/crypto/evp/pmeth_fn.c
@@ -243,3 +243,38 @@ int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx,
return ctx->pmeth->decrypt(ctx, out, outlen, in, inlen);
}
+
+int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx)
+ {
+ int ret;
+ if (!ctx || !ctx->pmeth || !ctx->pmeth->derive)
+ {
+ EVPerr(EVP_F_EVP_PKEY_DERIVE_INIT,
+ EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
+ return -2;
+ }
+ ctx->operation = EVP_PKEY_OP_DERIVE;
+ if (!ctx->pmeth->derive_init)
+ return 1;
+ ret = ctx->pmeth->derive_init(ctx);
+ if (ret <= 0)
+ ctx->operation = EVP_PKEY_OP_UNDEFINED;
+ return ret;
+ }
+
+int EVP_PKEY_derive(EVP_PKEY_CTX *ctx, unsigned char *key, int *pkeylen)
+ {
+ if (!ctx || !ctx->pmeth || !ctx->pmeth->derive)
+ {
+ EVPerr(EVP_F_EVP_PKEY_DERIVE,
+ EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
+ return -2;
+ }
+ if (ctx->operation != EVP_PKEY_OP_DERIVE)
+ {
+ EVPerr(EVP_F_EVP_PKEY_DERIVE, EVP_R_OPERATON_NOT_INITIALIZED);
+ return -1;
+ }
+ return ctx->pmeth->derive(ctx, key, pkeylen);
+ }
+