This is an automated email from the ASF dual-hosted git repository.
dgkimura pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-native.git
The following commit(s) were added to refs/heads/develop by this push:
new 4d8cd4f GEODE-3093: Update support for OpenSSL 1.1 (#147)
4d8cd4f is described below
commit 4d8cd4fb7aafee457de4e67269bf67cbe084357c
Author: David Kimura <[email protected]>
AuthorDate: Mon Nov 13 07:44:13 2017 -0800
GEODE-3093: Update support for OpenSSL 1.1 (#147)
GEODE-3093: Update support for OpenSSL 1.1
---
cryptoimpl/DHImpl.cpp | 170 ++++++++++++++++++++----------------
dependencies/openssl/CMakeLists.txt | 30 ++-----
dependencies/openssl/patches | 13 ---
dhimpl/DHImpl.cpp | 141 ++++++++++++++++++------------
templates/security/PkcsAuthInit.cpp | 17 ++--
tests/cpp/security/PkcsAuthInit.cpp | 16 ++--
6 files changed, 205 insertions(+), 182 deletions(-)
diff --git a/cryptoimpl/DHImpl.cpp b/cryptoimpl/DHImpl.cpp
index 982e742..1edcce8 100644
--- a/cryptoimpl/DHImpl.cpp
+++ b/cryptoimpl/DHImpl.cpp
@@ -99,27 +99,31 @@ ASN1_SEQUENCE(
dhimpl->m_dh = DH_new();
- LOGDH(" DHInit: P ptr is %p", dhimpl->m_dh->p);
- LOGDH(" DHInit: G ptr is %p", dhimpl->m_dh->g);
- LOGDH(" DHInit: length is %d", dhimpl->m_dh->length);
-
int ret = -1;
- ret = BN_dec2bn(&dhimpl->m_dh->p, dhP);
+ const BIGNUM* pbn,* gbn;
+ DH_get0_pqg(dhimpl->m_dh, &pbn, NULL, &gbn);
+ ret = BN_dec2bn((BIGNUM**)&pbn, dhP);
LOGDH(" DHInit: BN_dec2bn dhP ret %d", ret);
- ret = BN_dec2bn(&dhimpl->m_dh->g, dhG);
+ LOGDH(" DHInit: P ptr is %p", pbn);
+ LOGDH(" DHInit: G ptr is %p", gbn);
+ LOGDH(" DHInit: length is %d", DH_get_length(dhimpl->m_dh));
+
+ ret = BN_dec2bn((BIGNUM**)&gbn, dhG);
LOGDH(" DHInit: BN_dec2bn dhG ret %d", ret);
- dhimpl->m_dh->length = dhL;
+ DH_set_length(dhimpl->m_dh, dhL);
ret = DH_generate_key(dhimpl->m_dh);
LOGDH(" DHInit: DH_generate_key ret %d", ret);
- ret = BN_num_bits(dhimpl->m_dh->priv_key);
+ const BIGNUM* pub_key, *priv_key;
+ DH_get0_key(dhimpl->m_dh, &pub_key, &priv_key);
+ ret = BN_num_bits(priv_key);
LOGDH(" DHInit: BN_num_bits priv_key is %d", ret);
- ret = BN_num_bits(dhimpl->m_dh->pub_key);
+ ret = BN_num_bits(pub_key);
LOGDH(" DHInit: BN_num_bits pub_key is %d", ret);
int codes = 0;
@@ -193,11 +197,14 @@ void gf_clearDhKeys(void *dhCtx) {
unsigned char *gf_getPublicKey(void *dhCtx, int *pLen) {
DHImpl *dhimpl = reinterpret_cast<DHImpl *>(dhCtx);
- if (dhimpl->m_dh->pub_key == NULL || pLen == NULL) {
+ const BIGNUM* pub_key, *priv_key;
+ DH_get0_key(dhimpl->m_dh, &pub_key, &priv_key);
+
+ if (pub_key == NULL || pLen == NULL) {
return NULL;
}
- int numBytes = BN_num_bytes(dhimpl->m_dh->pub_key);
+ int numBytes = BN_num_bytes(pub_key);
if (numBytes <= 0) {
return NULL;
@@ -247,7 +254,11 @@ void gf_setPublicKeyOther(void *dhCtx, const unsigned char
*pubkey,
EVP_PKEY *evppkey = DH_PUBKEY_get(dhpubkey);
LOGDH(" setPubKeyOther: after dhpubkey get evp ptr is %p\n", evppkey);
LOGDH(" setPubKeyOther: before BNdup ptr is %p\n", dhimpl->m_pubKeyOther);
- dhimpl->m_pubKeyOther = BN_dup(evppkey->pkey.dh->pub_key);
+
+ const BIGNUM* pub_key, *priv_key;
+ DH* dh = EVP_PKEY_get1_DH(evppkey);
+ DH_get0_key(dh, &pub_key, &priv_key);
+ dhimpl->m_pubKeyOther = BN_dup(pub_key);
LOGDH(" setPubKeyOther: after BNdup ptr is %p\n", dhimpl->m_pubKeyOther);
EVP_PKEY_free(evppkey);
DH_PUBKEY_free(dhpubkey);
@@ -357,8 +368,7 @@ unsigned char *gf_encryptDH(void *dhCtx, const unsigned
char *cleartext,
unsigned char *ciphertext =
new unsigned char[len + 50]; // give enough room for padding
int outlen, tmplen;
- EVP_CIPHER_CTX ctx;
- EVP_CIPHER_CTX_init(&ctx);
+ EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
int ret = -123;
@@ -367,27 +377,27 @@ unsigned char *gf_encryptDH(void *dhCtx, const unsigned
char *cleartext,
// init openssl cipher context
if (dhimpl->m_skAlgo == "AES") {
int keySize = dhimpl->m_keySize > 128 ? dhimpl->m_keySize / 8 : 16;
- ret = EVP_EncryptInit_ex(&ctx, cipherFunc, NULL,
+ ret = EVP_EncryptInit_ex(ctx, cipherFunc, NULL,
(unsigned char *)dhimpl->m_key,
(unsigned char *)dhimpl->m_key + keySize);
} else if (dhimpl->m_skAlgo == "Blowfish") {
int keySize = dhimpl->m_keySize > 128 ? dhimpl->m_keySize / 8 : 16;
- ret = EVP_EncryptInit_ex(&ctx, cipherFunc, NULL, NULL,
+ ret = EVP_EncryptInit_ex(ctx, cipherFunc, NULL, NULL,
(unsigned char *)dhimpl->m_key + keySize);
LOGDH("DHencrypt: init BF ret %d", ret);
- EVP_CIPHER_CTX_set_key_length(&ctx, keySize);
+ EVP_CIPHER_CTX_set_key_length(ctx, keySize);
LOGDH("DHencrypt: BF keysize is %d", keySize);
- ret = EVP_EncryptInit_ex(&ctx, NULL, NULL, (unsigned char *)dhimpl->m_key,
+ ret = EVP_EncryptInit_ex(ctx, NULL, NULL, (unsigned char *)dhimpl->m_key,
NULL);
} else if (dhimpl->m_skAlgo == "DESede") {
- ret = EVP_EncryptInit_ex(&ctx, cipherFunc, NULL,
+ ret = EVP_EncryptInit_ex(ctx, cipherFunc, NULL,
(unsigned char *)dhimpl->m_key,
(unsigned char *)dhimpl->m_key + 24);
}
LOGDH(" DHencrypt: init ret %d", ret);
- if (!EVP_EncryptUpdate(&ctx, ciphertext, &outlen, cleartext, len)) {
+ if (!EVP_EncryptUpdate(ctx, ciphertext, &outlen, cleartext, len)) {
LOGDH(" DHencrypt: enc update ret NULL");
return NULL;
}
@@ -396,14 +406,14 @@ unsigned char *gf_encryptDH(void *dhCtx, const unsigned
char *cleartext,
*/
tmplen = 0;
- if (!EVP_EncryptFinal_ex(&ctx, ciphertext + outlen, &tmplen)) {
+ if (!EVP_EncryptFinal_ex(ctx, ciphertext + outlen, &tmplen)) {
LOGDH("DHencrypt: enc final ret NULL");
return NULL;
}
outlen += tmplen;
- ret = EVP_CIPHER_CTX_cleanup(&ctx);
+ EVP_CIPHER_CTX_free(ctx);
LOGDH("DHencrypt: in len is %d, out len is %d", len, outlen);
@@ -426,8 +436,7 @@ unsigned char *gf_decryptDH(void *dhCtx, const unsigned
char *cleartext,
unsigned char *ciphertext =
new unsigned char[len + 50]; // give enough room for padding
int outlen, tmplen;
- EVP_CIPHER_CTX ctx;
- EVP_CIPHER_CTX_init(&ctx);
+ EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
int ret = -123;
@@ -436,27 +445,27 @@ unsigned char *gf_decryptDH(void *dhCtx, const unsigned
char *cleartext,
// init openssl cipher context
if (dhimpl->m_skAlgo == "AES") {
int keySize = dhimpl->m_keySize > 128 ? dhimpl->m_keySize / 8 : 16;
- ret = EVP_DecryptInit_ex(&ctx, cipherFunc, NULL,
+ ret = EVP_DecryptInit_ex(ctx, cipherFunc, NULL,
(unsigned char *)dhimpl->m_key,
(unsigned char *)dhimpl->m_key + keySize);
} else if (dhimpl->m_skAlgo == "Blowfish") {
int keySize = dhimpl->m_keySize > 128 ? dhimpl->m_keySize / 8 : 16;
- ret = EVP_DecryptInit_ex(&ctx, cipherFunc, NULL, NULL,
+ ret = EVP_DecryptInit_ex(ctx, cipherFunc, NULL, NULL,
(unsigned char *)dhimpl->m_key + keySize);
LOGDH("DHencrypt: init BF ret %d", ret);
- EVP_CIPHER_CTX_set_key_length(&ctx, keySize);
+ EVP_CIPHER_CTX_set_key_length(ctx, keySize);
LOGDH("DHencrypt: BF keysize is %d", keySize);
- ret = EVP_DecryptInit_ex(&ctx, NULL, NULL, (unsigned char *)dhimpl->m_key,
+ ret = EVP_DecryptInit_ex(ctx, NULL, NULL, (unsigned char *)dhimpl->m_key,
NULL);
} else if (dhimpl->m_skAlgo == "DESede") {
- ret = EVP_DecryptInit_ex(&ctx, cipherFunc, NULL,
+ ret = EVP_DecryptInit_ex(ctx, cipherFunc, NULL,
(unsigned char *)dhimpl->m_key,
(unsigned char *)dhimpl->m_key + 24);
}
LOGDH(" DHencrypt: init ret %d", ret);
- if (!EVP_DecryptUpdate(&ctx, ciphertext, &outlen, cleartext, len)) {
+ if (!EVP_DecryptUpdate(ctx, ciphertext, &outlen, cleartext, len)) {
LOGDH(" DHencrypt: enc update ret NULL");
return NULL;
}
@@ -465,14 +474,14 @@ unsigned char *gf_decryptDH(void *dhCtx, const unsigned
char *cleartext,
*/
tmplen = 0;
- if (!EVP_DecryptFinal_ex(&ctx, ciphertext + outlen, &tmplen)) {
+ if (!EVP_DecryptFinal_ex(ctx, ciphertext + outlen, &tmplen)) {
LOGDH("DHencrypt: enc final ret NULL");
return NULL;
}
outlen += tmplen;
- ret = EVP_CIPHER_CTX_cleanup(&ctx);
+ EVP_CIPHER_CTX_free(ctx);
LOGDH("DHencrypt: in len is %d, out len is %d", len, outlen);
@@ -523,25 +532,21 @@ bool gf_verifyDH(void *dhCtx, const char *subject,
return false;
}
- int rsalen ATTR_UNUSED = RSA_size(evpkey->pkey.rsa);
+ RSA* dh = EVP_PKEY_get1_RSA(evpkey);
- LOGDH("Challenge response length is %d, rsalen is %d\n", responseLen,
rsalen);
-
- if (cert->sig_alg->algorithm != NULL) {
- LOGDH("algo %s -- %s \n", cert->sig_alg->algorithm->sn,
- cert->sig_alg->algorithm->ln);
- } else {
+ const ASN1_OBJECT *macobj;
+ const X509_ALGOR *algorithm;
+ X509_ALGOR_get0(&macobj, NULL, NULL, algorithm);
+ if (algorithm == NULL) {
LOGDH("algo is null \n");
}
- LOGDH("after algo name in DHimp = %s\n", cert->name);
- const EVP_MD *signatureDigest =
EVP_get_digestbyobj(cert->sig_alg->algorithm);
+ const EVP_MD *signatureDigest = EVP_get_digestbyobj(macobj);
LOGDH("after EVP_get_digestbyobj : err(%d): %s", ERR_get_error(),
ERR_error_string(ERR_get_error(), NULL));
- EVP_MD_CTX signatureCtx;
- EVP_MD_CTX_init(&signatureCtx);
+ EVP_MD_CTX* signatureCtx = EVP_MD_CTX_new();
- int result1 = EVP_VerifyInit_ex(&signatureCtx, signatureDigest, NULL);
+ int result1 = EVP_VerifyInit_ex(signatureCtx, signatureDigest, NULL);
LOGDH("after EVP_VerifyInit_ex ret %d : err(%d): %s", result1,
ERR_get_error(), ERR_error_string(ERR_get_error(), NULL));
LOGDH(" Result of VerifyInit is %s \n", ERR_lib_error_string(result1));
@@ -550,15 +555,15 @@ bool gf_verifyDH(void *dhCtx, const char *subject,
LOGDH(" Result of VerifyInit is %d", result1);
- int result2 = EVP_VerifyUpdate(&signatureCtx, challenge, challengeLen);
+ int result2 = EVP_VerifyUpdate(signatureCtx, challenge, challengeLen);
LOGDH(" Result of VerifyUpdate is %d", result2);
- int result3 = EVP_VerifyFinal(&signatureCtx, response, responseLen, evpkey);
+ int result3 = EVP_VerifyFinal(signatureCtx, response, responseLen, evpkey);
LOGDH(" Result of VerifyFinal is %d", result3);
bool result = (result1 == 1 && result2 == 1 && result3 == 1);
- EVP_MD_CTX_cleanup(&signatureCtx);
+ EVP_MD_CTX_free(signatureCtx);
if (result == false) {
*reason = DH_ERR_INVALID_SIGN;
@@ -574,21 +579,22 @@ int DH_PUBKEY_set(DH_PUBKEY **x, EVP_PKEY *pkey) {
unsigned char *s, *p = NULL;
int i;
ASN1_INTEGER *asn1int = NULL;
+ DH *dh = EVP_PKEY_get1_DH(pkey);
if (x == NULL) return (0);
if ((pk = DH_PUBKEY_new()) == NULL) goto err;
a = pk->algor;
- LOGDH(" key type for OBJ NID is %d", pkey->type);
+ LOGDH(" key type for OBJ NID is %d", EVP_PKEY_base_id(pkey));
/* set the algorithm id */
- if ((o = OBJ_nid2obj(pkey->type)) == NULL) goto err;
+ if ((o = OBJ_nid2obj(EVP_PKEY_base_id(pkey))) == NULL) goto err;
ASN1_OBJECT_free(a->algorithm);
a->algorithm = o;
/* Set the parameter list */
- if (!pkey->save_parameters || (pkey->type == EVP_PKEY_RSA)) {
+ if (EVP_PKEY_base_id(pkey) == EVP_PKEY_RSA) {
if ((a->parameter == NULL) || (a->parameter->type != V_ASN1_NULL)) {
ASN1_TYPE_free(a->parameter);
if (!(a->parameter = ASN1_TYPE_new())) {
@@ -597,11 +603,8 @@ int DH_PUBKEY_set(DH_PUBKEY **x, EVP_PKEY *pkey) {
}
a->parameter->type = V_ASN1_NULL;
}
- } else if (pkey->type == EVP_PKEY_DH) {
+ } else if (EVP_PKEY_base_id(pkey) == EVP_PKEY_DH) {
unsigned char *pp;
- DH *dh;
-
- dh = pkey->pkey.dh;
ASN1_TYPE_free(a->parameter);
if ((i = i2d_DHparams(dh, NULL)) <= 0) goto err;
if (!(p = reinterpret_cast<unsigned char *>(OPENSSL_malloc(i)))) {
@@ -632,7 +635,10 @@ int DH_PUBKEY_set(DH_PUBKEY **x, EVP_PKEY *pkey) {
goto err;
}
- asn1int = BN_to_ASN1_INTEGER(pkey->pkey.dh->pub_key, NULL);
+ const BIGNUM* pub_key, *priv_key;
+ DH_get0_key(dh, &pub_key, &priv_key);
+
+ asn1int = BN_to_ASN1_INTEGER(pub_key, NULL);
if ((i = i2d_ASN1_INTEGER(asn1int, NULL)) <= 0) goto err;
if ((s = reinterpret_cast<unsigned char *>(OPENSSL_malloc(i + 1))) == NULL) {
X509err(X509_F_X509_PUBKEY_SET, ERR_R_MALLOC_FAILURE);
@@ -640,7 +646,7 @@ int DH_PUBKEY_set(DH_PUBKEY **x, EVP_PKEY *pkey) {
}
p = s;
i2d_ASN1_INTEGER(asn1int, &p);
- if (!M_ASN1_BIT_STRING_set(pk->public_key, s, i)) {
+ if (!ASN1_BIT_STRING_set((ASN1_STRING*)pk->public_key, s, i)) {
X509err(X509_F_X509_PUBKEY_SET, ERR_R_MALLOC_FAILURE);
goto err;
}
@@ -670,42 +676,57 @@ EVP_PKEY *DH_PUBKEY_get(DH_PUBKEY *key) {
X509_ALGOR *a;
ASN1_INTEGER *asn1int = NULL;
- if (key == NULL) goto err;
+ if (key == NULL) {
+ if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
+ if (ret != NULL) EVP_PKEY_free(ret);
+ return (NULL);
+ }
if (key->pkey != NULL) {
- CRYPTO_add(&key->pkey->references, 1, CRYPTO_LOCK_EVP_PKEY);
+ EVP_PKEY_up_ref(key->pkey);
return (key->pkey);
}
- if (key->public_key == NULL) goto err;
+ if (key->public_key == NULL) {
+ if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
+ if (ret != NULL) EVP_PKEY_free(ret);
+ return (NULL);
+ }
type = OBJ_obj2nid(key->algor->algorithm);
LOGDH("DHPUBKEY type is %d", type);
if ((ret = EVP_PKEY_new()) == NULL) {
- X509err(X509_F_X509_PUBKEY_GET, ERR_R_MALLOC_FAILURE);
- goto err;
+ X509err(X509_F_X509_PUBKEY_DECODE, ERR_R_MALLOC_FAILURE);
+ if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
+ if (ret != NULL) EVP_PKEY_free(ret);
+ return (NULL);
}
- ret->type = EVP_PKEY_type(type);
- LOGDH(" DHPUBKEY evppkey type is %d", ret->type);
+ LOGDH(" DHPUBKEY evppkey type is %d", EVP_PKEY_base_id(ret));
/* the parameters must be extracted before the public key */
a = key->algor;
- if (ret->type == EVP_PKEY_DH) {
+ if (EVP_PKEY_base_id(ret) == EVP_PKEY_DH) {
if (a->parameter && (a->parameter->type == V_ASN1_SEQUENCE)) {
- if ((ret->pkey.dh = DH_new()) == NULL) {
- X509err(X509_F_X509_PUBKEY_GET, ERR_R_MALLOC_FAILURE);
- goto err;
+ if ((EVP_PKEY_set1_DH(ret, DH_new())) == 0) {
+ X509err(X509_F_X509_PUBKEY_DECODE, ERR_R_MALLOC_FAILURE);
+ if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
+ if (ret != NULL) EVP_PKEY_free(ret);
+ return (NULL);
}
cp = p = a->parameter->value.sequence->data;
j = a->parameter->value.sequence->length;
- if (!d2i_DHparams(&ret->pkey.dh, &cp, j)) goto err;
+ DH* dh = EVP_PKEY_get1_DH(ret);
+ if (!d2i_DHparams(&dh, &cp, j)) {
+ if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
+ if (ret != NULL) EVP_PKEY_free(ret);
+ return (NULL);
+ }
}
- ret->save_parameters = 1;
}
p = key->public_key->data;
@@ -714,16 +735,13 @@ EVP_PKEY *DH_PUBKEY_get(DH_PUBKEY *key) {
asn1int = d2i_ASN1_INTEGER(NULL, &p, j);
LOGDH("after d2i asn1 integer ptr is %p", asn1int);
- ret->pkey.dh->pub_key = ASN1_INTEGER_to_BN(asn1int, NULL);
- LOGDH(" after asn1int to bn ptr is %p", ret->pkey.dh->pub_key);
+ DH* dh = EVP_PKEY_get1_DH(ret);
+ DH_set0_key(dh, ASN1_INTEGER_to_BN(asn1int, NULL), NULL);
+ //LOGDH(" after asn1int to bn ptr is %p", ret->pkey.dh->pub_key);
key->pkey = ret;
- CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_EVP_PKEY);
+ EVP_PKEY_up_ref(ret);
if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
return (ret);
-err:
- if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
- if (ret != NULL) EVP_PKEY_free(ret);
- return (NULL);
}
diff --git a/dependencies/openssl/CMakeLists.txt
b/dependencies/openssl/CMakeLists.txt
index 33d80d8..2323337 100644
--- a/dependencies/openssl/CMakeLists.txt
+++ b/dependencies/openssl/CMakeLists.txt
@@ -15,8 +15,8 @@
project( openssl C )
-set( ${PROJECT_NAME}_VERSION 1.0.2l )
-set( ${PROJECT_NAME}_SHA265
ce07195b659e75f4e1db43552860070061f156a98bb37b672b101ba6e3ddf30c )
+set( ${PROJECT_NAME}_VERSION 1.1.0 )
+set( ${PROJECT_NAME}_SHA265
f5c69ff9ac1472c80b868efc1c1c0d8dcfc746d29ebe563de2365dd56dbd8c82 )
set( ${PROJECT_NAME}_URL
"https://www.openssl.org/source/openssl-${${PROJECT_NAME}_VERSION}.tar.gz" )
set( ${PROJECT_NAME}_EXTERN ${PROJECT_NAME}-extern )
@@ -49,11 +49,9 @@ elseif ("Darwin" STREQUAL ${CMAKE_SYSTEM_NAME})
set( openssl_PLATFORM darwin64-x86_64-cc )
elseif ("Windows" STREQUAL ${CMAKE_SYSTEM_NAME})
if (64 EQUAL ${BUILD_BITS})
- set( openssl_PLATFORM $<$<CONFIG:Debug>:debug->VC-WIN64A )
- set( openssl_WINDOWS_CMD cmd /c ms\\do_win64a)
+ set( openssl_PLATFORM $<$<CONFIG:Debug>:debug->VC-WIN64A no-asm )
else()
set( openssl_PLATFORM $<$<CONFIG:Debug>:debug->VC-WIN32 no-asm)
- set( openssl_WINDOWS_CMD cmd /c ms\\do_ms)
endif()
endif()
@@ -63,9 +61,9 @@ endif()
if (${WIN32})
# Keeps separate release/debug objects in build script
- set ( _CONFIGURE_COMMAND ${PERL} Configure
--prefix=<INSTALL_DIR>/${_DEBUG_OR_RELEASE} ${openssl_CONFIGURE_FLAGS}
${openssl_PLATFORM} COMMAND ${openssl_WINDOWS_CMD})
- set ( _BUILD_COMMAND nmake /f ms\\ntdll.mak )
- set ( _INSTALL_COMMAND nmake /f ms\\ntdll.mak install )
+ set ( _CONFIGURE_COMMAND ${PERL} Configure ${openssl_PLATFORM}
--prefix=<INSTALL_DIR>/${_DEBUG_OR_RELEASE}
--openssldir=<INSTALL_DIR>/${_DEBUG_OR_RELEASE} ${openssl_CONFIGURE_FLAGS} )
+ set ( _BUILD_COMMAND nmake )
+ set ( _INSTALL_COMMAND nmake install )
else()
# TODO Configure trips up without MAKE
set ( _CONFIGURE_COMMAND MAKE=$(MAKE) ./Configure threads zlib shared
--prefix=<INSTALL_DIR>/${_DEBUG_OR_RELEASE} ${openssl_CONFIGURE_FLAGS}
${openssl_PLATFORM} )
@@ -92,26 +90,14 @@ set( ${PROJECT_NAME}_INSTALL_DIR
${INSTALL_DIR}/${_DEBUG_OR_RELEASE} )
set( DEPENDENCIES_${PROJECT_NAME}_DIR ${${PROJECT_NAME}_INSTALL_DIR}
PARENT_SCOPE)
if (${WIN32})
- set( CRYPTO_NAME libeay32 )
- set( SSL_NAME ssleay32 )
+ set( CRYPTO_NAME libcrypto )
+ set( SSL_NAME libssl )
else()
set( CRYPTO_NAME crypto )
set( SSL_NAME ssl )
set( CMAKE_LINK_LIBRARY_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX})
endif()
-if ("SunOS" STREQUAL ${CMAKE_SYSTEM_NAME})
-ExternalProject_Add_Step( ${${PROJECT_NAME}_EXTERN} patches
- BYPRODUCTS ${${PROJECT_NAME}_SOURCE_DIR}/Configure
- ALWAYS 0
- DEPENDEES download
- DEPENDERS patch
- DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/patches
- WORKING_DIRECTORY ${${PROJECT_NAME}_SOURCE_DIR}
- COMMAND ${PATCH} -u -N -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/patches
-)
-endif()
-
add_library(ssl INTERFACE)
target_include_directories(ssl INTERFACE
$<BUILD_INTERFACE:${${PROJECT_NAME}_INSTALL_DIR}/include>
diff --git a/dependencies/openssl/patches b/dependencies/openssl/patches
deleted file mode 100644
index 2e1a656..0000000
--- a/dependencies/openssl/patches
+++ /dev/null
@@ -1,13 +0,0 @@
-diff -ru a/Configure b/Configure
---- a/Configure 2015-12-03 06:48:58.000000000 -0800
-+++ b/Configure 2015-12-17 04:11:33.900916627 -0800
-@@ -255,7 +255,7 @@
-
- #### Solaris x86 with Sun C setups
- "solaris-x86-cc","cc:-fast -xarch=generic -O -Xa::-D_REENTRANT::-lsocket
-lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_UNROLL
BF_PTR:${no_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z
text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
--"solaris64-x86_64-cc","cc:-fast -xarch=amd64 -xstrconst -Xa
-DL_ENDIAN::-D_REENTRANT::-lsocket -lnsl -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK
DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:solaris-shared:-KPIC:-xarch=amd64 -G
-dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/64",
-+"solaris64-x86_64-cc","cc:-fast -m64 -xchip=generic -xstrconst -Xa
-DL_ENDIAN::-D_REENTRANT::-lsocket -lnsl -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK
DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:solaris-shared:-KPIC:-m64 -G -dy -z
text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/64",
-
- #### SPARC Solaris with GNU C setups
- "solaris-sparcv7-gcc","gcc:-O3 -fomit-frame-pointer -Wall -DB_ENDIAN
-DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK
DES_UNROLL
BF_PTR:${no_asm}:dlfcn:solaris-shared:-fPIC:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
-
diff --git a/dhimpl/DHImpl.cpp b/dhimpl/DHImpl.cpp
index c86e618..cd49cd5 100644
--- a/dhimpl/DHImpl.cpp
+++ b/dhimpl/DHImpl.cpp
@@ -88,27 +88,32 @@ ASN1_SEQUENCE(
m_dh = DH_new();
- LOGDH(" DHInit: P ptr is %p", m_dh->p);
- LOGDH(" DHInit: G ptr is %p", m_dh->g);
- LOGDH(" DHInit: length is %d", m_dh->length);
-
int ret = -1;
- ret = BN_dec2bn(&m_dh->p, dhP);
+ const BIGNUM* pbn,* gbn;
+ DH_get0_pqg(m_dh, &pbn, NULL, &gbn);
+ ret = BN_dec2bn((BIGNUM**)&pbn, dhP);
LOGDH(" DHInit: BN_dec2bn dhP ret %d", ret);
- ret = BN_dec2bn(&m_dh->g, dhG);
+ LOGDH(" DHInit: P ptr is %p", pbn);
+ LOGDH(" DHInit: G ptr is %p", gbn);
+ LOGDH(" DHInit: length is %d", DH_get_length(m_dh));
+
+ ret = BN_dec2bn((BIGNUM**)&gbn, dhP);
LOGDH(" DHInit: BN_dec2bn dhG ret %d", ret);
- m_dh->length = dhL;
+ DH_set_length(m_dh, dhL);
ret = DH_generate_key(m_dh);
LOGDH(" DHInit: DH_generate_key ret %d", ret);
- ret = BN_num_bits(m_dh->priv_key);
+ const BIGNUM* pub_key, *priv_key;
+ DH_get0_key(m_dh, &pub_key, &priv_key);
+
+ ret = BN_num_bits(priv_key);
LOGDH(" DHInit: BN_num_bits priv_key is %d", ret);
- ret = BN_num_bits(m_dh->pub_key);
+ ret = BN_num_bits(pub_key);
LOGDH(" DHInit: BN_num_bits pub_key is %d", ret);
int codes = 0;
@@ -177,11 +182,14 @@ void gf_clearDhKeys(void) {
}
unsigned char *gf_getPublicKey(int *pLen) {
- if (m_dh->pub_key == NULL || pLen == NULL) {
+ const BIGNUM* pub_key, *priv_key;
+ DH_get0_key(m_dh, &pub_key, &priv_key);
+
+ if (pub_key == NULL || pLen == NULL) {
return NULL;
}
- int numBytes = BN_num_bytes(m_dh->pub_key);
+ int numBytes = BN_num_bytes(pub_key);
if (numBytes <= 0) {
return NULL;
@@ -228,7 +236,11 @@ void gf_setPublicKeyOther(const unsigned char *pubkey, int
length) {
EVP_PKEY *evppkey = DH_PUBKEY_get(dhpubkey);
LOGDH(" setPubKeyOther: after dhpubkey get evp ptr is %p", evppkey);
LOGDH(" setPubKeyOther: before BNdup ptr is %p", m_pubKeyOther);
- m_pubKeyOther = BN_dup(evppkey->pkey.dh->pub_key);
+
+ const BIGNUM* pub_key, *priv_key;
+ DH* dh = EVP_PKEY_get1_DH(evppkey);
+ DH_get0_key(dh, &pub_key, &priv_key);
+ m_pubKeyOther = BN_dup(pub_key);
LOGDH(" setPubKeyOther: after BNdup ptr is %p", m_pubKeyOther);
EVP_PKEY_free(evppkey);
DH_PUBKEY_free(dhpubkey);
@@ -335,8 +347,7 @@ unsigned char *gf_encryptDH(const unsigned char *cleartext,
int len,
unsigned char *ciphertext =
new unsigned char[len + 50]; // give enough room for padding
int outlen, tmplen;
- EVP_CIPHER_CTX ctx;
- EVP_CIPHER_CTX_init(&ctx);
+ EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
int ret = -123;
@@ -345,24 +356,24 @@ unsigned char *gf_encryptDH(const unsigned char
*cleartext, int len,
// init openssl cipher context
if (m_skAlgo == "AES") {
int keySize = m_keySize > 128 ? m_keySize / 8 : 16;
- ret = EVP_EncryptInit_ex(&ctx, cipherFunc, NULL, (unsigned char *)m_key,
+ ret = EVP_EncryptInit_ex(ctx, cipherFunc, NULL, (unsigned char *)m_key,
(unsigned char *)m_key + keySize);
} else if (m_skAlgo == "Blowfish") {
int keySize = m_keySize > 128 ? m_keySize / 8 : 16;
- ret = EVP_EncryptInit_ex(&ctx, cipherFunc, NULL, NULL,
+ ret = EVP_EncryptInit_ex(ctx, cipherFunc, NULL, NULL,
(unsigned char *)m_key + keySize);
LOGDH("DHencrypt: init BF ret %d", ret);
- EVP_CIPHER_CTX_set_key_length(&ctx, keySize);
+ EVP_CIPHER_CTX_set_key_length(ctx, keySize);
LOGDH("DHencrypt: BF keysize is %d", keySize);
- ret = EVP_EncryptInit_ex(&ctx, NULL, NULL, (unsigned char *)m_key, NULL);
+ ret = EVP_EncryptInit_ex(ctx, NULL, NULL, (unsigned char *)m_key, NULL);
} else if (m_skAlgo == "DESede") {
- ret = EVP_EncryptInit_ex(&ctx, cipherFunc, NULL, (unsigned char *)m_key,
+ ret = EVP_EncryptInit_ex(ctx, cipherFunc, NULL, (unsigned char *)m_key,
(unsigned char *)m_key + 24);
}
LOGDH(" DHencrypt: init ret %d", ret);
- if (!EVP_EncryptUpdate(&ctx, ciphertext, &outlen, cleartext, len)) {
+ if (!EVP_EncryptUpdate(ctx, ciphertext, &outlen, cleartext, len)) {
LOGDH(" DHencrypt: enc update ret NULL");
return NULL;
}
@@ -371,14 +382,14 @@ unsigned char *gf_encryptDH(const unsigned char
*cleartext, int len,
*/
tmplen = 0;
- if (!EVP_EncryptFinal_ex(&ctx, ciphertext + outlen, &tmplen)) {
+ if (!EVP_EncryptFinal_ex(ctx, ciphertext + outlen, &tmplen)) {
LOGDH("DHencrypt: enc final ret NULL");
return NULL;
}
outlen += tmplen;
- ret = EVP_CIPHER_CTX_cleanup(&ctx);
+ ret = EVP_CIPHER_CTX_cleanup(ctx);
LOGDH("DHencrypt: in len is %d, out len is %d", len, outlen);
@@ -427,27 +438,25 @@ bool gf_verifyDH(const char *subject, const unsigned char
*challenge,
return false;
}
-#ifdef _DEBUG
- int rsalen = RSA_size(evpkey->pkey.rsa);
- LOGDH("Challenge response length is %d, rsalen is %d", responseLen, rsalen);
-#endif
+ const ASN1_OBJECT *macobj;
+ const X509_ALGOR *algorithm;
+ X509_ALGOR_get0(&macobj, NULL, NULL, algorithm);
- const EVP_MD *signatureDigest =
EVP_get_digestbyobj(cert->sig_alg->algorithm);
- EVP_MD_CTX signatureCtx;
- EVP_MD_CTX_init(&signatureCtx);
+ const EVP_MD *signatureDigest = EVP_get_digestbyobj(macobj);
+ EVP_MD_CTX* signatureCtx = EVP_MD_CTX_new();
- int result1 = EVP_VerifyInit_ex(&signatureCtx, signatureDigest, NULL);
+ int result1 = EVP_VerifyInit_ex(signatureCtx, signatureDigest, NULL);
LOGDH(" Result of VerifyInit is %d", result1);
- int result2 = EVP_VerifyUpdate(&signatureCtx, challenge, challengeLen);
+ int result2 = EVP_VerifyUpdate(signatureCtx, challenge, challengeLen);
LOGDH(" Result of VerifyUpdate is %d", result2);
- int result3 = EVP_VerifyFinal(&signatureCtx, response, responseLen, evpkey);
+ int result3 = EVP_VerifyFinal(signatureCtx, response, responseLen, evpkey);
LOGDH(" Result of VerifyFinal is %d", result3);
bool result = (result1 == 1 && result2 == 1 && result3 == 1);
- EVP_MD_CTX_cleanup(&signatureCtx);
+ EVP_MD_CTX_free(signatureCtx);
if (result == false) {
*reason = DH_ERR_INVALID_SIGN;
@@ -463,21 +472,22 @@ int DH_PUBKEY_set(DH_PUBKEY **x, EVP_PKEY *pkey) {
unsigned char *s, *p = NULL;
int i;
ASN1_INTEGER *asn1int = NULL;
+ DH* dh = EVP_PKEY_get1_DH(pkey);
if (x == NULL) return (0);
if ((pk = DH_PUBKEY_new()) == NULL) goto err;
a = pk->algor;
- LOGDH(" key type for OBJ NID is %d", pkey->type);
+ LOGDH(" key type for OBJ NID is %d", EVP_PKEY_base_id(pkey));
/* set the algorithm id */
- if ((o = OBJ_nid2obj(pkey->type)) == NULL) goto err;
+ if ((o = OBJ_nid2obj(EVP_PKEY_base_id(pkey))) == NULL) goto err;
ASN1_OBJECT_free(a->algorithm);
a->algorithm = o;
/* Set the parameter list */
- if (!pkey->save_parameters || (pkey->type == EVP_PKEY_RSA)) {
+ if (EVP_PKEY_base_id(pkey) == EVP_PKEY_RSA) {
if ((a->parameter == NULL) || (a->parameter->type != V_ASN1_NULL)) {
ASN1_TYPE_free(a->parameter);
if (!(a->parameter = ASN1_TYPE_new())) {
@@ -486,11 +496,11 @@ int DH_PUBKEY_set(DH_PUBKEY **x, EVP_PKEY *pkey) {
}
a->parameter->type = V_ASN1_NULL;
}
- } else if (pkey->type == EVP_PKEY_DH) {
+ } else if (EVP_PKEY_base_id(pkey) == EVP_PKEY_DH) {
unsigned char *pp;
- DH *dh;
- dh = pkey->pkey.dh;
+ const BIGNUM* pub_key, *priv_key;
+ DH_get0_key(dh, &pub_key, &priv_key);
ASN1_TYPE_free(a->parameter);
if ((i = i2d_DHparams(dh, NULL)) <= 0) goto err;
if (!(p = reinterpret_cast<unsigned char *>(OPENSSL_malloc(i)))) {
@@ -521,7 +531,10 @@ int DH_PUBKEY_set(DH_PUBKEY **x, EVP_PKEY *pkey) {
goto err;
}
- asn1int = BN_to_ASN1_INTEGER(pkey->pkey.dh->pub_key, NULL);
+ const BIGNUM* pub_key, *priv_key;
+ DH_get0_key(dh, &pub_key, &priv_key);
+
+ asn1int = BN_to_ASN1_INTEGER(pub_key, NULL);
if ((i = i2d_ASN1_INTEGER(asn1int, NULL)) <= 0) goto err;
if ((s = reinterpret_cast<unsigned char *>(OPENSSL_malloc(i + 1))) == NULL) {
X509err(X509_F_X509_PUBKEY_SET, ERR_R_MALLOC_FAILURE);
@@ -529,7 +542,7 @@ int DH_PUBKEY_set(DH_PUBKEY **x, EVP_PKEY *pkey) {
}
p = s;
i2d_ASN1_INTEGER(asn1int, &p);
- if (!M_ASN1_BIT_STRING_set(pk->public_key, s, i)) {
+ if (!ASN1_BIT_STRING_set(pk->public_key, s, i)) {
X509err(X509_F_X509_PUBKEY_SET, ERR_R_MALLOC_FAILURE);
goto err;
}
@@ -559,42 +572,56 @@ EVP_PKEY *DH_PUBKEY_get(DH_PUBKEY *key) {
X509_ALGOR *a;
ASN1_INTEGER *asn1int = NULL;
- if (key == NULL) goto err;
+ if (key == NULL) {
+ EVP_PKEY_up_ref(key->pkey);
+ return (key->pkey);
+ }
if (key->pkey != NULL) {
- CRYPTO_add(&key->pkey->references, 1, CRYPTO_LOCK_EVP_PKEY);
+ EVP_PKEY_up_ref(key->pkey);
return (key->pkey);
}
- if (key->public_key == NULL) goto err;
+ if (key->public_key == NULL) {
+ if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
+ if (ret != NULL) EVP_PKEY_free(ret);
+ return (NULL);
+ }
type = OBJ_obj2nid(key->algor->algorithm);
LOGDH("DHPUBKEY type is %d", type);
if ((ret = EVP_PKEY_new()) == NULL) {
- X509err(X509_F_X509_PUBKEY_GET, ERR_R_MALLOC_FAILURE);
- goto err;
+ X509err(X509_F_X509_PUBKEY_DECODE, ERR_R_MALLOC_FAILURE);
+ if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
+ if (ret != NULL) EVP_PKEY_free(ret);
+ return (NULL);
}
- ret->type = EVP_PKEY_type(type);
- LOGDH(" DHPUBKEY evppkey type is %d", ret->type);
+ LOGDH(" DHPUBKEY evppkey type is %d", EVP_PKEY_base_id(ret));
/* the parameters must be extracted before the public key */
a = key->algor;
- if (ret->type == EVP_PKEY_DH) {
+ if (EVP_PKEY_base_id(ret) == EVP_PKEY_DH) {
if (a->parameter && (a->parameter->type == V_ASN1_SEQUENCE)) {
- if ((ret->pkey.dh = DH_new()) == NULL) {
- X509err(X509_F_X509_PUBKEY_GET, ERR_R_MALLOC_FAILURE);
- goto err;
+ if ((EVP_PKEY_set1_DH(ret, DH_new())) == 0) {
+ X509err(X509_F_X509_PUBKEY_DECODE, ERR_R_MALLOC_FAILURE);
+ if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
+ if (ret != NULL) EVP_PKEY_free(ret);
+ return (NULL);
}
cp = p = a->parameter->value.sequence->data;
j = a->parameter->value.sequence->length;
- if (!d2i_DHparams(&ret->pkey.dh, &cp, j)) goto err;
+ DH* dh = EVP_PKEY_get1_DH(ret);
+ if (!d2i_DHparams(&dh, &cp, j)) {
+ if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
+ if (ret != NULL) EVP_PKEY_free(ret);
+ return (NULL);
+ }
}
- ret->save_parameters = 1;
}
p = key->public_key->data;
@@ -603,11 +630,11 @@ EVP_PKEY *DH_PUBKEY_get(DH_PUBKEY *key) {
asn1int = d2i_ASN1_INTEGER(NULL, &p, j);
LOGDH("after d2i asn1 integer ptr is %p", asn1int);
- ret->pkey.dh->pub_key = ASN1_INTEGER_to_BN(asn1int, NULL);
- LOGDH(" after asn1int to bn ptr is %p", ret->pkey.dh->pub_key);
+ DH* dh = EVP_PKEY_get1_DH(ret);
+ DH_set0_key(dh, ASN1_INTEGER_to_BN(asn1int, NULL), NULL);
key->pkey = ret;
- CRYPTO_add(&ret->references, 1, CRYPTO_LOCK_EVP_PKEY);
+ EVP_PKEY_up_ref(key->pkey);
if (asn1int != NULL) ASN1_INTEGER_free(asn1int);
return (ret);
diff --git a/templates/security/PkcsAuthInit.cpp
b/templates/security/PkcsAuthInit.cpp
index ebae246..51a4933 100644
--- a/templates/security/PkcsAuthInit.cpp
+++ b/templates/security/PkcsAuthInit.cpp
@@ -38,17 +38,20 @@ uint8_t* createSignature(EVP_PKEY* key, X509* cert,
return NULL;
}
- const EVP_MD* signatureDigest =
EVP_get_digestbyobj(cert->sig_alg->algorithm);
- EVP_MD_CTX signatureCtx;
- EVP_MD_CTX_init(&signatureCtx);
+ const ASN1_OBJECT *macobj;
+ const X509_ALGOR *algorithm;
+ X509_ALGOR_get0(&macobj, NULL, NULL, algorithm);
+ const EVP_MD* signatureDigest = EVP_get_digestbyobj(macobj);
+
+ EVP_MD_CTX* signatureCtx = EVP_MD_CTX_new();
uint8_t* signatureData = new uint8_t[EVP_PKEY_size(key)];
bool result =
- (EVP_SignInit_ex(&signatureCtx, signatureDigest, NULL) &&
- EVP_SignUpdate(&signatureCtx, inputBuffer, inputBufferLen) &&
- EVP_SignFinal(&signatureCtx, signatureData, signatureLen, key));
+ (EVP_SignInit_ex(signatureCtx, signatureDigest, NULL) &&
+ EVP_SignUpdate(signatureCtx, inputBuffer, inputBufferLen) &&
+ EVP_SignFinal(signatureCtx, signatureData, signatureLen, key));
- EVP_MD_CTX_cleanup(&signatureCtx);
+ EVP_MD_CTX_free(signatureCtx);
if (result) {
return signatureData;
}
diff --git a/tests/cpp/security/PkcsAuthInit.cpp
b/tests/cpp/security/PkcsAuthInit.cpp
index f17b59e..26889ba 100644
--- a/tests/cpp/security/PkcsAuthInit.cpp
+++ b/tests/cpp/security/PkcsAuthInit.cpp
@@ -58,15 +58,17 @@ uint8_t* createSignature(EVP_PKEY* key, X509* cert,
if (key == NULL || cert == NULL || inputBuffer == NULL) {
return NULL;
}
- const EVP_MD* signatureDigest =
EVP_get_digestbyobj(cert->sig_alg->algorithm);
- EVP_MD_CTX signatureCtx;
- EVP_MD_CTX_init(&signatureCtx);
+ const ASN1_OBJECT *macobj;
+ const X509_ALGOR *algorithm;
+ X509_ALGOR_get0(&macobj, NULL, NULL, algorithm);
+ const EVP_MD* signatureDigest = EVP_get_digestbyobj(macobj);
+ EVP_MD_CTX* signatureCtx = EVP_MD_CTX_new();
uint8_t* signatureData = new uint8_t[EVP_PKEY_size(key)];
bool result =
- (EVP_SignInit_ex(&signatureCtx, signatureDigest, NULL) &&
- EVP_SignUpdate(&signatureCtx, inputBuffer, inputBufferLen) &&
- EVP_SignFinal(&signatureCtx, signatureData, signatureLen, key));
- EVP_MD_CTX_cleanup(&signatureCtx);
+ (EVP_SignInit_ex(signatureCtx, signatureDigest, NULL) &&
+ EVP_SignUpdate(signatureCtx, inputBuffer, inputBufferLen) &&
+ EVP_SignFinal(signatureCtx, signatureData, signatureLen, key));
+ EVP_MD_CTX_free(signatureCtx);
if (result) {
return signatureData;
}
--
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].