From 3295b0fec7be5399328a8e660f61b2634f907719 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 2 Oct 2018 21:40:57 +0000 Subject: [PATCH 1/6] Update obsolete files list for OpenSSL 1.1.1. This will need a real date once this is merged to head. One weird thing to note: the 32-bit engines get dumped into /usr/lib32 rather than /usr/lib32/engines, and I bet the 32-bit libcrypto.so i looking for the .so files in the wrong place. We should probably fix both of those at some point. Reviewed by: emaste, jkim Differential Revision: https://reviews.freebsd.org/D17384 --- ObsoleteFiles.inc | 223 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 53e3c6104ce..ddcd215fbd8 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -38,6 +38,229 @@ # xargs -n1 | sort | uniq -d; # done +# 2018xxxx: OpenSSL 1.1.1 +OLD_FILES+=usr/include/openssl/des_old.h +OLD_FILES+=usr/include/openssl/dso.h +OLD_FILES+=usr/include/openssl/krb5_asn.h +OLD_FILES+=usr/include/openssl/kssl.h +OLD_FILES+=usr/include/openssl/pqueue.h +OLD_FILES+=usr/include/openssl/ssl23.h +OLD_FILES+=usr/include/openssl/ui_compat.h +OLD_FILES+=usr/share/openssl/man/man1/dss1.1.gz +OLD_FILES+=usr/share/openssl/man/man1/md2.1.gz +OLD_FILES+=usr/share/openssl/man/man1/md4.1.gz +OLD_FILES+=usr/share/openssl/man/man1/md5.1.gz +OLD_FILES+=usr/share/openssl/man/man1/mdc2.1.gz +OLD_FILES+=usr/share/openssl/man/man1/ripemd160.1.gz +OLD_FILES+=usr/share/openssl/man/man1/sha.1.gz +OLD_FILES+=usr/share/openssl/man/man1/sha1.1.gz +OLD_FILES+=usr/share/openssl/man/man1/sha224.1.gz +OLD_FILES+=usr/share/openssl/man/man1/sha256.1.gz +OLD_FILES+=usr/share/openssl/man/man1/sha384.1.gz +OLD_FILES+=usr/share/openssl/man/man1/sha512.1.gz +OLD_FILES+=usr/share/openssl/man/man1/x509v3_config.1.gz +OLD_FILES+=usr/share/openssl/man/man3/ASN1_STRING_length_set.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BIO_get_conn_int_port.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BIO_get_conn_ip.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BIO_set.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BIO_set_conn_int_port.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BIO_set_conn_ip.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BN_BLINDING_get_thread_id.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BN_BLINDING_set_thread_id.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BN_BLINDING_thread_id.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BN_CTX_init.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BN_MONT_CTX_init.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BN_RECP_CTX_init.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BN_init.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BUF_memdup.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BUF_memdup.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BUF_strdup.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BUF_strlcat.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BUF_strlcpy.3.gz +OLD_FILES+=usr/share/openssl/man/man3/BUF_strndup.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CMS_set1_signer_cert.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_THREADID_cmp.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_THREADID_cpy.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_THREADID_current.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_THREADID_get_callback.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_THREADID_hash.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_THREADID_set_callback.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_destroy_dynlockid.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_get_new_dynlockid.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_lock.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_num_locks.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_set_dynlock_create_callback.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_set_dynlock_destroy_callback.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_set_dynlock_lock_callback.3.gz +OLD_FILES+=usr/share/openssl/man/man3/CRYPTO_set_locking_callback.3.gz +OLD_FILES+=usr/share/openssl/man/man3/DES_ede3_cbcm_encrypt.3.gz +OLD_FILES+=usr/share/openssl/man/man3/DES_enc_read.3.gz +OLD_FILES+=usr/share/openssl/man/man3/DES_enc_write.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EC_KEY_get_key_method_data.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EC_KEY_insert_key_method_data.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EC_POINT_set_Jprojective_coordinates.3.gz +OLD_FILES+=usr/share/openssl/man/man3/ERR_load_UI_strings.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_CIPHER_CTX_cleanup.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_CIPHER_CTX_init.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_MAX_MD_SIZE.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_MD_CTX_cleanup.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_MD_CTX_create.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_MD_CTX_destroy.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_MD_CTX_init.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_PKEVP_PKEY_CTX_set_app_data.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_PKEY_CTX_set_rsa_rsa_keygen_bits.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_PKEY_get_default_digest.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_dss.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_dss1.3.gz +OLD_FILES+=usr/share/openssl/man/man3/EVP_sha.3.gz +OLD_FILES+=usr/share/openssl/man/man3/HMAC_CTX_cleanup.3.gz +OLD_FILES+=usr/share/openssl/man/man3/HMAC_CTX_init.3.gz +OLD_FILES+=usr/share/openssl/man/man3/HMAC_cleanup.3.gz +OLD_FILES+=usr/share/openssl/man/man3/OPENSSL_ia32cap_loc.3.gz +OLD_FILES+=usr/share/openssl/man/man3/PEM.3.gz +OLD_FILES+=usr/share/openssl/man/man3/RAND_SSLeay.3.gz +OLD_FILES+=usr/share/openssl/man/man3/RSA_PKCS1_SSLeay.3.gz +OLD_FILES+=usr/share/openssl/man/man3/RSA_null_method.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_CTX_get_ex_new_index.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_CTX_need_tmp_rsa.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_CTX_set_custom_cli_ext.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_CTX_set_default_read_ahead.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_CTX_set_ecdh_auto.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_CTX_set_tmp_rsa.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_CTX_set_tmp_rsa_callback.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_SESSION_get_ex_new_index.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_add_session.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_flush_sessions.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_get_accept_state.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_get_ex_new_index.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_get_msg_callback_arg.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_need_tmp_rsa.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_remove_session.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_set_ecdh_auto.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_set_tmp_rsa.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSL_set_tmp_rsa_callback.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSLeay.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSLeay_add_ssl_algorithms.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSLeay_version.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSLv2_client_method.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSLv2_method.3.gz +OLD_FILES+=usr/share/openssl/man/man3/SSLv2_server_method.3.gz +OLD_FILES+=usr/share/openssl/man/man3/X509_STORE_CTX_set_chain.3.gz +OLD_FILES+=usr/share/openssl/man/man3/X509_STORE_CTX_trusted_stack.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bio.3.gz +OLD_FILES+=usr/share/openssl/man/man3/blowfish.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_add_words.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_check_top.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_cmp_words.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_div_words.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_dump.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_expand.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_expand2.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_fix_top.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_internal.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_mul_add_words.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_mul_comba4.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_mul_comba8.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_mul_high.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_mul_low_normal.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_mul_low_recursive.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_mul_normal.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_mul_part_recursive.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_mul_recursive.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_mul_words.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_print.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_set_high.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_set_low.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_set_max.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_sqr_comba4.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_sqr_comba8.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_sqr_normal.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_sqr_recursive.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_sqr_words.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_sub_words.3.gz +OLD_FILES+=usr/share/openssl/man/man3/bn_wexpand.3.gz +OLD_FILES+=usr/share/openssl/man/man3/buffer.3.gz +OLD_FILES+=usr/share/openssl/man/man3/crypto.3.gz +OLD_FILES+=usr/share/openssl/man/man3/d2i_ECPKParameters_bio.3.gz +OLD_FILES+=usr/share/openssl/man/man3/d2i_ECPKParameters_fp.3.gz +OLD_FILES+=usr/share/openssl/man/man3/d2i_ECPrivate_key.3.gz +OLD_FILES+=usr/share/openssl/man/man3/d2i_Netscape_RSA.3.gz +OLD_FILES+=usr/share/openssl/man/man3/d2i_PKCS8PrivateKey.3.gz +OLD_FILES+=usr/share/openssl/man/man3/d2i_Private_key.3.gz +OLD_FILES+=usr/share/openssl/man/man3/d2i_X509_bio.3.gz +OLD_FILES+=usr/share/openssl/man/man3/d2i_X509_fp.3.gz +OLD_FILES+=usr/share/openssl/man/man3/des.3.gz +OLD_FILES+=usr/share/openssl/man/man3/des_read_2passwords.3.gz +OLD_FILES+=usr/share/openssl/man/man3/des_read_password.3.gz +OLD_FILES+=usr/share/openssl/man/man3/des_read_pw.3.gz +OLD_FILES+=usr/share/openssl/man/man3/des_read_pw_string.3.gz +OLD_FILES+=usr/share/openssl/man/man3/dh.3.gz +OLD_FILES+=usr/share/openssl/man/man3/dsa.3.gz +OLD_FILES+=usr/share/openssl/man/man3/ec.3.gz +OLD_FILES+=usr/share/openssl/man/man3/ecdsa.3.gz +OLD_FILES+=usr/share/openssl/man/man3/engine.3.gz +OLD_FILES+=usr/share/openssl/man/man3/err.3.gz +OLD_FILES+=usr/share/openssl/man/man3/evp.3.gz +OLD_FILES+=usr/share/openssl/man/man3/hmac.3.gz +OLD_FILES+=usr/share/openssl/man/man3/i2d_ECPKParameters_bio.3.gz +OLD_FILES+=usr/share/openssl/man/man3/i2d_ECPKParameters_fp.3.gz +OLD_FILES+=usr/share/openssl/man/man3/i2d_Netscape_RSA.3.gz +OLD_FILES+=usr/share/openssl/man/man3/i2d_X509_bio.3.gz +OLD_FILES+=usr/share/openssl/man/man3/i2d_X509_fp.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_delete.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_doall.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_doall_arg.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_error.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_free.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_insert.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_new.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_node_stats.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_node_stats_bio.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_node_usage_stats.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_node_usage_stats_bio.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_retrieve.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_stats.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lh_stats_bio.3.gz +OLD_FILES+=usr/share/openssl/man/man3/lhash.3.gz +OLD_FILES+=usr/share/openssl/man/man3/md5.3.gz +OLD_FILES+=usr/share/openssl/man/man3/mdc2.3.gz +OLD_FILES+=usr/share/openssl/man/man3/pem.3.gz +OLD_FILES+=usr/share/openssl/man/man3/rand.3.gz +OLD_FILES+=usr/share/openssl/man/man3/rc4.3.gz +OLD_FILES+=usr/share/openssl/man/man3/ripemd.3.gz +OLD_FILES+=usr/share/openssl/man/man3/rsa.3.gz +OLD_FILES+=usr/share/openssl/man/man3/sha.3.gz +OLD_FILES+=usr/share/openssl/man/man3/ssl.3.gz +OLD_FILES+=usr/share/openssl/man/man3/threads.3.gz +OLD_FILES+=usr/share/openssl/man/man3/ui.3.gz +OLD_FILES+=usr/share/openssl/man/man3/ui_compat.3.gz +OLD_FILES+=usr/share/openssl/man/man3/x509.3.gz +OLD_LIBS+=lib/libcrypto.so.8 +OLD_LIBS+=usr/lib/engines/lib4758cca.so +OLD_LIBS+=usr/lib/engines/libaep.so +OLD_LIBS+=usr/lib/engines/libatalla.so +OLD_LIBS+=usr/lib/engines/libcapi.so +OLD_LIBS+=usr/lib/engines/libchil.so +OLD_LIBS+=usr/lib/engines/libcswift.so +OLD_LIBS+=usr/lib/engines/libgost.so +OLD_LIBS+=usr/lib/engines/libnuron.so +OLD_LIBS+=usr/lib/engines/libsureware.so +OLD_LIBS+=usr/lib/engines/libubsec.so +OLD_LIBS+=usr/lib/libssl.so.8 +OLD_LIBS+=usr/lib32/libcrypto.so.8 +OLD_LIBS+=usr/lib32/lib4758cca.so +OLD_LIBS+=usr/lib32/libaep.so +OLD_LIBS+=usr/lib32/libatalla.so +OLD_LIBS+=usr/lib32/libcapi.so +OLD_LIBS+=usr/lib32/libchil.so +OLD_LIBS+=usr/lib32/libcswift.so +OLD_LIBS+=usr/lib32/libgost.so +OLD_LIBS+=usr/lib32/libnuron.so +OLD_LIBS+=usr/lib32/libsureware.so +OLD_LIBS+=usr/lib32/libubsec.so +OLD_LIBS+=usr/lib32/libssl.so.8 # 20180824: libbe(3) SHLIBDIR fixed to reflect correct location OLD_LIBS+=usr/lib/libbe.so.1 # 20180819: Remove deprecated arc4random(3) stir/addrandom interfaces From 9e15a1058d550453092ee1f77d24fc38e01aaf5f Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Wed, 3 Oct 2018 16:06:17 +0000 Subject: [PATCH 2/6] openssh: add openbsd-compat/libressl-api-compat.c Missed in migrating changeset from git to svn for r338811 Reported by: jhb --- .../openbsd-compat/libressl-api-compat.c | 636 ++++++++++++++++++ 1 file changed, 636 insertions(+) create mode 100644 crypto/openssh/openbsd-compat/libressl-api-compat.c diff --git a/crypto/openssh/openbsd-compat/libressl-api-compat.c b/crypto/openssh/openbsd-compat/libressl-api-compat.c new file mode 100644 index 00000000000..de3e64a63f1 --- /dev/null +++ b/crypto/openssh/openbsd-compat/libressl-api-compat.c @@ -0,0 +1,636 @@ +/* $OpenBSD: dsa_lib.c,v 1.29 2018/04/14 07:09:21 tb Exp $ */ +/* $OpenBSD: rsa_lib.c,v 1.37 2018/04/14 07:09:21 tb Exp $ */ +/* $OpenBSD: evp_lib.c,v 1.17 2018/09/12 06:35:38 djm Exp $ */ +/* $OpenBSD: dh_lib.c,v 1.32 2018/05/02 15:48:38 tb Exp $ */ +/* $OpenBSD: p_lib.c,v 1.24 2018/05/30 15:40:50 tb Exp $ */ +/* $OpenBSD: digest.c,v 1.30 2018/04/14 07:09:21 tb Exp $ */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +/* $OpenBSD: dsa_asn1.c,v 1.22 2018/06/14 17:03:19 jsing Exp $ */ +/* $OpenBSD: ecs_asn1.c,v 1.9 2018/03/17 15:24:44 tb Exp $ */ +/* $OpenBSD: digest.c,v 1.30 2018/04/14 07:09:21 tb Exp $ */ +/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL + * project 2000. + */ +/* ==================================================================== + * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* $OpenBSD: rsa_meth.c,v 1.2 2018/09/12 06:35:38 djm Exp $ */ +/* + * Copyright (c) 2018 Theo Buehler + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "includes.h" + +#ifdef WITH_OPENSSL + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifndef HAVE_DSA_GET0_PQG +void +DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g) +{ + if (p != NULL) + *p = d->p; + if (q != NULL) + *q = d->q; + if (g != NULL) + *g = d->g; +} +#endif /* HAVE_DSA_GET0_PQG */ + +#ifndef HAVE_DSA_SET0_PQG +int +DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g) +{ + if ((d->p == NULL && p == NULL) || (d->q == NULL && q == NULL) || + (d->g == NULL && g == NULL)) + return 0; + + if (p != NULL) { + BN_free(d->p); + d->p = p; + } + if (q != NULL) { + BN_free(d->q); + d->q = q; + } + if (g != NULL) { + BN_free(d->g); + d->g = g; + } + + return 1; +} +#endif /* HAVE_DSA_SET0_PQG */ + +#ifndef HAVE_DSA_GET0_KEY +void +DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key) +{ + if (pub_key != NULL) + *pub_key = d->pub_key; + if (priv_key != NULL) + *priv_key = d->priv_key; +} +#endif /* HAVE_DSA_GET0_KEY */ + +#ifndef HAVE_DSA_SET0_KEY +int +DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key) +{ + if (d->pub_key == NULL && pub_key == NULL) + return 0; + + if (pub_key != NULL) { + BN_free(d->pub_key); + d->pub_key = pub_key; + } + if (priv_key != NULL) { + BN_free(d->priv_key); + d->priv_key = priv_key; + } + + return 1; +} +#endif /* HAVE_DSA_SET0_KEY */ + +#ifndef HAVE_RSA_GET0_KEY +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; +} +#endif /* HAVE_RSA_GET0_KEY */ + +#ifndef HAVE_RSA_SET0_KEY +int +RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) +{ + 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; +} +#endif /* HAVE_RSA_SET0_KEY */ + +#ifndef HAVE_RSA_GET0_CRT_PARAMS +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; +} +#endif /* HAVE_RSA_GET0_CRT_PARAMS */ + +#ifndef HAVE_RSA_SET0_CRT_PARAMS +int +RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp) +{ + 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; +} +#endif /* HAVE_RSA_SET0_CRT_PARAMS */ + +#ifndef HAVE_RSA_GET0_FACTORS +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; +} +#endif /* HAVE_RSA_GET0_FACTORS */ + +#ifndef HAVE_RSA_SET0_FACTORS +int +RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q) +{ + 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; +} +#endif /* HAVE_RSA_SET0_FACTORS */ + +#ifndef HAVE_EVP_CIPHER_CTX_GET_IV +int +EVP_CIPHER_CTX_get_iv(const EVP_CIPHER_CTX *ctx, unsigned char *iv, size_t len) +{ + if (ctx == NULL) + return 0; + if (EVP_CIPHER_CTX_iv_length(ctx) < 0) + return 0; + if (len != (size_t)EVP_CIPHER_CTX_iv_length(ctx)) + return 0; + if (len > EVP_MAX_IV_LENGTH) + return 0; /* sanity check; shouldn't happen */ + /* + * Skip the memcpy entirely when the requested IV length is zero, + * since the iv pointer may be NULL or invalid. + */ + if (len != 0) { + if (iv == NULL) + return 0; +# ifdef HAVE_EVP_CIPHER_CTX_IV + memcpy(iv, EVP_CIPHER_CTX_iv(ctx), len); +# else + memcpy(iv, ctx->iv, len); +# endif /* HAVE_EVP_CIPHER_CTX_IV */ + } + return 1; +} +#endif /* HAVE_EVP_CIPHER_CTX_GET_IV */ + +#ifndef HAVE_EVP_CIPHER_CTX_SET_IV +int +EVP_CIPHER_CTX_set_iv(EVP_CIPHER_CTX *ctx, const unsigned char *iv, size_t len) +{ + if (ctx == NULL) + return 0; + if (EVP_CIPHER_CTX_iv_length(ctx) < 0) + return 0; + if (len != (size_t)EVP_CIPHER_CTX_iv_length(ctx)) + return 0; + if (len > EVP_MAX_IV_LENGTH) + return 0; /* sanity check; shouldn't happen */ + /* + * Skip the memcpy entirely when the requested IV length is zero, + * since the iv pointer may be NULL or invalid. + */ + if (len != 0) { + if (iv == NULL) + return 0; +# ifdef HAVE_EVP_CIPHER_CTX_IV_NOCONST + memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, len); +# else + memcpy(ctx->iv, iv, len); +# endif /* HAVE_EVP_CIPHER_CTX_IV_NOCONST */ + } + return 1; +} +#endif /* HAVE_EVP_CIPHER_CTX_SET_IV */ + +#ifndef HAVE_DSA_SIG_GET0 +void +DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps) +{ + if (pr != NULL) + *pr = sig->r; + if (ps != NULL) + *ps = sig->s; +} +#endif /* HAVE_DSA_SIG_GET0 */ + +#ifndef HAVE_DSA_SIG_SET0 +int +DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s) +{ + if (r == NULL || s == NULL) + return 0; + + BN_clear_free(sig->r); + sig->r = r; + BN_clear_free(sig->s); + sig->s = s; + + return 1; +} +#endif /* HAVE_DSA_SIG_SET0 */ + +#ifndef HAVE_ECDSA_SIG_GET0 +void +ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps) +{ + if (pr != NULL) + *pr = sig->r; + if (ps != NULL) + *ps = sig->s; +} +#endif /* HAVE_ECDSA_SIG_GET0 */ + +#ifndef HAVE_ECDSA_SIG_SET0 +int +ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s) +{ + if (r == NULL || s == NULL) + return 0; + + BN_clear_free(sig->r); + BN_clear_free(sig->s); + sig->r = r; + sig->s = s; + return 1; +} +#endif /* HAVE_ECDSA_SIG_SET0 */ + +#ifndef HAVE_DH_GET0_PQG +void +DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g) +{ + if (p != NULL) + *p = dh->p; + if (q != NULL) + *q = dh->q; + if (g != NULL) + *g = dh->g; +} +#endif /* HAVE_DH_GET0_PQG */ + +#ifndef HAVE_DH_SET0_PQG +int +DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g) +{ + 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; + } + + return 1; +} +#endif /* HAVE_DH_SET0_PQG */ + +#ifndef HAVE_DH_GET0_KEY +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; +} +#endif /* HAVE_DH_GET0_KEY */ + +#ifndef HAVE_DH_SET0_KEY +int +DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key) +{ + 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; +} +#endif /* HAVE_DH_SET0_KEY */ + +#ifndef HAVE_DH_SET_LENGTH +int +DH_set_length(DH *dh, long length) +{ + if (length < 0 || length > INT_MAX) + return 0; + + dh->length = length; + return 1; +} +#endif /* HAVE_DH_SET_LENGTH */ + +#ifndef HAVE_RSA_METH_FREE +void +RSA_meth_free(RSA_METHOD *meth) +{ + if (meth != NULL) { + free((char *)meth->name); + free(meth); + } +} +#endif /* HAVE_RSA_METH_FREE */ + +#ifndef HAVE_RSA_METH_DUP +RSA_METHOD * +RSA_meth_dup(const RSA_METHOD *meth) +{ + RSA_METHOD *copy; + + if ((copy = calloc(1, sizeof(*copy))) == NULL) + return NULL; + memcpy(copy, meth, sizeof(*copy)); + if ((copy->name = strdup(meth->name)) == NULL) { + free(copy); + return NULL; + } + + return copy; +} +#endif /* HAVE_RSA_METH_DUP */ + +#ifndef HAVE_RSA_METH_SET1_NAME +int +RSA_meth_set1_name(RSA_METHOD *meth, const char *name) +{ + char *copy; + + if ((copy = strdup(name)) == NULL) + return 0; + free((char *)meth->name); + meth->name = copy; + return 1; +} +#endif /* HAVE_RSA_METH_SET1_NAME */ + +#ifndef HAVE_RSA_METH_GET_FINISH +int +(*RSA_meth_get_finish(const RSA_METHOD *meth))(RSA *rsa) +{ + return meth->finish; +} +#endif /* HAVE_RSA_METH_GET_FINISH */ + +#ifndef HAVE_RSA_METH_SET_PRIV_ENC +int +RSA_meth_set_priv_enc(RSA_METHOD *meth, int (*priv_enc)(int flen, + const unsigned char *from, unsigned char *to, RSA *rsa, int padding)) +{ + meth->rsa_priv_enc = priv_enc; + return 1; +} +#endif /* HAVE_RSA_METH_SET_PRIV_ENC */ + +#ifndef HAVE_RSA_METH_SET_PRIV_DEC +int +RSA_meth_set_priv_dec(RSA_METHOD *meth, int (*priv_dec)(int flen, + const unsigned char *from, unsigned char *to, RSA *rsa, int padding)) +{ + meth->rsa_priv_dec = priv_dec; + return 1; +} +#endif /* HAVE_RSA_METH_SET_PRIV_DEC */ + +#ifndef HAVE_RSA_METH_SET_FINISH +int +RSA_meth_set_finish(RSA_METHOD *meth, int (*finish)(RSA *rsa)) +{ + meth->finish = finish; + return 1; +} +#endif /* HAVE_RSA_METH_SET_FINISH */ + +#ifndef HAVE_EVP_PKEY_GET0_RSA +RSA * +EVP_PKEY_get0_RSA(EVP_PKEY *pkey) +{ + if (pkey->type != EVP_PKEY_RSA) { + /* EVPerror(EVP_R_EXPECTING_AN_RSA_KEY); */ + return NULL; + } + return pkey->pkey.rsa; +} +#endif /* HAVE_EVP_PKEY_GET0_RSA */ + +#ifndef HAVE_EVP_MD_CTX_NEW +EVP_MD_CTX * +EVP_MD_CTX_new(void) +{ + return calloc(1, sizeof(EVP_MD_CTX)); +} +#endif /* HAVE_EVP_MD_CTX_NEW */ + +#ifndef HAVE_EVP_MD_CTX_FREE +void +EVP_MD_CTX_free(EVP_MD_CTX *ctx) +{ + if (ctx == NULL) + return; + + EVP_MD_CTX_cleanup(ctx); + + free(ctx); +} +#endif /* HAVE_EVP_MD_CTX_FREE */ + +#endif /* WITH_OPENSSL */ From 4b6d416b3218ec9278480ac18e457fe7b1f5db20 Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Wed, 3 Oct 2018 16:38:36 +0000 Subject: [PATCH 3/6] openssh: connect libressl-api-compat.c and regen config.h Differential Revision: https://reviews.freebsd.org/D17390 --- crypto/openssh/config.h | 102 +++++++++++++++++++++++++++++++++++-- secure/lib/libssh/Makefile | 4 +- 2 files changed, 102 insertions(+), 4 deletions(-) diff --git a/crypto/openssh/config.h b/crypto/openssh/config.h index 83a9856774b..17d7e53666e 100644 --- a/crypto/openssh/config.h +++ b/crypto/openssh/config.h @@ -394,6 +394,21 @@ /* Define if you have /dev/ptc */ /* #undef HAVE_DEV_PTS_AND_PTC */ +/* Define if libcrypto has DH_get0_key */ +#define HAVE_DH_GET0_KEY 1 + +/* Define if libcrypto has DH_get0_pqg */ +#define HAVE_DH_GET0_PQG 1 + +/* Define if libcrypto has DH_set0_key */ +#define HAVE_DH_SET0_KEY 1 + +/* Define if libcrypto has DH_set0_pqg */ +#define HAVE_DH_SET0_PQG 1 + +/* Define if libcrypto has DH_set_length */ +#define HAVE_DH_SET_LENGTH 1 + /* Define to 1 if you have the header file. */ #define HAVE_DIRENT_H 1 @@ -406,6 +421,30 @@ /* Define to 1 if you have the `DSA_generate_parameters_ex' function. */ #define HAVE_DSA_GENERATE_PARAMETERS_EX 1 +/* Define if libcrypto has DSA_get0_key */ +#define HAVE_DSA_GET0_KEY 1 + +/* Define if libcrypto has DSA_get0_pqg */ +#define HAVE_DSA_GET0_PQG 1 + +/* Define if libcrypto has DSA_set0_key */ +#define HAVE_DSA_SET0_KEY 1 + +/* Define if libcrypto has DSA_set0_pqg */ +#define HAVE_DSA_SET0_PQG 1 + +/* Define if libcrypto has DSA_SIG_get0 */ +#define HAVE_DSA_SIG_GET0 1 + +/* Define if libcrypto has DSA_SIG_set0 */ +#define HAVE_DSA_SIG_SET0 1 + +/* Define if libcrypto has ECDSA_SIG_get0 */ +#define HAVE_ECDSA_SIG_GET0 1 + +/* Define if libcrypto has ECDSA_SIG_set0 */ +#define HAVE_ECDSA_SIG_SET0 1 + /* Define to 1 if you have the header file. */ #define HAVE_ELF_H 1 @@ -436,6 +475,15 @@ /* Define if libcrypto has EVP_CIPHER_CTX_ctrl */ #define HAVE_EVP_CIPHER_CTX_CTRL 1 +/* Define if libcrypto has EVP_CIPHER_CTX_set_iv */ +/* #undef HAVE_EVP_CIPHER_CTX_GET_IV */ + +/* Define if libcrypto has EVP_CIPHER_CTX_iv */ +#define HAVE_EVP_CIPHER_CTX_IV 1 + +/* Define if libcrypto has EVP_CIPHER_CTX_iv_noconst */ +#define HAVE_EVP_CIPHER_CTX_IV_NOCONST 1 + /* Define to 1 if you have the `EVP_DigestFinal_ex' function. */ #define HAVE_EVP_DIGESTFINAL_EX 1 @@ -443,13 +491,22 @@ #define HAVE_EVP_DIGESTINIT_EX 1 /* Define to 1 if you have the `EVP_MD_CTX_cleanup' function. */ -#define HAVE_EVP_MD_CTX_CLEANUP 1 +/* #undef HAVE_EVP_MD_CTX_CLEANUP */ /* Define to 1 if you have the `EVP_MD_CTX_copy_ex' function. */ #define HAVE_EVP_MD_CTX_COPY_EX 1 +/* Define if libcrypto has EVP_MD_CTX_free */ +#define HAVE_EVP_MD_CTX_FREE 1 + /* Define to 1 if you have the `EVP_MD_CTX_init' function. */ -#define HAVE_EVP_MD_CTX_INIT 1 +/* #undef HAVE_EVP_MD_CTX_INIT */ + +/* Define if libcrypto has EVP_MD_CTX_new */ +#define HAVE_EVP_MD_CTX_NEW 1 + +/* Define if libcrypto has EVP_PKEY_get0_RSA */ +#define HAVE_EVP_PKEY_GET0_RSA 1 /* Define to 1 if you have the `EVP_ripemd160' function. */ #define HAVE_EVP_RIPEMD160 1 @@ -647,7 +704,7 @@ #define HAVE_HEADER_AD 1 /* Define to 1 if you have the `HMAC_CTX_init' function. */ -#define HAVE_HMAC_CTX_INIT 1 +/* #undef HAVE_HMAC_CTX_INIT */ /* Define if you have ut_host in utmp.h */ /* #undef HAVE_HOST_IN_UTMP */ @@ -973,9 +1030,48 @@ /* Define to 1 if you have the `RSA_generate_key_ex' function. */ #define HAVE_RSA_GENERATE_KEY_EX 1 +/* Define if libcrypto has RSA_get0_crt_params */ +#define HAVE_RSA_GET0_CRT_PARAMS 1 + +/* Define if libcrypto has RSA_get0_factors */ +#define HAVE_RSA_GET0_FACTORS 1 + +/* Define if libcrypto has RSA_get0_key */ +#define HAVE_RSA_GET0_KEY 1 + /* Define to 1 if you have the `RSA_get_default_method' function. */ #define HAVE_RSA_GET_DEFAULT_METHOD 1 +/* Define if libcrypto has RSA_meth_dup */ +#define HAVE_RSA_METH_DUP 1 + +/* Define if libcrypto has RSA_meth_free */ +#define HAVE_RSA_METH_FREE 1 + +/* Define if libcrypto has RSA_meth_get_finish */ +#define HAVE_RSA_METH_GET_FINISH 1 + +/* Define if libcrypto has RSA_meth_set1_name */ +#define HAVE_RSA_METH_SET1_NAME 1 + +/* Define if libcrypto has RSA_meth_set_finish */ +#define HAVE_RSA_METH_SET_FINISH 1 + +/* Define if libcrypto has RSA_meth_set_priv_dec */ +#define HAVE_RSA_METH_SET_PRIV_DEC 1 + +/* Define if libcrypto has RSA_meth_set_priv_enc */ +#define HAVE_RSA_METH_SET_PRIV_ENC 1 + +/* Define if libcrypto has RSA_get0_srt_params */ +#define HAVE_RSA_SET0_CRT_PARAMS 1 + +/* Define if libcrypto has RSA_set0_factors */ +#define HAVE_RSA_SET0_FACTORS 1 + +/* Define if libcrypto has RSA_set0_key */ +#define HAVE_RSA_SET0_KEY 1 + /* Define to 1 if you have the header file. */ /* #undef HAVE_SANDBOX_H */ diff --git a/secure/lib/libssh/Makefile b/secure/lib/libssh/Makefile index e443228c52b..b325fe9d32d 100644 --- a/secure/lib/libssh/Makefile +++ b/secure/lib/libssh/Makefile @@ -31,7 +31,9 @@ PACKAGE= ssh # Portability layer SRCS+= bcrypt_pbkdf.c blowfish.c bsd-misc.c bsd-signal.c explicit_bzero.c \ - fmt_scaled.c freezero.c glob.c openssl-compat.c port-net.c \ + fmt_scaled.c freezero.c glob.c \ + libressl-api-compat.c \ + openssl-compat.c port-net.c \ realpath.c recallocarray.c strtonum.c timingsafe_bcmp.c vis.c xcrypt.c .if ${MK_LDNS} == "no" From e4456411a8c2d4a9bfbccd60f2cf914fd402f817 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Fri, 5 Oct 2018 16:35:24 +0000 Subject: [PATCH 4/6] Update the existing heimdal implementation for OpenSSL 1.1. Existing work is underway to import a newer version of heimdal, but this patchset gets us to a fully working tree to enable more wide spread testing of OpenSSL 1.1 for now. I've also enabled WARNS=1 for kerberos (which is the reason for the change in libroken). Having -Werror enabled was useful during the 1.1 updates and we probably should have warnings enabled by default for kerberos anyway. This passes make tinderbox, and I have also done some very light runtime testing on amd64. Reviewed by: bjk, jkim, emaste Differential Revision: https://reviews.freebsd.org/D17276 --- crypto/heimdal/kdc/digest.c | 20 ++- crypto/heimdal/kdc/kx509.c | 48 ++++--- crypto/heimdal/kdc/pkinit.c | 27 ++-- crypto/heimdal/lib/gssapi/krb5/arcfour.c | 91 ++++++++---- crypto/heimdal/lib/gssapi/krb5/get_mic.c | 20 ++- crypto/heimdal/lib/gssapi/krb5/unwrap.c | 37 +++-- crypto/heimdal/lib/gssapi/krb5/verify_mic.c | 17 ++- crypto/heimdal/lib/gssapi/krb5/wrap.c | 27 ++-- crypto/heimdal/lib/gssapi/ntlm/crypto.c | 16 ++- crypto/heimdal/lib/hx509/crypto.c | 150 ++++++++++++++----- crypto/heimdal/lib/hx509/hxtool.c | 4 +- crypto/heimdal/lib/hx509/ks_file.c | 19 ++- crypto/heimdal/lib/hx509/ks_p11.c | 74 +++++++--- crypto/heimdal/lib/krb5/crypto-aes.c | 12 +- crypto/heimdal/lib/krb5/crypto-arcfour.c | 24 ++-- crypto/heimdal/lib/krb5/crypto-des-common.c | 8 +- crypto/heimdal/lib/krb5/crypto-des.c | 4 +- crypto/heimdal/lib/krb5/crypto-evp.c | 18 +-- crypto/heimdal/lib/krb5/crypto-rand.c | 2 + crypto/heimdal/lib/krb5/crypto.h | 4 +- crypto/heimdal/lib/krb5/pkinit.c | 37 +++-- crypto/heimdal/lib/ntlm/heimntlm-protos.h | 2 +- crypto/heimdal/lib/ntlm/ntlm.c | 152 +++++++++++++------- crypto/heimdal/lib/roken/snprintf.c | 2 +- kerberos5/Makefile.inc | 4 + kerberos5/include/crypto-headers.h | 4 - 26 files changed, 561 insertions(+), 262 deletions(-) diff --git a/crypto/heimdal/kdc/digest.c b/crypto/heimdal/kdc/digest.c index 5f0d27441a2..9398803f04d 100644 --- a/crypto/heimdal/kdc/digest.c +++ b/crypto/heimdal/kdc/digest.c @@ -375,8 +375,8 @@ _kdc_do_digest(krb5_context context, case choice_DigestReqInner_init: { unsigned char server_nonce[16], identifier; - RAND_pseudo_bytes(&identifier, sizeof(identifier)); - RAND_pseudo_bytes(server_nonce, sizeof(server_nonce)); + RAND_bytes(&identifier, sizeof(identifier)); + RAND_bytes(server_nonce, sizeof(server_nonce)); server_nonce[0] = kdc_time & 0xff; server_nonce[1] = (kdc_time >> 8) & 0xff; @@ -1333,7 +1333,7 @@ _kdc_do_digest(krb5_context context, if (ireq.u.ntlmRequest.sessionkey) { unsigned char masterkey[MD4_DIGEST_LENGTH]; - EVP_CIPHER_CTX rc4; + EVP_CIPHER_CTX *rc4; size_t len; if ((flags & NTLM_NEG_KEYEX) == 0) { @@ -1354,12 +1354,18 @@ _kdc_do_digest(krb5_context context, } - EVP_CIPHER_CTX_init(&rc4); - EVP_CipherInit_ex(&rc4, EVP_rc4(), NULL, sessionkey, NULL, 1); - EVP_Cipher(&rc4, + rc4 = EVP_CIPHER_CTX_new(); + if (rc4 == NULL) { + ret = ENOMEM; + krb5_set_error_message(context, ret, + "NTLM failed to malloc cipher context"); + goto failed; + } + EVP_CipherInit_ex(rc4, EVP_rc4(), NULL, sessionkey, NULL, 1); + EVP_Cipher(rc4, masterkey, ireq.u.ntlmRequest.sessionkey->data, sizeof(masterkey)); - EVP_CIPHER_CTX_cleanup(&rc4); + EVP_CIPHER_CTX_free(rc4); r.u.ntlmResponse.sessionkey = malloc(sizeof(*r.u.ntlmResponse.sessionkey)); diff --git a/crypto/heimdal/kdc/kx509.c b/crypto/heimdal/kdc/kx509.c index 8d683d50a37..4694b098275 100644 --- a/crypto/heimdal/kdc/kx509.c +++ b/crypto/heimdal/kdc/kx509.c @@ -64,7 +64,7 @@ verify_req_hash(krb5_context context, krb5_keyblock *key) { unsigned char digest[SHA_DIGEST_LENGTH]; - HMAC_CTX ctx; + HMAC_CTX *ctx; if (req->pk_hash.length != sizeof(digest)) { krb5_set_error_message(context, KRB5KDC_ERR_PREAUTH_FAILED, @@ -73,16 +73,21 @@ verify_req_hash(krb5_context context, return KRB5KDC_ERR_PREAUTH_FAILED; } - HMAC_CTX_init(&ctx); - HMAC_Init_ex(&ctx, + ctx = HMAC_CTX_new(); + if (ctx == NULL) { + krb5_set_error_message(context, ENOMEM, + "HMAC context malloc failed"); + return ENOMEM; + } + HMAC_Init_ex(ctx, key->keyvalue.data, key->keyvalue.length, EVP_sha1(), NULL); - if (sizeof(digest) != HMAC_size(&ctx)) + if (sizeof(digest) != HMAC_size(ctx)) krb5_abortx(context, "runtime error, hmac buffer wrong size in kx509"); - HMAC_Update(&ctx, version_2_0, sizeof(version_2_0)); - HMAC_Update(&ctx, req->pk_key.data, req->pk_key.length); - HMAC_Final(&ctx, digest, 0); - HMAC_CTX_cleanup(&ctx); + HMAC_Update(ctx, version_2_0, sizeof(version_2_0)); + HMAC_Update(ctx, req->pk_key.data, req->pk_key.length); + HMAC_Final(ctx, digest, 0); + HMAC_CTX_free(ctx); if (memcmp(req->pk_hash.data, digest, sizeof(digest)) != 0) { krb5_set_error_message(context, KRB5KDC_ERR_PREAUTH_FAILED, @@ -98,35 +103,40 @@ calculate_reply_hash(krb5_context context, Kx509Response *rep) { krb5_error_code ret; - HMAC_CTX ctx; + HMAC_CTX *ctx; - HMAC_CTX_init(&ctx); + ctx = HMAC_CTX_new(); + if (ctx == NULL) { + krb5_set_error_message(context, ENOMEM, + "HMAC context malloc failed"); + return ENOMEM; + } - HMAC_Init_ex(&ctx, key->keyvalue.data, key->keyvalue.length, + HMAC_Init_ex(ctx, key->keyvalue.data, key->keyvalue.length, EVP_sha1(), NULL); - ret = krb5_data_alloc(rep->hash, HMAC_size(&ctx)); + ret = krb5_data_alloc(rep->hash, HMAC_size(ctx)); if (ret) { - HMAC_CTX_cleanup(&ctx); + HMAC_CTX_free(ctx); krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; } - HMAC_Update(&ctx, version_2_0, sizeof(version_2_0)); + HMAC_Update(ctx, version_2_0, sizeof(version_2_0)); if (rep->error_code) { int32_t t = *rep->error_code; do { unsigned char p = (t & 0xff); - HMAC_Update(&ctx, &p, 1); + HMAC_Update(ctx, &p, 1); t >>= 8; } while (t); } if (rep->certificate) - HMAC_Update(&ctx, rep->certificate->data, rep->certificate->length); + HMAC_Update(ctx, rep->certificate->data, rep->certificate->length); if (rep->e_text) - HMAC_Update(&ctx, (unsigned char *)*rep->e_text, strlen(*rep->e_text)); + HMAC_Update(ctx, (unsigned char *)*rep->e_text, strlen(*rep->e_text)); - HMAC_Final(&ctx, rep->hash->data, 0); - HMAC_CTX_cleanup(&ctx); + HMAC_Final(ctx, rep->hash->data, 0); + HMAC_CTX_free(ctx); return 0; } diff --git a/crypto/heimdal/kdc/pkinit.c b/crypto/heimdal/kdc/pkinit.c index d85b1565007..75edda464f4 100644 --- a/crypto/heimdal/kdc/pkinit.c +++ b/crypto/heimdal/kdc/pkinit.c @@ -331,6 +331,7 @@ get_dh_param(krb5_context context, { DomainParameters dhparam; DH *dh = NULL; + BIGNUM *p, *q, *g; krb5_error_code ret; memset(&dhparam, 0, sizeof(dhparam)); @@ -375,15 +376,21 @@ get_dh_param(krb5_context context, goto out; } ret = KRB5_BADMSGTYPE; - dh->p = integer_to_BN(context, "DH prime", &dhparam.p); - if (dh->p == NULL) + p = integer_to_BN(context, "DH prime", &dhparam.p); + g = integer_to_BN(context, "DH base", &dhparam.g); + q = integer_to_BN(context, "DH p-1 factor", &dhparam.q); + if (p == NULL || g == NULL || q == NULL) { + BN_free(p); + BN_free(g); + BN_free(q); goto out; - dh->g = integer_to_BN(context, "DH base", &dhparam.g); - if (dh->g == NULL) - goto out; - dh->q = integer_to_BN(context, "DH p-1 factor", &dhparam.q); - if (dh->g == NULL) + } + if (DH_set0_pqg(dh, p, g, q) != 1) { + BN_free(p); + BN_free(g); + BN_free(q); goto out; + } { heim_integer glue; @@ -895,7 +902,7 @@ out: */ static krb5_error_code -BN_to_integer(krb5_context context, BIGNUM *bn, heim_integer *integer) +BN_to_integer(krb5_context context, const BIGNUM *bn, heim_integer *integer) { integer->length = BN_num_bytes(bn); integer->data = malloc(integer->length); @@ -1112,9 +1119,11 @@ pk_mk_pa_reply_dh(krb5_context context, if (cp->keyex == USE_DH) { DH *kdc_dh = cp->u.dh.key; + const BIGNUM *pub_key; heim_integer i; - ret = BN_to_integer(context, kdc_dh->pub_key, &i); + DH_get0_key(kdc_dh, &pub_key, NULL); + ret = BN_to_integer(context, pub_key, &i); if (ret) return ret; diff --git a/crypto/heimdal/lib/gssapi/krb5/arcfour.c b/crypto/heimdal/lib/gssapi/krb5/arcfour.c index 15b1b343409..b4ef8d39ffd 100644 --- a/crypto/heimdal/lib/gssapi/krb5/arcfour.c +++ b/crypto/heimdal/lib/gssapi/krb5/arcfour.c @@ -173,7 +173,7 @@ _gssapi_get_mic_arcfour(OM_uint32 * minor_status, int32_t seq_number; size_t len, total_len; u_char k6_data[16], *p0, *p; - EVP_CIPHER_CTX rc4_key; + EVP_CIPHER_CTX *rc4_key; _gsskrb5_encap_length (22, &len, &total_len, GSS_KRB5_MECHANISM); @@ -235,10 +235,16 @@ _gssapi_get_mic_arcfour(OM_uint32 * minor_status, memset (p + 4, (context_handle->more_flags & LOCAL) ? 0 : 0xff, 4); - EVP_CIPHER_CTX_init(&rc4_key); - EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); - EVP_Cipher(&rc4_key, p, p, 8); - EVP_CIPHER_CTX_cleanup(&rc4_key); + rc4_key = EVP_CIPHER_CTX_new(); + if (rc4_key == NULL) { + _gsskrb5_release_buffer(minor_status, message_token); + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + + EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(rc4_key, p, p, 8); + EVP_CIPHER_CTX_free(rc4_key); memset(k6_data, 0, sizeof(k6_data)); @@ -308,12 +314,16 @@ _gssapi_verify_mic_arcfour(OM_uint32 * minor_status, } { - EVP_CIPHER_CTX rc4_key; + EVP_CIPHER_CTX *rc4_key; - EVP_CIPHER_CTX_init(&rc4_key); - EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, (void *)k6_data, NULL, 0); - EVP_Cipher(&rc4_key, SND_SEQ, p, 8); - EVP_CIPHER_CTX_cleanup(&rc4_key); + rc4_key = EVP_CIPHER_CTX_new(); + if (rc4_key == NULL) { + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, (void *)k6_data, NULL, 0); + EVP_Cipher(rc4_key, SND_SEQ, p, 8); + EVP_CIPHER_CTX_free(rc4_key); memset(k6_data, 0, sizeof(k6_data)); } @@ -461,12 +471,17 @@ _gssapi_wrap_arcfour(OM_uint32 * minor_status, if(conf_req_flag) { - EVP_CIPHER_CTX rc4_key; + EVP_CIPHER_CTX *rc4_key; - EVP_CIPHER_CTX_init(&rc4_key); - EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); - EVP_Cipher(&rc4_key, p0 + 24, p0 + 24, 8 + datalen); - EVP_CIPHER_CTX_cleanup(&rc4_key); + rc4_key = EVP_CIPHER_CTX_new(); + if (rc4_key == NULL) { + _gsskrb5_release_buffer(minor_status, output_message_buffer); + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(rc4_key, p0 + 24, p0 + 24, 8 + datalen); + EVP_CIPHER_CTX_free(rc4_key); } memset(k6_data, 0, sizeof(k6_data)); @@ -480,12 +495,17 @@ _gssapi_wrap_arcfour(OM_uint32 * minor_status, } { - EVP_CIPHER_CTX rc4_key; + EVP_CIPHER_CTX *rc4_key; - EVP_CIPHER_CTX_init(&rc4_key); - EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); - EVP_Cipher(&rc4_key, p0 + 8, p0 + 8 /* SND_SEQ */, 8); - EVP_CIPHER_CTX_cleanup(&rc4_key); + rc4_key = EVP_CIPHER_CTX_new(); + if (rc4_key == NULL) { + _gsskrb5_release_buffer(minor_status, output_message_buffer); + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(rc4_key, p0 + 8, p0 + 8 /* SND_SEQ */, 8); + EVP_CIPHER_CTX_free(rc4_key); memset(k6_data, 0, sizeof(k6_data)); } @@ -580,12 +600,16 @@ OM_uint32 _gssapi_unwrap_arcfour(OM_uint32 *minor_status, } { - EVP_CIPHER_CTX rc4_key; + EVP_CIPHER_CTX *rc4_key; - EVP_CIPHER_CTX_init(&rc4_key); - EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); - EVP_Cipher(&rc4_key, SND_SEQ, p0 + 8, 8); - EVP_CIPHER_CTX_cleanup(&rc4_key); + rc4_key = EVP_CIPHER_CTX_new(); + if (rc4_key == NULL) { + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(rc4_key, SND_SEQ, p0 + 8, 8); + EVP_CIPHER_CTX_free(rc4_key); memset(k6_data, 0, sizeof(k6_data)); } @@ -628,13 +652,18 @@ OM_uint32 _gssapi_unwrap_arcfour(OM_uint32 *minor_status, output_message_buffer->length = datalen; if(conf_flag) { - EVP_CIPHER_CTX rc4_key; + EVP_CIPHER_CTX *rc4_key; - EVP_CIPHER_CTX_init(&rc4_key); - EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); - EVP_Cipher(&rc4_key, Confounder, p0 + 24, 8); - EVP_Cipher(&rc4_key, output_message_buffer->value, p0 + GSS_ARCFOUR_WRAP_TOKEN_SIZE, datalen); - EVP_CIPHER_CTX_cleanup(&rc4_key); + rc4_key = EVP_CIPHER_CTX_new(); + if (rc4_key == NULL) { + _gsskrb5_release_buffer(minor_status, output_message_buffer); + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(rc4_key, Confounder, p0 + 24, 8); + EVP_Cipher(rc4_key, output_message_buffer->value, p0 + GSS_ARCFOUR_WRAP_TOKEN_SIZE, datalen); + EVP_CIPHER_CTX_free(rc4_key); } else { memcpy(Confounder, p0 + 24, 8); /* Confounder */ memcpy(output_message_buffer->value, diff --git a/crypto/heimdal/lib/gssapi/krb5/get_mic.c b/crypto/heimdal/lib/gssapi/krb5/get_mic.c index 0109ca7c6e7..01892ac5ba7 100644 --- a/crypto/heimdal/lib/gssapi/krb5/get_mic.c +++ b/crypto/heimdal/lib/gssapi/krb5/get_mic.c @@ -50,7 +50,7 @@ mic_des EVP_MD_CTX *md5; u_char hash[16]; DES_key_schedule schedule; - EVP_CIPHER_CTX des_ctx; + EVP_CIPHER_CTX *des_ctx; DES_cblock deskey; DES_cblock zero; int32_t seq_number; @@ -96,6 +96,17 @@ mic_des &schedule, &zero); memcpy (p - 8, hash, 8); /* SGN_CKSUM */ + des_ctx = EVP_CIPHER_CTX_new(); + if (des_ctx == NULL) { + memset (deskey, 0, sizeof(deskey)); + memset (&schedule, 0, sizeof(schedule)); + free (message_token->value); + message_token->value = NULL; + message_token->length = 0; + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); /* sequence number */ krb5_auth_con_getlocalseqnumber (context, @@ -111,10 +122,9 @@ mic_des (ctx->more_flags & LOCAL) ? 0 : 0xFF, 4); - EVP_CIPHER_CTX_init(&des_ctx); - EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, p + 8, 1); - EVP_Cipher(&des_ctx, p, p, 8); - EVP_CIPHER_CTX_cleanup(&des_ctx); + EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, p + 8, 1); + EVP_Cipher(des_ctx, p, p, 8); + EVP_CIPHER_CTX_free(des_ctx); krb5_auth_con_setlocalseqnumber (context, ctx->auth_context, diff --git a/crypto/heimdal/lib/gssapi/krb5/unwrap.c b/crypto/heimdal/lib/gssapi/krb5/unwrap.c index d6bc2047778..5a003815a0f 100644 --- a/crypto/heimdal/lib/gssapi/krb5/unwrap.c +++ b/crypto/heimdal/lib/gssapi/krb5/unwrap.c @@ -50,7 +50,7 @@ unwrap_des size_t len; EVP_MD_CTX *md5; u_char hash[16]; - EVP_CIPHER_CTX des_ctx; + EVP_CIPHER_CTX *des_ctx; DES_key_schedule schedule; DES_cblock deskey; DES_cblock zero; @@ -104,12 +104,17 @@ unwrap_des deskey[i] ^= 0xf0; - EVP_CIPHER_CTX_init(&des_ctx); - EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, deskey, zero, 0); - EVP_Cipher(&des_ctx, p, p, input_message_buffer->length - len); - EVP_CIPHER_CTX_cleanup(&des_ctx); + des_ctx = EVP_CIPHER_CTX_new(); + if (des_ctx == NULL) { + memset (deskey, 0, sizeof(deskey)); + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, deskey, zero, 0); + EVP_Cipher(des_ctx, p, p, input_message_buffer->length - len); + EVP_CIPHER_CTX_free(des_ctx); - memset (&schedule, 0, sizeof(schedule)); + memset (deskey, 0, sizeof(deskey)); } if (IS_DCE_STYLE(context_handle)) { @@ -135,19 +140,29 @@ unwrap_des DES_set_key_unchecked (&deskey, &schedule); DES_cbc_cksum ((void *)hash, (void *)hash, sizeof(hash), &schedule, &zero); - if (ct_memcmp (p - 8, hash, 8) != 0) + if (ct_memcmp (p - 8, hash, 8) != 0) { + memset (deskey, 0, sizeof(deskey)); + memset (&schedule, 0, sizeof(schedule)); return GSS_S_BAD_MIC; + } /* verify sequence number */ + des_ctx = EVP_CIPHER_CTX_new(); + if (des_ctx == NULL) { + memset (deskey, 0, sizeof(deskey)); + memset (&schedule, 0, sizeof(schedule)); + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + HEIMDAL_MUTEX_lock(&context_handle->ctx_id_mutex); p -= 16; - EVP_CIPHER_CTX_init(&des_ctx); - EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, hash, 0); - EVP_Cipher(&des_ctx, p, p, 8); - EVP_CIPHER_CTX_cleanup(&des_ctx); + EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, hash, 0); + EVP_Cipher(des_ctx, p, p, 8); + EVP_CIPHER_CTX_free(des_ctx); memset (deskey, 0, sizeof(deskey)); memset (&schedule, 0, sizeof(schedule)); diff --git a/crypto/heimdal/lib/gssapi/krb5/verify_mic.c b/crypto/heimdal/lib/gssapi/krb5/verify_mic.c index 3814ef7062c..7f9374cf975 100644 --- a/crypto/heimdal/lib/gssapi/krb5/verify_mic.c +++ b/crypto/heimdal/lib/gssapi/krb5/verify_mic.c @@ -51,7 +51,7 @@ verify_mic_des EVP_MD_CTX *md5; u_char hash[16], *seq; DES_key_schedule schedule; - EVP_CIPHER_CTX des_ctx; + EVP_CIPHER_CTX *des_ctx; DES_cblock zero; DES_cblock deskey; uint32_t seq_number; @@ -96,14 +96,21 @@ verify_mic_des /* verify sequence number */ + des_ctx = EVP_CIPHER_CTX_new(); + if (des_ctx == NULL) { + memset (deskey, 0, sizeof(deskey)); + memset (&schedule, 0, sizeof(schedule)); + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + HEIMDAL_MUTEX_lock(&context_handle->ctx_id_mutex); p -= 16; - EVP_CIPHER_CTX_init(&des_ctx); - EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, hash, 0); - EVP_Cipher(&des_ctx, p, p, 8); - EVP_CIPHER_CTX_cleanup(&des_ctx); + EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, hash, 0); + EVP_Cipher(des_ctx, p, p, 8); + EVP_CIPHER_CTX_free(des_ctx); memset (deskey, 0, sizeof(deskey)); memset (&schedule, 0, sizeof(schedule)); diff --git a/crypto/heimdal/lib/gssapi/krb5/wrap.c b/crypto/heimdal/lib/gssapi/krb5/wrap.c index 1026e41914e..857ca525d49 100644 --- a/crypto/heimdal/lib/gssapi/krb5/wrap.c +++ b/crypto/heimdal/lib/gssapi/krb5/wrap.c @@ -211,7 +211,7 @@ wrap_des EVP_MD_CTX *md5; u_char hash[16]; DES_key_schedule schedule; - EVP_CIPHER_CTX des_ctx; + EVP_CIPHER_CTX *des_ctx; DES_cblock deskey; DES_cblock zero; size_t i; @@ -283,6 +283,17 @@ wrap_des &schedule, &zero); memcpy (p - 8, hash, 8); + des_ctx = EVP_CIPHER_CTX_new(); + if (des_ctx == NULL) { + memset (deskey, 0, sizeof(deskey)); + memset (&schedule, 0, sizeof(schedule)); + free(output_message_buffer->value); + output_message_buffer->value = NULL; + output_message_buffer->length = 0; + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + /* sequence number */ HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); krb5_auth_con_getlocalseqnumber (context, @@ -298,10 +309,8 @@ wrap_des (ctx->more_flags & LOCAL) ? 0 : 0xFF, 4); - EVP_CIPHER_CTX_init(&des_ctx); - EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, p + 8, 1); - EVP_Cipher(&des_ctx, p, p, 8); - EVP_CIPHER_CTX_cleanup(&des_ctx); + EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, p + 8, 1); + EVP_Cipher(des_ctx, p, p, 8); krb5_auth_con_setlocalseqnumber (context, ctx->auth_context, @@ -317,11 +326,11 @@ wrap_des for (i = 0; i < sizeof(deskey); ++i) deskey[i] ^= 0xf0; - EVP_CIPHER_CTX_init(&des_ctx); - EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, deskey, zero, 1); - EVP_Cipher(&des_ctx, p, p, datalen); - EVP_CIPHER_CTX_cleanup(&des_ctx); + EVP_CIPHER_CTX_reset(des_ctx); + EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, deskey, zero, 1); + EVP_Cipher(des_ctx, p, p, datalen); } + EVP_CIPHER_CTX_free(des_ctx); memset (deskey, 0, sizeof(deskey)); memset (&schedule, 0, sizeof(schedule)); diff --git a/crypto/heimdal/lib/gssapi/ntlm/crypto.c b/crypto/heimdal/lib/gssapi/ntlm/crypto.c index 85dc638dda5..5573f3a209f 100644 --- a/crypto/heimdal/lib/gssapi/ntlm/crypto.c +++ b/crypto/heimdal/lib/gssapi/ntlm/crypto.c @@ -148,16 +148,18 @@ v2_sign_message(gss_buffer_t in, { unsigned char hmac[16]; unsigned int hmaclen; - HMAC_CTX c; + HMAC_CTX *c; - HMAC_CTX_init(&c); - HMAC_Init_ex(&c, signkey, 16, EVP_md5(), NULL); + c = HMAC_CTX_new(); + if (c == NULL) + return GSS_S_FAILURE; + HMAC_Init_ex(c, signkey, 16, EVP_md5(), NULL); encode_le_uint32(seq, hmac); - HMAC_Update(&c, hmac, 4); - HMAC_Update(&c, in->value, in->length); - HMAC_Final(&c, hmac, &hmaclen); - HMAC_CTX_cleanup(&c); + HMAC_Update(c, hmac, 4); + HMAC_Update(c, in->value, in->length); + HMAC_Final(c, hmac, &hmaclen); + HMAC_CTX_free(c); encode_le_uint32(1, &out[0]); if (sealkey) diff --git a/crypto/heimdal/lib/hx509/crypto.c b/crypto/heimdal/lib/hx509/crypto.c index 4559a9c4939..b2a88a57f8a 100644 --- a/crypto/heimdal/lib/hx509/crypto.c +++ b/crypto/heimdal/lib/hx509/crypto.c @@ -226,7 +226,8 @@ heim_int2BN(const heim_integer *i) BIGNUM *bn; bn = BN_bin2bn(i->data, i->length, NULL); - BN_set_negative(bn, i->negative); + if (bn != NULL) + BN_set_negative(bn, i->negative); return bn; } @@ -899,12 +900,15 @@ rsa_get_internal(hx509_context context, hx509_private_key key, const char *type) { + const BIGNUM *n; + if (strcasecmp(type, "rsa-modulus") == 0) { - return BN_dup(key->private_key.rsa->n); + RSA_get0_key(key->private_key.rsa, &n, NULL, NULL); } else if (strcasecmp(type, "rsa-exponent") == 0) { - return BN_dup(key->private_key.rsa->e); + RSA_get0_key(key->private_key.rsa, NULL, &n, NULL); } else return NULL; + return BN_dup(n); } @@ -1045,6 +1049,7 @@ dsa_verify_signature(hx509_context context, DSAPublicKey pk; DSAParams param; size_t size; + BIGNUM *key, *p, *q, *g; DSA *dsa; int ret; @@ -1062,16 +1067,25 @@ dsa_verify_signature(hx509_context context, if (ret) goto out; - dsa->pub_key = heim_int2BN(&pk); + key = heim_int2BN(&pk); free_DSAPublicKey(&pk); - if (dsa->pub_key == NULL) { + if (key == NULL) { ret = ENOMEM; hx509_set_error_string(context, 0, ret, "out of memory"); goto out; } + ret = DSA_set0_key(dsa, key, NULL); + + if (ret != 1) { + BN_free(key); + ret = EINVAL; + hx509_set_error_string(context, 0, ret, "failed to set DSA key"); + goto out; + } + if (spi->algorithm.parameters == NULL) { ret = HX509_CRYPTO_SIG_INVALID_FORMAT; hx509_set_error_string(context, 0, ret, "DSA parameters missing"); @@ -1087,18 +1101,32 @@ dsa_verify_signature(hx509_context context, goto out; } - dsa->p = heim_int2BN(¶m.p); - dsa->q = heim_int2BN(¶m.q); - dsa->g = heim_int2BN(¶m.g); + p = heim_int2BN(¶m.p); + q = heim_int2BN(¶m.q); + g = heim_int2BN(¶m.g); free_DSAParams(¶m); - if (dsa->p == NULL || dsa->q == NULL || dsa->g == NULL) { + if (p == NULL || q == NULL || g == NULL) { + BN_free(p); + BN_free(q); + BN_free(g); ret = ENOMEM; hx509_set_error_string(context, 0, ret, "out of memory"); goto out; } + ret = DSA_set0_pqg(dsa, p, q, g); + + if (ret != 1) { + BN_free(p); + BN_free(q); + BN_free(g); + ret = EINVAL; + hx509_set_error_string(context, 0, ret, "failed to set DSA parameters"); + goto out; + } + ret = DSA_verify(-1, data->data, data->length, (unsigned char*)sig->data, sig->length, dsa); @@ -2562,7 +2590,7 @@ hx509_crypto_encrypt(hx509_crypto crypto, const heim_octet_string *ivec, heim_octet_string **ciphertext) { - EVP_CIPHER_CTX evp; + EVP_CIPHER_CTX *evp; size_t padsize, bsize; int ret; @@ -2574,12 +2602,13 @@ hx509_crypto_encrypt(hx509_crypto crypto, assert(EVP_CIPHER_iv_length(crypto->c) == (int)ivec->length); - EVP_CIPHER_CTX_init(&evp); + evp = EVP_CIPHER_CTX_new(); + if (evp == NULL) + return ENOMEM; - ret = EVP_CipherInit_ex(&evp, crypto->c, NULL, + ret = EVP_CipherInit_ex(evp, crypto->c, NULL, crypto->key.data, ivec->data, 1); if (ret != 1) { - EVP_CIPHER_CTX_cleanup(&evp); ret = HX509_CRYPTO_INTERNAL_ERROR; goto out; } @@ -2619,7 +2648,7 @@ hx509_crypto_encrypt(hx509_crypto crypto, *p++ = padsize; } - ret = EVP_Cipher(&evp, (*ciphertext)->data, + ret = EVP_Cipher(evp, (*ciphertext)->data, (*ciphertext)->data, length + padsize); if (ret != 1) { @@ -2638,7 +2667,7 @@ hx509_crypto_encrypt(hx509_crypto crypto, *ciphertext = NULL; } } - EVP_CIPHER_CTX_cleanup(&evp); + EVP_CIPHER_CTX_free(evp); return ret; } @@ -2650,7 +2679,7 @@ hx509_crypto_decrypt(hx509_crypto crypto, heim_octet_string *ivec, heim_octet_string *clear) { - EVP_CIPHER_CTX evp; + EVP_CIPHER_CTX *evp; void *idata = NULL; int ret; @@ -2670,27 +2699,30 @@ hx509_crypto_decrypt(hx509_crypto crypto, if (ivec) idata = ivec->data; - EVP_CIPHER_CTX_init(&evp); + evp = EVP_CIPHER_CTX_new(); + if (evp == NULL) + return ENOMEM; - ret = EVP_CipherInit_ex(&evp, crypto->c, NULL, + ret = EVP_CipherInit_ex(evp, crypto->c, NULL, crypto->key.data, idata, 0); if (ret != 1) { - EVP_CIPHER_CTX_cleanup(&evp); + EVP_CIPHER_CTX_free(evp); return HX509_CRYPTO_INTERNAL_ERROR; } clear->length = length; clear->data = malloc(length); if (clear->data == NULL) { - EVP_CIPHER_CTX_cleanup(&evp); + EVP_CIPHER_CTX_free(evp); clear->length = 0; return ENOMEM; } - if (EVP_Cipher(&evp, clear->data, data, length) != 1) { + if (EVP_Cipher(evp, clear->data, data, length) != 1) { + EVP_CIPHER_CTX_free(evp); return HX509_CRYPTO_INTERNAL_ERROR; } - EVP_CIPHER_CTX_cleanup(&evp); + EVP_CIPHER_CTX_free(evp); if ((crypto->flags & PADDING_PKCS7) && EVP_CIPHER_block_size(crypto->c) > 1) { int padsize; @@ -2949,6 +2981,8 @@ match_keys_rsa(hx509_cert c, hx509_private_key private_key) const SubjectPublicKeyInfo *spi; RSAPublicKey pk; RSA *rsa; + const BIGNUM *d, *p, *q, *dmp1, *dmq1, *iqmp; + BIGNUM *new_d, *new_p, *new_q, *new_dmp1, *new_dmq1, *new_iqmp, *n, *e; size_t size; int ret; @@ -2956,7 +2990,10 @@ match_keys_rsa(hx509_cert c, hx509_private_key private_key) return 0; rsa = private_key->private_key.rsa; - if (rsa->d == NULL || rsa->p == NULL || rsa->q == NULL) + RSA_get0_key(rsa, NULL, NULL, &d); + RSA_get0_factors(rsa, &p, &q); + RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp); + if (d == NULL || p == NULL || q == NULL) return 0; cert = _hx509_get_cert(c); @@ -2973,21 +3010,66 @@ match_keys_rsa(hx509_cert c, hx509_private_key private_key) RSA_free(rsa); return 0; } - rsa->n = heim_int2BN(&pk.modulus); - rsa->e = heim_int2BN(&pk.publicExponent); + n = heim_int2BN(&pk.modulus); + e = heim_int2BN(&pk.publicExponent); free_RSAPublicKey(&pk); - rsa->d = BN_dup(private_key->private_key.rsa->d); - rsa->p = BN_dup(private_key->private_key.rsa->p); - rsa->q = BN_dup(private_key->private_key.rsa->q); - rsa->dmp1 = BN_dup(private_key->private_key.rsa->dmp1); - rsa->dmq1 = BN_dup(private_key->private_key.rsa->dmq1); - rsa->iqmp = BN_dup(private_key->private_key.rsa->iqmp); + new_d = BN_dup(d); + new_p = BN_dup(p); + new_q = BN_dup(q); + new_dmp1 = BN_dup(dmp1); + new_dmq1 = BN_dup(dmq1); + new_iqmp = BN_dup(iqmp); - if (rsa->n == NULL || rsa->e == NULL || - rsa->d == NULL || rsa->p == NULL|| rsa->q == NULL || - rsa->dmp1 == NULL || rsa->dmq1 == NULL) { + if (n == NULL || e == NULL || + new_d == NULL || new_p == NULL|| new_q == NULL || + new_dmp1 == NULL || new_dmq1 == NULL || new_iqmp == NULL) { + BN_free(n); + BN_free(e); + BN_free(new_d); + BN_free(new_p); + BN_free(new_q); + BN_free(new_dmp1); + BN_free(new_dmq1); + BN_free(new_iqmp); + RSA_free(rsa); + return 0; + } + + ret = RSA_set0_key(rsa, new_d, n, e); + + if (ret != 1) { + BN_free(n); + BN_free(e); + BN_free(new_d); + BN_free(new_p); + BN_free(new_q); + BN_free(new_dmp1); + BN_free(new_dmq1); + BN_free(new_iqmp); + RSA_free(rsa); + return 0; + } + + ret = RSA_set0_factors(rsa, new_p, new_q); + + if (ret != 1) { + BN_free(new_p); + BN_free(new_q); + BN_free(new_dmp1); + BN_free(new_dmq1); + BN_free(new_iqmp); + RSA_free(rsa); + return 0; + } + + ret = RSA_set0_crt_params(rsa, new_dmp1, new_dmq1, new_iqmp); + + if (ret != 1) { + BN_free(new_dmp1); + BN_free(new_dmq1); + BN_free(new_iqmp); RSA_free(rsa); return 0; } diff --git a/crypto/heimdal/lib/hx509/hxtool.c b/crypto/heimdal/lib/hx509/hxtool.c index 4bd467f4284..06c7958592f 100644 --- a/crypto/heimdal/lib/hx509/hxtool.c +++ b/crypto/heimdal/lib/hx509/hxtool.c @@ -1387,12 +1387,12 @@ info(void *opt, int argc, char **argv) { const RSA_METHOD *m = RSA_get_default_method(); if (m != NULL) - printf("rsa: %s\n", m->name); + printf("rsa: %s\n", RSA_meth_get0_name(m)); } { const DH_METHOD *m = DH_get_default_method(); if (m != NULL) - printf("dh: %s\n", m->name); + printf("dh: %s\n", DH_meth_get0_name(m)); } #ifdef HAVE_OPENSSL { diff --git a/crypto/heimdal/lib/hx509/ks_file.c b/crypto/heimdal/lib/hx509/ks_file.c index d21d8892870..6aa36f4e204 100644 --- a/crypto/heimdal/lib/hx509/ks_file.c +++ b/crypto/heimdal/lib/hx509/ks_file.c @@ -107,11 +107,18 @@ try_decrypt(hx509_context context, clear.length = len; { - EVP_CIPHER_CTX ctx; - EVP_CIPHER_CTX_init(&ctx); - EVP_CipherInit_ex(&ctx, c, NULL, key, ivdata, 0); - EVP_Cipher(&ctx, clear.data, cipher, len); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX *ctx; + + ctx = EVP_CIPHER_CTX_new(); + if (ctx == NULL) { + hx509_set_error_string(context, 0, ENOMEM, + "Out of memory to decrypt for private key"); + ret = ENOMEM; + goto out; + } + EVP_CipherInit_ex(ctx, c, NULL, key, ivdata, 0); + EVP_Cipher(ctx, clear.data, cipher, len); + EVP_CIPHER_CTX_free(ctx); } ret = _hx509_collector_private_key_add(context, @@ -122,8 +129,8 @@ try_decrypt(hx509_context context, NULL); memset(clear.data, 0, clear.length); - free(clear.data); out: + free(clear.data); memset(key, 0, keylen); free(key); return ret; diff --git a/crypto/heimdal/lib/hx509/ks_p11.c b/crypto/heimdal/lib/hx509/ks_p11.c index 120bf43ef43..1e73bbaacbb 100644 --- a/crypto/heimdal/lib/hx509/ks_p11.c +++ b/crypto/heimdal/lib/hx509/ks_p11.c @@ -213,21 +213,47 @@ p11_rsa_finish(RSA *rsa) return 1; } -static const RSA_METHOD p11_rsa_pkcs1_method = { - "hx509 PKCS11 PKCS#1 RSA", - p11_rsa_public_encrypt, - p11_rsa_public_decrypt, - p11_rsa_private_encrypt, - p11_rsa_private_decrypt, - NULL, - NULL, - p11_rsa_init, - p11_rsa_finish, - 0, - NULL, - NULL, - NULL -}; +static const RSA_METHOD * +get_p11_rsa_pkcs1_method(void) +{ + static const RSA_METHOD *p11_rsa_pkcs1_method; + RSA_METHOD *new_method; + + if (p11_rsa_pkcs1_method != NULL) + return p11_rsa_pkcs1_method; + + new_method = RSA_meth_new("hx509 PKCS11 PKCS#1 RSA", 0); + if (new_method == NULL) + return NULL; + + if (RSA_meth_set_pub_enc(new_method, p11_rsa_public_encrypt) != 1) + goto out; + + if (RSA_meth_set_pub_dec(new_method, p11_rsa_public_decrypt) != 1) + goto out; + + if (RSA_meth_set_priv_enc(new_method, p11_rsa_private_encrypt) != 1) + goto out; + + if (RSA_meth_set_priv_dec(new_method, p11_rsa_private_decrypt) != 1) + goto out; + + if (RSA_meth_set_init(new_method, p11_rsa_init) != 1) + goto out; + + if (RSA_meth_set_finish(new_method, p11_rsa_finish) != 1) + goto out; + + /* + * This might overwrite a previously-created method if multiple + * threads invoke this concurrently which will leak memory. + */ + p11_rsa_pkcs1_method = new_method; + return p11_rsa_pkcs1_method; +out: + RSA_meth_free(new_method); + return NULL; +} /* * @@ -607,6 +633,8 @@ collect_private_key(hx509_context context, hx509_private_key key; heim_octet_string localKeyId; int ret; + const RSA_METHOD *meth; + BIGNUM *n, *e; RSA *rsa; struct p11_rsa *p11rsa; @@ -626,8 +654,15 @@ collect_private_key(hx509_context context, * the pkcs11 specification, but some smartcards leaves it out, * let ignore any failure to fetch it. */ - rsa->n = getattr_bn(p, slot, session, object, CKA_MODULUS); - rsa->e = getattr_bn(p, slot, session, object, CKA_PUBLIC_EXPONENT); + n = getattr_bn(p, slot, session, object, CKA_MODULUS); + e = getattr_bn(p, slot, session, object, CKA_PUBLIC_EXPONENT); + if (RSA_set0_key(rsa, n, e, NULL) != 1) { + BN_free(n); + BN_free(e); + RSA_free(rsa); + hx509_private_key_free(&key); + return EINVAL; + } p11rsa = calloc(1, sizeof(*p11rsa)); if (p11rsa == NULL) @@ -643,7 +678,10 @@ collect_private_key(hx509_context context, if (p->ref == UINT_MAX) _hx509_abort("pkcs11 ref == UINT_MAX on alloc"); - RSA_set_method(rsa, &p11_rsa_pkcs1_method); + meth = get_p11_rsa_pkcs1_method(); + if (meth == NULL) + _hx509_abort("failed to create RSA method"); + RSA_set_method(rsa, meth); ret = RSA_set_app_data(rsa, p11rsa); if (ret != 1) _hx509_abort("RSA_set_app_data"); diff --git a/crypto/heimdal/lib/krb5/crypto-aes.c b/crypto/heimdal/lib/krb5/crypto-aes.c index b97854206ce..0800824e97a 100644 --- a/crypto/heimdal/lib/krb5/crypto-aes.c +++ b/crypto/heimdal/lib/krb5/crypto-aes.c @@ -124,13 +124,15 @@ AES_PRF(krb5_context context, { const EVP_CIPHER *c = (*crypto->et->keytype->evp)(); - EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX *ctx; - EVP_CIPHER_CTX_init(&ctx); /* ivec all zero */ - EVP_CipherInit_ex(&ctx, c, NULL, derived->keyvalue.data, NULL, 1); - EVP_Cipher(&ctx, out->data, result.checksum.data, + ctx = EVP_CIPHER_CTX_new(); /* ivec all zero */ + if (ctx == NULL) + krb5_abortx(context, "malloc failed"); + EVP_CipherInit_ex(ctx, c, NULL, derived->keyvalue.data, NULL, 1); + EVP_Cipher(ctx, out->data, result.checksum.data, crypto->et->blocksize); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); } krb5_data_free(&result.checksum); diff --git a/crypto/heimdal/lib/krb5/crypto-arcfour.c b/crypto/heimdal/lib/krb5/crypto-arcfour.c index 7f7e21d0d22..9a71d53f654 100644 --- a/crypto/heimdal/lib/krb5/crypto-arcfour.c +++ b/crypto/heimdal/lib/krb5/crypto-arcfour.c @@ -129,7 +129,7 @@ ARCFOUR_subencrypt(krb5_context context, unsigned usage, void *ivec) { - EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX *ctx; struct _krb5_checksum_type *c = _krb5_find_checksum (CKSUMTYPE_RSA_MD5); Checksum k1_c, k2_c, k3_c, cksum; struct _krb5_key_data ke; @@ -176,11 +176,13 @@ ARCFOUR_subencrypt(krb5_context context, if (ret) krb5_abortx(context, "hmac failed"); - EVP_CIPHER_CTX_init(&ctx); + ctx = EVP_CIPHER_CTX_new(); + if (ctx == NULL) + krb5_abortx(context, "malloc failed"); - EVP_CipherInit_ex(&ctx, EVP_rc4(), NULL, k3_c.checksum.data, NULL, 1); - EVP_Cipher(&ctx, cdata + 16, cdata + 16, len - 16); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CipherInit_ex(ctx, EVP_rc4(), NULL, k3_c.checksum.data, NULL, 1); + EVP_Cipher(ctx, cdata + 16, cdata + 16, len - 16); + EVP_CIPHER_CTX_free(ctx); memset (k1_c_data, 0, sizeof(k1_c_data)); memset (k2_c_data, 0, sizeof(k2_c_data)); @@ -196,7 +198,7 @@ ARCFOUR_subdecrypt(krb5_context context, unsigned usage, void *ivec) { - EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX *ctx; struct _krb5_checksum_type *c = _krb5_find_checksum (CKSUMTYPE_RSA_MD5); Checksum k1_c, k2_c, k3_c, cksum; struct _krb5_key_data ke; @@ -234,10 +236,12 @@ ARCFOUR_subdecrypt(krb5_context context, if (ret) krb5_abortx(context, "hmac failed"); - EVP_CIPHER_CTX_init(&ctx); - EVP_CipherInit_ex(&ctx, EVP_rc4(), NULL, k3_c.checksum.data, NULL, 0); - EVP_Cipher(&ctx, cdata + 16, cdata + 16, len - 16); - EVP_CIPHER_CTX_cleanup(&ctx); + ctx = EVP_CIPHER_CTX_new(); + if (ctx == NULL) + krb5_abortx(context, "malloc failed"); + EVP_CipherInit_ex(ctx, EVP_rc4(), NULL, k3_c.checksum.data, NULL, 0); + EVP_Cipher(ctx, cdata + 16, cdata + 16, len - 16); + EVP_CIPHER_CTX_free(ctx); ke.key = &kb; kb.keyvalue = k2_c.checksum; diff --git a/crypto/heimdal/lib/krb5/crypto-des-common.c b/crypto/heimdal/lib/krb5/crypto-des-common.c index f8313952dc7..60951d33e96 100644 --- a/crypto/heimdal/lib/krb5/crypto-des-common.c +++ b/crypto/heimdal/lib/krb5/crypto-des-common.c @@ -81,8 +81,8 @@ _krb5_des_checksum(krb5_context context, EVP_DigestFinal_ex (m, p + 8, NULL); EVP_MD_CTX_destroy(m); memset (&ivec, 0, sizeof(ivec)); - EVP_CipherInit_ex(&ctx->ectx, NULL, NULL, NULL, (void *)&ivec, -1); - EVP_Cipher(&ctx->ectx, p, p, 24); + EVP_CipherInit_ex(ctx->ectx, NULL, NULL, NULL, (void *)&ivec, -1); + EVP_Cipher(ctx->ectx, p, p, 24); return 0; } @@ -109,8 +109,8 @@ _krb5_des_verify(krb5_context context, } memset(&ivec, 0, sizeof(ivec)); - EVP_CipherInit_ex(&ctx->dctx, NULL, NULL, NULL, (void *)&ivec, -1); - EVP_Cipher(&ctx->dctx, tmp, C->checksum.data, 24); + EVP_CipherInit_ex(ctx->dctx, NULL, NULL, NULL, (void *)&ivec, -1); + EVP_Cipher(ctx->dctx, tmp, C->checksum.data, 24); EVP_DigestInit_ex(m, evp_md, NULL); EVP_DigestUpdate(m, tmp, 8); /* confounder */ diff --git a/crypto/heimdal/lib/krb5/crypto-des.c b/crypto/heimdal/lib/krb5/crypto-des.c index f6f1c6881c9..70924d1d403 100644 --- a/crypto/heimdal/lib/krb5/crypto-des.c +++ b/crypto/heimdal/lib/krb5/crypto-des.c @@ -225,7 +225,7 @@ evp_des_encrypt_null_ivec(krb5_context context, EVP_CIPHER_CTX *c; DES_cblock ivec; memset(&ivec, 0, sizeof(ivec)); - c = encryptp ? &ctx->ectx : &ctx->dctx; + c = encryptp ? ctx->ectx : ctx->dctx; EVP_CipherInit_ex(c, NULL, NULL, NULL, (void *)&ivec, -1); EVP_Cipher(c, data, data, len); return 0; @@ -244,7 +244,7 @@ evp_des_encrypt_key_ivec(krb5_context context, EVP_CIPHER_CTX *c; DES_cblock ivec; memcpy(&ivec, key->key->keyvalue.data, sizeof(ivec)); - c = encryptp ? &ctx->ectx : &ctx->dctx; + c = encryptp ? ctx->ectx : ctx->dctx; EVP_CipherInit_ex(c, NULL, NULL, NULL, (void *)&ivec, -1); EVP_Cipher(c, data, data, len); return 0; diff --git a/crypto/heimdal/lib/krb5/crypto-evp.c b/crypto/heimdal/lib/krb5/crypto-evp.c index e8fb1caf6ae..55b494856e2 100644 --- a/crypto/heimdal/lib/krb5/crypto-evp.c +++ b/crypto/heimdal/lib/krb5/crypto-evp.c @@ -41,19 +41,21 @@ _krb5_evp_schedule(krb5_context context, struct _krb5_evp_schedule *key = kd->schedule->data; const EVP_CIPHER *c = (*kt->evp)(); - EVP_CIPHER_CTX_init(&key->ectx); - EVP_CIPHER_CTX_init(&key->dctx); + key->ectx = EVP_CIPHER_CTX_new(); + key->dctx = EVP_CIPHER_CTX_new(); + if (key->ectx == NULL || key->dctx == NULL) + krb5_abort(context, ENOMEM, "malloc failed"); - EVP_CipherInit_ex(&key->ectx, c, NULL, kd->key->keyvalue.data, NULL, 1); - EVP_CipherInit_ex(&key->dctx, c, NULL, kd->key->keyvalue.data, NULL, 0); + EVP_CipherInit_ex(key->ectx, c, NULL, kd->key->keyvalue.data, NULL, 1); + EVP_CipherInit_ex(key->dctx, c, NULL, kd->key->keyvalue.data, NULL, 0); } void _krb5_evp_cleanup(krb5_context context, struct _krb5_key_data *kd) { struct _krb5_evp_schedule *key = kd->schedule->data; - EVP_CIPHER_CTX_cleanup(&key->ectx); - EVP_CIPHER_CTX_cleanup(&key->dctx); + EVP_CIPHER_CTX_free(key->ectx); + EVP_CIPHER_CTX_free(key->dctx); } krb5_error_code @@ -67,7 +69,7 @@ _krb5_evp_encrypt(krb5_context context, { struct _krb5_evp_schedule *ctx = key->schedule->data; EVP_CIPHER_CTX *c; - c = encryptp ? &ctx->ectx : &ctx->dctx; + c = encryptp ? ctx->ectx : ctx->dctx; if (ivec == NULL) { /* alloca ? */ size_t len2 = EVP_CIPHER_CTX_iv_length(c); @@ -102,7 +104,7 @@ _krb5_evp_encrypt_cts(krb5_context context, EVP_CIPHER_CTX *c; unsigned char *p; - c = encryptp ? &ctx->ectx : &ctx->dctx; + c = encryptp ? ctx->ectx : ctx->dctx; blocksize = EVP_CIPHER_CTX_block_size(c); diff --git a/crypto/heimdal/lib/krb5/crypto-rand.c b/crypto/heimdal/lib/krb5/crypto-rand.c index 49bd6793625..5ff4d84cee7 100644 --- a/crypto/heimdal/lib/krb5/crypto-rand.c +++ b/crypto/heimdal/lib/krb5/crypto-rand.c @@ -63,6 +63,7 @@ seed_something(void) we do not have to deal with it. */ if (RAND_status() != 1) { #ifndef _WIN32 +#ifndef OPENSSL_NO_EGD krb5_context context; const char *p; @@ -74,6 +75,7 @@ seed_something(void) RAND_egd_bytes(p, ENTROPY_NEEDED); krb5_free_context(context); } +#endif #else /* TODO: Once a Windows CryptoAPI RAND method is defined, we can use that and failover to another method. */ diff --git a/crypto/heimdal/lib/krb5/crypto.h b/crypto/heimdal/lib/krb5/crypto.h index 9b95b8f0cbc..546480b28be 100644 --- a/crypto/heimdal/lib/krb5/crypto.h +++ b/crypto/heimdal/lib/krb5/crypto.h @@ -174,6 +174,6 @@ extern int _krb5_num_etypes; /* Interface to the EVP crypto layer provided by hcrypto */ struct _krb5_evp_schedule { - EVP_CIPHER_CTX ectx; - EVP_CIPHER_CTX dctx; + EVP_CIPHER_CTX *ectx; + EVP_CIPHER_CTX *dctx; }; diff --git a/crypto/heimdal/lib/krb5/pkinit.c b/crypto/heimdal/lib/krb5/pkinit.c index 1103a17807b..7164a118c34 100644 --- a/crypto/heimdal/lib/krb5/pkinit.c +++ b/crypto/heimdal/lib/krb5/pkinit.c @@ -101,7 +101,7 @@ _krb5_pk_cert_free(struct krb5_pk_cert *cert) } static krb5_error_code -BN_to_integer(krb5_context context, BIGNUM *bn, heim_integer *integer) +BN_to_integer(krb5_context context, const BIGNUM *bn, heim_integer *integer) { integer->length = BN_num_bytes(bn); integer->data = malloc(integer->length); @@ -134,6 +134,7 @@ select_dh_group(krb5_context context, DH *dh, unsigned long bits, struct krb5_dh_moduli **moduli) { const struct krb5_dh_moduli *m; + BIGNUM *p, *g, *q; if (bits == 0) { m = moduli[1]; /* XXX */ @@ -155,15 +156,22 @@ select_dh_group(krb5_context context, DH *dh, unsigned long bits, m = moduli[i]; } - dh->p = integer_to_BN(context, "p", &m->p); - if (dh->p == NULL) - return ENOMEM; - dh->g = integer_to_BN(context, "g", &m->g); - if (dh->g == NULL) - return ENOMEM; - dh->q = integer_to_BN(context, "q", &m->q); - if (dh->q == NULL) + p = integer_to_BN(context, "p", &m->p); + g = integer_to_BN(context, "g", &m->g); + q = integer_to_BN(context, "q", &m->q); + if (p == NULL || g == NULL || q == NULL) { + BN_free(p); + BN_free(g); + BN_free(q); return ENOMEM; + } + + if (DH_set0_pqg(dh, p, q, g) != 1) { + BN_free(p); + BN_free(g); + BN_free(q); + return EINVAL; + } return 0; } @@ -477,6 +485,7 @@ build_auth_pack(krb5_context context, if (ctx->keyex == USE_DH) { DH *dh = ctx->u.dh; + const BIGNUM *p, *g, *q, *pub_key; DomainParameters dp; heim_integer dh_pub_key; @@ -487,17 +496,18 @@ build_auth_pack(krb5_context context, memset(&dp, 0, sizeof(dp)); - ret = BN_to_integer(context, dh->p, &dp.p); + DH_get0_pqg(dh, &p, &q, &g); + ret = BN_to_integer(context, p, &dp.p); if (ret) { free_DomainParameters(&dp); return ret; } - ret = BN_to_integer(context, dh->g, &dp.g); + ret = BN_to_integer(context, g, &dp.g); if (ret) { free_DomainParameters(&dp); return ret; } - ret = BN_to_integer(context, dh->q, &dp.q); + ret = BN_to_integer(context, q, &dp.q); if (ret) { free_DomainParameters(&dp); return ret; @@ -522,7 +532,8 @@ build_auth_pack(krb5_context context, if (size != a->clientPublicValue->algorithm.parameters->length) krb5_abortx(context, "Internal ASN1 encoder error"); - ret = BN_to_integer(context, dh->pub_key, &dh_pub_key); + DH_get0_key(dh, &pub_key, NULL); + ret = BN_to_integer(context, pub_key, &dh_pub_key); if (ret) return ret; diff --git a/crypto/heimdal/lib/ntlm/heimntlm-protos.h b/crypto/heimdal/lib/ntlm/heimntlm-protos.h index 5f56536ffc3..e06c1f3c373 100644 --- a/crypto/heimdal/lib/ntlm/heimntlm-protos.h +++ b/crypto/heimdal/lib/ntlm/heimntlm-protos.h @@ -87,7 +87,7 @@ heim_ntlm_decode_type3 ( int /*ucs2*/, struct ntlm_type3 */*type3*/); -void +int heim_ntlm_derive_ntlm2_sess ( const unsigned char sessionkey[16], const unsigned char */*clnt_nonce*/, diff --git a/crypto/heimdal/lib/ntlm/ntlm.c b/crypto/heimdal/lib/ntlm/ntlm.c index 7aafc8c0aa7..3ce8d28e527 100644 --- a/crypto/heimdal/lib/ntlm/ntlm.c +++ b/crypto/heimdal/lib/ntlm/ntlm.c @@ -1011,12 +1011,12 @@ out: * */ -static void +static int splitandenc(unsigned char *hash, unsigned char *challenge, unsigned char *answer) { - EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX *ctx; unsigned char key[8]; key[0] = hash[0]; @@ -1028,12 +1028,15 @@ splitandenc(unsigned char *hash, key[6] = (hash[5] << 2) | (hash[6] >> 6); key[7] = (hash[6] << 1); - EVP_CIPHER_CTX_init(&ctx); + ctx = EVP_CIPHER_CTX_new(); + if (ctx == NULL) + return ENOMEM; - EVP_CipherInit_ex(&ctx, EVP_des_cbc(), NULL, key, NULL, 1); - EVP_Cipher(&ctx, answer, challenge, 8); - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CipherInit_ex(ctx, EVP_des_cbc(), NULL, key, NULL, 1); + EVP_Cipher(ctx, answer, challenge, 8); + EVP_CIPHER_CTX_free(ctx); memset(key, 0, sizeof(key)); + return 0; } /** @@ -1102,6 +1105,7 @@ heim_ntlm_calculate_ntlm1(void *key, size_t len, struct ntlm_buf *answer) { unsigned char res[21]; + int ret; if (len != MD4_DIGEST_LENGTH) return HNTLM_ERR_INVALID_LENGTH; @@ -1114,11 +1118,21 @@ heim_ntlm_calculate_ntlm1(void *key, size_t len, return ENOMEM; answer->length = 24; - splitandenc(&res[0], challenge, ((unsigned char *)answer->data) + 0); - splitandenc(&res[7], challenge, ((unsigned char *)answer->data) + 8); - splitandenc(&res[14], challenge, ((unsigned char *)answer->data) + 16); + ret = splitandenc(&res[0], challenge, ((unsigned char *)answer->data) + 0); + if (ret) + goto out; + ret = splitandenc(&res[7], challenge, ((unsigned char *)answer->data) + 8); + if (ret) + goto out; + ret = splitandenc(&res[14], challenge, ((unsigned char *)answer->data) + 16); + if (ret) + goto out; return 0; + +out: + heim_ntlm_free_buf(answer); + return ret; } int @@ -1153,7 +1167,7 @@ heim_ntlm_v2_base_session(void *key, size_t len, struct ntlm_buf *session) { unsigned int hmaclen; - HMAC_CTX c; + HMAC_CTX *c; if (ntlmResponse->length <= 16) return HNTLM_ERR_INVALID_LENGTH; @@ -1164,11 +1178,15 @@ heim_ntlm_v2_base_session(void *key, size_t len, session->length = 16; /* Note: key is the NTLMv2 key */ - HMAC_CTX_init(&c); - HMAC_Init_ex(&c, key, len, EVP_md5(), NULL); - HMAC_Update(&c, ntlmResponse->data, 16); - HMAC_Final(&c, session->data, &hmaclen); - HMAC_CTX_cleanup(&c); + c = HMAC_CTX_new(); + if (c == NULL) { + heim_ntlm_free_buf(session); + return ENOMEM; + } + HMAC_Init_ex(c, key, len, EVP_md5(), NULL); + HMAC_Update(c, ntlmResponse->data, 16); + HMAC_Final(c, session->data, &hmaclen); + HMAC_CTX_free(c); return 0; } @@ -1179,7 +1197,7 @@ heim_ntlm_keyex_wrap(struct ntlm_buf *base_session, struct ntlm_buf *session, struct ntlm_buf *encryptedSession) { - EVP_CIPHER_CTX c; + EVP_CIPHER_CTX *c; int ret; session->length = MD4_DIGEST_LENGTH; @@ -1196,25 +1214,30 @@ heim_ntlm_keyex_wrap(struct ntlm_buf *base_session, return ENOMEM; } - EVP_CIPHER_CTX_init(&c); + c = EVP_CIPHER_CTX_new(); + if (c == NULL) { + heim_ntlm_free_buf(encryptedSession); + heim_ntlm_free_buf(session); + return ENOMEM; + } - ret = EVP_CipherInit_ex(&c, EVP_rc4(), NULL, base_session->data, NULL, 1); + ret = EVP_CipherInit_ex(c, EVP_rc4(), NULL, base_session->data, NULL, 1); if (ret != 1) { - EVP_CIPHER_CTX_cleanup(&c); + EVP_CIPHER_CTX_free(c); heim_ntlm_free_buf(encryptedSession); heim_ntlm_free_buf(session); return HNTLM_ERR_CRYPTO; } if (RAND_bytes(session->data, session->length) != 1) { - EVP_CIPHER_CTX_cleanup(&c); + EVP_CIPHER_CTX_free(c); heim_ntlm_free_buf(encryptedSession); heim_ntlm_free_buf(session); return HNTLM_ERR_RAND; } - EVP_Cipher(&c, encryptedSession->data, session->data, encryptedSession->length); - EVP_CIPHER_CTX_cleanup(&c); + EVP_Cipher(c, encryptedSession->data, session->data, encryptedSession->length); + EVP_CIPHER_CTX_free(c); return 0; @@ -1309,7 +1332,7 @@ heim_ntlm_keyex_unwrap(struct ntlm_buf *baseKey, struct ntlm_buf *encryptedSession, struct ntlm_buf *session) { - EVP_CIPHER_CTX c; + EVP_CIPHER_CTX *c; memset(session, 0, sizeof(*session)); @@ -1322,16 +1345,20 @@ heim_ntlm_keyex_unwrap(struct ntlm_buf *baseKey, session->length = 0; return ENOMEM; } - EVP_CIPHER_CTX_init(&c); + c = EVP_CIPHER_CTX_new(); + if (c == NULL) { + heim_ntlm_free_buf(session); + return ENOMEM; + } - if (EVP_CipherInit_ex(&c, EVP_rc4(), NULL, baseKey->data, NULL, 0) != 1) { - EVP_CIPHER_CTX_cleanup(&c); + if (EVP_CipherInit_ex(c, EVP_rc4(), NULL, baseKey->data, NULL, 0) != 1) { + EVP_CIPHER_CTX_free(c); heim_ntlm_free_buf(session); return HNTLM_ERR_CRYPTO; } - EVP_Cipher(&c, session->data, encryptedSession->data, session->length); - EVP_CIPHER_CTX_cleanup(&c); + EVP_Cipher(c, session->data, encryptedSession->data, session->length); + EVP_CIPHER_CTX_free(c); return 0; } @@ -1359,28 +1386,30 @@ heim_ntlm_ntlmv2_key(const void *key, size_t len, { int ret; unsigned int hmaclen; - HMAC_CTX c; + HMAC_CTX *c; - HMAC_CTX_init(&c); - HMAC_Init_ex(&c, key, len, EVP_md5(), NULL); + c = HMAC_CTX_new(); + if (c == NULL) + return ENOMEM; + HMAC_Init_ex(c, key, len, EVP_md5(), NULL); { struct ntlm_buf buf; /* uppercase username and turn it into ucs2-le */ ret = ascii2ucs2le(username, 1, &buf); if (ret) goto out; - HMAC_Update(&c, buf.data, buf.length); + HMAC_Update(c, buf.data, buf.length); free(buf.data); /* uppercase target and turn into ucs2-le */ ret = ascii2ucs2le(target, 1, &buf); if (ret) goto out; - HMAC_Update(&c, buf.data, buf.length); + HMAC_Update(c, buf.data, buf.length); free(buf.data); } - HMAC_Final(&c, ntlmv2, &hmaclen); + HMAC_Final(c, ntlmv2, &hmaclen); out: - HMAC_CTX_cleanup(&c); + HMAC_CTX_free(c); return ret; } @@ -1434,6 +1463,7 @@ heim_ntlm_calculate_lm2(const void *key, size_t len, struct ntlm_buf *answer) { unsigned char clientchallenge[8]; + int ret; if (RAND_bytes(clientchallenge, sizeof(clientchallenge)) != 1) return HNTLM_ERR_RAND; @@ -1447,8 +1477,10 @@ heim_ntlm_calculate_lm2(const void *key, size_t len, return ENOMEM; answer->length = 24; - heim_ntlm_derive_ntlm2_sess(ntlmv2, clientchallenge, 8, + ret = heim_ntlm_derive_ntlm2_sess(ntlmv2, clientchallenge, 8, serverchallenge, answer->data); + if (ret) + return ret; memcpy(((uint8_t *)answer->data) + 16, clientchallenge, 8); @@ -1489,6 +1521,7 @@ heim_ntlm_calculate_ntlm2(const void *key, size_t len, krb5_storage *sp; unsigned char clientchallenge[8]; uint64_t t; + int code; t = unix2nttime(time(NULL)); @@ -1523,7 +1556,11 @@ heim_ntlm_calculate_ntlm2(const void *key, size_t len, krb5_storage_free(sp); sp = NULL; - heim_ntlm_derive_ntlm2_sess(ntlmv2, data.data, data.length, serverchallenge, ntlmv2answer); + code = heim_ntlm_derive_ntlm2_sess(ntlmv2, data.data, data.length, serverchallenge, ntlmv2answer); + if (code) { + krb5_data_free(&data); + return code; + } sp = krb5_storage_emem(); if (sp == NULL) { @@ -1588,6 +1625,7 @@ heim_ntlm_verify_ntlm2(const void *key, size_t len, time_t authtime; uint32_t temp; uint64_t t; + int code; infotarget->length = 0; infotarget->data = NULL; @@ -1651,10 +1689,12 @@ heim_ntlm_verify_ntlm2(const void *key, size_t len, goto out; } - heim_ntlm_derive_ntlm2_sess(ntlmv2, + ret = heim_ntlm_derive_ntlm2_sess(ntlmv2, ((unsigned char *)answer->data) + 16, answer->length - 16, serverchallenge, serveranswer); + if (ret) + goto out; if (memcmp(serveranswer, clientanswer, 16) != 0) { heim_ntlm_free_buf(infotarget); @@ -1724,11 +1764,22 @@ heim_ntlm_calculate_ntlm2_sess(const unsigned char clnt_nonce[8], memcpy(res, ntlm_hash, 16); resp = ntlm->data; - splitandenc(&res[0], ntlm2_sess_hash, resp + 0); - splitandenc(&res[7], ntlm2_sess_hash, resp + 8); - splitandenc(&res[14], ntlm2_sess_hash, resp + 16); + code = splitandenc(&res[0], ntlm2_sess_hash, resp + 0); + if (code) + goto out; + code = splitandenc(&res[7], ntlm2_sess_hash, resp + 8); + if (code) + goto out; + code = splitandenc(&res[14], ntlm2_sess_hash, resp + 16); + if (code) + goto out; return 0; + +out: + heim_ntlm_free_buf(ntlm); + heim_ntlm_free_buf(lm); + return code; } @@ -1783,21 +1834,24 @@ heim_ntlm_calculate_ntlm2_sess_hash(const unsigned char clnt_nonce[8], * @ingroup ntlm_core */ -void +int heim_ntlm_derive_ntlm2_sess(const unsigned char sessionkey[16], const unsigned char *clnt_nonce, size_t clnt_nonce_length, const unsigned char svr_chal[8], unsigned char derivedkey[16]) { unsigned int hmaclen; - HMAC_CTX c; + HMAC_CTX *c; /* HMAC(Ksession, serverchallenge || clientchallenge) */ - HMAC_CTX_init(&c); - HMAC_Init_ex(&c, sessionkey, 16, EVP_md5(), NULL); - HMAC_Update(&c, svr_chal, 8); - HMAC_Update(&c, clnt_nonce, clnt_nonce_length); - HMAC_Final(&c, derivedkey, &hmaclen); - HMAC_CTX_cleanup(&c); + c = HMAC_CTX_new(); + if (c == NULL) + return ENOMEM; + HMAC_Init_ex(c, sessionkey, 16, EVP_md5(), NULL); + HMAC_Update(c, svr_chal, 8); + HMAC_Update(c, clnt_nonce, clnt_nonce_length); + HMAC_Final(c, derivedkey, &hmaclen); + HMAC_CTX_free(c); + return 0; } diff --git a/crypto/heimdal/lib/roken/snprintf.c b/crypto/heimdal/lib/roken/snprintf.c index 88e996c671f..1b8e5458e64 100644 --- a/crypto/heimdal/lib/roken/snprintf.c +++ b/crypto/heimdal/lib/roken/snprintf.c @@ -498,7 +498,7 @@ xyzprintf (struct snprintf_state *state, const char *char_format, va_list ap) break; } case 'p' : { - u_longest arg = (u_longest)va_arg(ap, void*); + u_longest arg = (uintptr_t)va_arg(ap, void*); len += append_number (state, arg, 0x10, "0123456789ABCDEF", width, prec, flags, 0); diff --git a/kerberos5/Makefile.inc b/kerberos5/Makefile.inc index eeb8d3a20bb..5ca8f73faf9 100644 --- a/kerberos5/Makefile.inc +++ b/kerberos5/Makefile.inc @@ -8,6 +8,10 @@ KRB5DIR= ${SRCTOP}/crypto/heimdal CFLAGS+= -DHAVE_CONFIG_H -I${.CURDIR:H:H}/include +WARNS?= 1 +CWARNFLAGS.clang+= -Wno-error=absolute-value +CWARNFLAGS+= -Wno-error=deprecated-declarations + .if ${MK_OPENLDAP} != "no" && !defined(COMPAT_32BIT) OPENLDAPBASE?= /usr/local LDAPLDADD= -lldap -llber diff --git a/kerberos5/include/crypto-headers.h b/kerberos5/include/crypto-headers.h index dceebce0330..625c8083a6e 100644 --- a/kerberos5/include/crypto-headers.h +++ b/kerberos5/include/crypto-headers.h @@ -18,9 +18,5 @@ #include #include #include -#ifndef BN_is_negative -#define BN_set_negative(bn, flag) ((bn)->neg=(flag)?1:0) -#define BN_is_negative(bn) ((bn)->neg != 0) -#endif #endif /* __crypto_headers_h__ */ From c4cff941344a444687a72b932a40ea71cb1e63dc Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Fri, 5 Oct 2018 20:49:54 +0000 Subject: [PATCH 5/6] libcrypto: have buildinf.h depend on Makefile So that it will be regenerated after Makefile changes affecting the file's content - specifically, the OpenSSL 1.1.1 update adds a DATE macro which did not exist previously. Sponsored by: The FreeBSD Foundation --- secure/lib/libcrypto/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/secure/lib/libcrypto/Makefile b/secure/lib/libcrypto/Makefile index 564c031930c..459a16c4b64 100644 --- a/secure/lib/libcrypto/Makefile +++ b/secure/lib/libcrypto/Makefile @@ -430,7 +430,7 @@ SRCS+= buildinf.h CLEANDIRS= openssl CLEANFILES= buildinf.h opensslconf.h opensslconf.h.tmp -buildinf.h: +buildinf.h: Makefile ( echo "/*"; \ echo " * WARNING: do not edit!"; \ echo " * Generated by ${.ALLSRC}"; \ From 4660a83eac83eb44ce9b8b15f76bca34646048c0 Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Tue, 9 Oct 2018 17:29:31 +0000 Subject: [PATCH 6/6] Regenerate ssh_namespace.h for OpenSSL 1.1.1 update --- crypto/openssh/ssh_namespace.h | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/crypto/openssh/ssh_namespace.h b/crypto/openssh/ssh_namespace.h index c14e9a87b03..2f839fee072 100644 --- a/crypto/openssh/ssh_namespace.h +++ b/crypto/openssh/ssh_namespace.h @@ -8,37 +8,8 @@ #define Blowfish_expandstate Fssh_Blowfish_expandstate #define Blowfish_initstate Fssh_Blowfish_initstate #define Blowfish_stream2word Fssh_Blowfish_stream2word -#define DH_get0_key Fssh_DH_get0_key -#define DH_get0_pqg Fssh_DH_get0_pqg -#define DH_set0_key Fssh_DH_set0_key -#define DH_set0_pqg Fssh_DH_set0_pqg -#define DH_set_length Fssh_DH_set_length -#define DSA_SIG_get0 Fssh_DSA_SIG_get0 -#define DSA_SIG_set0 Fssh_DSA_SIG_set0 -#define DSA_get0_key Fssh_DSA_get0_key -#define DSA_get0_pqg Fssh_DSA_get0_pqg -#define DSA_set0_key Fssh_DSA_set0_key -#define DSA_set0_pqg Fssh_DSA_set0_pqg -#define ECDSA_SIG_get0 Fssh_ECDSA_SIG_get0 -#define ECDSA_SIG_set0 Fssh_ECDSA_SIG_set0 #define EVP_CIPHER_CTX_get_iv Fssh_EVP_CIPHER_CTX_get_iv #define EVP_CIPHER_CTX_set_iv Fssh_EVP_CIPHER_CTX_set_iv -#define EVP_MD_CTX_free Fssh_EVP_MD_CTX_free -#define EVP_MD_CTX_new Fssh_EVP_MD_CTX_new -#define EVP_PKEY_get0_RSA Fssh_EVP_PKEY_get0_RSA -#define RSA_get0_crt_params Fssh_RSA_get0_crt_params -#define RSA_get0_factors Fssh_RSA_get0_factors -#define RSA_get0_key Fssh_RSA_get0_key -#define RSA_meth_dup Fssh_RSA_meth_dup -#define RSA_meth_free Fssh_RSA_meth_free -#define RSA_meth_get_finish Fssh_RSA_meth_get_finish -#define RSA_meth_set1_name Fssh_RSA_meth_set1_name -#define RSA_meth_set_finish Fssh_RSA_meth_set_finish -#define RSA_meth_set_priv_dec Fssh_RSA_meth_set_priv_dec -#define RSA_meth_set_priv_enc Fssh_RSA_meth_set_priv_enc -#define RSA_set0_crt_params Fssh_RSA_set0_crt_params -#define RSA_set0_factors Fssh_RSA_set0_factors -#define RSA_set0_key Fssh_RSA_set0_key #define _ssh__compat_glob Fssh__ssh__compat_glob #define _ssh__compat_globfree Fssh__ssh__compat_globfree #define _ssh_compat_realpath Fssh__ssh_compat_realpath