| From 071fec7181255b9234add44865a435dfdefee520 Mon Sep 17 00:00:00 2001 |
| In-Reply-To: <20180528120513.560-1-cote2004-github@yahoo.com> |
| References: <20180528120513.560-1-cote2004-github@yahoo.com> |
| From: Eneas U de Queiroz <cote2004-github@yahoo.com> |
| Date: Wed, 30 May 2018 15:42:20 -0300 |
| Subject: [PATCH] ipsec-tools: add openssl 1.1 support |
| To: equeiroz@troianet.com.br |
| |
| This patch updates the calls to openssl 1.1 API, and adds a |
| compatibility layer so it compiles with (at least) openssl 1.0.2, I |
| haven't tested it with lower versions, but all that's needed is to edit |
| the openssl_compat.* files and add the missing functions there--they're |
| usually trivial. |
| |
| Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com> |
| |
| Downloaded from |
| https://github.com/openwrt/packages/blob/master/net/ipsec-tools/patches/015-openssl-1.1.patch |
| |
| Patch was sent upstream: |
| https://sourceforge.net/p/ipsec-tools/mailman/ipsec-tools-devel/thread/20180528120513.560-1-cote2004-github%40yahoo.com/#msg36327963 |
| |
| Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de> |
| --- |
| src/racoon/Makefile.am | 10 +-- |
| src/racoon/algorithm.c | 6 +- |
| src/racoon/cfparse.y | 2 +- |
| src/racoon/crypto_openssl.c | 197 +++++++++++++++++++++------------------- |
| src/racoon/crypto_openssl.h | 2 +- |
| src/racoon/eaytest.c | 7 +- |
| src/racoon/ipsec_doi.c | 2 +- |
| src/racoon/openssl_compat.c | 213 ++++++++++++++++++++++++++++++++++++++++++++ |
| src/racoon/openssl_compat.h | 45 ++++++++++ |
| src/racoon/plainrsa-gen.c | 41 +++++---- |
| src/racoon/prsa_par.y | 28 ++++-- |
| src/racoon/rsalist.c | 5 +- |
| 12 files changed, 431 insertions(+), 127 deletions(-) |
| create mode 100644 src/racoon/openssl_compat.c |
| create mode 100644 src/racoon/openssl_compat.h |
| |
| diff --git a/src/racoon/Makefile.am b/src/racoon/Makefile.am |
| index dbaded9..4c585f3 100644 |
| --- a/src/racoon/Makefile.am |
| +++ b/src/racoon/Makefile.am |
| @@ -4,7 +4,7 @@ sbin_PROGRAMS = racoon racoonctl plainrsa-gen |
| noinst_PROGRAMS = eaytest |
| include_racoon_HEADERS = racoonctl.h var.h vmbuf.h misc.h gcmalloc.h admin.h \ |
| schedule.h sockmisc.h isakmp_var.h isakmp.h isakmp_xauth.h \ |
| - isakmp_cfg.h isakmp_unity.h ipsec_doi.h evt.h |
| + isakmp_cfg.h isakmp_unity.h ipsec_doi.h evt.h openssl_compat.h |
| lib_LTLIBRARIES = libracoon.la |
| |
| adminsockdir=${localstatedir}/racoon |
| @@ -32,7 +32,7 @@ racoon_SOURCES = \ |
| gssapi.c dnssec.c getcertsbyname.c privsep.c \ |
| pfkey.c admin.c evt.c ipsec_doi.c oakley.c grabmyaddr.c vendorid.c \ |
| policy.c localconf.c remoteconf.c crypto_openssl.c algorithm.c \ |
| - proposal.c sainfo.c strnames.c \ |
| + openssl_compat.c proposal.c sainfo.c strnames.c \ |
| plog.c logger.c schedule.c str2val.c \ |
| safefile.c backupsa.c genlist.c rsalist.c \ |
| cftoken.l cfparse.y prsa_tok.l prsa_par.y |
| @@ -51,12 +51,12 @@ libracoon_la_SOURCES = kmpstat.c vmbuf.c sockmisc.c misc.c |
| libracoon_la_CFLAGS = -DNOUSE_PRIVSEP $(AM_CFLAGS) |
| |
| plainrsa_gen_SOURCES = plainrsa-gen.c plog.c \ |
| - crypto_openssl.c logger.c |
| + crypto_openssl.c logger.c openssl_compat.c |
| EXTRA_plainrsa_gen_SOURCES = $(MISSING_ALGOS) |
| plainrsa_gen_LDADD = $(CRYPTOBJS) vmbuf.o misc.o |
| plainrsa_gen_DEPENDENCIES = $(CRYPTOBJS) vmbuf.o misc.o |
| |
| -eaytest_SOURCES = eaytest.c plog.c logger.c |
| +eaytest_SOURCES = eaytest.c plog.c logger.c openssl_compat.c |
| EXTRA_eaytest_SOURCES = missing/crypto/sha2/sha2.c |
| eaytest_LDADD = crypto_openssl_test.o vmbuf.o str2val.o misc_noplog.o \ |
| $(CRYPTOBJS) |
| @@ -75,7 +75,7 @@ noinst_HEADERS = \ |
| debugrm.h isakmp.h misc.h sainfo.h \ |
| dhgroup.h isakmp_agg.h netdb_dnssec.h schedule.h \ |
| isakmp_cfg.h isakmp_xauth.h isakmp_unity.h isakmp_frag.h \ |
| - throttle.h privsep.h \ |
| + throttle.h privsep.h openssl_compat.h \ |
| cfparse_proto.h cftoken_proto.h genlist.h rsalist.h \ |
| missing/crypto/sha2/sha2.h missing/crypto/rijndael/rijndael_local.h \ |
| missing/crypto/rijndael/rijndael-api-fst.h \ |
| diff --git a/src/racoon/algorithm.c b/src/racoon/algorithm.c |
| index 3fd50f6..66c874b 100644 |
| --- a/src/racoon/algorithm.c |
| +++ b/src/racoon/algorithm.c |
| @@ -128,7 +128,7 @@ static struct enc_algorithm oakley_encdef[] = { |
| { "aes", algtype_aes, OAKLEY_ATTR_ENC_ALG_AES, 16, |
| eay_aes_encrypt, eay_aes_decrypt, |
| eay_aes_weakkey, eay_aes_keylen, }, |
| -#ifdef HAVE_OPENSSL_CAMELLIA_H |
| +#if defined(HAVE_OPENSSL_CAMELLIA_H) && ! defined(OPENSSL_NO_CAMELLIA) |
| { "camellia", algtype_camellia, OAKLEY_ATTR_ENC_ALG_CAMELLIA, 16, |
| eay_camellia_encrypt, eay_camellia_decrypt, |
| eay_camellia_weakkey, eay_camellia_keylen, }, |
| @@ -168,7 +168,7 @@ static struct enc_algorithm ipsec_encdef[] = { |
| { "twofish", algtype_twofish, IPSECDOI_ESP_TWOFISH, 16, |
| NULL, NULL, |
| NULL, eay_twofish_keylen, }, |
| -#ifdef HAVE_OPENSSL_IDEA_H |
| +#if defined(HAVE_OPENSSL_IDEA_H) && ! defined(OPENSSL_NO_IDEA) |
| { "3idea", algtype_3idea, IPSECDOI_ESP_3IDEA, 8, |
| NULL, NULL, |
| NULL, NULL, }, |
| @@ -179,7 +179,7 @@ static struct enc_algorithm ipsec_encdef[] = { |
| { "rc4", algtype_rc4, IPSECDOI_ESP_RC4, 8, |
| NULL, NULL, |
| NULL, NULL, }, |
| -#ifdef HAVE_OPENSSL_CAMELLIA_H |
| +#if defined(HAVE_OPENSSL_CAMELLIA_H) && ! defined(OPENSSL_NO_CAMELLIA) |
| { "camellia", algtype_camellia, IPSECDOI_ESP_CAMELLIA, 16, |
| NULL, NULL, |
| NULL, eay_camellia_keylen, }, |
| diff --git a/src/racoon/cfparse.y b/src/racoon/cfparse.y |
| index 0d9bd67..8415752 100644 |
| --- a/src/racoon/cfparse.y |
| +++ b/src/racoon/cfparse.y |
| @@ -2564,7 +2564,7 @@ set_isakmp_proposal(rmconf) |
| plog(LLV_DEBUG2, LOCATION, NULL, |
| "encklen=%d\n", s->encklen); |
| |
| - memset(types, 0, ARRAYLEN(types)); |
| + memset(types, 0, sizeof types); |
| types[algclass_isakmp_enc] = s->algclass[algclass_isakmp_enc]; |
| types[algclass_isakmp_hash] = s->algclass[algclass_isakmp_hash]; |
| types[algclass_isakmp_dh] = s->algclass[algclass_isakmp_dh]; |
| diff --git a/src/racoon/crypto_openssl.c b/src/racoon/crypto_openssl.c |
| index 55b076a..8fb358f 100644 |
| --- a/src/racoon/crypto_openssl.c |
| +++ b/src/racoon/crypto_openssl.c |
| @@ -90,6 +90,7 @@ |
| #endif |
| #endif |
| #include "plog.h" |
| +#include "openssl_compat.h" |
| |
| #define USE_NEW_DES_API |
| |
| @@ -316,9 +317,12 @@ eay_cmp_asn1dn(n1, n2) |
| i = idx+1; |
| goto end; |
| } |
| - if ((ea->value->length == 1 && ea->value->data[0] == '*') || |
| - (eb->value->length == 1 && eb->value->data[0] == '*')) { |
| - if (OBJ_cmp(ea->object,eb->object)) { |
| + ASN1_STRING *sa = X509_NAME_ENTRY_get_data(ea); |
| + ASN1_STRING *sb = X509_NAME_ENTRY_get_data(eb); |
| + if ((ASN1_STRING_length(sa) == 1 && ASN1_STRING_get0_data(sa)[0] == '*') || |
| + (ASN1_STRING_length(sb) == 1 && ASN1_STRING_get0_data(sb)[0] == '*')) { |
| + if (OBJ_cmp(X509_NAME_ENTRY_get_object(ea), |
| + X509_NAME_ENTRY_get_object(eb))) { |
| i = idx+1; |
| goto end; |
| } |
| @@ -430,7 +434,7 @@ cb_check_cert_local(ok, ctx) |
| |
| if (!ok) { |
| X509_NAME_oneline( |
| - X509_get_subject_name(ctx->current_cert), |
| + X509_get_subject_name(X509_STORE_CTX_get_current_cert(ctx)), |
| buf, |
| 256); |
| /* |
| @@ -438,7 +442,8 @@ cb_check_cert_local(ok, ctx) |
| * ok if they are self signed. But we should still warn |
| * the user. |
| */ |
| - switch (ctx->error) { |
| + int ctx_error = X509_STORE_CTX_get_error(ctx); |
| + switch (ctx_error) { |
| case X509_V_ERR_CERT_HAS_EXPIRED: |
| case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: |
| case X509_V_ERR_INVALID_CA: |
| @@ -453,9 +458,9 @@ cb_check_cert_local(ok, ctx) |
| } |
| plog(log_tag, LOCATION, NULL, |
| "%s(%d) at depth:%d SubjectName:%s\n", |
| - X509_verify_cert_error_string(ctx->error), |
| - ctx->error, |
| - ctx->error_depth, |
| + X509_verify_cert_error_string(ctx_error), |
| + ctx_error, |
| + X509_STORE_CTX_get_error_depth(ctx), |
| buf); |
| } |
| ERR_clear_error(); |
| @@ -477,10 +482,11 @@ cb_check_cert_remote(ok, ctx) |
| |
| if (!ok) { |
| X509_NAME_oneline( |
| - X509_get_subject_name(ctx->current_cert), |
| + X509_get_subject_name(X509_STORE_CTX_get_current_cert(ctx)), |
| buf, |
| 256); |
| - switch (ctx->error) { |
| + int ctx_error=X509_STORE_CTX_get_error(ctx); |
| + switch (ctx_error) { |
| case X509_V_ERR_UNABLE_TO_GET_CRL: |
| ok = 1; |
| log_tag = LLV_WARNING; |
| @@ -490,9 +496,9 @@ cb_check_cert_remote(ok, ctx) |
| } |
| plog(log_tag, LOCATION, NULL, |
| "%s(%d) at depth:%d SubjectName:%s\n", |
| - X509_verify_cert_error_string(ctx->error), |
| - ctx->error, |
| - ctx->error_depth, |
| + X509_verify_cert_error_string(ctx_error), |
| + ctx_error, |
| + X509_STORE_CTX_get_error_depth(ctx), |
| buf); |
| } |
| ERR_clear_error(); |
| @@ -516,14 +522,15 @@ eay_get_x509asn1subjectname(cert) |
| if (x509 == NULL) |
| goto error; |
| |
| + X509_NAME *subject_name = X509_get_subject_name(x509); |
| /* get the length of the name */ |
| - len = i2d_X509_NAME(x509->cert_info->subject, NULL); |
| + len = i2d_X509_NAME(subject_name, NULL); |
| name = vmalloc(len); |
| if (!name) |
| goto error; |
| /* get the name */ |
| bp = (unsigned char *) name->v; |
| - len = i2d_X509_NAME(x509->cert_info->subject, &bp); |
| + len = i2d_X509_NAME(subject_name, &bp); |
| |
| X509_free(x509); |
| |
| @@ -661,15 +668,16 @@ eay_get_x509asn1issuername(cert) |
| if (x509 == NULL) |
| goto error; |
| |
| + X509_NAME *issuer_name = X509_get_issuer_name(x509); |
| /* get the length of the name */ |
| - len = i2d_X509_NAME(x509->cert_info->issuer, NULL); |
| + len = i2d_X509_NAME(issuer_name, NULL); |
| name = vmalloc(len); |
| if (name == NULL) |
| goto error; |
| |
| /* get the name */ |
| bp = (unsigned char *) name->v; |
| - len = i2d_X509_NAME(x509->cert_info->issuer, &bp); |
| + len = i2d_X509_NAME(issuer_name, &bp); |
| |
| X509_free(x509); |
| |
| @@ -850,7 +858,7 @@ eay_check_x509sign(source, sig, cert) |
| return -1; |
| } |
| |
| - res = eay_rsa_verify(source, sig, evp->pkey.rsa); |
| + res = eay_rsa_verify(source, sig, EVP_PKEY_get0_RSA(evp)); |
| |
| EVP_PKEY_free(evp); |
| X509_free(x509); |
| @@ -992,7 +1000,7 @@ eay_get_x509sign(src, privkey) |
| if (evp == NULL) |
| return NULL; |
| |
| - sig = eay_rsa_sign(src, evp->pkey.rsa); |
| + sig = eay_rsa_sign(src, EVP_PKEY_get0_RSA(evp)); |
| |
| EVP_PKEY_free(evp); |
| |
| @@ -1079,7 +1087,11 @@ eay_strerror() |
| int line, flags; |
| unsigned long es; |
| |
| +#if OPENSSL_VERSION_NUMBER >= 0x10100000L |
| + es = 0; /* even when allowed by OPENSSL_API_COMPAT, it is defined as 0 */ |
| +#else |
| es = CRYPTO_thread_id(); |
| +#endif |
| |
| while ((l = ERR_get_error_line_data(&file, &line, &data, &flags)) != 0){ |
| n = snprintf(ebuf + len, sizeof(ebuf) - len, |
| @@ -1100,7 +1112,7 @@ vchar_t * |
| evp_crypt(vchar_t *data, vchar_t *key, vchar_t *iv, const EVP_CIPHER *e, int enc) |
| { |
| vchar_t *res; |
| - EVP_CIPHER_CTX ctx; |
| + EVP_CIPHER_CTX *ctx; |
| |
| if (!e) |
| return NULL; |
| @@ -1111,7 +1123,7 @@ evp_crypt(vchar_t *data, vchar_t *key, vchar_t *iv, const EVP_CIPHER *e, int enc |
| if ((res = vmalloc(data->l)) == NULL) |
| return NULL; |
| |
| - EVP_CIPHER_CTX_init(&ctx); |
| + ctx = EVP_CIPHER_CTX_new(); |
| |
| switch(EVP_CIPHER_nid(e)){ |
| case NID_bf_cbc: |
| @@ -1125,54 +1137,41 @@ evp_crypt(vchar_t *data, vchar_t *key, vchar_t *iv, const EVP_CIPHER *e, int enc |
| /* XXX: can we do that also for algos with a fixed key size ? |
| */ |
| /* init context without key/iv |
| - */ |
| - if (!EVP_CipherInit(&ctx, e, NULL, NULL, enc)) |
| - { |
| - OpenSSL_BUG(); |
| - vfree(res); |
| - return NULL; |
| - } |
| + */ |
| + if (!EVP_CipherInit(ctx, e, NULL, NULL, enc)) |
| + goto out; |
| |
| - /* update key size |
| - */ |
| - if (!EVP_CIPHER_CTX_set_key_length(&ctx, key->l)) |
| - { |
| - OpenSSL_BUG(); |
| - vfree(res); |
| - return NULL; |
| - } |
| - |
| - /* finalize context init with desired key size |
| - */ |
| - if (!EVP_CipherInit(&ctx, NULL, (u_char *) key->v, |
| + /* update key size |
| + */ |
| + if (!EVP_CIPHER_CTX_set_key_length(ctx, key->l)) |
| + goto out; |
| + |
| + /* finalize context init with desired key size |
| + */ |
| + if (!EVP_CipherInit(ctx, NULL, (u_char *) key->v, |
| (u_char *) iv->v, enc)) |
| - { |
| - OpenSSL_BUG(); |
| - vfree(res); |
| - return NULL; |
| - } |
| + goto out; |
| break; |
| default: |
| - if (!EVP_CipherInit(&ctx, e, (u_char *) key->v, |
| - (u_char *) iv->v, enc)) { |
| - OpenSSL_BUG(); |
| - vfree(res); |
| - return NULL; |
| - } |
| + if (!EVP_CipherInit(ctx, e, (u_char *) key->v, |
| + (u_char *) iv->v, enc)) |
| + goto out; |
| } |
| |
| /* disable openssl padding */ |
| - EVP_CIPHER_CTX_set_padding(&ctx, 0); |
| + EVP_CIPHER_CTX_set_padding(ctx, 0); |
| |
| - if (!EVP_Cipher(&ctx, (u_char *) res->v, (u_char *) data->v, data->l)) { |
| - OpenSSL_BUG(); |
| - vfree(res); |
| - return NULL; |
| - } |
| + if (!EVP_Cipher(ctx, (u_char *) res->v, (u_char *) data->v, data->l)) |
| + goto out; |
| |
| - EVP_CIPHER_CTX_cleanup(&ctx); |
| + EVP_CIPHER_CTX_free(ctx); |
| |
| return res; |
| +out: |
| + EVP_CIPHER_CTX_free(ctx); |
| + OpenSSL_BUG(); |
| + vfree(res); |
| + return NULL; |
| } |
| |
| int |
| @@ -1230,7 +1229,7 @@ eay_des_keylen(len) |
| return evp_keylen(len, EVP_des_cbc()); |
| } |
| |
| -#ifdef HAVE_OPENSSL_IDEA_H |
| +#if defined(HAVE_OPENSSL_IDEA_H) && ! defined(OPENSSL_NO_IDEA) |
| /* |
| * IDEA-CBC |
| */ |
| @@ -1587,7 +1586,7 @@ eay_aes_keylen(len) |
| return len; |
| } |
| |
| -#if defined(HAVE_OPENSSL_CAMELLIA_H) |
| +#if defined(HAVE_OPENSSL_CAMELLIA_H) && ! defined(OPENSSL_NO_CAMELLIA) |
| /* |
| * CAMELLIA-CBC |
| */ |
| @@ -1680,9 +1679,9 @@ eay_hmac_init(key, md) |
| vchar_t *key; |
| const EVP_MD *md; |
| { |
| - HMAC_CTX *c = racoon_malloc(sizeof(*c)); |
| + HMAC_CTX *c = HMAC_CTX_new(); |
| |
| - HMAC_Init(c, key->v, key->l, md); |
| + HMAC_Init_ex(c, key->v, key->l, md, NULL); |
| |
| return (caddr_t)c; |
| } |
| @@ -1761,8 +1760,7 @@ eay_hmacsha2_512_final(c) |
| |
| HMAC_Final((HMAC_CTX *)c, (unsigned char *) res->v, &l); |
| res->l = l; |
| - HMAC_cleanup((HMAC_CTX *)c); |
| - (void)racoon_free(c); |
| + HMAC_CTX_free((HMAC_CTX *)c); |
| |
| if (SHA512_DIGEST_LENGTH != res->l) { |
| plog(LLV_ERROR, LOCATION, NULL, |
| @@ -1811,8 +1809,7 @@ eay_hmacsha2_384_final(c) |
| |
| HMAC_Final((HMAC_CTX *)c, (unsigned char *) res->v, &l); |
| res->l = l; |
| - HMAC_cleanup((HMAC_CTX *)c); |
| - (void)racoon_free(c); |
| + HMAC_CTX_free((HMAC_CTX *)c); |
| |
| if (SHA384_DIGEST_LENGTH != res->l) { |
| plog(LLV_ERROR, LOCATION, NULL, |
| @@ -1861,8 +1858,7 @@ eay_hmacsha2_256_final(c) |
| |
| HMAC_Final((HMAC_CTX *)c, (unsigned char *) res->v, &l); |
| res->l = l; |
| - HMAC_cleanup((HMAC_CTX *)c); |
| - (void)racoon_free(c); |
| + HMAC_CTX_free((HMAC_CTX *)c); |
| |
| if (SHA256_DIGEST_LENGTH != res->l) { |
| plog(LLV_ERROR, LOCATION, NULL, |
| @@ -1912,8 +1908,7 @@ eay_hmacsha1_final(c) |
| |
| HMAC_Final((HMAC_CTX *)c, (unsigned char *) res->v, &l); |
| res->l = l; |
| - HMAC_cleanup((HMAC_CTX *)c); |
| - (void)racoon_free(c); |
| + HMAC_CTX_free((HMAC_CTX *)c); |
| |
| if (SHA_DIGEST_LENGTH != res->l) { |
| plog(LLV_ERROR, LOCATION, NULL, |
| @@ -1962,8 +1957,7 @@ eay_hmacmd5_final(c) |
| |
| HMAC_Final((HMAC_CTX *)c, (unsigned char *) res->v, &l); |
| res->l = l; |
| - HMAC_cleanup((HMAC_CTX *)c); |
| - (void)racoon_free(c); |
| + HMAC_CTX_free((HMAC_CTX *)c); |
| |
| if (MD5_DIGEST_LENGTH != res->l) { |
| plog(LLV_ERROR, LOCATION, NULL, |
| @@ -2266,6 +2260,7 @@ eay_dh_generate(prime, g, publen, pub, priv) |
| u_int32_t g; |
| { |
| BIGNUM *p = NULL; |
| + BIGNUM *BNg = NULL; |
| DH *dh = NULL; |
| int error = -1; |
| |
| @@ -2276,25 +2271,28 @@ eay_dh_generate(prime, g, publen, pub, priv) |
| |
| if ((dh = DH_new()) == NULL) |
| goto end; |
| - dh->p = p; |
| - p = NULL; /* p is now part of dh structure */ |
| - dh->g = NULL; |
| - if ((dh->g = BN_new()) == NULL) |
| + if ((BNg = BN_new()) == NULL) |
| goto end; |
| - if (!BN_set_word(dh->g, g)) |
| + if (!BN_set_word(BNg, g)) |
| goto end; |
| + if (! DH_set0_pqg(dh, p, NULL, BNg)) |
| + goto end; |
| + BNg = NULL; |
| + p = NULL; /* p is now part of dh structure */ |
| |
| if (publen != 0) |
| - dh->length = publen; |
| + DH_set_length(dh, publen); |
| |
| /* generate public and private number */ |
| if (!DH_generate_key(dh)) |
| goto end; |
| |
| /* copy results to buffers */ |
| - if (eay_bn2v(pub, dh->pub_key) < 0) |
| + BIGNUM *pub_key, *priv_key; |
| + DH_get0_key(dh, (const BIGNUM**) &pub_key, (const BIGNUM**) &priv_key); |
| + if (eay_bn2v(pub, pub_key) < 0) |
| goto end; |
| - if (eay_bn2v(priv, dh->priv_key) < 0) { |
| + if (eay_bn2v(priv, priv_key) < 0) { |
| vfree(*pub); |
| goto end; |
| } |
| @@ -2306,6 +2304,8 @@ end: |
| DH_free(dh); |
| if (p != 0) |
| BN_free(p); |
| + if (BNg != 0) |
| + BN_free(BNg); |
| return(error); |
| } |
| |
| @@ -2319,6 +2319,10 @@ eay_dh_compute(prime, g, pub, priv, pub2, key) |
| int l; |
| unsigned char *v = NULL; |
| int error = -1; |
| + BIGNUM *p = BN_new(); |
| + BIGNUM *BNg = BN_new(); |
| + BIGNUM *pub_key = BN_new(); |
| + BIGNUM *priv_key = BN_new(); |
| |
| /* make public number to compute */ |
| if (eay_v2bn(&dh_pub, pub2) < 0) |
| @@ -2327,19 +2331,21 @@ eay_dh_compute(prime, g, pub, priv, pub2, key) |
| /* make DH structure */ |
| if ((dh = DH_new()) == NULL) |
| goto end; |
| - if (eay_v2bn(&dh->p, prime) < 0) |
| + if (p == NULL || BNg == NULL || pub_key == NULL || priv_key == NULL) |
| goto end; |
| - if (eay_v2bn(&dh->pub_key, pub) < 0) |
| + |
| + if (eay_v2bn(&p, prime) < 0) |
| goto end; |
| - if (eay_v2bn(&dh->priv_key, priv) < 0) |
| + if (eay_v2bn(&pub_key, pub) < 0) |
| goto end; |
| - dh->length = pub2->l * 8; |
| - |
| - dh->g = NULL; |
| - if ((dh->g = BN_new()) == NULL) |
| + if (eay_v2bn(&priv_key, priv) < 0) |
| goto end; |
| - if (!BN_set_word(dh->g, g)) |
| + if (!BN_set_word(BNg, g)) |
| goto end; |
| + DH_set0_key(dh, pub_key, priv_key); |
| + DH_set_length(dh, pub2->l * 8); |
| + DH_set0_pqg(dh, p, NULL, BNg); |
| + pub_key = priv_key = p = BNg = NULL; |
| |
| if ((v = racoon_calloc(prime->l, sizeof(u_char))) == NULL) |
| goto end; |
| @@ -2350,6 +2356,14 @@ eay_dh_compute(prime, g, pub, priv, pub2, key) |
| error = 0; |
| |
| end: |
| + if (p != NULL) |
| + BN_free(p); |
| + if (BNg != NULL) |
| + BN_free(BNg); |
| + if (pub_key != NULL) |
| + BN_free(pub_key); |
| + if (priv_key != NULL) |
| + BN_free(priv_key); |
| if (dh_pub != NULL) |
| BN_free(dh_pub); |
| if (dh != NULL) |
| @@ -2400,12 +2414,14 @@ eay_bn2v(var, bn) |
| void |
| eay_init() |
| { |
| +#if OPENSSL_VERSION_NUMBER < 0x10100000L |
| OpenSSL_add_all_algorithms(); |
| ERR_load_crypto_strings(); |
| #ifdef HAVE_OPENSSL_ENGINE_H |
| ENGINE_load_builtin_engines(); |
| ENGINE_register_all_complete(); |
| #endif |
| +#endif |
| } |
| |
| vchar_t * |
| @@ -2504,8 +2520,7 @@ binbuf_pubkey2rsa(vchar_t *binbuf) |
| goto out; |
| } |
| |
| - rsa_pub->n = mod; |
| - rsa_pub->e = exp; |
| + RSA_set0_key(rsa_pub, mod, exp, NULL); |
| |
| out: |
| return rsa_pub; |
| @@ -2582,5 +2597,5 @@ eay_random() |
| const char * |
| eay_version() |
| { |
| - return SSLeay_version(SSLEAY_VERSION); |
| + return OpenSSL_version(OPENSSL_VERSION); |
| } |
| diff --git a/src/racoon/crypto_openssl.h b/src/racoon/crypto_openssl.h |
| index 66fac73..ee5b765 100644 |
| --- a/src/racoon/crypto_openssl.h |
| +++ b/src/racoon/crypto_openssl.h |
| @@ -124,7 +124,7 @@ extern vchar_t *eay_aes_decrypt __P((vchar_t *, vchar_t *, vchar_t *)); |
| extern int eay_aes_weakkey __P((vchar_t *)); |
| extern int eay_aes_keylen __P((int)); |
| |
| -#if defined(HAVE_OPENSSL_CAMELLIA_H) |
| +#if defined(HAVE_OPENSSL_CAMELLIA_H) && ! defined(OPENSSL_NO_CAMELLIA) |
| /* Camellia */ |
| extern vchar_t *eay_camellia_encrypt __P((vchar_t *, vchar_t *, vchar_t *)); |
| extern vchar_t *eay_camellia_decrypt __P((vchar_t *, vchar_t *, vchar_t *)); |
| diff --git a/src/racoon/eaytest.c b/src/racoon/eaytest.c |
| index 1474bdc..ae09db3 100644 |
| --- a/src/racoon/eaytest.c |
| +++ b/src/racoon/eaytest.c |
| @@ -62,6 +62,7 @@ |
| #include "dhgroup.h" |
| #include "crypto_openssl.h" |
| #include "gnuc.h" |
| +#include "openssl_compat.h" |
| |
| #include "package_version.h" |
| |
| @@ -103,7 +104,7 @@ rsa_verify_with_pubkey(src, sig, pubkey_txt) |
| printf ("PEM_read_PUBKEY(): %s\n", eay_strerror()); |
| return -1; |
| } |
| - error = eay_check_rsasign(src, sig, evp->pkey.rsa); |
| + error = eay_check_rsasign(src, sig, EVP_PKEY_get0_RSA(evp)); |
| |
| return error; |
| } |
| @@ -698,7 +699,7 @@ ciphertest(ac, av) |
| eay_cast_encrypt, eay_cast_decrypt) < 0) |
| return -1; |
| |
| -#ifdef HAVE_OPENSSL_IDEA_H |
| +#if defined(HAVE_OPENSSL_IDEA_H) && ! defined(OPENSSL_NO_IDEA) |
| if (ciphertest_1 ("IDEA", |
| &data, 8, |
| &key, key.l, |
| @@ -715,7 +716,7 @@ ciphertest(ac, av) |
| eay_rc5_encrypt, eay_rc5_decrypt) < 0) |
| return -1; |
| #endif |
| -#if defined(HAVE_OPENSSL_CAMELLIA_H) |
| +#if defined(HAVE_OPENSSL_CAMELLIA_H) && ! defined(OPENSSL_NO_CAMELLIA) |
| if (ciphertest_1 ("CAMELLIA", |
| &data, 16, |
| &key, key.l, |
| diff --git a/src/racoon/ipsec_doi.c b/src/racoon/ipsec_doi.c |
| index 84a4c71..b52469f 100644 |
| --- a/src/racoon/ipsec_doi.c |
| +++ b/src/racoon/ipsec_doi.c |
| @@ -715,7 +715,7 @@ out: |
| /* key length must not be specified on some algorithms */ |
| if (keylen) { |
| if (sa->enctype == OAKLEY_ATTR_ENC_ALG_DES |
| -#ifdef HAVE_OPENSSL_IDEA_H |
| +#if defined(HAVE_OPENSSL_IDEA_H) && ! defined(OPENSSL_NO_IDEA) |
| || sa->enctype == OAKLEY_ATTR_ENC_ALG_IDEA |
| #endif |
| || sa->enctype == OAKLEY_ATTR_ENC_ALG_3DES) { |
| diff --git a/src/racoon/openssl_compat.c b/src/racoon/openssl_compat.c |
| new file mode 100644 |
| index 0000000..864b5fb |
| --- /dev/null |
| +++ b/src/racoon/openssl_compat.c |
| @@ -0,0 +1,213 @@ |
| +/* |
| + * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. |
| + * |
| + * Licensed under the OpenSSL license (the "License"). You may not use |
| + * this file except in compliance with the License. You can obtain a copy |
| + * in the file LICENSE in the source distribution or at |
| + * https://www.openssl.org/source/license.html |
| + */ |
| + |
| +#include "openssl_compat.h" |
| + |
| +#if OPENSSL_VERSION_NUMBER < 0x10100000L |
| + |
| +#include <string.h> |
| + |
| +static void *OPENSSL_zalloc(size_t num) |
| +{ |
| + void *ret = OPENSSL_malloc(num); |
| + |
| + if (ret != NULL) |
| + memset(ret, 0, num); |
| + return ret; |
| +} |
| + |
| +int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) |
| +{ |
| + /* If the fields n and e in r are NULL, the corresponding input |
| + * parameters MUST be non-NULL for n and e. d may be |
| + * left NULL (in case only the public key is used). |
| + */ |
| + if ((r->n == NULL && n == NULL) |
| + || (r->e == NULL && e == NULL)) |
| + return 0; |
| + |
| + if (n != NULL) { |
| + BN_free(r->n); |
| + r->n = n; |
| + } |
| + if (e != NULL) { |
| + BN_free(r->e); |
| + r->e = e; |
| + } |
| + if (d != NULL) { |
| + BN_free(r->d); |
| + r->d = d; |
| + } |
| + |
| + return 1; |
| +} |
| + |
| +int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q) |
| +{ |
| + /* If the fields p and q in r are NULL, the corresponding input |
| + * parameters MUST be non-NULL. |
| + */ |
| + if ((r->p == NULL && p == NULL) |
| + || (r->q == NULL && q == NULL)) |
| + return 0; |
| + |
| + if (p != NULL) { |
| + BN_free(r->p); |
| + r->p = p; |
| + } |
| + if (q != NULL) { |
| + BN_free(r->q); |
| + r->q = q; |
| + } |
| + |
| + return 1; |
| +} |
| + |
| +int RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp) |
| +{ |
| + /* If the fields dmp1, dmq1 and iqmp in r are NULL, the corresponding input |
| + * parameters MUST be non-NULL. |
| + */ |
| + if ((r->dmp1 == NULL && dmp1 == NULL) |
| + || (r->dmq1 == NULL && dmq1 == NULL) |
| + || (r->iqmp == NULL && iqmp == NULL)) |
| + return 0; |
| + |
| + if (dmp1 != NULL) { |
| + BN_free(r->dmp1); |
| + r->dmp1 = dmp1; |
| + } |
| + if (dmq1 != NULL) { |
| + BN_free(r->dmq1); |
| + r->dmq1 = dmq1; |
| + } |
| + if (iqmp != NULL) { |
| + BN_free(r->iqmp); |
| + r->iqmp = iqmp; |
| + } |
| + |
| + return 1; |
| +} |
| + |
| +void RSA_get0_key(const RSA *r, |
| + const BIGNUM **n, const BIGNUM **e, const BIGNUM **d) |
| +{ |
| + if (n != NULL) |
| + *n = r->n; |
| + if (e != NULL) |
| + *e = r->e; |
| + if (d != NULL) |
| + *d = r->d; |
| +} |
| + |
| +void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q) |
| +{ |
| + if (p != NULL) |
| + *p = r->p; |
| + if (q != NULL) |
| + *q = r->q; |
| +} |
| + |
| +void RSA_get0_crt_params(const RSA *r, |
| + const BIGNUM **dmp1, const BIGNUM **dmq1, |
| + const BIGNUM **iqmp) |
| +{ |
| + if (dmp1 != NULL) |
| + *dmp1 = r->dmp1; |
| + if (dmq1 != NULL) |
| + *dmq1 = r->dmq1; |
| + if (iqmp != NULL) |
| + *iqmp = r->iqmp; |
| +} |
| + |
| +int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g) |
| +{ |
| + /* If the fields p and g in d are NULL, the corresponding input |
| + * parameters MUST be non-NULL. q may remain NULL. |
| + */ |
| + if ((dh->p == NULL && p == NULL) |
| + || (dh->g == NULL && g == NULL)) |
| + return 0; |
| + |
| + if (p != NULL) { |
| + BN_free(dh->p); |
| + dh->p = p; |
| + } |
| + if (q != NULL) { |
| + BN_free(dh->q); |
| + dh->q = q; |
| + } |
| + if (g != NULL) { |
| + BN_free(dh->g); |
| + dh->g = g; |
| + } |
| + |
| + if (q != NULL) { |
| + dh->length = BN_num_bits(q); |
| + } |
| + |
| + return 1; |
| +} |
| + |
| +void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key) |
| +{ |
| + if (pub_key != NULL) |
| + *pub_key = dh->pub_key; |
| + if (priv_key != NULL) |
| + *priv_key = dh->priv_key; |
| +} |
| + |
| +int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key) |
| +{ |
| + /* If the field pub_key in dh is NULL, the corresponding input |
| + * parameters MUST be non-NULL. The priv_key field may |
| + * be left NULL. |
| + */ |
| + if (dh->pub_key == NULL && pub_key == NULL) |
| + return 0; |
| + |
| + if (pub_key != NULL) { |
| + BN_free(dh->pub_key); |
| + dh->pub_key = pub_key; |
| + } |
| + if (priv_key != NULL) { |
| + BN_free(dh->priv_key); |
| + dh->priv_key = priv_key; |
| + } |
| + |
| + return 1; |
| +} |
| + |
| +int DH_set_length(DH *dh, long length) |
| +{ |
| + dh->length = length; |
| + return 1; |
| +} |
| + |
| +HMAC_CTX *HMAC_CTX_new(void) |
| +{ |
| + return OPENSSL_zalloc(sizeof(HMAC_CTX)); |
| +} |
| + |
| +void HMAC_CTX_free(HMAC_CTX *ctx) |
| +{ |
| + HMAC_CTX_cleanup(ctx); |
| + OPENSSL_free(ctx); |
| +} |
| + |
| +RSA *EVP_PKEY_get0_RSA(EVP_PKEY *pkey) |
| +{ |
| + if (pkey->type != EVP_PKEY_RSA) { |
| + return NULL; |
| + } |
| + return pkey->pkey.rsa; |
| +} |
| + |
| + |
| +#endif /* OPENSSL_VERSION_NUMBER */ |
| diff --git a/src/racoon/openssl_compat.h b/src/racoon/openssl_compat.h |
| new file mode 100644 |
| index 0000000..9e152c2 |
| --- /dev/null |
| +++ b/src/racoon/openssl_compat.h |
| @@ -0,0 +1,45 @@ |
| +#ifndef OPENSSL_COMPAT_H |
| +#define OPENSSL_COMPAT_H |
| + |
| +#include <openssl/opensslv.h> |
| +#if OPENSSL_VERSION_NUMBER < 0x10100000L |
| + |
| +#include <openssl/rsa.h> |
| +#include <openssl/dh.h> |
| +#include <openssl/evp.h> |
| +#include <openssl/hmac.h> |
| + |
| +int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d); |
| +int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q); |
| +int RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp); |
| +void RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d); |
| +void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q); |
| +void RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, const BIGNUM **iqmp); |
| + |
| +int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g); |
| +void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key); |
| +int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key); |
| +int DH_set_length(DH *dh, long length); |
| + |
| +HMAC_CTX *HMAC_CTX_new(void); |
| +void HMAC_CTX_free(HMAC_CTX* ctx); |
| + |
| +RSA *EVP_PKEY_get0_RSA(EVP_PKEY *pkey); |
| + |
| +#define ASN1_STRING_length(s) s->length |
| +#define ASN1_STRING_get0_data(s) s->data |
| + |
| +#define X509_get_subject_name(x) x->cert_info->subject |
| +#define X509_get_issuer_name(x) x->cert_info->issuer |
| +#define X509_NAME_ENTRY_get_data(n) n->value |
| +#define X509_NAME_ENTRY_get_object(n) n->object |
| +#define X509_STORE_CTX_get_current_cert(ctx) ctx->current_cert |
| +#define X509_STORE_CTX_get_error(ctx) ctx->error |
| +#define X509_STORE_CTX_get_error_depth(ctx) ctx->error_depth |
| + |
| +#define OPENSSL_VERSION SSLEAY_VERSION |
| +#define OpenSSL_version SSLeay_version |
| + |
| +#endif /* OPENSSL_VERSION_NUMBER */ |
| + |
| +#endif /* OPENSSL_COMPAT_H */ |
| diff --git a/src/racoon/plainrsa-gen.c b/src/racoon/plainrsa-gen.c |
| index cad1861..b949b08 100644 |
| --- a/src/racoon/plainrsa-gen.c |
| +++ b/src/racoon/plainrsa-gen.c |
| @@ -60,6 +60,7 @@ |
| #include "vmbuf.h" |
| #include "plog.h" |
| #include "crypto_openssl.h" |
| +#include "openssl_compat.h" |
| |
| #include "package_version.h" |
| |
| @@ -90,12 +91,14 @@ mix_b64_pubkey(const RSA *key) |
| char *binbuf; |
| long binlen, ret; |
| vchar_t *res; |
| - |
| - binlen = 1 + BN_num_bytes(key->e) + BN_num_bytes(key->n); |
| + const BIGNUM *e, *n; |
| + |
| + RSA_get0_key(key, &n, &e, NULL); |
| + binlen = 1 + BN_num_bytes(e) + BN_num_bytes(n); |
| binbuf = malloc(binlen); |
| memset(binbuf, 0, binlen); |
| - binbuf[0] = BN_bn2bin(key->e, (unsigned char *) &binbuf[1]); |
| - ret = BN_bn2bin(key->n, (unsigned char *) (&binbuf[binbuf[0] + 1])); |
| + binbuf[0] = BN_bn2bin(e, (unsigned char *) &binbuf[1]); |
| + ret = BN_bn2bin(n, (unsigned char *) (&binbuf[binbuf[0] + 1])); |
| if (1 + binbuf[0] + ret != binlen) { |
| plog(LLV_ERROR, LOCATION, NULL, |
| "Pubkey generation failed. This is really strange...\n"); |
| @@ -131,16 +134,20 @@ print_rsa_key(FILE *fp, const RSA *key) |
| |
| fprintf(fp, "# : PUB 0s%s\n", pubkey64->v); |
| fprintf(fp, ": RSA\t{\n"); |
| - fprintf(fp, "\t# RSA %d bits\n", BN_num_bits(key->n)); |
| + const BIGNUM *n, *e, *d, *p, *q, *dmp1, *dmq1, *iqmp; |
| + RSA_get0_key(key, &n, &e, &d); |
| + RSA_get0_factors(key, &p, &q); |
| + RSA_get0_crt_params(key, &dmp1, &dmq1, &iqmp); |
| + fprintf(fp, "\t# RSA %d bits\n", BN_num_bits(n)); |
| fprintf(fp, "\t# pubkey=0s%s\n", pubkey64->v); |
| - fprintf(fp, "\tModulus: 0x%s\n", lowercase(BN_bn2hex(key->n))); |
| - fprintf(fp, "\tPublicExponent: 0x%s\n", lowercase(BN_bn2hex(key->e))); |
| - fprintf(fp, "\tPrivateExponent: 0x%s\n", lowercase(BN_bn2hex(key->d))); |
| - fprintf(fp, "\tPrime1: 0x%s\n", lowercase(BN_bn2hex(key->p))); |
| - fprintf(fp, "\tPrime2: 0x%s\n", lowercase(BN_bn2hex(key->q))); |
| - fprintf(fp, "\tExponent1: 0x%s\n", lowercase(BN_bn2hex(key->dmp1))); |
| - fprintf(fp, "\tExponent2: 0x%s\n", lowercase(BN_bn2hex(key->dmq1))); |
| - fprintf(fp, "\tCoefficient: 0x%s\n", lowercase(BN_bn2hex(key->iqmp))); |
| + fprintf(fp, "\tModulus: 0x%s\n", lowercase(BN_bn2hex(n))); |
| + fprintf(fp, "\tPublicExponent: 0x%s\n", lowercase(BN_bn2hex(e))); |
| + fprintf(fp, "\tPrivateExponent: 0x%s\n", lowercase(BN_bn2hex(d))); |
| + fprintf(fp, "\tPrime1: 0x%s\n", lowercase(BN_bn2hex(p))); |
| + fprintf(fp, "\tPrime2: 0x%s\n", lowercase(BN_bn2hex(q))); |
| + fprintf(fp, "\tExponent1: 0x%s\n", lowercase(BN_bn2hex(dmp1))); |
| + fprintf(fp, "\tExponent2: 0x%s\n", lowercase(BN_bn2hex(dmq1))); |
| + fprintf(fp, "\tCoefficient: 0x%s\n", lowercase(BN_bn2hex(iqmp))); |
| fprintf(fp, " }\n"); |
| |
| vfree(pubkey64); |
| @@ -203,11 +210,13 @@ int |
| gen_rsa_key(FILE *fp, size_t bits, unsigned long exp) |
| { |
| int ret; |
| - RSA *key; |
| + RSA *key = RSA_new(); |
| + BIGNUM *e = BN_new(); |
| |
| - key = RSA_generate_key(bits, exp, NULL, NULL); |
| - if (!key) { |
| + BN_set_word(e, exp); |
| + if (! RSA_generate_key_ex(key, bits, e, NULL)) { |
| fprintf(stderr, "RSA_generate_key(): %s\n", eay_strerror()); |
| + RSA_free(key); |
| return -1; |
| } |
| |
| diff --git a/src/racoon/prsa_par.y b/src/racoon/prsa_par.y |
| index 1987e4d..27ce4c6 100644 |
| --- a/src/racoon/prsa_par.y |
| +++ b/src/racoon/prsa_par.y |
| @@ -68,6 +68,7 @@ |
| #include "isakmp_var.h" |
| #include "handler.h" |
| #include "crypto_openssl.h" |
| +#include "openssl_compat.h" |
| #include "sockmisc.h" |
| #include "rsalist.h" |
| |
| @@ -85,7 +86,18 @@ char *prsa_cur_fname = NULL; |
| struct genlist *prsa_cur_list = NULL; |
| enum rsa_key_type prsa_cur_type = RSA_TYPE_ANY; |
| |
| -static RSA *rsa_cur; |
| +struct my_rsa_st { |
| + BIGNUM *n; |
| + BIGNUM *e; |
| + BIGNUM *d; |
| + BIGNUM *p; |
| + BIGNUM *q; |
| + BIGNUM *dmp1; |
| + BIGNUM *dmq1; |
| + BIGNUM *iqmp; |
| +}; |
| + |
| +static struct my_rsa_st *rsa_cur; |
| |
| void |
| prsaerror(const char *s, ...) |
| @@ -201,8 +213,12 @@ rsa_statement: |
| rsa_cur->iqmp = NULL; |
| } |
| } |
| - $$ = rsa_cur; |
| - rsa_cur = RSA_new(); |
| + RSA * rsa_tmp = RSA_new(); |
| + RSA_set0_key(rsa_tmp, rsa_cur->n, rsa_cur->e, rsa_cur->d); |
| + RSA_set0_factors(rsa_tmp, rsa_cur->p, rsa_cur->q); |
| + RSA_set0_crt_params(rsa_tmp, rsa_cur->dmp1, rsa_cur->dmq1, rsa_cur->iqmp); |
| + $$ = rsa_tmp; |
| + memset(rsa_cur, 0, sizeof(struct my_rsa_st)); |
| } |
| | TAG_PUB BASE64 |
| { |
| @@ -351,10 +367,12 @@ prsa_parse_file(struct genlist *list, char *fname, enum rsa_key_type type) |
| prsa_cur_fname = fname; |
| prsa_cur_list = list; |
| prsa_cur_type = type; |
| - rsa_cur = RSA_new(); |
| + rsa_cur = malloc(sizeof(struct my_rsa_st)); |
| + memset(rsa_cur, 0, sizeof(struct my_rsa_st)); |
| ret = prsaparse(); |
| if (rsa_cur) { |
| - RSA_free(rsa_cur); |
| + memset(rsa_cur, 0, sizeof(struct my_rsa_st)); |
| + free(rsa_cur); |
| rsa_cur = NULL; |
| } |
| fclose (fp); |
| diff --git a/src/racoon/rsalist.c b/src/racoon/rsalist.c |
| index f152c82..96e8363 100644 |
| --- a/src/racoon/rsalist.c |
| +++ b/src/racoon/rsalist.c |
| @@ -52,6 +52,7 @@ |
| #include "genlist.h" |
| #include "remoteconf.h" |
| #include "crypto_openssl.h" |
| +#include "openssl_compat.h" |
| |
| #ifndef LIST_FIRST |
| #define LIST_FIRST(head) ((head)->lh_first) |
| @@ -98,7 +99,9 @@ rsa_key_dup(struct rsa_key *key) |
| return NULL; |
| |
| if (key->rsa) { |
| - new->rsa = key->rsa->d != NULL ? RSAPrivateKey_dup(key->rsa) : RSAPublicKey_dup(key->rsa); |
| + const BIGNUM *d; |
| + RSA_get0_key(key->rsa, NULL, NULL, &d); |
| + new->rsa = (d != NULL ? RSAPrivateKey_dup(key->rsa) : RSAPublicKey_dup(key->rsa)); |
| if (new->rsa == NULL) |
| goto dup_error; |
| } |
| -- |
| 2.16.1 |
| |