From e06b2112a84129f3a97968ad8551ee3d9588af63 Mon Sep 17 00:00:00 2001 From: Dmitry Belyavskiy Date: Sat, 23 Jan 2016 12:44:01 +0300 Subject: [PATCH] GOST engine fixes to make it compiling with opaque EVP_CIPHER/EVP_CIPHER_CTX structs --- Makefile | 172 +++++++++++++------------ gost_crypt.c | 351 +++++++++++++++++++++++++++++++++------------------ gost_eng.c | 19 +-- gost_lcl.h | 9 +- 4 files changed, 333 insertions(+), 218 deletions(-) diff --git a/Makefile b/Makefile index 1b91579..95014cb 100644 --- a/Makefile +++ b/Makefile @@ -96,87 +96,91 @@ gost89.o: gost89.c gost89.h gost_ameth.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h gost_ameth.o: ../../include/openssl/bio.h ../../include/openssl/bn.h gost_ameth.o: ../../include/openssl/buffer.h ../../include/openssl/cms.h -gost_ameth.o: ../../include/openssl/crypto.h ../../include/openssl/dsa.h +gost_ameth.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h +gost_ameth.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h gost_ameth.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h -gost_ameth.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h gost_ameth.o: ../../include/openssl/engine.h ../../include/openssl/err.h gost_ameth.o: ../../include/openssl/evp.h ../../include/openssl/lhash.h gost_ameth.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h gost_ameth.o: ../../include/openssl/opensslconf.h gost_ameth.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h -gost_ameth.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h +gost_ameth.o: ../../include/openssl/pkcs7.h ../../include/openssl/rand.h +gost_ameth.o: ../../include/openssl/rsa.h ../../include/openssl/safestack.h gost_ameth.o: ../../include/openssl/sha.h ../../include/openssl/stack.h -gost_ameth.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h -gost_ameth.o: ../../include/openssl/x509_vfy.h e_gost_err.h gost89.h -gost_ameth.o: gost_ameth.c gost_lcl.h gosthash.h +gost_ameth.o: ../../include/openssl/symhacks.h ../../include/openssl/ui.h +gost_ameth.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h +gost_ameth.o: ../../include/openssl/x509v3.h e_gost_err.h gost89.h gost_ameth.c +gost_ameth.o: gost_lcl.h gosthash.h gost_asn1.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h gost_asn1.o: ../../include/openssl/bio.h ../../include/openssl/bn.h gost_asn1.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h -gost_asn1.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h -gost_asn1.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h -gost_asn1.o: ../../include/openssl/ecdsa.h ../../include/openssl/engine.h +gost_asn1.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h +gost_asn1.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h +gost_asn1.o: ../../include/openssl/engine.h ../../include/openssl/err.h gost_asn1.o: ../../include/openssl/evp.h ../../include/openssl/lhash.h gost_asn1.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h gost_asn1.o: ../../include/openssl/opensslconf.h gost_asn1.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h -gost_asn1.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h +gost_asn1.o: ../../include/openssl/pkcs7.h ../../include/openssl/rand.h +gost_asn1.o: ../../include/openssl/rsa.h ../../include/openssl/safestack.h gost_asn1.o: ../../include/openssl/sha.h ../../include/openssl/stack.h -gost_asn1.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h -gost_asn1.o: ../../include/openssl/x509_vfy.h gost89.h gost_asn1.c gost_lcl.h -gost_asn1.o: gosthash.h +gost_asn1.o: ../../include/openssl/symhacks.h ../../include/openssl/ui.h +gost_asn1.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h +gost_asn1.o: gost89.h gost_asn1.c gost_lcl.h gosthash.h gost_crypt.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h gost_crypt.o: ../../include/openssl/bio.h ../../include/openssl/bn.h gost_crypt.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h -gost_crypt.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h -gost_crypt.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h -gost_crypt.o: ../../include/openssl/ecdsa.h ../../include/openssl/engine.h -gost_crypt.o: ../../include/openssl/err.h ../../include/openssl/evp.h -gost_crypt.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h -gost_crypt.o: ../../include/openssl/objects.h +gost_crypt.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h +gost_crypt.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h +gost_crypt.o: ../../include/openssl/engine.h ../../include/openssl/err.h +gost_crypt.o: ../../include/openssl/evp.h ../../include/openssl/lhash.h +gost_crypt.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h gost_crypt.o: ../../include/openssl/opensslconf.h gost_crypt.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h gost_crypt.o: ../../include/openssl/pkcs7.h ../../include/openssl/rand.h -gost_crypt.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h -gost_crypt.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h +gost_crypt.o: ../../include/openssl/rsa.h ../../include/openssl/safestack.h +gost_crypt.o: ../../include/openssl/sha.h ../../include/openssl/stack.h +gost_crypt.o: ../../include/openssl/symhacks.h ../../include/openssl/ui.h gost_crypt.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h gost_crypt.o: e_gost_err.h gost89.h gost_crypt.c gost_lcl.h gosthash.h gost_ctl.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h gost_ctl.o: ../../include/openssl/bio.h ../../include/openssl/bn.h gost_ctl.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h -gost_ctl.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h -gost_ctl.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h -gost_ctl.o: ../../include/openssl/ecdsa.h ../../include/openssl/engine.h -gost_ctl.o: ../../include/openssl/err.h ../../include/openssl/evp.h -gost_ctl.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h -gost_ctl.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h +gost_ctl.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h +gost_ctl.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h +gost_ctl.o: ../../include/openssl/engine.h ../../include/openssl/err.h +gost_ctl.o: ../../include/openssl/evp.h ../../include/openssl/lhash.h +gost_ctl.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h +gost_ctl.o: ../../include/openssl/opensslconf.h gost_ctl.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h -gost_ctl.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h +gost_ctl.o: ../../include/openssl/pkcs7.h ../../include/openssl/rand.h +gost_ctl.o: ../../include/openssl/rsa.h ../../include/openssl/safestack.h gost_ctl.o: ../../include/openssl/sha.h ../../include/openssl/stack.h -gost_ctl.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h -gost_ctl.o: ../../include/openssl/x509_vfy.h gost89.h gost_ctl.c gost_lcl.h -gost_ctl.o: gosthash.h +gost_ctl.o: ../../include/openssl/symhacks.h ../../include/openssl/ui.h +gost_ctl.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h +gost_ctl.o: gost89.h gost_ctl.c gost_lcl.h gosthash.h gost_ec_keyx.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h gost_ec_keyx.o: ../../include/openssl/bio.h ../../include/openssl/bn.h gost_ec_keyx.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h -gost_ec_keyx.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h -gost_ec_keyx.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h -gost_ec_keyx.o: ../../include/openssl/ecdsa.h ../../include/openssl/engine.h -gost_ec_keyx.o: ../../include/openssl/err.h ../../include/openssl/evp.h -gost_ec_keyx.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h -gost_ec_keyx.o: ../../include/openssl/objects.h +gost_ec_keyx.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h +gost_ec_keyx.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h +gost_ec_keyx.o: ../../include/openssl/engine.h ../../include/openssl/err.h +gost_ec_keyx.o: ../../include/openssl/evp.h ../../include/openssl/lhash.h +gost_ec_keyx.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h gost_ec_keyx.o: ../../include/openssl/opensslconf.h gost_ec_keyx.o: ../../include/openssl/opensslv.h gost_ec_keyx.o: ../../include/openssl/ossl_typ.h ../../include/openssl/pkcs7.h -gost_ec_keyx.o: ../../include/openssl/rand.h ../../include/openssl/safestack.h -gost_ec_keyx.o: ../../include/openssl/sha.h ../../include/openssl/stack.h -gost_ec_keyx.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h +gost_ec_keyx.o: ../../include/openssl/rand.h ../../include/openssl/rsa.h +gost_ec_keyx.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h +gost_ec_keyx.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h +gost_ec_keyx.o: ../../include/openssl/ui.h ../../include/openssl/x509.h gost_ec_keyx.o: ../../include/openssl/x509_vfy.h e_gost_err.h gost89.h gost_ec_keyx.o: gost_ec_keyx.c gost_keywrap.h gost_lcl.h gosthash.h gost_ec_sign.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h gost_ec_sign.o: ../../include/openssl/bio.h ../../include/openssl/bn.h gost_ec_sign.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h -gost_ec_sign.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h -gost_ec_sign.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h +gost_ec_sign.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h +gost_ec_sign.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h gost_ec_sign.o: ../../include/openssl/ecdsa.h ../../include/openssl/engine.h gost_ec_sign.o: ../../include/openssl/err.h ../../include/openssl/evp.h gost_ec_sign.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h @@ -184,82 +188,90 @@ gost_ec_sign.o: ../../include/openssl/objects.h gost_ec_sign.o: ../../include/openssl/opensslconf.h gost_ec_sign.o: ../../include/openssl/opensslv.h gost_ec_sign.o: ../../include/openssl/ossl_typ.h ../../include/openssl/pkcs7.h -gost_ec_sign.o: ../../include/openssl/rand.h ../../include/openssl/safestack.h -gost_ec_sign.o: ../../include/openssl/sha.h ../../include/openssl/stack.h -gost_ec_sign.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h +gost_ec_sign.o: ../../include/openssl/rand.h ../../include/openssl/rsa.h +gost_ec_sign.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h +gost_ec_sign.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h +gost_ec_sign.o: ../../include/openssl/ui.h ../../include/openssl/x509.h gost_ec_sign.o: ../../include/openssl/x509_vfy.h e_gost_err.h gost89.h gost_ec_sign.o: gost_ec_sign.c gost_lcl.h gosthash.h gost_eng.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h gost_eng.o: ../../include/openssl/bio.h ../../include/openssl/bn.h gost_eng.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h -gost_eng.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h -gost_eng.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h -gost_eng.o: ../../include/openssl/ecdsa.h ../../include/openssl/engine.h -gost_eng.o: ../../include/openssl/err.h ../../include/openssl/evp.h -gost_eng.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h -gost_eng.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h +gost_eng.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h +gost_eng.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h +gost_eng.o: ../../include/openssl/engine.h ../../include/openssl/err.h +gost_eng.o: ../../include/openssl/evp.h ../../include/openssl/lhash.h +gost_eng.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h +gost_eng.o: ../../include/openssl/opensslconf.h gost_eng.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h -gost_eng.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h +gost_eng.o: ../../include/openssl/pkcs7.h ../../include/openssl/rand.h +gost_eng.o: ../../include/openssl/rsa.h ../../include/openssl/safestack.h gost_eng.o: ../../include/openssl/sha.h ../../include/openssl/stack.h -gost_eng.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h -gost_eng.o: ../../include/openssl/x509_vfy.h e_gost_err.h gost89.h gost_eng.c -gost_eng.o: gost_lcl.h gosthash.h +gost_eng.o: ../../include/openssl/symhacks.h ../../include/openssl/ui.h +gost_eng.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h +gost_eng.o: e_gost_err.h gost89.h gost_eng.c gost_lcl.h gosthash.h gost_keywrap.o: gost89.h gost_keywrap.c gost_keywrap.h gost_md.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h gost_md.o: ../../include/openssl/bio.h ../../include/openssl/bn.h gost_md.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h -gost_md.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h -gost_md.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h -gost_md.o: ../../include/openssl/ecdsa.h ../../include/openssl/engine.h +gost_md.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h +gost_md.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h +gost_md.o: ../../include/openssl/engine.h ../../include/openssl/err.h gost_md.o: ../../include/openssl/evp.h ../../include/openssl/lhash.h gost_md.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h gost_md.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h gost_md.o: ../../include/openssl/ossl_typ.h ../../include/openssl/pkcs7.h +gost_md.o: ../../include/openssl/rand.h ../../include/openssl/rsa.h gost_md.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h gost_md.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h -gost_md.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h -gost_md.o: e_gost_err.h gost89.h gost_lcl.h gost_md.c gosthash.h +gost_md.o: ../../include/openssl/ui.h ../../include/openssl/x509.h +gost_md.o: ../../include/openssl/x509_vfy.h e_gost_err.h gost89.h gost_lcl.h +gost_md.o: gost_md.c gosthash.h gost_md2012.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h -gost_md2012.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h -gost_md2012.o: ../../include/openssl/evp.h ../../include/openssl/obj_mac.h -gost_md2012.o: ../../include/openssl/objects.h +gost_md2012.o: ../../include/openssl/bn.h ../../include/openssl/crypto.h +gost_md2012.o: ../../include/openssl/e_os2.h ../../include/openssl/evp.h +gost_md2012.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h gost_md2012.o: ../../include/openssl/opensslconf.h gost_md2012.o: ../../include/openssl/opensslv.h gost_md2012.o: ../../include/openssl/ossl_typ.h gost_md2012.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h gost_md2012.o: ../../include/openssl/symhacks.h gost_md2012.c gosthash2012.h -gost_md2012.o: gosthash2012_const.h gosthash2012_precalc.h gosthash2012_ref.h +gost_md2012.o: gosthash2012_const.h gosthash2012_precalc.h gosthash2012_sse2.h gost_params.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h gost_params.o: ../../include/openssl/bio.h ../../include/openssl/bn.h gost_params.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h -gost_params.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h -gost_params.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h -gost_params.o: ../../include/openssl/ecdsa.h ../../include/openssl/engine.h +gost_params.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h +gost_params.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h +gost_params.o: ../../include/openssl/engine.h ../../include/openssl/err.h gost_params.o: ../../include/openssl/evp.h ../../include/openssl/lhash.h gost_params.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h gost_params.o: ../../include/openssl/opensslconf.h gost_params.o: ../../include/openssl/opensslv.h gost_params.o: ../../include/openssl/ossl_typ.h ../../include/openssl/pkcs7.h +gost_params.o: ../../include/openssl/rand.h ../../include/openssl/rsa.h gost_params.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h gost_params.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h -gost_params.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h -gost_params.o: gost89.h gost_lcl.h gost_params.c gosthash.h +gost_params.o: ../../include/openssl/ui.h ../../include/openssl/x509.h +gost_params.o: ../../include/openssl/x509_vfy.h gost89.h gost_lcl.h +gost_params.o: gost_params.c gosthash.h gost_pmeth.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h gost_pmeth.o: ../../include/openssl/bio.h ../../include/openssl/bn.h gost_pmeth.o: ../../include/openssl/buffer.h ../../include/openssl/conf.h -gost_pmeth.o: ../../include/openssl/crypto.h ../../include/openssl/dsa.h -gost_pmeth.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h -gost_pmeth.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h -gost_pmeth.o: ../../include/openssl/engine.h ../../include/openssl/err.h -gost_pmeth.o: ../../include/openssl/evp.h ../../include/openssl/lhash.h -gost_pmeth.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h +gost_pmeth.o: ../../include/openssl/crypto.h ../../include/openssl/dh.h +gost_pmeth.o: ../../include/openssl/dsa.h ../../include/openssl/e_os2.h +gost_pmeth.o: ../../include/openssl/ec.h ../../include/openssl/engine.h +gost_pmeth.o: ../../include/openssl/err.h ../../include/openssl/evp.h +gost_pmeth.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h +gost_pmeth.o: ../../include/openssl/objects.h gost_pmeth.o: ../../include/openssl/opensslconf.h gost_pmeth.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h -gost_pmeth.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h +gost_pmeth.o: ../../include/openssl/pkcs7.h ../../include/openssl/rand.h +gost_pmeth.o: ../../include/openssl/rsa.h ../../include/openssl/safestack.h gost_pmeth.o: ../../include/openssl/sha.h ../../include/openssl/stack.h -gost_pmeth.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h -gost_pmeth.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h -gost_pmeth.o: e_gost_err.h gost89.h gost_lcl.h gost_pmeth.c gosthash.h +gost_pmeth.o: ../../include/openssl/symhacks.h ../../include/openssl/ui.h +gost_pmeth.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h +gost_pmeth.o: ../../include/openssl/x509v3.h e_gost_err.h gost89.h gost_lcl.h +gost_pmeth.o: gost_pmeth.c gosthash.h gosthash.o: gost89.h gosthash.c gosthash.h gosthash2012.o: gosthash2012.c gosthash2012.h gosthash2012_const.h -gosthash2012.o: gosthash2012_precalc.h gosthash2012_ref.h +gosthash2012.o: gosthash2012_precalc.h gosthash2012_sse2.h diff --git a/gost_crypt.c b/gost_crypt.c index a0125ea..f55a10c 100644 --- a/gost_crypt.c +++ b/gost_crypt.c @@ -46,73 +46,156 @@ static int gost89_get_asn1_parameters(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params); /* Control function */ static int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr); -EVP_CIPHER cipher_gost = { - NID_id_Gost28147_89, - 1, /* block_size */ - 32, /* key_size */ - 8, /* iv_len */ - EVP_CIPH_CFB_MODE | EVP_CIPH_NO_PADDING | - EVP_CIPH_CUSTOM_IV | EVP_CIPH_RAND_KEY | EVP_CIPH_ALWAYS_CALL_INIT, - gost_cipher_init, - gost_cipher_do_cfb, - gost_cipher_cleanup, - sizeof(struct ossl_gost_cipher_ctx), /* ctx_size */ - gost89_set_asn1_parameters, - gost89_get_asn1_parameters, - gost_cipher_ctl, - NULL, -}; +static EVP_CIPHER *_hidden_Gost28147_89_cipher = NULL; +const EVP_CIPHER *cipher_gost(void) +{ + if (_hidden_Gost28147_89_cipher == NULL + && ((_hidden_Gost28147_89_cipher = + EVP_CIPHER_meth_new(NID_id_Gost28147_89, + 1 /* block_size */, + 32 /* key_size */)) == NULL + || !EVP_CIPHER_meth_set_iv_length(_hidden_Gost28147_89_cipher, 8) + || !EVP_CIPHER_meth_set_flags(_hidden_Gost28147_89_cipher, + EVP_CIPH_CFB_MODE | + EVP_CIPH_NO_PADDING | + EVP_CIPH_CUSTOM_IV | + EVP_CIPH_RAND_KEY | + EVP_CIPH_ALWAYS_CALL_INIT) + || !EVP_CIPHER_meth_set_init(_hidden_Gost28147_89_cipher, + gost_cipher_init) + || !EVP_CIPHER_meth_set_do_cipher(_hidden_Gost28147_89_cipher, + gost_cipher_do_cfb) + || !EVP_CIPHER_meth_set_cleanup(_hidden_Gost28147_89_cipher, + gost_cipher_cleanup) + || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_Gost28147_89_cipher, + sizeof(struct ossl_gost_cipher_ctx)) + || !EVP_CIPHER_meth_set_set_asn1_params(_hidden_Gost28147_89_cipher, + gost89_set_asn1_parameters) + || !EVP_CIPHER_meth_set_get_asn1_params(_hidden_Gost28147_89_cipher, + gost89_get_asn1_parameters) + || !EVP_CIPHER_meth_set_ctrl(_hidden_Gost28147_89_cipher, + gost_cipher_ctl))) { + EVP_CIPHER_meth_free(_hidden_Gost28147_89_cipher); + _hidden_Gost28147_89_cipher = NULL; + } + return _hidden_Gost28147_89_cipher; +} + +static EVP_CIPHER *_hidden_Gost28147_89_cbc = NULL; +const EVP_CIPHER *cipher_gost_cbc(void) +{ + if (_hidden_Gost28147_89_cbc == NULL + && ((_hidden_Gost28147_89_cbc = + EVP_CIPHER_meth_new(NID_gost89_cbc, + 8 /* block_size */, + 32 /* key_size */)) == NULL + || !EVP_CIPHER_meth_set_iv_length(_hidden_Gost28147_89_cbc, 8) + || !EVP_CIPHER_meth_set_flags(_hidden_Gost28147_89_cbc, + EVP_CIPH_CBC_MODE | + EVP_CIPH_CUSTOM_IV | + EVP_CIPH_RAND_KEY | + EVP_CIPH_ALWAYS_CALL_INIT) + || !EVP_CIPHER_meth_set_init(_hidden_Gost28147_89_cbc, + gost_cipher_init_cbc) + || !EVP_CIPHER_meth_set_do_cipher(_hidden_Gost28147_89_cbc, + gost_cipher_do_cbc) + || !EVP_CIPHER_meth_set_cleanup(_hidden_Gost28147_89_cbc, + gost_cipher_cleanup) + || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_Gost28147_89_cbc, + sizeof(struct ossl_gost_cipher_ctx)) + || !EVP_CIPHER_meth_set_set_asn1_params(_hidden_Gost28147_89_cbc, + gost89_set_asn1_parameters) + || !EVP_CIPHER_meth_set_get_asn1_params(_hidden_Gost28147_89_cbc, + gost89_get_asn1_parameters) + || !EVP_CIPHER_meth_set_ctrl(_hidden_Gost28147_89_cbc, + gost_cipher_ctl))) { + EVP_CIPHER_meth_free(_hidden_Gost28147_89_cbc); + _hidden_Gost28147_89_cbc = NULL; + } + return _hidden_Gost28147_89_cbc; +} +static EVP_CIPHER *_hidden_gost89_cnt = NULL; +const EVP_CIPHER *cipher_gost_cpacnt(void) +{ + if (_hidden_gost89_cnt == NULL + && ((_hidden_gost89_cnt = + EVP_CIPHER_meth_new(NID_gost89_cnt, + 1 /* block_size */, + 32 /* key_size */)) == NULL + || !EVP_CIPHER_meth_set_iv_length(_hidden_gost89_cnt, 8) + || !EVP_CIPHER_meth_set_flags(_hidden_gost89_cnt, + EVP_CIPH_OFB_MODE | + EVP_CIPH_NO_PADDING | + EVP_CIPH_CUSTOM_IV | + EVP_CIPH_RAND_KEY | + EVP_CIPH_ALWAYS_CALL_INIT) + || !EVP_CIPHER_meth_set_init(_hidden_gost89_cnt, + gost_cipher_init_cpa) + || !EVP_CIPHER_meth_set_do_cipher(_hidden_gost89_cnt, + gost_cipher_do_cnt) + || !EVP_CIPHER_meth_set_cleanup(_hidden_gost89_cnt, + gost_cipher_cleanup) + || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_gost89_cnt, + sizeof(struct ossl_gost_cipher_ctx)) + || !EVP_CIPHER_meth_set_set_asn1_params(_hidden_gost89_cnt, + gost89_set_asn1_parameters) + || !EVP_CIPHER_meth_set_get_asn1_params(_hidden_gost89_cnt, + gost89_get_asn1_parameters) + || !EVP_CIPHER_meth_set_ctrl(_hidden_gost89_cnt, + gost_cipher_ctl))) { + EVP_CIPHER_meth_free(_hidden_gost89_cnt); + _hidden_gost89_cnt = NULL; + } + return _hidden_gost89_cnt; +} -EVP_CIPHER cipher_gost_cbc = { - NID_gost89_cbc, - 8, /*block_size */ - 32, /*key_size */ - 8, /*iv_len */ - EVP_CIPH_CBC_MODE | - EVP_CIPH_CUSTOM_IV | EVP_CIPH_RAND_KEY | EVP_CIPH_ALWAYS_CALL_INIT, - gost_cipher_init_cbc, - gost_cipher_do_cbc, - gost_cipher_cleanup, - sizeof(struct ossl_gost_cipher_ctx), /* ctx_size */ - gost89_set_asn1_parameters, - gost89_get_asn1_parameters, - gost_cipher_ctl, - NULL, -}; +static EVP_CIPHER *_hidden_gost89_cnt_12 = NULL; +const EVP_CIPHER *cipher_gost_cpcnt_12(void) +{ + if (_hidden_gost89_cnt_12 == NULL + && ((_hidden_gost89_cnt_12 = + EVP_CIPHER_meth_new(NID_gost89_cnt_12, + 1 /* block_size */, + 32 /* key_size */)) == NULL + || !EVP_CIPHER_meth_set_iv_length(_hidden_gost89_cnt_12, 8) + || !EVP_CIPHER_meth_set_flags(_hidden_gost89_cnt_12, + EVP_CIPH_OFB_MODE | + EVP_CIPH_NO_PADDING | + EVP_CIPH_CUSTOM_IV | + EVP_CIPH_RAND_KEY | + EVP_CIPH_ALWAYS_CALL_INIT) + || !EVP_CIPHER_meth_set_init(_hidden_gost89_cnt_12, + gost_cipher_init_cp_12) + || !EVP_CIPHER_meth_set_do_cipher(_hidden_gost89_cnt_12, + gost_cipher_do_cnt) + || !EVP_CIPHER_meth_set_cleanup(_hidden_gost89_cnt_12, + gost_cipher_cleanup) + || !EVP_CIPHER_meth_set_impl_ctx_size(_hidden_gost89_cnt_12, + sizeof(struct ossl_gost_cipher_ctx)) + || !EVP_CIPHER_meth_set_set_asn1_params(_hidden_gost89_cnt_12, + gost89_set_asn1_parameters) + || !EVP_CIPHER_meth_set_get_asn1_params(_hidden_gost89_cnt_12, + gost89_get_asn1_parameters) + || !EVP_CIPHER_meth_set_ctrl(_hidden_gost89_cnt_12, + gost_cipher_ctl))) { + EVP_CIPHER_meth_free(_hidden_gost89_cnt_12); + _hidden_gost89_cnt_12 = NULL; + } + return _hidden_gost89_cnt_12; +} -EVP_CIPHER cipher_gost_cpacnt = { - NID_gost89_cnt, - 1, /* block_size */ - 32, /* key_size */ - 8, /* iv_len */ - EVP_CIPH_OFB_MODE | EVP_CIPH_NO_PADDING | - EVP_CIPH_CUSTOM_IV | EVP_CIPH_RAND_KEY | EVP_CIPH_ALWAYS_CALL_INIT, - gost_cipher_init_cpa, - gost_cipher_do_cnt, - gost_cipher_cleanup, - sizeof(struct ossl_gost_cipher_ctx), /* ctx_size */ - gost89_set_asn1_parameters, - gost89_get_asn1_parameters, - gost_cipher_ctl, - NULL, -}; +void cipher_gost_destroy(void) +{ + EVP_CIPHER_meth_free(_hidden_Gost28147_89_cipher); + _hidden_Gost28147_89_cipher = NULL; + EVP_CIPHER_meth_free(_hidden_gost89_cnt); + _hidden_gost89_cnt = NULL; + EVP_CIPHER_meth_free(_hidden_Gost28147_89_cbc); + _hidden_Gost28147_89_cbc = NULL; + EVP_CIPHER_meth_free(_hidden_gost89_cnt_12); + _hidden_gost89_cnt_12 = NULL; +} -EVP_CIPHER cipher_gost_cpcnt_12 = { - NID_gost89_cnt_12, - 1, /* block_size */ - 32, /* key_size */ - 8, /* iv_len */ - EVP_CIPH_OFB_MODE | EVP_CIPH_NO_PADDING | - EVP_CIPH_CUSTOM_IV | EVP_CIPH_RAND_KEY | EVP_CIPH_ALWAYS_CALL_INIT, - gost_cipher_init_cp_12, - gost_cipher_do_cnt, - gost_cipher_cleanup, - sizeof(struct ossl_gost_cipher_ctx), /* ctx_size */ - gost89_set_asn1_parameters, - gost89_get_asn1_parameters, - gost_cipher_ctl, - NULL, -}; /* Implementation of GOST 28147-89 in MAC (imitovstavka) mode */ /* Init functions which set specific parameters */ @@ -281,17 +364,21 @@ static int gost_cipher_init_param(EVP_CIPHER_CTX *ctx, const unsigned char *iv, int enc, int paramNID, int mode) { - struct ossl_gost_cipher_ctx *c = ctx->cipher_data; - if (ctx->app_data == NULL) { + struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx); + if (EVP_CIPHER_CTX_get_app_data(ctx) == NULL) { if (!gost_cipher_set_param(c, paramNID)) return 0; - ctx->app_data = ctx->cipher_data; + EVP_CIPHER_CTX_set_app_data(ctx, EVP_CIPHER_CTX_cipher_data(ctx)); } if (key) gost_key(&(c->cctx), key); - if (iv) - memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx)); - memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx)); + if (iv) { + memcpy((unsigned char *)EVP_CIPHER_CTX_original_iv(ctx), iv, + EVP_CIPHER_CTX_iv_length(ctx)); + } + memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), + EVP_CIPHER_CTX_original_iv(ctx), + EVP_CIPHER_CTX_iv_length(ctx)); return 1; } @@ -300,15 +387,19 @@ static int gost_cipher_init_cnt(EVP_CIPHER_CTX *ctx, const unsigned char *iv, gost_subst_block * block) { - struct ossl_gost_cipher_ctx *c = ctx->cipher_data; + struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx); gost_init(&(c->cctx), block); c->key_meshing = 1; c->count = 0; if (key) gost_key(&(c->cctx), key); - if (iv) - memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx)); - memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx)); + if (iv) { + memcpy((unsigned char *)EVP_CIPHER_CTX_original_iv(ctx), iv, + EVP_CIPHER_CTX_iv_length(ctx)); + } + memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), + EVP_CIPHER_CTX_original_iv(ctx), + EVP_CIPHER_CTX_iv_length(ctx)); return 1; } @@ -399,14 +490,16 @@ int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in_ptr = in; unsigned char *out_ptr = out; int i; - struct ossl_gost_cipher_ctx *c = ctx->cipher_data; - if (ctx->encrypt) { + struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx); + unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx); + if (EVP_CIPHER_CTX_encrypting(ctx)) { while (inl > 0) { + for (i = 0; i < 8; i++) { - b[i] = ctx->iv[i] ^ in_ptr[i]; + b[i] = iv[i] ^ in_ptr[i]; } gostcrypt(&(c->cctx), b, out_ptr); - memcpy(ctx->iv, out_ptr, 8); + memcpy(iv, out_ptr, 8); out_ptr += 8; in_ptr += 8; inl -= 8; @@ -415,9 +508,9 @@ int gost_cipher_do_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out, while (inl > 0) { gostdecrypt(&(c->cctx), in_ptr, b); for (i = 0; i < 8; i++) { - out_ptr[i] = ctx->iv[i] ^ b[i]; + out_ptr[i] = iv[i] ^ b[i]; } - memcpy(ctx->iv, in_ptr, 8); + memcpy(iv, in_ptr, 8); out_ptr += 8; in_ptr += 8; inl -= 8; @@ -434,21 +527,23 @@ int gost_cipher_do_cfb(EVP_CIPHER_CTX *ctx, unsigned char *out, unsigned char *out_ptr = out; size_t i = 0; size_t j = 0; + unsigned char *buf = EVP_CIPHER_CTX_buf_noconst(ctx); + unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx); /* process partial block if any */ - if (ctx->num) { - for (j = ctx->num, i = 0; j < 8 && i < inl; + if (EVP_CIPHER_CTX_num(ctx)) { + for (j = EVP_CIPHER_CTX_num(ctx), i = 0; j < 8 && i < inl; j++, i++, in_ptr++, out_ptr++) { - if (!ctx->encrypt) - ctx->buf[j + 8] = *in_ptr; - *out_ptr = ctx->buf[j] ^ (*in_ptr); - if (ctx->encrypt) - ctx->buf[j + 8] = *out_ptr; + if (!EVP_CIPHER_CTX_encrypting(ctx)) + buf[j + 8] = *in_ptr; + *out_ptr = buf[j] ^ (*in_ptr); + if (EVP_CIPHER_CTX_encrypting(ctx)) + buf[j + 8] = *out_ptr; } if (j == 8) { - memcpy(ctx->iv, ctx->buf + 8, 8); - ctx->num = 0; + memcpy(iv, buf + 8, 8); + EVP_CIPHER_CTX_set_num(ctx, 0); } else { - ctx->num = j; + EVP_CIPHER_CTX_set_num(ctx, j); return 1; } } @@ -457,36 +552,36 @@ int gost_cipher_do_cfb(EVP_CIPHER_CTX *ctx, unsigned char *out, /* * block cipher current iv */ - gost_crypt_mesh(ctx->cipher_data, ctx->iv, ctx->buf); + gost_crypt_mesh(EVP_CIPHER_CTX_cipher_data(ctx), iv, buf); /* * xor next block of input text with it and output it */ /* * output this block */ - if (!ctx->encrypt) - memcpy(ctx->iv, in_ptr, 8); + if (!EVP_CIPHER_CTX_encrypting(ctx)) + memcpy(iv, in_ptr, 8); for (j = 0; j < 8; j++) { - out_ptr[j] = ctx->buf[j] ^ in_ptr[j]; + out_ptr[j] = buf[j] ^ in_ptr[j]; } /* Encrypt */ /* Next iv is next block of cipher text */ - if (ctx->encrypt) - memcpy(ctx->iv, out_ptr, 8); + if (EVP_CIPHER_CTX_encrypting(ctx)) + memcpy(iv, out_ptr, 8); } /* Process rest of buffer */ if (i < inl) { - gost_crypt_mesh(ctx->cipher_data, ctx->iv, ctx->buf); - if (!ctx->encrypt) - memcpy(ctx->buf + 8, in_ptr, inl - i); + gost_crypt_mesh(EVP_CIPHER_CTX_cipher_data(ctx), iv, buf); + if (!EVP_CIPHER_CTX_encrypting(ctx)) + memcpy(buf + 8, in_ptr, inl - i); for (j = 0; i < inl; j++, i++) { - out_ptr[j] = ctx->buf[j] ^ in_ptr[j]; + out_ptr[j] = buf[j] ^ in_ptr[j]; } - ctx->num = j; - if (ctx->encrypt) - memcpy(ctx->buf + 8, out_ptr, j); + EVP_CIPHER_CTX_set_num(ctx, j); + if (EVP_CIPHER_CTX_encrypting(ctx)) + memcpy(buf + 8, out_ptr, j); } else { - ctx->num = 0; + EVP_CIPHER_CTX_set_num(ctx, 0); } return 1; } @@ -498,16 +593,18 @@ static int gost_cipher_do_cnt(EVP_CIPHER_CTX *ctx, unsigned char *out, unsigned char *out_ptr = out; size_t i = 0; size_t j; + unsigned char *buf = EVP_CIPHER_CTX_buf_noconst(ctx); + unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx); /* process partial block if any */ - if (ctx->num) { - for (j = ctx->num, i = 0; j < 8 && i < inl; + if (EVP_CIPHER_CTX_num(ctx)) { + for (j = EVP_CIPHER_CTX_num(ctx), i = 0; j < 8 && i < inl; j++, i++, in_ptr++, out_ptr++) { - *out_ptr = ctx->buf[j] ^ (*in_ptr); + *out_ptr = buf[j] ^ (*in_ptr); } if (j == 8) { - ctx->num = 0; + EVP_CIPHER_CTX_set_num(ctx, 0); } else { - ctx->num = j; + EVP_CIPHER_CTX_set_num(ctx, j); return 1; } } @@ -517,7 +614,7 @@ static int gost_cipher_do_cnt(EVP_CIPHER_CTX *ctx, unsigned char *out, * block cipher current iv */ /* Encrypt */ - gost_cnt_next(ctx->cipher_data, ctx->iv, ctx->buf); + gost_cnt_next(EVP_CIPHER_CTX_cipher_data(ctx), iv, buf); /* * xor next block of input text with it and output it */ @@ -525,18 +622,18 @@ static int gost_cipher_do_cnt(EVP_CIPHER_CTX *ctx, unsigned char *out, * output this block */ for (j = 0; j < 8; j++) { - out_ptr[j] = ctx->buf[j] ^ in_ptr[j]; + out_ptr[j] = buf[j] ^ in_ptr[j]; } } /* Process rest of buffer */ if (i < inl) { - gost_cnt_next(ctx->cipher_data, ctx->iv, ctx->buf); + gost_cnt_next(EVP_CIPHER_CTX_cipher_data(ctx), iv, buf); for (j = 0; i < inl; j++, i++) { - out_ptr[j] = ctx->buf[j] ^ in_ptr[j]; + out_ptr[j] = buf[j] ^ in_ptr[j]; } - ctx->num = j; + EVP_CIPHER_CTX_set_num(ctx, j); } else { - ctx->num = 0; + EVP_CIPHER_CTX_set_num(ctx, 0); } return 1; } @@ -544,8 +641,8 @@ static int gost_cipher_do_cnt(EVP_CIPHER_CTX *ctx, unsigned char *out, /* Cleaning up of EVP_CIPHER_CTX */ int gost_cipher_cleanup(EVP_CIPHER_CTX *ctx) { - gost_destroy(&((struct ossl_gost_cipher_ctx *)ctx->cipher_data)->cctx); - ctx->app_data = NULL; + gost_destroy(&((struct ossl_gost_cipher_ctx *)EVP_CIPHER_CTX_cipher_data(ctx))->cctx); + EVP_CIPHER_CTX_set_app_data(ctx, NULL); return 1; } @@ -556,7 +653,7 @@ int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) #if 0 case EVP_CTRL_INIT: { - struct ossl_gost_cipher_ctx *c = ctx->cipher_data; + struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx); if (c == NULL) { return -1; } @@ -565,7 +662,7 @@ int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) #endif case EVP_CTRL_RAND_KEY: { - if (RAND_bytes((unsigned char *)ptr, ctx->key_len) <= 0) { + if (RAND_bytes((unsigned char *)ptr, EVP_CIPHER_CTX_key_length(ctx)) <= 0) { GOSTerr(GOST_F_GOST_CIPHER_CTL, GOST_R_RNG_ERROR); return -1; } @@ -592,7 +689,7 @@ int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) case EVP_CTRL_SET_SBOX: if (ptr) { - struct ossl_gost_cipher_ctx *c = ctx->cipher_data; + struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx); int nid; int cur_meshing; int ret; @@ -619,7 +716,7 @@ int gost_cipher_ctl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) } case EVP_CTRL_KEY_MESH: { - struct ossl_gost_cipher_ctx *c = ctx->cipher_data; + struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx); if (c == NULL) { return -1; @@ -646,14 +743,14 @@ int gost89_set_asn1_parameters(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params) int len = 0; unsigned char *buf = NULL; unsigned char *p = NULL; - struct ossl_gost_cipher_ctx *c = ctx->cipher_data; + struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx); GOST_CIPHER_PARAMS *gcp = GOST_CIPHER_PARAMS_new(); ASN1_OCTET_STRING *os = NULL; if (!gcp) { GOSTerr(GOST_F_GOST89_SET_ASN1_PARAMETERS, ERR_R_MALLOC_FAILURE); return 0; } - if (!ASN1_OCTET_STRING_set(gcp->iv, ctx->iv, ctx->cipher->iv_len)) { + if (!ASN1_OCTET_STRING_set(gcp->iv, EVP_CIPHER_CTX_iv(ctx), EVP_CIPHER_CTX_iv_length(ctx))) { GOST_CIPHER_PARAMS_free(gcp); GOSTerr(GOST_F_GOST89_SET_ASN1_PARAMETERS, ERR_R_MALLOC_FAILURE); return 0; @@ -691,7 +788,7 @@ int gost89_get_asn1_parameters(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params) int len; GOST_CIPHER_PARAMS *gcp = NULL; unsigned char *p; - struct ossl_gost_cipher_ctx *c = ctx->cipher_data; + struct ossl_gost_cipher_ctx *c = EVP_CIPHER_CTX_cipher_data(ctx); int nid; if (ASN1_TYPE_get(params) != V_ASN1_SEQUENCE) { @@ -704,7 +801,7 @@ int gost89_get_asn1_parameters(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params) params->value.sequence->length); len = gcp->iv->length; - if (len != ctx->cipher->iv_len) { + if (len != EVP_CIPHER_CTX_iv_length(ctx)) { GOST_CIPHER_PARAMS_free(gcp); GOSTerr(GOST_F_GOST89_GET_ASN1_PARAMETERS, GOST_R_INVALID_IV_LENGTH); return -1; @@ -722,7 +819,9 @@ int gost89_get_asn1_parameters(EVP_CIPHER_CTX *ctx, ASN1_TYPE *params) GOST_CIPHER_PARAMS_free(gcp); return -1; } - memcpy(ctx->oiv, gcp->iv->data, len); + /*XXX missing non-const accessor*/ + memcpy((unsigned char *)EVP_CIPHER_CTX_original_iv(ctx), gcp->iv->data, + EVP_CIPHER_CTX_iv_length(ctx)); GOST_CIPHER_PARAMS_free(gcp); diff --git a/gost_eng.c b/gost_eng.c index bb314d3..e9751e0 100644 --- a/gost_eng.c +++ b/gost_eng.c @@ -100,9 +100,12 @@ static int gost_engine_destroy(ENGINE *e) digest_gost_destroy(); digest_gost2012_256_destroy(); digest_gost2012_512_destroy(); + imit_gost_cpa_destroy(); imit_gost_cp_12_destroy(); + cipher_gost_destroy(); + gost_param_free(); pmeth_GostR3410_2001 = NULL; @@ -206,10 +209,10 @@ static int bind_gost(ENGINE *e, const char *id) || !ENGINE_register_digests(e) || !ENGINE_register_pkey_meths(e) /* These two actually should go in LIST_ADD command */ - || !EVP_add_cipher(&cipher_gost) - || !EVP_add_cipher(&cipher_gost_cbc) - || !EVP_add_cipher(&cipher_gost_cpacnt) - || !EVP_add_cipher(&cipher_gost_cpcnt_12) + || !EVP_add_cipher(cipher_gost()) + || !EVP_add_cipher(cipher_gost_cbc()) + || !EVP_add_cipher(cipher_gost_cpacnt()) + || !EVP_add_cipher(cipher_gost_cpcnt_12()) || !EVP_add_digest(digest_gost()) || !EVP_add_digest(digest_gost2012_512()) || !EVP_add_digest(digest_gost2012_256()) @@ -263,13 +266,13 @@ static int gost_ciphers(ENGINE *e, const EVP_CIPHER **cipher, } if (nid == NID_id_Gost28147_89) { - *cipher = &cipher_gost; + *cipher = cipher_gost(); } else if (nid == NID_gost89_cnt) { - *cipher = &cipher_gost_cpacnt; + *cipher = cipher_gost_cpacnt(); } else if (nid == NID_gost89_cnt_12) { - *cipher = &cipher_gost_cpcnt_12; + *cipher = cipher_gost_cpcnt_12(); } else if (nid == NID_gost89_cbc) { - *cipher = &cipher_gost_cbc; + *cipher = cipher_gost_cbc(); } else { ok = 0; *cipher = NULL; diff --git a/gost_lcl.h b/gost_lcl.h index 68f40b6..a82362f 100644 --- a/gost_lcl.h +++ b/gost_lcl.h @@ -205,10 +205,11 @@ extern struct gost_cipher_info gost_cipher_list[]; /* Find encryption params from ASN1_OBJECT */ const struct gost_cipher_info *get_encryption_params(ASN1_OBJECT *obj); /* Implementation of GOST 28147-89 cipher in CFB and CNT modes */ -extern EVP_CIPHER cipher_gost; -extern EVP_CIPHER cipher_gost_cbc; -extern EVP_CIPHER cipher_gost_cpacnt; -extern EVP_CIPHER cipher_gost_cpcnt_12; +const EVP_CIPHER* cipher_gost(); +const EVP_CIPHER* cipher_gost_cbc(); +const EVP_CIPHER* cipher_gost_cpacnt(); +const EVP_CIPHER* cipher_gost_cpcnt_12(); +void cipher_gost_destroy(); # define EVP_MD_CTRL_KEY_LEN (EVP_MD_CTRL_ALG_CTRL+3) # define EVP_MD_CTRL_SET_KEY (EVP_MD_CTRL_ALG_CTRL+4) # define EVP_MD_CTRL_MAC_LEN (EVP_MD_CTRL_ALG_CTRL+5) -- 2.39.2