From 5be4ebb4c0b8ffcf643b4631ab899a6aabfd0135 Mon Sep 17 00:00:00 2001 From: Zhi Guan Date: Tue, 21 Feb 2017 09:25:05 +0800 Subject: [PATCH] add encrypt/decrypt to ec_key_method --- crypto/ec/ec_kmeth.c | 65 +++++++++++++++++++++++++++++++++++++++++--- include/openssl/ec.h | 52 +++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 4 deletions(-) diff --git a/crypto/ec/ec_kmeth.c b/crypto/ec/ec_kmeth.c index 86ab7c81..0579d94c 100644 --- a/crypto/ec/ec_kmeth.c +++ b/crypto/ec/ec_kmeth.c @@ -323,9 +323,50 @@ void EC_KEY_METHOD_get_verify(EC_KEY_METHOD *meth, } #ifndef OPENSSL_NO_SM2 +void EC_KEY_METHOD_set_encrypt(EC_KEY_METHOD *meth, + int (*encrypt)(int type, + const unsigned char *in, + size_t inlen, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key), + ECIES_CIPHERTEXT_VALUE *(*do_encrypt)(int type, + const unsigned char *in, + size_t inlen, + EC_KEY *ec_key)) +{ + meth->encrypt = encrypt; + meth->do_encrypt = do_encrypt; +} + +void EC_KEY_METHOD_get_decrypt(EC_KEY_METHOD *meth, + int (*decrypt)(int type, + const unsigned char *in, + size_t inlen, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key), + int (do_decrypt)(int type, + const ECIES_CIPHERTEXT_VALUE *in, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key)) +{ + meth->decrypt = decrypt; + meth->do_decrypt = do_decrypt; +} + void EC_KEY_METHOD_get_encrypt(EC_KEY_METHOD *meth, - int (**pencrypt)(int a), - int (**pdo_encrypt)(int a)) + int (**pencrypt)(int type, + const unsigned char *in, + size_t inlen, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key), + ECIES_CIPHERTEXT_VALUE *(**pdo_encrypt)(int type, + const unsigned char *in, + size_t inlen, + EC_KEY *ec_key)) { if (pencrypt != NULL) *pencrypt = meth->encrypt; @@ -333,6 +374,22 @@ void EC_KEY_METHOD_get_encrypt(EC_KEY_METHOD *meth, *pdo_encrypt = meth->do_encrypt; } - - +void EC_KEY_METHOD_get_decrypt(EC_KEY_METHOD *meth, + int (**pdecrypt)(int type, + const unsigned char *in, + size_t inlen, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key), + int (*pdo_decrypt)(int type, + const ECIES_CIPHERTEXT_VALUE *in, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key)) +{ + if (pdecrypt != NULL) + *pdecrypt = meth->decrypt; + if (pdo_decrypt != NULL) + *pdo_decrypt = meth->do_decrypt; +} #endif diff --git a/include/openssl/ec.h b/include/openssl/ec.h index 782106dc..5582d6c8 100644 --- a/include/openssl/ec.h +++ b/include/openssl/ec.h @@ -1272,6 +1272,58 @@ void EC_KEY_METHOD_get_verify(EC_KEY_METHOD *meth, const ECDSA_SIG *sig, EC_KEY *eckey)); +# ifndef OPENSSL_NO_SM2 +void EC_KEY_METHOD_set_encrypt(EC_KEY_METHOD *meth, + int (*encrypt)(int type, + const unsigned char *in, + size_t inlen, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key), + ECIES_CIPHERTEXT_VALUE *(*do_encrypt)(int type, + const unsigned char *in, + size_t inlen, + EC_KEY *ec_key)); + +void EC_KEY_METHOD_get_decrypt(EC_KEY_METHOD *meth, + int (*decrypt)(int type, + const unsigned char *in, + size_t inlen, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key), + int (do_decrypt)(int type, + const ECIES_CIPHERTEXT_VALUE *in, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key)); + +void EC_KEY_METHOD_get_encrypt(EC_KEY_METHOD *meth, + int (**pencrypt)(int type, + const unsigned char *in, + size_t inlen, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key), + ECIES_CIPHERTEXT_VALUE *(**pdo_encrypt)(int type, + const unsigned char *in, + size_t inlen, + EC_KEY *ec_key)); + +void EC_KEY_METHOD_get_decrypt(EC_KEY_METHOD *meth, + int (**pdecrypt)(int type, + const unsigned char *in, + size_t inlen, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key), + int (*pdo_decrypt)(int type, + const ECIES_CIPHERTEXT_VALUE *in, + unsigned char *out, + size_t *outlen, + EC_KEY *ec_key)); +# endif + # define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x) # ifndef __cplusplus