
169 changed files with 74076 additions and 0 deletions
@ -0,0 +1,82 @@
@@ -0,0 +1,82 @@
|
||||
UTF8 := $(shell locale -c LC_CTYPE -k | grep -q charmap.*UTF-8 && echo -utf8) |
||||
DAYS=365 |
||||
KEYLEN=2048 |
||||
TYPE=rsa:$(KEYLEN) |
||||
EXTRA_FLAGS= |
||||
ifdef SERIAL |
||||
EXTRA_FLAGS+=-set_serial $(SERIAL) |
||||
endif |
||||
|
||||
.PHONY: usage |
||||
.SUFFIXES: .key .csr .crt .pem |
||||
.PRECIOUS: %.key %.csr %.crt %.pem |
||||
|
||||
usage: |
||||
@echo "This makefile allows you to create:" |
||||
@echo " o public/private key pairs" |
||||
@echo " o SSL certificate signing requests (CSRs)" |
||||
@echo " o self-signed SSL test certificates" |
||||
@echo |
||||
@echo "To create a key pair, run \"make SOMETHING.key\"." |
||||
@echo "To create a CSR, run \"make SOMETHING.csr\"." |
||||
@echo "To create a test certificate, run \"make SOMETHING.crt\"." |
||||
@echo "To create a key and a test certificate in one file, run \"make SOMETHING.pem\"." |
||||
@echo |
||||
@echo "To create a key for use with Apache, run \"make genkey\"." |
||||
@echo "To create a CSR for use with Apache, run \"make certreq\"." |
||||
@echo "To create a test certificate for use with Apache, run \"make testcert\"." |
||||
@echo |
||||
@echo "To create a test certificate with serial number other than random, add SERIAL=num" |
||||
@echo "You can also specify key length with KEYLEN=n and expiration in days with DAYS=n" |
||||
@echo "Any additional options can be passed to openssl req via EXTRA_FLAGS" |
||||
@echo |
||||
@echo Examples: |
||||
@echo " make server.key" |
||||
@echo " make server.csr" |
||||
@echo " make server.crt" |
||||
@echo " make stunnel.pem" |
||||
@echo " make genkey" |
||||
@echo " make certreq" |
||||
@echo " make testcert" |
||||
@echo " make server.crt SERIAL=1" |
||||
@echo " make stunnel.pem EXTRA_FLAGS=-sha384" |
||||
@echo " make testcert DAYS=600" |
||||
|
||||
%.pem: |
||||
umask 77 ; \ |
||||
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ |
||||
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ |
||||
/usr/bin/openssl req $(UTF8) -newkey $(TYPE) -keyout $$PEM1 -nodes -x509 -days $(DAYS) -out $$PEM2 $(EXTRA_FLAGS) ; \ |
||||
cat $$PEM1 > $@ ; \ |
||||
echo "" >> $@ ; \ |
||||
cat $$PEM2 >> $@ ; \ |
||||
$(RM) $$PEM1 $$PEM2 |
||||
|
||||
%.key: |
||||
umask 77 ; \ |
||||
/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@ |
||||
|
||||
%.csr: %.key |
||||
umask 77 ; \ |
||||
/usr/bin/openssl req $(UTF8) -new -key $^ -out $@ |
||||
|
||||
%.crt: %.key |
||||
umask 77 ; \ |
||||
/usr/bin/openssl req $(UTF8) -new -key $^ -x509 -days $(DAYS) -out $@ $(EXTRA_FLAGS) |
||||
|
||||
TLSROOT=/etc/pki/tls |
||||
KEY=$(TLSROOT)/private/localhost.key |
||||
CSR=$(TLSROOT)/certs/localhost.csr |
||||
CRT=$(TLSROOT)/certs/localhost.crt |
||||
|
||||
genkey: $(KEY) |
||||
certreq: $(CSR) |
||||
testcert: $(CRT) |
||||
|
||||
$(CSR): $(KEY) |
||||
umask 77 ; \ |
||||
/usr/bin/openssl req $(UTF8) -new -key $(KEY) -out $(CSR) |
||||
|
||||
$(CRT): $(KEY) |
||||
umask 77 ; \ |
||||
/usr/bin/openssl req $(UTF8) -new -key $(KEY) -x509 -days $(DAYS) -out $(CRT) $(EXTRA_FLAGS) |
@ -0,0 +1,75 @@
@@ -0,0 +1,75 @@
|
||||
User guide for the FIPS Red Hat Enterprise Linux - OpenSSL Module |
||||
================================================================= |
||||
|
||||
This package contains libraries which comprise the FIPS 140-2 |
||||
Red Hat Enterprise Linux - OPENSSL Module. |
||||
|
||||
The module files |
||||
================ |
||||
/usr/lib[64]/libcrypto.so.1.0.2j |
||||
/usr/lib[64]/libssl.so.1.0.2j |
||||
/usr/lib[64]/.libcrypto.so.1.0.2j.hmac |
||||
/usr/lib[64]/.libssl.so.1.0.2j.hmac |
||||
|
||||
Dependencies |
||||
============ |
||||
|
||||
The approved mode of operation requires kernel with /dev/urandom RNG running |
||||
with properties as defined in the security policy of the module. This is |
||||
provided by kernel packages with validated Red Hat Enterprise Linux - IPSec |
||||
Crytographic Module. |
||||
|
||||
Installation |
||||
============ |
||||
|
||||
The RPM package of the module can be installed by standard tools recommended |
||||
for installation of RPM packages on the Red Hat Enterprise Linux system (yum, |
||||
rpm, RHN remote management tool). |
||||
|
||||
For proper operation of the in-module integrity verification the prelink has to |
||||
be disabled. This can be done with setting PRELINKING=no in the |
||||
/etc/sysconfig/prelink configuration file. If the libraries were already |
||||
prelinked the prelink should be undone on all the system files with the |
||||
'prelink -u -a' command. |
||||
|
||||
Usage and API |
||||
============= |
||||
|
||||
The module respects kernel command line FIPS setting. If the kernel command |
||||
line contains option fips=1 the module will initialize in the FIPS approved |
||||
mode of operation automatically. To allow for the automatic initialization the |
||||
application using the module has to call one of the following API calls: |
||||
|
||||
- void OPENSSL_init_library(void) - this will do only a basic initialization |
||||
of the library and does initialization of the FIPS approved mode without setting |
||||
up EVP API with supported algorithms. |
||||
|
||||
- void OPENSSL_add_all_algorithms(void) - this API function calls |
||||
OPENSSL_init() implicitly and also adds all approved algorithms to the EVP API |
||||
in the approved mode |
||||
|
||||
- void SSL_library_init(void) - it calls OPENSSL_init() implicitly and also |
||||
adds algorithms which are necessary for TLS protocol support and initializes |
||||
the SSL library. |
||||
|
||||
To explicitely put the library to the approved mode the application can call |
||||
the following function: |
||||
|
||||
- int FIPS_mode_set(int on) - if called with 1 as a parameter it will switch |
||||
the library from the non-approved to the approved mode. If any of the selftests |
||||
and integrity verification tests fail, the library is put into the error state |
||||
and 0 is returned. If they succeed the return value is 1. |
||||
|
||||
To query the module whether it is in the approved mode or not: |
||||
|
||||
- int FIPS_mode(void) - returns 1 if the module is in the approved mode, |
||||
0 otherwise. |
||||
|
||||
To query whether the module is in the error state: |
||||
|
||||
- int FIPS_selftest_failed(void) - returns 1 if the module is in the error |
||||
state, 0 otherwise. |
||||
|
||||
To zeroize the FIPS RNG key and internal state the application calls: |
||||
|
||||
- void RAND_cleanup(void) |
@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
|
||||
Guide for legacy support enablement |
||||
=================================== |
||||
|
||||
To improve security provided by use of OpenSSL especially in context of |
||||
TLS connections we regularly review and deprecate algorithms and algorithm |
||||
settings which are no longer viewed as secure. |
||||
|
||||
For some of these deprecated algorithms we provide a way for the |
||||
system administrator to reenable them. |
||||
|
||||
Deprecated algorithms, protocols and settings in OpenSSL |
||||
======================================================== |
||||
|
||||
Previous Red Hat Enterprise Linux 7 update releases: |
||||
|
||||
* SSL2 protocol disabled by default. |
||||
* Minimum DH group size accepted by SSL/TLS client 768 bits. |
||||
* Verification of certificates and signatures using MD5 hash |
||||
disabled. |
||||
|
||||
Red Hat Enterprise Linux 7.4: |
||||
|
||||
* SSL2 protocol support completely disabled (cannot be re-enabled). |
||||
* All SSL/TLS export ciphers disabled. |
||||
* All SSL/TLS ciphersuites with keys smaller than 128 bits disabled. |
||||
* Minimum DH group size accepted by SSL/TLS client 1024 bits. |
||||
* Disabled support for verification of certificates and signatures |
||||
using MD2, MD4, MD5, and SHA0 hashes. |
||||
|
||||
Legacy support enablement |
||||
========================= |
||||
|
||||
The OpenSSL now supports /etc/pki/tls/legacy-settings configuration file |
||||
which can be created by the system administrator which contains lines with |
||||
simple Key Value pairs. |
||||
|
||||
The library recognizes the following possible configuration settings in |
||||
that file: |
||||
|
||||
LegacySigningMDs md2 md5 |
||||
MinimumDHBits 512 |
||||
|
||||
The LegacySigningMDs option allows reenabling support for verification of |
||||
signatures with the specified hash algorithms. These can be any combination |
||||
of md2, md4, md5 and sha. (sha represents SHA0 algorithm, not SHA1.) Any |
||||
unrecognized algorithms are ignored. |
||||
|
||||
The MinimumDHBits option allows setting of the minimum bit size of DH group |
||||
accepted by SSL/TLS client. It can be any value between 512 and 10000. |
||||
|
||||
If the configuration file is not present the built-in defaults (that is the |
||||
secure defaults) are used. Any unrecognized lines (with other parameter |
||||
names or comments) are ignored. |
@ -0,0 +1,455 @@
@@ -0,0 +1,455 @@
|
||||
/* crypto/ec/ec_curve.c */ |
||||
/* |
||||
* Written by Nils Larsch for the OpenSSL project. |
||||
*/ |
||||
/* ==================================================================== |
||||
* Copyright (c) 1998-2010 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 |
||||
* openssl-core@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). |
||||
* |
||||
*/ |
||||
/* ==================================================================== |
||||
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. |
||||
* |
||||
* Portions of the attached software ("Contribution") are developed by |
||||
* SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. |
||||
* |
||||
* The Contribution is licensed pursuant to the OpenSSL open source |
||||
* license provided above. |
||||
* |
||||
* The elliptic curve binary polynomial software is originally written by |
||||
* Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. |
||||
* |
||||
*/ |
||||
|
||||
#include <string.h> |
||||
#include "ec_lcl.h" |
||||
#include <openssl/err.h> |
||||
#include <openssl/obj_mac.h> |
||||
#include <openssl/opensslconf.h> |
||||
|
||||
#ifdef OPENSSL_FIPS |
||||
# include <openssl/fips.h> |
||||
#endif |
||||
|
||||
typedef struct { |
||||
int field_type, /* either NID_X9_62_prime_field or |
||||
* NID_X9_62_characteristic_two_field */ |
||||
seed_len, param_len; |
||||
unsigned int cofactor; /* promoted to BN_ULONG */ |
||||
} EC_CURVE_DATA; |
||||
|
||||
/* the nist prime curves */ |
||||
static const struct { |
||||
EC_CURVE_DATA h; |
||||
unsigned char data[20 + 48 * 6]; |
||||
} _EC_NIST_PRIME_384 = { |
||||
{ |
||||
NID_X9_62_prime_field, 20, 48, 1 |
||||
}, |
||||
{ |
||||
/* seed */ |
||||
0xA3, 0x35, 0x92, 0x6A, 0xA3, 0x19, 0xA2, 0x7A, 0x1D, 0x00, 0x89, 0x6A, |
||||
0x67, 0x73, 0xA4, 0x82, 0x7A, 0xCD, 0xAC, 0x73, |
||||
/* p */ |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
/* a */ |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, |
||||
/* b */ |
||||
0xB3, 0x31, 0x2F, 0xA7, 0xE2, 0x3E, 0xE7, 0xE4, 0x98, 0x8E, 0x05, 0x6B, |
||||
0xE3, 0xF8, 0x2D, 0x19, 0x18, 0x1D, 0x9C, 0x6E, 0xFE, 0x81, 0x41, 0x12, |
||||
0x03, 0x14, 0x08, 0x8F, 0x50, 0x13, 0x87, 0x5A, 0xC6, 0x56, 0x39, 0x8D, |
||||
0x8A, 0x2E, 0xD1, 0x9D, 0x2A, 0x85, 0xC8, 0xED, 0xD3, 0xEC, 0x2A, 0xEF, |
||||
/* x */ |
||||
0xAA, 0x87, 0xCA, 0x22, 0xBE, 0x8B, 0x05, 0x37, 0x8E, 0xB1, 0xC7, 0x1E, |
||||
0xF3, 0x20, 0xAD, 0x74, 0x6E, 0x1D, 0x3B, 0x62, 0x8B, 0xA7, 0x9B, 0x98, |
||||
0x59, 0xF7, 0x41, 0xE0, 0x82, 0x54, 0x2A, 0x38, 0x55, 0x02, 0xF2, 0x5D, |
||||
0xBF, 0x55, 0x29, 0x6C, 0x3A, 0x54, 0x5E, 0x38, 0x72, 0x76, 0x0A, 0xB7, |
||||
/* y */ |
||||
0x36, 0x17, 0xde, 0x4a, 0x96, 0x26, 0x2c, 0x6f, 0x5d, 0x9e, 0x98, 0xbf, |
||||
0x92, 0x92, 0xdc, 0x29, 0xf8, 0xf4, 0x1d, 0xbd, 0x28, 0x9a, 0x14, 0x7c, |
||||
0xe9, 0xda, 0x31, 0x13, 0xb5, 0xf0, 0xb8, 0xc0, 0x0a, 0x60, 0xb1, 0xce, |
||||
0x1d, 0x7e, 0x81, 0x9d, 0x7a, 0x43, 0x1d, 0x7c, 0x90, 0xea, 0x0e, 0x5f, |
||||
/* order */ |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xC7, 0x63, 0x4D, 0x81, 0xF4, 0x37, 0x2D, 0xDF, 0x58, 0x1A, 0x0D, 0xB2, |
||||
0x48, 0xB0, 0xA7, 0x7A, 0xEC, 0xEC, 0x19, 0x6A, 0xCC, 0xC5, 0x29, 0x73 |
||||
} |
||||
}; |
||||
|
||||
static const struct { |
||||
EC_CURVE_DATA h; |
||||
unsigned char data[20 + 66 * 6]; |
||||
} _EC_NIST_PRIME_521 = { |
||||
{ |
||||
NID_X9_62_prime_field, 20, 66, 1 |
||||
}, |
||||
{ |
||||
/* seed */ |
||||
0xD0, 0x9E, 0x88, 0x00, 0x29, 0x1C, 0xB8, 0x53, 0x96, 0xCC, 0x67, 0x17, |
||||
0x39, 0x32, 0x84, 0xAA, 0xA0, 0xDA, 0x64, 0xBA, |
||||
/* p */ |
||||
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
/* a */ |
||||
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, |
||||
/* b */ |
||||
0x00, 0x51, 0x95, 0x3E, 0xB9, 0x61, 0x8E, 0x1C, 0x9A, 0x1F, 0x92, 0x9A, |
||||
0x21, 0xA0, 0xB6, 0x85, 0x40, 0xEE, 0xA2, 0xDA, 0x72, 0x5B, 0x99, 0xB3, |
||||
0x15, 0xF3, 0xB8, 0xB4, 0x89, 0x91, 0x8E, 0xF1, 0x09, 0xE1, 0x56, 0x19, |
||||
0x39, 0x51, 0xEC, 0x7E, 0x93, 0x7B, 0x16, 0x52, 0xC0, 0xBD, 0x3B, 0xB1, |
||||
0xBF, 0x07, 0x35, 0x73, 0xDF, 0x88, 0x3D, 0x2C, 0x34, 0xF1, 0xEF, 0x45, |
||||
0x1F, 0xD4, 0x6B, 0x50, 0x3F, 0x00, |
||||
/* x */ |
||||
0x00, 0xC6, 0x85, 0x8E, 0x06, 0xB7, 0x04, 0x04, 0xE9, 0xCD, 0x9E, 0x3E, |
||||
0xCB, 0x66, 0x23, 0x95, 0xB4, 0x42, 0x9C, 0x64, 0x81, 0x39, 0x05, 0x3F, |
||||
0xB5, 0x21, 0xF8, 0x28, 0xAF, 0x60, 0x6B, 0x4D, 0x3D, 0xBA, 0xA1, 0x4B, |
||||
0x5E, 0x77, 0xEF, 0xE7, 0x59, 0x28, 0xFE, 0x1D, 0xC1, 0x27, 0xA2, 0xFF, |
||||
0xA8, 0xDE, 0x33, 0x48, 0xB3, 0xC1, 0x85, 0x6A, 0x42, 0x9B, 0xF9, 0x7E, |
||||
0x7E, 0x31, 0xC2, 0xE5, 0xBD, 0x66, |
||||
/* y */ |
||||
0x01, 0x18, 0x39, 0x29, 0x6a, 0x78, 0x9a, 0x3b, 0xc0, 0x04, 0x5c, 0x8a, |
||||
0x5f, 0xb4, 0x2c, 0x7d, 0x1b, 0xd9, 0x98, 0xf5, 0x44, 0x49, 0x57, 0x9b, |
||||
0x44, 0x68, 0x17, 0xaf, 0xbd, 0x17, 0x27, 0x3e, 0x66, 0x2c, 0x97, 0xee, |
||||
0x72, 0x99, 0x5e, 0xf4, 0x26, 0x40, 0xc5, 0x50, 0xb9, 0x01, 0x3f, 0xad, |
||||
0x07, 0x61, 0x35, 0x3c, 0x70, 0x86, 0xa2, 0x72, 0xc2, 0x40, 0x88, 0xbe, |
||||
0x94, 0x76, 0x9f, 0xd1, 0x66, 0x50, |
||||
/* order */ |
||||
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x51, 0x86, |
||||
0x87, 0x83, 0xBF, 0x2F, 0x96, 0x6B, 0x7F, 0xCC, 0x01, 0x48, 0xF7, 0x09, |
||||
0xA5, 0xD0, 0x3B, 0xB5, 0xC9, 0xB8, 0x89, 0x9C, 0x47, 0xAE, 0xBB, 0x6F, |
||||
0xB7, 0x1E, 0x91, 0x38, 0x64, 0x09 |
||||
} |
||||
}; |
||||
|
||||
static const struct { |
||||
EC_CURVE_DATA h; |
||||
unsigned char data[20 + 32 * 6]; |
||||
} _EC_X9_62_PRIME_256V1 = { |
||||
{ |
||||
NID_X9_62_prime_field, 20, 32, 1 |
||||
}, |
||||
{ |
||||
/* seed */ |
||||
0xC4, 0x9D, 0x36, 0x08, 0x86, 0xE7, 0x04, 0x93, 0x6A, 0x66, 0x78, 0xE1, |
||||
0x13, 0x9D, 0x26, 0xB7, 0x81, 0x9F, 0x7E, 0x90, |
||||
/* p */ |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
/* a */ |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, |
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, |
||||
/* b */ |
||||
0x5A, 0xC6, 0x35, 0xD8, 0xAA, 0x3A, 0x93, 0xE7, 0xB3, 0xEB, 0xBD, 0x55, |
||||
0x76, 0x98, 0x86, 0xBC, 0x65, 0x1D, 0x06, 0xB0, 0xCC, 0x53, 0xB0, 0xF6, |
||||
0x3B, 0xCE, 0x3C, 0x3E, 0x27, 0xD2, 0x60, 0x4B, |
||||
/* x */ |
||||
0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, 0xE5, |
||||
0x63, 0xA4, 0x40, 0xF2, 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, 0x33, 0xA0, |
||||
0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96, |
||||
/* y */ |
||||
0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, 0x8e, 0xe7, 0xeb, 0x4a, |
||||
0x7c, 0x0f, 0x9e, 0x16, 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce, |
||||
0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5, |
||||
/* order */ |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, |
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84, |
||||
0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51 |
||||
} |
||||
}; |
||||
|
||||
typedef struct _ec_list_element_st { |
||||
int nid; |
||||
const EC_CURVE_DATA *data; |
||||
const EC_METHOD *(*meth) (void); |
||||
const char *comment; |
||||
} ec_list_element; |
||||
|
||||
static const ec_list_element curve_list[] = { |
||||
/* prime field curves */ |
||||
/* secg curves */ |
||||
/* SECG secp256r1 is the same as X9.62 prime256v1 and hence omitted */ |
||||
{NID_secp384r1, &_EC_NIST_PRIME_384.h, 0, |
||||
"NIST/SECG curve over a 384 bit prime field"}, |
||||
#ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 |
||||
{NID_secp521r1, &_EC_NIST_PRIME_521.h, EC_GFp_nistp521_method, |
||||
"NIST/SECG curve over a 521 bit prime field"}, |
||||
#else |
||||
{NID_secp521r1, &_EC_NIST_PRIME_521.h, 0, |
||||
"NIST/SECG curve over a 521 bit prime field"}, |
||||
#endif |
||||
/* X9.62 curves */ |
||||
{NID_X9_62_prime256v1, &_EC_X9_62_PRIME_256V1.h, |
||||
#if defined(ECP_NISTZ256_ASM) |
||||
EC_GFp_nistz256_method, |
||||
#elif !defined(OPENSSL_NO_EC_NISTP_64_GCC_128) |
||||
EC_GFp_nistp256_method, |
||||
#else |
||||
0, |
||||
#endif |
||||
"X9.62/SECG curve over a 256 bit prime field"}, |
||||
}; |
||||
|
||||
#define curve_list_length (sizeof(curve_list)/sizeof(ec_list_element)) |
||||
|
||||
static EC_GROUP *ec_group_new_from_data(const ec_list_element curve) |
||||
{ |
||||
EC_GROUP *group = NULL; |
||||
EC_POINT *P = NULL; |
||||
BN_CTX *ctx = NULL; |
||||
BIGNUM *p = NULL, *a = NULL, *b = NULL, *x = NULL, *y = NULL, *order = |
||||
NULL; |
||||
int ok = 0; |
||||
int seed_len, param_len; |
||||
const EC_METHOD *meth; |
||||
const EC_CURVE_DATA *data; |
||||
const unsigned char *params; |
||||
|
||||
if ((ctx = BN_CTX_new()) == NULL) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE); |
||||
goto err; |
||||
} |
||||
|
||||
data = curve.data; |
||||
seed_len = data->seed_len; |
||||
param_len = data->param_len; |
||||
params = (const unsigned char *)(data + 1); /* skip header */ |
||||
params += seed_len; /* skip seed */ |
||||
|
||||
if (!(p = BN_bin2bn(params + 0 * param_len, param_len, NULL)) |
||||
|| !(a = BN_bin2bn(params + 1 * param_len, param_len, NULL)) |
||||
|| !(b = BN_bin2bn(params + 2 * param_len, param_len, NULL))) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB); |
||||
goto err; |
||||
} |
||||
|
||||
if (curve.meth != 0) { |
||||
meth = curve.meth(); |
||||
if (((group = EC_GROUP_new(meth)) == NULL) || |
||||
(!(group->meth->group_set_curve(group, p, a, b, ctx)))) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); |
||||
goto err; |
||||
} |
||||
} else if (data->field_type == NID_X9_62_prime_field) { |
||||
if ((group = EC_GROUP_new_curve_GFp(p, a, b, ctx)) == NULL) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); |
||||
goto err; |
||||
} |
||||
} |
||||
#ifndef OPENSSL_NO_EC2M |
||||
else { /* field_type == |
||||
* NID_X9_62_characteristic_two_field */ |
||||
|
||||
if ((group = EC_GROUP_new_curve_GF2m(p, a, b, ctx)) == NULL) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); |
||||
goto err; |
||||
} |
||||
} |
||||
#endif |
||||
|
||||
if ((P = EC_POINT_new(group)) == NULL) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); |
||||
goto err; |
||||
} |
||||
|
||||
if (!(x = BN_bin2bn(params + 3 * param_len, param_len, NULL)) |
||||
|| !(y = BN_bin2bn(params + 4 * param_len, param_len, NULL))) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB); |
||||
goto err; |
||||
} |
||||
if (!EC_POINT_set_affine_coordinates_GFp(group, P, x, y, ctx)) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); |
||||
goto err; |
||||
} |
||||
if (!(order = BN_bin2bn(params + 5 * param_len, param_len, NULL)) |
||||
|| !BN_set_word(x, (BN_ULONG)data->cofactor)) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB); |
||||
goto err; |
||||
} |
||||
if (!EC_GROUP_set_generator(group, P, order, x)) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); |
||||
goto err; |
||||
} |
||||
if (seed_len) { |
||||
if (!EC_GROUP_set_seed(group, params - seed_len, seed_len)) { |
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); |
||||
goto err; |
||||
} |
||||
} |
||||
ok = 1; |
||||
err: |
||||
if (!ok) { |
||||
EC_GROUP_free(group); |
||||
group = NULL; |
||||
} |
||||
if (P) |
||||
EC_POINT_free(P); |
||||
if (ctx) |
||||
BN_CTX_free(ctx); |
||||
if (p) |
||||
BN_free(p); |
||||
if (a) |
||||
BN_free(a); |
||||
if (b) |
||||
BN_free(b); |
||||
if (order) |
||||
BN_free(order); |
||||
if (x) |
||||
BN_free(x); |
||||
if (y) |
||||
BN_free(y); |
||||
return group; |
||||
} |
||||
|
||||
EC_GROUP *EC_GROUP_new_by_curve_name(int nid) |
||||
{ |
||||
size_t i; |
||||
EC_GROUP *ret = NULL; |
||||
|
||||
if (nid <= 0) |
||||
return NULL; |
||||
|
||||
for (i = 0; i < curve_list_length; i++) |
||||
if (curve_list[i].nid == nid) { |
||||
ret = ec_group_new_from_data(curve_list[i]); |
||||
break; |
||||
} |
||||
|
||||
if (ret == NULL) { |
||||
ECerr(EC_F_EC_GROUP_NEW_BY_CURVE_NAME, EC_R_UNKNOWN_GROUP); |
||||
return NULL; |
||||
} |
||||
|
||||
EC_GROUP_set_curve_name(ret, nid); |
||||
|
||||
return ret; |
||||
} |
||||
|
||||
size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems) |
||||
{ |
||||
size_t i, min; |
||||
|
||||
if (r == NULL || nitems == 0) |
||||
return curve_list_length; |
||||
|
||||
min = nitems < curve_list_length ? nitems : curve_list_length; |
||||
|
||||
for (i = 0; i < min; i++) { |
||||
r[i].nid = curve_list[i].nid; |
||||
r[i].comment = curve_list[i].comment; |
||||
} |
||||
|
||||
return curve_list_length; |
||||
} |
||||
|
||||
/* Functions to translate between common NIST curve names and NIDs */ |
||||
|
||||
typedef struct { |
||||
const char *name; /* NIST Name of curve */ |
||||
int nid; /* Curve NID */ |
||||
} EC_NIST_NAME; |
||||
|
||||
static EC_NIST_NAME nist_curves[] = { |
||||
{"B-163", NID_sect163r2}, |
||||
{"B-233", NID_sect233r1}, |
||||
{"B-283", NID_sect283r1}, |
||||
{"B-409", NID_sect409r1}, |
||||
{"B-571", NID_sect571r1}, |
||||
{"K-163", NID_sect163k1}, |
||||
{"K-233", NID_sect233k1}, |
||||
{"K-283", NID_sect283k1}, |
||||
{"K-409", NID_sect409k1}, |
||||
{"K-571", NID_sect571k1}, |
||||
{"P-192", NID_X9_62_prime192v1}, |
||||
{"P-224", NID_secp224r1}, |
||||
{"P-256", NID_X9_62_prime256v1}, |
||||
{"P-384", NID_secp384r1}, |
||||
{"P-521", NID_secp521r1} |
||||
}; |
||||
|
||||
const char *EC_curve_nid2nist(int nid) |
||||
{ |
||||
size_t i; |
||||
for (i = 0; i < sizeof(nist_curves) / sizeof(EC_NIST_NAME); i++) { |
||||
if (nist_curves[i].nid == nid) |
||||
return nist_curves[i].name; |
||||
} |
||||
return NULL; |
||||
} |
||||
|
||||
int EC_curve_nist2nid(const char *name) |
||||
{ |
||||
size_t i; |
||||
for (i = 0; i < sizeof(nist_curves) / sizeof(EC_NIST_NAME); i++) { |
||||
if (!strcmp(nist_curves[i].name, name)) |
||||
return nist_curves[i].nid; |
||||
} |
||||
return NID_undef; |
||||
} |
@ -0,0 +1,994 @@
@@ -0,0 +1,994 @@
|
||||
/* crypto/ec/ectest.c */ |
||||
/* |
||||
* Originally written by Bodo Moeller for the OpenSSL project. |
||||
*/ |
||||
/* ==================================================================== |
||||
* Copyright (c) 1998-2001 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 |
||||
* openssl-core@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). |
||||
* |
||||
*/ |
||||
/* ==================================================================== |
||||
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. |
||||
* |
||||
* Portions of the attached software ("Contribution") are developed by |
||||
* SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. |
||||
* |
||||
* The Contribution is licensed pursuant to the OpenSSL open source |
||||
* license provided above. |
||||
* |
||||
* The elliptic curve binary polynomial software is originally written by |
||||
* Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. |
||||
* |
||||
*/ |
||||
|
||||
#include <stdio.h> |
||||
#include <stdlib.h> |
||||
#ifdef FLAT_INC |
||||
# include "e_os.h" |
||||
#else |
||||
# include "../e_os.h" |
||||
#endif |
||||
#include <string.h> |
||||
#include <time.h> |
||||
|
||||
#ifdef OPENSSL_NO_EC |
||||
int main(int argc, char *argv[]) |
||||
{ |
||||
puts("Elliptic curves are disabled."); |
||||
return 0; |
||||
} |
||||
#else |
||||
|
||||
# include <openssl/ec.h> |
||||
# ifndef OPENSSL_NO_ENGINE |
||||
# include <openssl/engine.h> |
||||
# endif |
||||
# include <openssl/err.h> |
||||
# include <openssl/obj_mac.h> |
||||
# include <openssl/objects.h> |
||||
# include <openssl/rand.h> |
||||
# include <openssl/bn.h> |
||||
# include <openssl/opensslconf.h> |
||||
|
||||
# if defined(_MSC_VER) && defined(_MIPS_) && (_MSC_VER/100==12) |
||||
/* suppress "too big too optimize" warning */ |
||||
# pragma warning(disable:4959) |
||||
# endif |
||||
|
||||
# define ABORT do { \ |
||||
fflush(stdout); \ |
||||
fprintf(stderr, "%s:%d: ABORT\n", __FILE__, __LINE__); \ |
||||
ERR_print_errors_fp(stderr); \ |
||||
EXIT(1); \ |
||||
} while (0) |
||||
|
||||
# define TIMING_BASE_PT 0 |
||||
# define TIMING_RAND_PT 1 |
||||
# define TIMING_SIMUL 2 |
||||
|
||||
# if 0 |
||||
static void timings(EC_GROUP *group, int type, BN_CTX *ctx) |
||||
{ |
||||
clock_t clck; |
||||
int i, j; |
||||
BIGNUM *s; |
||||
BIGNUM *r[10], *r0[10]; |
||||
EC_POINT *P; |
||||
|
||||
s = BN_new(); |
||||
if (s == NULL) |
||||
ABORT; |
||||
|
||||
fprintf(stdout, "Timings for %d-bit field, ", EC_GROUP_get_degree(group)); |
||||
if (!EC_GROUP_get_order(group, s, ctx)) |
||||
ABORT; |
||||
fprintf(stdout, "%d-bit scalars ", (int)BN_num_bits(s)); |
||||
fflush(stdout); |
||||
|
||||
P = EC_POINT_new(group); |
||||
if (P == NULL) |
||||
ABORT; |
||||
EC_POINT_copy(P, EC_GROUP_get0_generator(group)); |
||||
|
||||
for (i = 0; i < 10; i++) { |
||||
if ((r[i] = BN_new()) == NULL) |
||||
ABORT; |
||||
if (!BN_pseudo_rand(r[i], BN_num_bits(s), 0, 0)) |
||||
ABORT; |
||||
if (type != TIMING_BASE_PT) { |
||||
if ((r0[i] = BN_new()) == NULL) |
||||
ABORT; |
||||
if (!BN_pseudo_rand(r0[i], BN_num_bits(s), 0, 0)) |
||||
ABORT; |
||||
} |
||||
} |
||||
|
||||
clck = clock(); |
||||
for (i = 0; i < 10; i++) { |
||||
for (j = 0; j < 10; j++) { |
||||
if (!EC_POINT_mul |
||||
(group, P, (type != TIMING_RAND_PT) ? r[i] : NULL, |
||||
(type != TIMING_BASE_PT) ? P : NULL, |
||||
(type != TIMING_BASE_PT) ? r0[i] : NULL, ctx)) |
||||
ABORT; |
||||
} |
||||
} |
||||
clck = clock() - clck; |
||||
|
||||
fprintf(stdout, "\n"); |
||||
|
||||
# ifdef CLOCKS_PER_SEC |
||||
/* |
||||
* "To determine the time in seconds, the value returned by the clock |
||||
* function should be divided by the value of the macro CLOCKS_PER_SEC." |
||||
* -- ISO/IEC 9899 |
||||
*/ |
||||
# define UNIT "s" |
||||
# else |
||||
/* |
||||
* "`CLOCKS_PER_SEC' undeclared (first use this function)" -- cc on |
||||
* NeXTstep/OpenStep |
||||
*/ |
||||
# define UNIT "units" |
||||
# define CLOCKS_PER_SEC 1 |
||||
# endif |
||||
|
||||
if (type == TIMING_BASE_PT) { |
||||
fprintf(stdout, "%i %s in %.2f " UNIT "\n", i * j, |
||||
"base point multiplications", (double)clck / CLOCKS_PER_SEC); |
||||
} else if (type == TIMING_RAND_PT) { |
||||
fprintf(stdout, "%i %s in %.2f " UNIT "\n", i * j, |
||||
"random point multiplications", |
||||
(double)clck / CLOCKS_PER_SEC); |
||||
} else if (type == TIMING_SIMUL) { |
||||
fprintf(stdout, "%i %s in %.2f " UNIT "\n", i * j, |
||||
"s*P+t*Q operations", (double)clck / CLOCKS_PER_SEC); |
||||
} |
||||
fprintf(stdout, "average: %.4f " UNIT "\n", |
||||
(double)clck / (CLOCKS_PER_SEC * i * j)); |
||||
|
||||
EC_POINT_free(P); |
||||
BN_free(s); |
||||
for (i = 0; i < 10; i++) { |
||||
BN_free(r[i]); |
||||
if (type != TIMING_BASE_PT) |
||||
BN_free(r0[i]); |
||||
} |
||||
} |
||||
# endif |
||||
|
||||
/* test multiplication with group order, long and negative scalars */ |
||||
static void group_order_tests(EC_GROUP *group) |
||||
{ |
||||
BIGNUM *n1, *n2, *order; |
||||
EC_POINT *P = EC_POINT_new(group); |
||||
EC_POINT *Q = EC_POINT_new(group); |
||||
BN_CTX *ctx = BN_CTX_new(); |
||||
int i; |
||||
|
||||
n1 = BN_new(); |
||||
n2 = BN_new(); |
||||
order = BN_new(); |
||||
fprintf(stdout, "verify group order ..."); |
||||
fflush(stdout); |
||||
if (!EC_GROUP_get_order(group, order, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_mul(group, Q, order, NULL, NULL, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_is_at_infinity(group, Q)) |
||||
ABORT; |
||||
fprintf(stdout, "."); |
||||
fflush(stdout); |
||||
if (!EC_GROUP_precompute_mult(group, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_mul(group, Q, order, NULL, NULL, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_is_at_infinity(group, Q)) |
||||
ABORT; |
||||
fprintf(stdout, " ok\n"); |
||||
fprintf(stdout, "long/negative scalar tests "); |
||||
for (i = 1; i <= 2; i++) { |
||||
const BIGNUM *scalars[6]; |
||||
const EC_POINT *points[6]; |
||||
|
||||
fprintf(stdout, i == 1 ? |
||||
"allowing precomputation ... " : |
||||
"without precomputation ... "); |
||||
if (!BN_set_word(n1, i)) |
||||
ABORT; |
||||
/* |
||||
* If i == 1, P will be the predefined generator for which |
||||
* EC_GROUP_precompute_mult has set up precomputation. |
||||
*/ |
||||
if (!EC_POINT_mul(group, P, n1, NULL, NULL, ctx)) |
||||
ABORT; |
||||
|
||||
if (!BN_one(n1)) |
||||
ABORT; |
||||
/* n1 = 1 - order */ |
||||
if (!BN_sub(n1, n1, order)) |
||||
ABORT; |
||||
if (!EC_POINT_mul(group, Q, NULL, P, n1, ctx)) |
||||
ABORT; |
||||
if (0 != EC_POINT_cmp(group, Q, P, ctx)) |
||||
ABORT; |
||||
|
||||
/* n2 = 1 + order */ |
||||
if (!BN_add(n2, order, BN_value_one())) |
||||
ABORT; |
||||
if (!EC_POINT_mul(group, Q, NULL, P, n2, ctx)) |
||||
ABORT; |
||||
if (0 != EC_POINT_cmp(group, Q, P, ctx)) |
||||
ABORT; |
||||
|
||||
/* n2 = (1 - order) * (1 + order) = 1 - order^2 */ |
||||
if (!BN_mul(n2, n1, n2, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_mul(group, Q, NULL, P, n2, ctx)) |
||||
ABORT; |
||||
if (0 != EC_POINT_cmp(group, Q, P, ctx)) |
||||
ABORT; |
||||
|
||||
/* n2 = order^2 - 1 */ |
||||
BN_set_negative(n2, 0); |
||||
if (!EC_POINT_mul(group, Q, NULL, P, n2, ctx)) |
||||
ABORT; |
||||
/* Add P to verify the result. */ |
||||
if (!EC_POINT_add(group, Q, Q, P, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_is_at_infinity(group, Q)) |
||||
ABORT; |
||||
|
||||
/* Exercise EC_POINTs_mul, including corner cases. */ |
||||
if (EC_POINT_is_at_infinity(group, P)) |
||||
ABORT; |
||||
scalars[0] = n1; |
||||
points[0] = Q; /* => infinity */ |
||||
scalars[1] = n2; |
||||
points[1] = P; /* => -P */ |
||||
scalars[2] = n1; |
||||
points[2] = Q; /* => infinity */ |
||||
scalars[3] = n2; |
||||
points[3] = Q; /* => infinity */ |
||||
scalars[4] = n1; |
||||
points[4] = P; /* => P */ |
||||
scalars[5] = n2; |
||||
points[5] = Q; /* => infinity */ |
||||
if (!EC_POINTs_mul(group, P, NULL, 6, points, scalars, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_is_at_infinity(group, P)) |
||||
ABORT; |
||||
} |
||||
fprintf(stdout, "ok\n"); |
||||
|
||||
EC_POINT_free(P); |
||||
EC_POINT_free(Q); |
||||
BN_free(n1); |
||||
BN_free(n2); |
||||
BN_free(order); |
||||
BN_CTX_free(ctx); |
||||
} |
||||
|
||||
static void prime_field_tests(void) |
||||
{ |
||||
BN_CTX *ctx = NULL; |
||||
BIGNUM *p, *a, *b; |
||||
EC_GROUP *group; |
||||
EC_GROUP *P_160 = NULL, *P_192 = NULL, *P_224 = NULL, *P_256 = |
||||
NULL, *P_384 = NULL, *P_521 = NULL; |
||||
EC_POINT *P, *Q, *R; |
||||
BIGNUM *x, *y, *z; |
||||
unsigned char buf[100]; |
||||
size_t i, len; |
||||
int k; |
||||
|
||||
# if 1 /* optional */ |
||||
ctx = BN_CTX_new(); |
||||
if (!ctx) |
||||
ABORT; |
||||
# endif |
||||
|
||||
p = BN_new(); |
||||
a = BN_new(); |
||||
b = BN_new(); |
||||
if (!p || !a || !b) |
||||
ABORT; |
||||
|
||||
group = EC_GROUP_new(EC_GFp_mont_method()); /* applications should use |
||||
* EC_GROUP_new_curve_GFp so |
||||
* that the library gets to |
||||
* choose the EC_METHOD */ |
||||
if (!group) |
||||
ABORT; |
||||
|
||||
P = EC_POINT_new(group); |
||||
Q = EC_POINT_new(group); |
||||
R = EC_POINT_new(group); |
||||
if (!P || !Q || !R) |
||||
ABORT; |
||||
|
||||
x = BN_new(); |
||||
y = BN_new(); |
||||
z = BN_new(); |
||||
if (!x || !y || !z) |
||||
ABORT; |
||||
|
||||
/* Curve P-256 (FIPS PUB 186-2, App. 6) */ |
||||
|
||||
if (!BN_hex2bn |
||||
(&p, |
||||
"FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF")) |
||||
ABORT; |
||||
if (1 != BN_is_prime_ex(p, BN_prime_checks, ctx, NULL)) |
||||
ABORT; |
||||
if (!BN_hex2bn |
||||
(&a, |
||||
"FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC")) |
||||
ABORT; |
||||
if (!BN_hex2bn |
||||
(&b, |
||||
"5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B")) |
||||
ABORT; |
||||
if (!EC_GROUP_set_curve_GFp(group, p, a, b, ctx)) |
||||
ABORT; |
||||
|
||||
if (!BN_hex2bn |
||||
(&x, |
||||
"6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296")) |
||||
ABORT; |
||||
if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 1, ctx)) |
||||
ABORT; |
||||
if (EC_POINT_is_on_curve(group, P, ctx) <= 0) |
||||
ABORT; |
||||
if (!BN_hex2bn(&z, "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E" |
||||
"84F3B9CAC2FC632551")) |
||||
ABORT; |
||||
if (!EC_GROUP_set_generator(group, P, z, BN_value_one())) |
||||
ABORT; |
||||
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)) |
||||
ABORT; |
||||
fprintf(stdout, "\nNIST curve P-256 -- Generator:\n x = 0x"); |
||||
BN_print_fp(stdout, x); |
||||
fprintf(stdout, "\n y = 0x"); |
||||
BN_print_fp(stdout, y); |
||||
fprintf(stdout, "\n"); |
||||
/* G_y value taken from the standard: */ |
||||
if (!BN_hex2bn |
||||
(&z, |
||||
"4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5")) |
||||
ABORT; |
||||
if (0 != BN_cmp(y, z)) |
||||
ABORT; |
||||
|
||||
fprintf(stdout, "verify degree ..."); |
||||
if (EC_GROUP_get_degree(group) != 256) |
||||
ABORT; |
||||
fprintf(stdout, " ok\n"); |
||||
|
||||
group_order_tests(group); |
||||
|
||||
if (!(P_256 = EC_GROUP_new(EC_GROUP_method_of(group)))) |
||||
ABORT; |
||||
if (!EC_GROUP_copy(P_256, group)) |
||||
ABORT; |
||||
|
||||
/* Curve P-384 (FIPS PUB 186-2, App. 6) */ |
||||
|
||||
if (!BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" |
||||
"FFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF")) |
||||
ABORT; |
||||
if (1 != BN_is_prime_ex(p, BN_prime_checks, ctx, NULL)) |
||||
ABORT; |
||||
if (!BN_hex2bn(&a, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" |
||||
"FFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC")) |
||||
ABORT; |
||||
if (!BN_hex2bn(&b, "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141" |
||||
"120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF")) |
||||
ABORT; |
||||
if (!EC_GROUP_set_curve_GFp(group, p, a, b, ctx)) |
||||
ABORT; |
||||
|
||||
if (!BN_hex2bn(&x, "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B" |
||||
"9859F741E082542A385502F25DBF55296C3A545E3872760AB7")) |
||||
ABORT; |
||||
if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 1, ctx)) |
||||
ABORT; |
||||
if (EC_POINT_is_on_curve(group, P, ctx) <= 0) |
||||
ABORT; |
||||
if (!BN_hex2bn(&z, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" |
||||
"FFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973")) |
||||
ABORT; |
||||
if (!EC_GROUP_set_generator(group, P, z, BN_value_one())) |
||||
ABORT; |
||||
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)) |
||||
ABORT; |
||||
fprintf(stdout, "\nNIST curve P-384 -- Generator:\n x = 0x"); |
||||
BN_print_fp(stdout, x); |
||||
fprintf(stdout, "\n y = 0x"); |
||||
BN_print_fp(stdout, y); |
||||
fprintf(stdout, "\n"); |
||||
/* G_y value taken from the standard: */ |
||||
if (!BN_hex2bn(&z, "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A14" |
||||
"7CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F")) |
||||
ABORT; |
||||
if (0 != BN_cmp(y, z)) |
||||
ABORT; |
||||
|
||||
fprintf(stdout, "verify degree ..."); |
||||
if (EC_GROUP_get_degree(group) != 384) |
||||
ABORT; |
||||
fprintf(stdout, " ok\n"); |
||||
|
||||
group_order_tests(group); |
||||
|
||||
if (!(P_384 = EC_GROUP_new(EC_GROUP_method_of(group)))) |
||||
ABORT; |
||||
if (!EC_GROUP_copy(P_384, group)) |
||||
ABORT; |
||||
|
||||
/* Curve P-521 (FIPS PUB 186-2, App. 6) */ |
||||
|
||||
if (!BN_hex2bn(&p, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" |
||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" |
||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFF")) |
||||
ABORT; |
||||
if (1 != BN_is_prime_ex(p, BN_prime_checks, ctx, NULL)) |
||||
ABORT; |
||||
if (!BN_hex2bn(&a, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" |
||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" |
||||
"FFFFFFFFFFFFFFFFFFFFFFFFFFFC")) |
||||
ABORT; |
||||
if (!BN_hex2bn(&b, "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B" |
||||
"315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573" |
||||
"DF883D2C34F1EF451FD46B503F00")) |
||||
ABORT; |
||||
if (!EC_GROUP_set_curve_GFp(group, p, a, b, ctx)) |
||||
ABORT; |
||||
|
||||
if (!BN_hex2bn(&x, "C6858E06B70404E9CD9E3ECB662395B4429C648139053F" |
||||
"B521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B" |
||||
"3C1856A429BF97E7E31C2E5BD66")) |
||||
ABORT; |
||||
if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 0, ctx)) |
||||
ABORT; |
||||
if (EC_POINT_is_on_curve(group, P, ctx) <= 0) |
||||
ABORT; |
||||
if (!BN_hex2bn(&z, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" |
||||
"FFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5" |
||||
"C9B8899C47AEBB6FB71E91386409")) |
||||
ABORT; |
||||
if (!EC_GROUP_set_generator(group, P, z, BN_value_one())) |
||||
ABORT; |
||||
|
||||
if (!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)) |
||||
ABORT; |
||||
fprintf(stdout, "\nNIST curve P-521 -- Generator:\n x = 0x"); |
||||
BN_print_fp(stdout, x); |
||||
fprintf(stdout, "\n y = 0x"); |
||||
BN_print_fp(stdout, y); |
||||
fprintf(stdout, "\n"); |
||||
/* G_y value taken from the standard: */ |
||||
if (!BN_hex2bn(&z, "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579" |
||||
"B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C" |
||||
"7086A272C24088BE94769FD16650")) |
||||
ABORT; |
||||
if (0 != BN_cmp(y, z)) |
||||
ABORT; |
||||
|
||||
fprintf(stdout, "verify degree ..."); |
||||
if (EC_GROUP_get_degree(group) != 521) |
||||
ABORT; |
||||
fprintf(stdout, " ok\n"); |
||||
|
||||
group_order_tests(group); |
||||
|
||||
if (!(P_521 = EC_GROUP_new(EC_GROUP_method_of(group)))) |
||||
ABORT; |
||||
if (!EC_GROUP_copy(P_521, group)) |
||||
ABORT; |
||||
|
||||
/* more tests using the last curve */ |
||||
|
||||
if (!EC_POINT_copy(Q, P)) |
||||
ABORT; |
||||
if (EC_POINT_is_at_infinity(group, Q)) |
||||
ABORT; |
||||
if (!EC_POINT_dbl(group, P, P, ctx)) |
||||
ABORT; |
||||
if (EC_POINT_is_on_curve(group, P, ctx) <= 0) |
||||
ABORT; |
||||
if (!EC_POINT_invert(group, Q, ctx)) |
||||
ABORT; /* P = -2Q */ |
||||
|
||||
if (!EC_POINT_add(group, R, P, Q, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_add(group, R, R, Q, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_is_at_infinity(group, R)) |
||||
ABORT; /* R = P + 2Q */ |
||||
|
||||
{ |
||||
const EC_POINT *points[4]; |
||||
const BIGNUM *scalars[4]; |
||||
BIGNUM scalar3; |
||||
|
||||
if (EC_POINT_is_at_infinity(group, Q)) |
||||
ABORT; |
||||
points[0] = Q; |
||||
points[1] = Q; |
||||
points[2] = Q; |
||||
points[3] = Q; |
||||
|
||||
if (!EC_GROUP_get_order(group, z, ctx)) |
||||
ABORT; |
||||
if (!BN_add(y, z, BN_value_one())) |
||||
ABORT; |
||||
if (BN_is_odd(y)) |
||||
ABORT; |
||||
if (!BN_rshift1(y, y)) |
||||
ABORT; |
||||
scalars[0] = y; /* (group order + 1)/2, so y*Q + y*Q = Q */ |
||||
scalars[1] = y; |
||||
|
||||
fprintf(stdout, "combined multiplication ..."); |
||||
fflush(stdout); |
||||
|
||||
/* z is still the group order */ |
||||
if (!EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx)) |
||||
ABORT; |
||||
if (!EC_POINTs_mul(group, R, z, 2, points, scalars, ctx)) |
||||
ABORT; |
||||
if (0 != EC_POINT_cmp(group, P, R, ctx)) |
||||
ABORT; |
||||
if (0 != EC_POINT_cmp(group, R, Q, ctx)) |
||||
ABORT; |
||||
|
||||
fprintf(stdout, "."); |
||||
fflush(stdout); |
||||
|
||||
if (!BN_pseudo_rand(y, BN_num_bits(y), 0, 0)) |
||||
ABORT; |
||||
if (!BN_add(z, z, y)) |
||||
ABORT; |
||||
BN_set_negative(z, 1); |
||||
scalars[0] = y; |
||||
scalars[1] = z; /* z = -(order + y) */ |
||||
|
||||
if (!EC_POINTs_mul(group, P, NULL, 2, points, scalars, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_is_at_infinity(group, P)) |
||||
ABORT; |
||||
|
||||
fprintf(stdout, "."); |
||||
fflush(stdout); |
||||
|
||||
if (!BN_pseudo_rand(x, BN_num_bits(y) - 1, 0, 0)) |
||||
ABORT; |
||||
if (!BN_add(z, x, y)) |
||||
ABORT; |
||||
BN_set_negative(z, 1); |
||||
scalars[0] = x; |
||||
scalars[1] = y; |
||||
scalars[2] = z; /* z = -(x+y) */ |
||||
|
||||
BN_init(&scalar3); |
||||
BN_zero(&scalar3); |
||||
scalars[3] = &scalar3; |
||||
|
||||
if (!EC_POINTs_mul(group, P, NULL, 4, points, scalars, ctx)) |
||||
ABORT; |
||||
if (!EC_POINT_is_at_infinity(group, P)) |
||||
ABORT; |
||||
|
||||
fprintf(stdout, " ok\n\n"); |
||||
|
||||
BN_free(&scalar3); |
||||
} |
||||
|
||||
# if 0 |
||||
timings(P_256, TIMING_BASE_PT, ctx); |
||||
timings(P_256, TIMING_RAND_PT, ctx); |
||||
timings(P_256, TIMING_SIMUL, ctx); |
||||
timings(P_384, TIMING_BASE_PT, ctx); |
||||
timings(P_384, TIMING_RAND_PT, ctx); |
||||
timings(P_384, TIMING_SIMUL, ctx); |
||||
timings(P_521, TIMING_BASE_PT, ctx); |
||||
timings(P_521, TIMING_RAND_PT, ctx); |
||||
timings(P_521, TIMING_SIMUL, ctx); |
||||
# endif |
||||
|
||||
if (ctx) |
||||
BN_CTX_free(ctx); |
||||
BN_free(p); |
||||
BN_free(a); |
||||
BN_free(b); |
||||
EC_GROUP_free(group); |
||||
EC_POINT_free(P); |
||||
EC_POINT_free(Q); |
||||
EC_POINT_free(R); |
||||
BN_free(x); |
||||
BN_free(y); |
||||
BN_free(z); |
||||
|
||||
if (P_160) |
||||
EC_GROUP_free(P_160); |
||||
if (P_192) |
||||
EC_GROUP_free(P_192); |
||||
if (P_224) |
||||
EC_GROUP_free(P_224); |
||||
if (P_256) |
||||
EC_GROUP_free(P_256); |
||||
if (P_384) |
||||
EC_GROUP_free(P_384); |
||||
if (P_521) |
||||
EC_GROUP_free(P_521); |
||||
|
||||
} |
||||
|
||||
|
||||
static void internal_curve_test(void) |
||||
{ |
||||
EC_builtin_curve *curves = NULL; |
||||
size_t crv_len = 0, n = 0; |
||||
int ok = 1; |
||||
|
||||
crv_len = EC_get_builtin_curves(NULL, 0); |
||||
|
||||
curves = OPENSSL_malloc(sizeof(EC_builtin_curve) * crv_len); |
||||
|
||||
if (curves == NULL) |
||||
return; |
||||
|
||||
if (!EC_get_builtin_curves(curves, crv_len)) { |
||||
OPENSSL_free(curves); |
||||
return; |
||||
} |
||||
|
||||
fprintf(stdout, "testing internal curves: "); |
||||
|
||||
for (n = 0; n < crv_len; n++) { |
||||
EC_GROUP *group = NULL; |
||||
int nid = curves[n].nid; |
||||
if ((group = EC_GROUP_new_by_curve_name(nid)) == NULL) { |
||||
ok = 0; |
||||
fprintf(stdout, "\nEC_GROUP_new_curve_name() failed with" |
||||
" curve %s\n", OBJ_nid2sn(nid)); |
||||
/* try next curve */ |
||||
continue; |
||||
} |
||||
if (!EC_GROUP_check(group, NULL)) { |
||||
ok = 0; |
||||
fprintf(stdout, "\nEC_GROUP_check() failed with" |
||||
" curve %s\n", OBJ_nid2sn(nid)); |
||||
EC_GROUP_free(group); |
||||
/* try the next curve */ |
||||
continue; |
||||
} |
||||
fprintf(stdout, "."); |
||||
fflush(stdout); |
||||
EC_GROUP_free(group); |
||||
} |
||||
if (ok) |
||||
fprintf(stdout, " ok\n\n"); |
||||
else { |
||||
fprintf(stdout, " failed\n\n"); |
||||
ABORT; |
||||
} |
||||
OPENSSL_free(curves); |
||||
return; |
||||
} |
||||
|
||||
# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 |
||||
/* |
||||
* nistp_test_params contains magic numbers for testing our optimized |
||||
* implementations of several NIST curves with characteristic > 3. |
||||
*/ |
||||
struct nistp_test_params { |
||||
const EC_METHOD *(*meth) (); |
||||
int degree; |
||||
/* |
||||
* Qx, Qy and D are taken from |
||||
* http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf |
||||
* Otherwise, values are standard curve parameters from FIPS 180-3 |
||||
*/ |
||||
const char *p, *a, *b, *Qx, *Qy, *Gx, *Gy, *order, *d; |
||||
}; |
||||
|
||||
static const struct nistp_test_params nistp_tests_params[] = { |
||||
{ |
||||
/* P-256 */ |
||||
EC_GFp_nistp256_method, |
||||
256, |
||||
/* p */ |
||||
"ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", |
||||
/* a */ |
||||
"ffffffff00000001000000000000000000000000fffffffffffffffffffffffc", |
||||
/* b */ |
||||
"5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", |
||||
/* Qx */ |
||||
"b7e08afdfe94bad3f1dc8c734798ba1c62b3a0ad1e9ea2a38201cd0889bc7a19", |
||||
/* Qy */ |
||||
"3603f747959dbf7a4bb226e41928729063adc7ae43529e61b563bbc606cc5e09", |
||||
/* Gx */ |
||||
"6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", |
||||
/* Gy */ |
||||
"4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", |
||||
/* order */ |
||||
"ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", |
||||
/* d */ |
||||
"c477f9f65c22cce20657faa5b2d1d8122336f851a508a1ed04e479c34985bf96", |
||||
}, |
||||
{ |
||||
/* P-521 */ |
||||
EC_GFp_nistp521_method, |
||||
521, |
||||
/* p */ |
||||
"1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", |
||||
/* a */ |
||||
"1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc", |
||||
/* b */ |
||||
"051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00", |
||||
/* Qx */ |
||||
"0098e91eef9a68452822309c52fab453f5f117c1da8ed796b255e9ab8f6410cca16e59df403a6bdc6ca467a37056b1e54b3005d8ac030decfeb68df18b171885d5c4", |
||||
/* Qy */ |
||||
"0164350c321aecfc1cca1ba4364c9b15656150b4b78d6a48d7d28e7f31985ef17be8554376b72900712c4b83ad668327231526e313f5f092999a4632fd50d946bc2e", |
||||
/* Gx */ |
||||
"c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66", |
||||
/* Gy */ |
||||
"11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", |
||||
/* order */ |
||||
"1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409", |
||||
/* d */ |
||||
"0100085f47b8e1b8b11b7eb33028c0b2888e304bfc98501955b45bba1478dc184eeedf09b86a5f7c21994406072787205e69a63709fe35aa93ba333514b24f961722", |
||||
}, |
||||
}; |
||||
|
||||
static void nistp_single_test(const struct nistp_test_params *test) |
||||
{ |
||||
BN_CTX *ctx; |
||||
BIGNUM *p, *a, *b, *x, *y, *n, *m, *order; |
||||
EC_GROUP *NISTP; |
||||
EC_POINT *G, *P, *Q, *Q_CHECK; |
||||
|
||||
fprintf(stdout, "\nNIST curve P-%d (optimised implementation):\n", |
||||
test->degree); |
||||
ctx = BN_CTX_new(); |
||||
p = BN_new(); |
||||
a = BN_new(); |
||||
b = BN_new(); |
||||
x = BN_new(); |
||||
y = BN_new(); |
||||
m = BN_new(); |
||||
n = BN_new(); |
||||
order = BN_new(); |
||||
|
||||
NISTP = EC_GROUP_new(test->meth()); |
||||
if (!NISTP) |
||||
ABORT; |
||||
if (!BN_hex2bn(&p, test->p)) |
||||
ABORT; |
||||
if (1 != BN_is_prime_ex(p, BN_prime_checks, ctx, NULL)) |
||||
ABORT; |
||||
if (!BN_hex2bn(&a, test->a)) |
||||
ABORT; |
||||
if (!BN_hex2bn(&b, test->b)) |
||||
ABORT; |
||||
if (!EC_GROUP_set_curve_GFp(NISTP, p, a, b, ctx)) |
||||
ABORT; |
||||
G = EC_POINT_new(NISTP); |
||||
P = EC_POINT_new(NISTP); |
||||
Q = EC_POINT_new(NISTP); |
||||
Q_CHECK = EC_POINT_new(NISTP); |
||||
if (!BN_hex2bn(&x, test->Qx)) |
||||
ABORT; |
||||
if (!BN_hex2bn(&y, test->Qy)) |
||||
ABORT; |
||||
if (!EC_POINT_set_affine_coordinates_GFp(NISTP, Q_CHECK, x, y, ctx)) |
||||
ABORT; |
||||
if (!BN_hex2bn(&x, test->Gx)) |
||||
ABORT; |
||||
if (!BN_hex2bn(&y, test->Gy)) |
||||
ABORT; |
||||
if (!EC_POINT_set_affine_coordinates_GFp(NISTP, G, x, y, ctx)) |
||||
ABORT; |
||||
if (!BN_hex2bn(&order, test->order)) |
||||
ABORT; |
||||
if (!EC_GROUP_set_generator(NISTP, G, order, BN_value_one())) |
||||
ABORT; |
||||
|
||||
fprintf(stdout, "verify degree ... "); |
||||
if (EC_GROUP_get_degree(NISTP) != test->degree) |
||||
ABORT; |
||||
fprintf(stdout, "ok\n"); |
||||
|
||||
fprintf(stdout, "NIST test vectors ... "); |
||||
if (!BN_hex2bn(&n, test->d)) |
||||
ABORT; |
||||
/* fixed point multiplication */ |
||||
EC_POINT_mul(NISTP, Q, n, NULL, NULL, ctx); |
||||
if (0 != EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)) |
||||
ABORT; |
||||
/* random point multiplication */ |
||||
EC_POINT_mul(NISTP, Q, NULL, G, n, ctx); |
||||
if (0 != EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)) |
||||
ABORT; |
||||
|
||||
/* set generator to P = 2*G, where G is the standard generator */ |
||||
if (!EC_POINT_dbl(NISTP, P, G, ctx)) |
||||
ABORT; |
||||
if (!EC_GROUP_set_generator(NISTP, P, order, BN_value_one())) |
||||
ABORT; |
||||
/* set the scalar to m=n/2, where n is the NIST test scalar */ |
||||
if (!BN_rshift(m, n, 1)) |
||||
ABORT; |
||||
|
||||
/* test the non-standard generator */ |
||||
/* fixed point multiplication */ |
||||
EC_POINT_mul(NISTP, Q, m, NULL, NULL, ctx); |
||||
if (0 != EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)) |
||||
ABORT; |
||||
/* random point multiplication */ |
||||
EC_POINT_mul(NISTP, Q, NULL, P, m, ctx); |
||||
if (0 != EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)) |
||||
ABORT; |
||||
|
||||
/* |
||||
* We have not performed precomputation so have_precompute mult should be |
||||
* false |
||||
*/ |
||||
if (EC_GROUP_have_precompute_mult(NISTP)) |
||||
ABORT; |
||||
|
||||
/* now repeat all tests with precomputation */ |
||||
if (!EC_GROUP_precompute_mult(NISTP, ctx)) |
||||
ABORT; |
||||
if (!EC_GROUP_have_precompute_mult(NISTP)) |
||||
ABORT; |
||||
|
||||
/* fixed point multiplication */ |
||||
EC_POINT_mul(NISTP, Q, m, NULL, NULL, ctx); |
||||
if (0 != EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)) |
||||
ABORT; |
||||
/* random point multiplication */ |
||||
EC_POINT_mul(NISTP, Q, NULL, P, m, ctx); |
||||
if (0 != EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)) |
||||
ABORT; |
||||
|
||||
/* reset generator */ |
||||
if (!EC_GROUP_set_generator(NISTP, G, order, BN_value_one())) |
||||
ABORT; |
||||
/* fixed point multiplication */ |
||||
EC_POINT_mul(NISTP, Q, n, NULL, NULL, ctx); |
||||
if (0 != EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)) |
||||
ABORT; |
||||
/* random point multiplication */ |
||||
EC_POINT_mul(NISTP, Q, NULL, G, n, ctx); |
||||
if (0 != EC_POINT_cmp(NISTP, Q, Q_CHECK, ctx)) |
||||
ABORT; |
||||
|
||||
fprintf(stdout, "ok\n"); |
||||
group_order_tests(NISTP); |
||||
# if 0 |
||||
timings(NISTP, TIMING_BASE_PT, ctx); |
||||
timings(NISTP, TIMING_RAND_PT, ctx); |
||||
# endif |
||||
EC_GROUP_free(NISTP); |
||||
EC_POINT_free(G); |
||||
EC_POINT_free(P); |
||||
EC_POINT_free(Q); |
||||
EC_POINT_free(Q_CHECK); |
||||
BN_free(n); |
||||
BN_free(m); |
||||
BN_free(p); |
||||
BN_free(a); |
||||
BN_free(b); |
||||
BN_free(x); |
||||
BN_free(y); |
||||
BN_free(order); |
||||
BN_CTX_free(ctx); |
||||
} |
||||
|
||||
static void nistp_tests() |
||||
{ |
||||
unsigned i; |
||||
|
||||
for (i = 0; |
||||
i < sizeof(nistp_tests_params) / sizeof(struct nistp_test_params); |
||||
i++) { |
||||
nistp_single_test(&nistp_tests_params[i]); |
||||
} |
||||
} |
||||
# endif |
||||
|
||||
static const char rnd_seed[] = |
||||
"string to make the random number generator think it has entropy"; |
||||
|
||||
int main(int argc, char *argv[]) |
||||
{ |
||||
|
||||
/* enable memory leak checking unless explicitly disabled */ |
||||
if (!((getenv("OPENSSL_DEBUG_MEMORY") != NULL) |
||||
&& (0 == strcmp(getenv("OPENSSL_DEBUG_MEMORY"), "off")))) { |
||||
CRYPTO_malloc_debug_init(); |
||||
CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL); |
||||
} else { |
||||
/* OPENSSL_DEBUG_MEMORY=off */ |
||||
CRYPTO_set_mem_debug_functions(0, 0, 0, 0, 0); |
||||
} |
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); |
||||
ERR_load_crypto_strings(); |
||||
|
||||
RAND_seed(rnd_seed, sizeof rnd_seed); /* or BN_generate_prime may fail */ |
||||
|
||||
prime_field_tests(); |
||||
puts(""); |
||||
# ifndef OPENSSL_NO_EC2M |
||||
char2_field_tests(); |
||||
# endif |
||||
# ifndef OPENSSL_NO_EC_NISTP_64_GCC_128 |
||||
nistp_tests(); |
||||
# endif |
||||
/* test the internal curves */ |
||||
internal_curve_test(); |
||||
|
||||
# ifndef OPENSSL_NO_ENGINE |
||||
ENGINE_cleanup(); |
||||
# endif |
||||
CRYPTO_cleanup_all_ex_data(); |
||||
ERR_free_strings(); |
||||
ERR_remove_thread_state(NULL); |
||||
CRYPTO_mem_leaks_fp(stderr); |
||||
|
||||
return 0; |
||||
} |
||||
#endif |
@ -0,0 +1,47 @@
@@ -0,0 +1,47 @@
|
||||
#!/bin/sh |
||||
|
||||
# Quit out if anything fails. |
||||
set -e |
||||
|
||||
# Clean out patent-or-otherwise-encumbered code. |
||||
# MDC-2: 4,908,861 13/03/2007 - expired, we do not remove it but do not enable it anyway |
||||
# IDEA: 5,214,703 07/01/2012 - expired, we do not remove it anymore |
||||
# RC5: 5,724,428 01/11/2015 - expired, we do not remove it anymore |
||||
# EC: ????????? ??/??/2020 |
||||
# SRP: ????????? ??/??/20?? |
||||
|
||||
# Remove assembler portions of IDEA, MDC2, and RC5. |
||||
# (find crypto/rc5/asm -type f | xargs -r rm -fv) |
||||
|
||||
# SRP. |
||||
for a in srp; do |
||||
for c in `find crypto/$a -name "*.c" -a \! -name "*test*" -type f` ; do |
||||
echo Destroying $c |
||||
> $c |
||||
done |
||||
done |
||||
|
||||
for c in `find crypto/bn -name "*gf2m.c"`; do |
||||
echo Destroying $c |
||||
> $c |
||||
done |
||||
|
||||
for c in `find crypto/ec -name "ec2*.c" -o -name "ec_curve.c" -o -name "ecp_nistp22?.c" -o -name "ectest.c"`; do |
||||
echo Destroying $c |
||||
> $c |
||||
done |
||||
|
||||
for h in `find crypto ssl apps test -name "*.h"` ; do |
||||
echo Removing SRP and EC2M references from $h |
||||
cat $h | \ |
||||
awk 'BEGIN {ech=1;} \ |
||||
/^#[ \t]*ifndef.*NO_SRP/ {ech--; next;} \ |
||||
/^#[ \t]*ifndef.*NO_EC2M/ {ech--; next;} \ |
||||
/^#[ \t]*if/ {if(ech < 1) ech--;} \ |
||||
{if(ech>0) {;print $0};} \ |
||||
/^#[ \t]*endif/ {if(ech < 1) ech++;}' > $h.hobbled && \ |
||||
mv $h.hobbled $h |
||||
done |
||||
|
||||
# Make the makefiles happy. |
||||
# touch crypto/rc5/asm/rc5-586.pl |
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
#!/bin/sh |
||||
umask 077 |
||||
|
||||
answers() { |
||||
echo -- |
||||
echo SomeState |
||||
echo SomeCity |
||||
echo SomeOrganization |
||||
echo SomeOrganizationalUnit |
||||
echo localhost.localdomain |
||||
echo root@localhost.localdomain |
||||
} |
||||
|
||||
if [ $# -eq 0 ] ; then |
||||
echo $"Usage: `basename $0` filename [...]" |
||||
exit 0 |
||||
fi |
||||
|
||||
for target in $@ ; do |
||||
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` |
||||
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` |
||||
trap "rm -f $PEM1 $PEM2" SIGINT |
||||
answers | /usr/bin/openssl req -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 2> /dev/null |
||||
cat $PEM1 > ${target} |
||||
echo "" >> ${target} |
||||
cat $PEM2 >> ${target} |
||||
rm -f $PEM1 $PEM2 |
||||
done |
@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
|
||||
Do not treat duplicate certs as an error. |
||||
|
||||
--- openssl-0.9.6/crypto/x509/by_file.c Wed Sep 27 15:09:05 2000 |
||||
+++ openssl-0.9.6/crypto/x509/by_file.c Wed Sep 27 14:21:20 2000 |
||||
@@ -163,8 +163,12 @@ |
||||
} |
||||
} |
||||
i=X509_STORE_add_cert(ctx->store_ctx,x); |
||||
- if (!i) goto err; |
||||
- count++; |
||||
+ /* ignore any problems with current certificate |
||||
+ and continue with the next one */ |
||||
+ if (i) |
||||
+ count++; |
||||
+ else |
||||
+ ERR_clear_error(); |
||||
X509_free(x); |
||||
x=NULL; |
||||
} |
||||
@@ -179,7 +183,8 @@ |
||||
goto err; |
||||
} |
||||
i=X509_STORE_add_cert(ctx->store_ctx,x); |
||||
- if (!i) goto err; |
||||
+ if (!i) |
||||
+ ERR_clear_error(); |
||||
ret=i; |
||||
} |
||||
else |
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
--- openssl-0.9.8a/Makefile.shared.no-rpath 2005-06-23 22:47:54.000000000 +0200 |
||||
+++ openssl-0.9.8a/Makefile.shared 2005-11-16 22:35:37.000000000 +0100 |
||||
@@ -153,7 +153,7 @@ |
||||
NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ |
||||
SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX" |
||||
|
||||
-DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)" |
||||
+DO_GNU_APP=LDFLAGS="$(CFLAGS)" |
||||
|
||||
#This is rather special. It's a special target with which one can link |
||||
#applications without bothering with any features that have anything to |
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
diff -up openssl-0.9.8b/ssl/ssltest.c.use-localhost openssl-0.9.8b/ssl/ssltest.c |
||||
--- openssl-0.9.8b/ssl/ssltest.c.use-localhost 2006-02-24 18:58:35.000000000 +0100 |
||||
+++ openssl-0.9.8b/ssl/ssltest.c 2007-08-03 14:06:16.000000000 +0200 |
||||
@@ -839,19 +839,8 @@ bad: |
||||
#ifndef OPENSSL_NO_KRB5 |
||||
if (c_ssl && c_ssl->kssl_ctx) |
||||
{ |
||||
- char localhost[MAXHOSTNAMELEN+2]; |
||||
- |
||||
- if (gethostname(localhost, sizeof localhost-1) == 0) |
||||
- { |
||||
- localhost[sizeof localhost-1]='\0'; |
||||
- if(strlen(localhost) == sizeof localhost-1) |
||||
- { |
||||
- BIO_printf(bio_err,"localhost name too long\n"); |
||||
- goto end; |
||||
- } |
||||
kssl_ctx_setstring(c_ssl->kssl_ctx, KSSL_SERVER, |
||||
- localhost); |
||||
- } |
||||
+ "localhost"); |
||||
} |
||||
#endif /* OPENSSL_NO_KRB5 */ |
||||
|
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
diff -up openssl-0.9.8j/apps/version.c.version-add-engines openssl-0.9.8j/apps/version.c |
||||
--- openssl-0.9.8j/apps/version.c.version-add-engines 2008-10-20 14:53:33.000000000 +0200 |
||||
+++ openssl-0.9.8j/apps/version.c 2009-01-13 23:22:03.000000000 +0100 |
||||
@@ -131,6 +131,7 @@ |
||||
#ifndef OPENSSL_NO_BF |
||||
# include <openssl/blowfish.h> |
||||
#endif |
||||
+#include <openssl/engine.h> |
||||
|
||||
#undef PROG |
||||
#define PROG version_main |
||||
@@ -140,7 +141,7 @@ int MAIN(int, char **); |
||||
int MAIN(int argc, char **argv) |
||||
{ |
||||
int i,ret=0; |
||||
- int cflags=0,version=0,date=0,options=0,platform=0,dir=0; |
||||
+ int cflags=0,version=0,date=0,options=0,platform=0,dir=0,engines=0; |
||||
|
||||
apps_startup(); |
||||
|
||||
@@ -164,7 +165,7 @@ int MAIN(int argc, char **argv) |
||||
else if (strcmp(argv[i],"-d") == 0) |
||||
dir=1; |
||||
else if (strcmp(argv[i],"-a") == 0) |
||||
- date=version=cflags=options=platform=dir=1; |
||||
+ date=version=cflags=options=platform=dir=engines=1; |
||||
else |
||||
{ |
||||
BIO_printf(bio_err,"usage:version -[avbofpd]\n"); |
||||
@@ -211,6 +212,18 @@ int MAIN(int argc, char **argv) |
||||
} |
||||
if (cflags) printf("%s\n",SSLeay_version(SSLEAY_CFLAGS)); |
||||
if (dir) printf("%s\n",SSLeay_version(SSLEAY_DIR)); |
||||
+ if (engines) |
||||
+ { |
||||
+ ENGINE *e; |
||||
+ printf("engines: "); |
||||
+ e = ENGINE_get_first(); |
||||
+ while (e) |
||||
+ { |
||||
+ printf("%s ", ENGINE_get_id(e)); |
||||
+ e = ENGINE_get_next(e); |
||||
+ } |
||||
+ printf("\n"); |
||||
+ } |
||||
end: |
||||
apps_shutdown(); |
||||
OPENSSL_EXIT(ret); |
@ -0,0 +1,36 @@
@@ -0,0 +1,36 @@
|
||||
diff -up openssl-1.0.0-beta4/apps/CA.pl.in.ca-dir openssl-1.0.0-beta4/apps/CA.pl.in |
||||
--- openssl-1.0.0-beta4/apps/CA.pl.in.ca-dir 2006-04-28 02:30:49.000000000 +0200 |
||||
+++ openssl-1.0.0-beta4/apps/CA.pl.in 2009-11-12 12:33:13.000000000 +0100 |
||||
@@ -53,7 +53,7 @@ $VERIFY="$openssl verify"; |
||||
$X509="$openssl x509"; |
||||
$PKCS12="$openssl pkcs12"; |
||||
|
||||
-$CATOP="./demoCA"; |
||||
+$CATOP="/etc/pki/CA"; |
||||
$CAKEY="cakey.pem"; |
||||
$CAREQ="careq.pem"; |
||||
$CACERT="cacert.pem"; |
||||
diff -up openssl-1.0.0-beta4/apps/CA.sh.ca-dir openssl-1.0.0-beta4/apps/CA.sh |
||||
--- openssl-1.0.0-beta4/apps/CA.sh.ca-dir 2009-10-15 19:27:47.000000000 +0200 |
||||
+++ openssl-1.0.0-beta4/apps/CA.sh 2009-11-12 12:35:14.000000000 +0100 |
||||
@@ -68,7 +68,7 @@ VERIFY="$OPENSSL verify" |
||||
X509="$OPENSSL x509" |
||||
PKCS12="openssl pkcs12" |
||||
|
||||
-if [ -z "$CATOP" ] ; then CATOP=./demoCA ; fi |
||||
+if [ -z "$CATOP" ] ; then CATOP=/etc/pki/CA ; fi |
||||
CAKEY=./cakey.pem |
||||
CAREQ=./careq.pem |
||||
CACERT=./cacert.pem |
||||
diff -up openssl-1.0.0-beta4/apps/openssl.cnf.ca-dir openssl-1.0.0-beta4/apps/openssl.cnf |
||||
--- openssl-1.0.0-beta4/apps/openssl.cnf.ca-dir 2009-11-12 12:33:13.000000000 +0100 |
||||
+++ openssl-1.0.0-beta4/apps/openssl.cnf 2009-11-12 12:33:13.000000000 +0100 |
||||
@@ -39,7 +39,7 @@ default_ca = CA_default # The default c |
||||
#################################################################### |
||||
[ CA_default ] |
||||
|
||||
-dir = ./demoCA # Where everything is kept |
||||
+dir = /etc/pki/CA # Where everything is kept |
||||
certs = $dir/certs # Where the issued certs are kept |
||||
crl_dir = $dir/crl # Where the issued crl are kept |
||||
database = $dir/index.txt # database index file. |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
diff -up openssl-1.0.0-beta5/Configure.enginesdir openssl-1.0.0-beta5/Configure |
||||
--- openssl-1.0.0-beta5/Configure.enginesdir 2010-01-20 18:07:05.000000000 +0100 |
||||
+++ openssl-1.0.0-beta5/Configure 2010-01-20 18:10:48.000000000 +0100 |
||||
@@ -622,6 +622,7 @@ my $idx_multilib = $idx++; |
||||
my $prefix=""; |
||||
my $libdir=""; |
||||
my $openssldir=""; |
||||
+my $enginesdir=""; |
||||
my $exe_ext=""; |
||||
my $install_prefix= "$ENV{'INSTALL_PREFIX'}"; |
||||
my $cross_compile_prefix=""; |
||||
@@ -833,6 +834,10 @@ PROCESS_ARGS: |
||||
{ |
||||
$openssldir=$1; |
||||
} |
||||
+ elsif (/^--enginesdir=(.*)$/) |
||||
+ { |
||||
+ $enginesdir=$1; |
||||
+ } |
||||
elsif (/^--install.prefix=(.*)$/) |
||||
{ |
||||
$install_prefix=$1; |
||||
@@ -1053,7 +1058,7 @@ chop $prefix if $prefix =~ /.\/$/; |
||||
|
||||
$openssldir=$prefix . "/ssl" if $openssldir eq ""; |
||||
$openssldir=$prefix . "/" . $openssldir if $openssldir !~ /(^\/|^[a-zA-Z]:[\\\/])/; |
||||
- |
||||
+$enginesdir="$prefix/lib/engines" if $enginesdir eq ""; |
||||
|
||||
print "IsMK1MF=$IsMK1MF\n"; |
||||
|
||||
@@ -1673,7 +1678,7 @@ while (<IN>) |
||||
} |
||||
elsif (/^#define\s+ENGINESDIR/) |
||||
{ |
||||
- my $foo = "$prefix/$libdir/engines"; |
||||
+ my $foo = "$enginesdir"; |
||||
$foo =~ s/\\/\\\\/g; |
||||
print OUT "#define ENGINESDIR \"$foo\"\n"; |
||||
} |
||||
diff -up openssl-1.0.0-beta5/engines/Makefile.enginesdir openssl-1.0.0-beta5/engines/Makefile |
||||
--- openssl-1.0.0-beta5/engines/Makefile.enginesdir 2010-01-16 21:06:09.000000000 +0100 |
||||
+++ openssl-1.0.0-beta5/engines/Makefile 2010-01-20 18:07:05.000000000 +0100 |
||||
@@ -124,7 +124,7 @@ install: |
||||
sfx=".so"; \ |
||||
cp cyg$$l.dll $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/$$pfx$$l$$sfx.new; \ |
||||
fi; \ |
||||
- chmod 555 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/$$pfx$$l$$sfx.new; \ |
||||
+ chmod 755 $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/$$pfx$$l$$sfx.new; \ |
||||
mv -f $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/$$pfx$$l$$sfx.new $(INSTALL_PREFIX)$(INSTALLTOP)/$(LIBDIR)/engines/$$pfx$$l$$sfx ); \ |
||||
done; \ |
||||
fi |
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
diff -up openssl-1.0.0-beta5/README.warning openssl-1.0.0-beta5/README |
||||
--- openssl-1.0.0-beta5/README.warning 2010-01-20 16:00:47.000000000 +0100 |
||||
+++ openssl-1.0.0-beta5/README 2010-01-21 09:06:11.000000000 +0100 |
||||
@@ -5,6 +5,35 @@ |
||||
Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson |
||||
All rights reserved. |
||||
|
||||
+ WARNING |
||||
+ ------- |
||||
+ |
||||
+ This version of OpenSSL is built in a way that supports operation in |
||||
+ the so called FIPS mode. Note though that the library as we build it |
||||
+ is not FIPS validated and the FIPS mode is present for testing purposes |
||||
+ only. |
||||
+ |
||||
+ This version also contains a few differences from the upstream code |
||||
+ some of which are: |
||||
+ * There are added changes forward ported from the upstream OpenSSL |
||||
+ 0.9.8 FIPS branch however the FIPS integrity verification check |
||||
+ is implemented differently from the upstream FIPS validated OpenSSL |
||||
+ module. It verifies HMAC-SHA256 checksum of the whole shared |
||||
+ libraries. For this reason the changes are ported to files in the |
||||
+ crypto directory and not in a separate fips subdirectory. Also |
||||
+ note that the FIPS integrity verification check requires unmodified |
||||
+ libcrypto and libssl shared library files which means that it will |
||||
+ fail if these files are modified for example by prelink. |
||||
+ * The module respects the kernel FIPS flag /proc/sys/crypto/fips and |
||||
+ tries to initialize the FIPS mode if it is set to 1 aborting if the |
||||
+ FIPS mode could not be initialized. It is also possible to force the |
||||
+ OpenSSL library to FIPS mode especially for debugging purposes by |
||||
+ setting the environment variable OPENSSL_FORCE_FIPS_MODE. |
||||
+ * If the environment variable OPENSSL_NO_DEFAULT_ZLIB is set the module |
||||
+ will not automatically load the built in compression method ZLIB |
||||
+ when initialized. Applications can still explicitely ask for ZLIB |
||||
+ compression method. |
||||
+ |
||||
DESCRIPTION |
||||
----------- |
||||
|
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
diff -up openssl-1.0.0/Makefile.org.timezone openssl-1.0.0/Makefile.org |
||||
--- openssl-1.0.0/Makefile.org.timezone 2010-03-30 11:08:40.000000000 +0200 |
||||
+++ openssl-1.0.0/Makefile.org 2010-04-06 12:49:21.000000000 +0200 |
||||
@@ -609,7 +609,7 @@ install_docs: |
||||
sec=`$(PERL) util/extract-section.pl 1 < $$i`; \ |
||||
echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ |
||||
(cd `$(PERL) util/dirname.pl $$i`; \ |
||||
- sh -c "$$pod2man \ |
||||
+ sh -c "TZ=UTC $$pod2man \ |
||||
--section=$$sec --center=OpenSSL \ |
||||
--release=$(VERSION) `basename $$i`") \ |
||||
> $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ |
||||
@@ -626,7 +626,7 @@ install_docs: |
||||
sec=`$(PERL) util/extract-section.pl 3 < $$i`; \ |
||||
echo "installing man$$sec/$$fn.$${sec}$(MANSUFFIX)"; \ |
||||
(cd `$(PERL) util/dirname.pl $$i`; \ |
||||
- sh -c "$$pod2man \ |
||||
+ sh -c "TZ=UTC $$pod2man \ |
||||
--section=$$sec --center=OpenSSL \ |
||||
--release=$(VERSION) `basename $$i`") \ |
||||
> $(INSTALL_PREFIX)$(MANDIR)/man$$sec/$$fn.$${sec}$(MANSUFFIX); \ |
@ -0,0 +1,36 @@
@@ -0,0 +1,36 @@
|
||||
diff -up openssl-1.0.0c/apps/genrsa.c.x931 openssl-1.0.0c/apps/genrsa.c |
||||
--- openssl-1.0.0c/apps/genrsa.c.x931 2010-03-01 15:22:02.000000000 +0100 |
||||
+++ openssl-1.0.0c/apps/genrsa.c 2011-02-01 18:32:05.000000000 +0100 |
||||
@@ -95,6 +95,7 @@ int MAIN(int argc, char **argv) |
||||
int ret=1; |
||||
int i,num=DEFBITS; |
||||
long l; |
||||
+ int use_x931 = 0; |
||||
const EVP_CIPHER *enc=NULL; |
||||
unsigned long f4=RSA_F4; |
||||
char *outfile=NULL; |
||||
@@ -138,6 +139,8 @@ int MAIN(int argc, char **argv) |
||||
f4=3; |
||||
else if (strcmp(*argv,"-F4") == 0 || strcmp(*argv,"-f4") == 0) |
||||
f4=RSA_F4; |
||||
+ else if (strcmp(*argv,"-x931") == 0) |
||||
+ use_x931 = 1; |
||||
#ifndef OPENSSL_NO_ENGINE |
||||
else if (strcmp(*argv,"-engine") == 0) |
||||
{ |
||||
@@ -273,7 +276,14 @@ bad: |
||||
if (!rsa) |
||||
goto err; |
||||
|
||||
- if(!BN_set_word(bn, f4) || !RSA_generate_key_ex(rsa, num, bn, &cb)) |
||||
+ if (use_x931) |
||||
+ { |
||||
+ if (!BN_set_word(bn, f4)) |
||||
+ goto err; |
||||
+ if (!RSA_X931_generate_key_ex(rsa, num, bn, &cb)) |
||||
+ goto err; |
||||
+ } |
||||
+ else if(!BN_set_word(bn, f4) || !RSA_generate_key_ex(rsa, num, bn, &cb)) |
||||
goto err; |
||||
|
||||
app_RAND_write_file(NULL, bio_err); |
@ -0,0 +1,110 @@
@@ -0,0 +1,110 @@
|
||||
diff -up openssl-1.0.0d/apps/ca.c.dgst openssl-1.0.0d/apps/ca.c |
||||
--- openssl-1.0.0d/apps/ca.c.dgst 2009-12-02 15:41:24.000000000 +0100 |
||||
+++ openssl-1.0.0d/apps/ca.c 2011-04-05 21:09:42.000000000 +0200 |
||||
@@ -157,7 +157,7 @@ static const char *ca_usage[]={ |
||||
" -startdate YYMMDDHHMMSSZ - certificate validity notBefore\n", |
||||
" -enddate YYMMDDHHMMSSZ - certificate validity notAfter (overrides -days)\n", |
||||
" -days arg - number of days to certify the certificate for\n", |
||||
-" -md arg - md to use, one of md2, md5, sha or sha1\n", |
||||
+" -md arg - md to use, see openssl dgst -h for list\n", |
||||
" -policy arg - The CA 'policy' to support\n", |
||||
" -keyfile arg - private key file\n", |
||||
" -keyform arg - private key file format (PEM or ENGINE)\n", |
||||
diff -up openssl-1.0.0d/apps/enc.c.dgst openssl-1.0.0d/apps/enc.c |
||||
--- openssl-1.0.0d/apps/enc.c.dgst 2010-06-15 19:25:02.000000000 +0200 |
||||
+++ openssl-1.0.0d/apps/enc.c 2011-04-05 21:11:54.000000000 +0200 |
||||
@@ -302,7 +302,7 @@ bad: |
||||
BIO_printf(bio_err,"%-14s passphrase is the next argument\n","-k"); |
||||
BIO_printf(bio_err,"%-14s passphrase is the first line of the file argument\n","-kfile"); |
||||
BIO_printf(bio_err,"%-14s the next argument is the md to use to create a key\n","-md"); |
||||
- BIO_printf(bio_err,"%-14s from a passphrase. One of md2, md5, sha or sha1\n",""); |
||||
+ BIO_printf(bio_err,"%-14s from a passphrase. See openssl dgst -h for list.\n",""); |
||||
BIO_printf(bio_err,"%-14s salt in hex is the next argument\n","-S"); |
||||
BIO_printf(bio_err,"%-14s key/iv in hex is the next argument\n","-K/-iv"); |
||||
BIO_printf(bio_err,"%-14s print the iv/key (then exit if -P)\n","-[pP]"); |
||||
diff -up openssl-1.0.0d/apps/req.c.dgst openssl-1.0.0d/apps/req.c |
||||
--- openssl-1.0.0d/apps/req.c.dgst 2010-03-10 14:48:21.000000000 +0100 |
||||
+++ openssl-1.0.0d/apps/req.c 2011-04-05 21:12:33.000000000 +0200 |
||||
@@ -421,7 +421,7 @@ bad: |
||||
#ifndef OPENSSL_NO_ECDSA |
||||
BIO_printf(bio_err," -newkey ec:file generate a new EC key, parameters taken from CA in 'file'\n"); |
||||
#endif |
||||
- BIO_printf(bio_err," -[digest] Digest to sign with (md5, sha1, md2, mdc2, md4)\n"); |
||||
+ BIO_printf(bio_err," -[digest] Digest to sign with (see openssl dgst -h for list)\n"); |
||||
BIO_printf(bio_err," -config file request template file.\n"); |
||||
BIO_printf(bio_err," -subj arg set or modify request subject\n"); |
||||
BIO_printf(bio_err," -multivalue-rdn enable support for multivalued RDNs\n"); |
||||
diff -up openssl-1.0.0d/apps/ts.c.dgst openssl-1.0.0d/apps/ts.c |
||||
--- openssl-1.0.0d/apps/ts.c.dgst 2009-10-18 16:42:26.000000000 +0200 |
||||
+++ openssl-1.0.0d/apps/ts.c 2011-04-05 21:16:07.000000000 +0200 |
||||
@@ -368,7 +368,7 @@ int MAIN(int argc, char **argv) |
||||
BIO_printf(bio_err, "usage:\n" |
||||
"ts -query [-rand file%cfile%c...] [-config configfile] " |
||||
"[-data file_to_hash] [-digest digest_bytes]" |
||||
- "[-md2|-md4|-md5|-sha|-sha1|-mdc2|-ripemd160] " |
||||
+ "[-<hashalg>] " |
||||
"[-policy object_id] [-no_nonce] [-cert] " |
||||
"[-in request.tsq] [-out request.tsq] [-text]\n", |
||||
LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR); |
||||
diff -up openssl-1.0.0d/apps/x509.c.dgst openssl-1.0.0d/apps/x509.c |
||||
--- openssl-1.0.0d/apps/x509.c.dgst 2011-04-05 21:13:42.000000000 +0200 |
||||
+++ openssl-1.0.0d/apps/x509.c 2011-04-05 21:13:17.000000000 +0200 |
||||
@@ -141,7 +141,7 @@ static const char *x509_usage[]={ |
||||
" -set_serial - serial number to use\n", |
||||
" -text - print the certificate in text form\n", |
||||
" -C - print out C code forms\n", |
||||
-" -md2/-md5/-sha1/-mdc2 - digest to use\n", |
||||
+" -<dgst> - digest to use, see openssl dgst -h output for list\n", |
||||
" -extfile - configuration file with X509V3 extensions to add\n", |
||||
" -extensions - section from config file with X509V3 extensions to add\n", |
||||
" -clrext - delete extensions before signing and input certificate\n", |
||||
diff -up openssl-1.0.0d/doc/apps/ca.pod.dgst openssl-1.0.0d/doc/apps/ca.pod |
||||
--- openssl-1.0.0d/doc/apps/ca.pod.dgst 2009-04-10 13:25:53.000000000 +0200 |
||||
+++ openssl-1.0.0d/doc/apps/ca.pod 2011-04-05 21:16:39.000000000 +0200 |
||||
@@ -160,7 +160,8 @@ the number of days to certify the certif |
||||
=item B<-md alg> |
||||
|
||||
the message digest to use. Possible values include md5, sha1 and mdc2. |
||||
-This option also applies to CRLs. |
||||
+For full list of digests see openssl dgst -h output. This option also |
||||
+applies to CRLs. |
||||
|
||||
=item B<-policy arg> |
||||
|
||||
diff -up openssl-1.0.0d/doc/apps/ocsp.pod.dgst openssl-1.0.0d/doc/apps/ocsp.pod |
||||
--- openssl-1.0.0d/doc/apps/ocsp.pod.dgst 2008-02-25 19:11:47.000000000 +0100 |
||||
+++ openssl-1.0.0d/doc/apps/ocsp.pod 2011-04-05 21:18:17.000000000 +0200 |
||||
@@ -210,7 +210,8 @@ check is not performed. |
||||
=item B<-md5|-sha1|-sha256|-ripemod160|...> |
||||
|
||||
this option sets digest algorithm to use for certificate identification |
||||
-in the OCSP request. By default SHA-1 is used. |
||||
+in the OCSP request. By default SHA-1 is used. See openssl dgst -h output for |
||||
+the list of available algorithms. |
||||
|
||||
=back |
||||
|
||||
diff -up openssl-1.0.0d/doc/apps/req.pod.dgst openssl-1.0.0d/doc/apps/req.pod |
||||
--- openssl-1.0.0d/doc/apps/req.pod.dgst 2009-04-10 18:42:28.000000000 +0200 |
||||
+++ openssl-1.0.0d/doc/apps/req.pod 2011-04-05 21:20:47.000000000 +0200 |
||||
@@ -201,7 +201,8 @@ will not be encrypted. |
||||
|
||||
this specifies the message digest to sign the request with (such as |
||||
B<-md5>, B<-sha1>). This overrides the digest algorithm specified in |
||||
-the configuration file. |
||||
+the configuration file. For full list of possible digests see openssl |
||||
+dgst -h output. |
||||
|
||||
Some public key algorithms may override this choice. For instance, DSA |
||||
signatures always use SHA1, GOST R 34.10 signatures always use |
||||
diff -up openssl-1.0.0d/doc/apps/x509.pod.dgst openssl-1.0.0d/doc/apps/x509.pod |
||||
--- openssl-1.0.0d/doc/apps/x509.pod.dgst 2010-01-12 18:27:11.000000000 +0100 |
||||
+++ openssl-1.0.0d/doc/apps/x509.pod 2011-04-05 21:19:56.000000000 +0200 |
||||
@@ -101,6 +101,7 @@ the digest to use. This affects any sign |
||||
digest, such as the B<-fingerprint>, B<-signkey> and B<-CA> options. If not |
||||
specified then SHA1 is used. If the key being used to sign with is a DSA key |
||||
then this option has no effect: SHA1 is always used with DSA keys. |
||||
+For full list of digests see openssl dgst -h output. |
||||
|
||||
=item B<-engine id> |
||||
|
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
diff -ru openssl-1.0.0d.old/apps/s_client.c openssl-1.0.0d/apps/s_client.c |
||||
--- openssl-1.0.0d.old/apps/s_client.c 2011-07-17 21:05:19.934181169 +0200 |
||||
+++ openssl-1.0.0d/apps/s_client.c 2011-07-17 21:11:42.747824990 +0200 |
||||
@@ -1186,7 +1186,7 @@ |
||||
"xmlns='jabber:client' to='%s' version='1.0'>", host); |
||||
seen = BIO_read(sbio,mbuf,BUFSIZZ); |
||||
mbuf[seen] = 0; |
||||
- while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'")) |
||||
+ while (!strcasestr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'") && !strcasestr(mbuf, "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"")) |
||||
{ |
||||
if (strstr(mbuf, "/stream:features>")) |
||||
goto shut; |
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
diff -up openssl-1.0.0e/engines/e_chil.c.chil openssl-1.0.0e/engines/e_chil.c |
||||
--- openssl-1.0.0e/engines/e_chil.c.chil 2010-06-15 19:25:12.000000000 +0200 |
||||
+++ openssl-1.0.0e/engines/e_chil.c 2011-09-21 17:32:03.000000000 +0200 |
||||
@@ -1261,6 +1261,11 @@ static int hwcrhk_insert_card(const char |
||||
UI *ui; |
||||
void *callback_data = NULL; |
||||
UI_METHOD *ui_method = NULL; |
||||
+ /* Despite what the documentation says prompt_info can be |
||||
+ * an empty string. |
||||
+ */ |
||||
+ if (prompt_info && !*prompt_info) |
||||
+ prompt_info = NULL; |
||||
|
||||
if (cactx) |
||||
{ |
||||
@@ -1287,7 +1292,7 @@ static int hwcrhk_insert_card(const char |
||||
|
||||
if (ui) |
||||
{ |
||||
- char answer; |
||||
+ char answer = '\0'; |
||||
char buf[BUFSIZ]; |
||||
/* Despite what the documentation says wrong_info can be |
||||
* an empty string. |
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
diff -up openssl-1.0.0e/doc/apps/s_client.pod.doc-noeof openssl-1.0.0e/doc/apps/s_client.pod |
||||
--- openssl-1.0.0e/doc/apps/s_client.pod.doc-noeof 2009-06-26 13:28:51.000000000 +0200 |
||||
+++ openssl-1.0.0e/doc/apps/s_client.pod 2011-11-03 08:30:35.000000000 +0100 |
||||
@@ -27,6 +27,7 @@ B<openssl> B<s_client> |
||||
[B<-nbio>] |
||||
[B<-crlf>] |
||||
[B<-ign_eof>] |
||||
+[B<-no_ign_eof>] |
||||
[B<-quiet>] |
||||
[B<-ssl2>] |
||||
[B<-ssl3>] |
||||
@@ -161,6 +162,11 @@ by some servers. |
||||
inhibit shutting down the connection when end of file is reached in the |
||||
input. |
||||
|
||||
+=item B<-no_ign_eof> |
||||
+ |
||||
+shut down the connection when end of file is reached in the |
||||
+input. Can be used to override the implicit B<-ign_eof> after B<-quiet>. |
||||
+ |
||||
=item B<-quiet> |
||||
|
||||
inhibit printing of session and certificate information. This implicitly |
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
diff -up openssl-1.0.1-beta2/ssl/dtls1.h.dtls1-abi openssl-1.0.1-beta2/ssl/dtls1.h |
||||
--- openssl-1.0.1-beta2/ssl/dtls1.h.dtls1-abi 2012-02-06 17:07:34.630336118 +0100 |
||||
+++ openssl-1.0.1-beta2/ssl/dtls1.h 2012-02-06 17:10:08.956623707 +0100 |
||||
@@ -222,9 +222,6 @@ typedef struct dtls1_state_st |
||||
*/ |
||||
record_pqueue buffered_app_data; |
||||
|
||||
- /* Is set when listening for new connections with dtls1_listen() */ |
||||
- unsigned int listen; |
||||
- |
||||
unsigned int mtu; /* max DTLS packet size */ |
||||
|
||||
struct hm_header_st w_msg_hdr; |
||||
@@ -248,6 +245,9 @@ typedef struct dtls1_state_st |
||||
unsigned int retransmitting; |
||||
unsigned int change_cipher_spec_ok; |
||||
|
||||
+ /* Is set when listening for new connections with dtls1_listen() */ |
||||
+ unsigned int listen; |
||||
+ |
||||
#ifndef OPENSSL_NO_SCTP |
||||
/* used when SSL_ST_XX_FLUSH is entered */ |
||||
int next_state; |
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
diff -up openssl-1.0.1-beta2/crypto/md5/md5_dgst.c.md5-allow openssl-1.0.1-beta2/crypto/md5/md5_dgst.c |
||||
--- openssl-1.0.1-beta2/crypto/md5/md5_dgst.c.md5-allow 2012-02-06 20:09:56.000000000 +0100 |
||||
+++ openssl-1.0.1-beta2/crypto/md5/md5_dgst.c 2012-02-06 20:14:02.332117603 +0100 |
||||
@@ -71,7 +71,16 @@ const char MD5_version[]="MD5" OPENSSL_V |
||||
#define INIT_DATA_C (unsigned long)0x98badcfeL |
||||
#define INIT_DATA_D (unsigned long)0x10325476L |
||||
|
||||
-nonfips_md_init(MD5) |
||||
+int MD5_Init(MD5_CTX *c) |
||||
+#ifdef OPENSSL_FIPS |
||||
+ { |
||||
+ if (FIPS_mode() && getenv("OPENSSL_FIPS_NON_APPROVED_MD5_ALLOW") == NULL) |
||||
+ OpenSSLDie(__FILE__, __LINE__, \ |
||||
+ "Digest MD5 forbidden in FIPS mode!"); |
||||
+ return private_MD5_Init(c); |
||||
+ } |
||||
+int private_MD5_Init(MD5_CTX *c) |
||||
+#endif |
||||
{ |
||||
memset (c,0,sizeof(*c)); |
||||
c->A=INIT_DATA_A; |
@ -0,0 +1,193 @@
@@ -0,0 +1,193 @@
|
||||
diff -up openssl-1.0.1-beta2/engines/e_padlock.c.padlock64 openssl-1.0.1-beta2/engines/e_padlock.c |
||||
--- openssl-1.0.1-beta2/engines/e_padlock.c.padlock64 2011-06-21 18:42:15.000000000 +0200 |
||||
+++ openssl-1.0.1-beta2/engines/e_padlock.c 2012-02-06 20:18:52.039537799 +0100 |
||||
@@ -101,7 +101,10 @@ |
||||
compiler choice is limited to GCC and Microsoft C. */ |
||||
#undef COMPILE_HW_PADLOCK |
||||
#if !defined(I386_ONLY) && !defined(OPENSSL_NO_INLINE_ASM) |
||||
-# if (defined(__GNUC__) && (defined(__i386__) || defined(__i386))) || \ |
||||
+# if (defined(__GNUC__) && __GNUC__>=2 && \ |
||||
+ (defined(__i386__) || defined(__i386) || \ |
||||
+ defined(__x86_64__) || defined(__x86_64)) \ |
||||
+ ) || \ |
||||
(defined(_MSC_VER) && defined(_M_IX86)) |
||||
# define COMPILE_HW_PADLOCK |
||||
# endif |
||||
@@ -137,7 +140,7 @@ void ENGINE_load_padlock (void) |
||||
# endif |
||||
#elif defined(__GNUC__) |
||||
# ifndef alloca |
||||
-# define alloca(s) __builtin_alloca(s) |
||||
+# define alloca(s) __builtin_alloca((s)) |
||||
# endif |
||||
#endif |
||||
|
||||
@@ -304,6 +307,7 @@ static volatile struct padlock_cipher_da |
||||
* ======================================================= |
||||
*/ |
||||
#if defined(__GNUC__) && __GNUC__>=2 |
||||
+#if defined(__i386__) || defined(__i386) |
||||
/* |
||||
* As for excessive "push %ebx"/"pop %ebx" found all over. |
||||
* When generating position-independent code GCC won't let |
||||
@@ -383,21 +387,6 @@ padlock_available(void) |
||||
return padlock_use_ace + padlock_use_rng; |
||||
} |
||||
|
||||
-#ifndef OPENSSL_NO_AES |
||||
-/* Our own htonl()/ntohl() */ |
||||
-static inline void |
||||
-padlock_bswapl(AES_KEY *ks) |
||||
-{ |
||||
- size_t i = sizeof(ks->rd_key)/sizeof(ks->rd_key[0]); |
||||
- unsigned int *key = ks->rd_key; |
||||
- |
||||
- while (i--) { |
||||
- asm volatile ("bswapl %0" : "+r"(*key)); |
||||
- key++; |
||||
- } |
||||
-} |
||||
-#endif |
||||
- |
||||
/* Force key reload from memory to the CPU microcode. |
||||
Loading EFLAGS from the stack clears EFLAGS[30] |
||||
which does the trick. */ |
||||
@@ -455,12 +444,127 @@ static inline void *name(size_t cnt, \ |
||||
: "edx", "cc", "memory"); \ |
||||
return iv; \ |
||||
} |
||||
+#endif |
||||
+ |
||||
+#elif defined(__x86_64__) || defined(__x86_64) |
||||
+ |
||||
+/* Load supported features of the CPU to see if |
||||
+ the PadLock is available. */ |
||||
+static int |
||||
+padlock_available(void) |
||||
+{ |
||||
+ char vendor_string[16]; |
||||
+ unsigned int eax, edx; |
||||
|
||||
+ /* Are we running on the Centaur (VIA) CPU? */ |
||||
+ eax = 0x00000000; |
||||
+ vendor_string[12] = 0; |
||||
+ asm volatile ( |
||||
+ "cpuid\n" |
||||
+ "movl %%ebx,(%1)\n" |
||||
+ "movl %%edx,4(%1)\n" |
||||
+ "movl %%ecx,8(%1)\n" |
||||
+ : "+a"(eax) : "r"(vendor_string) : "rbx", "rcx", "rdx"); |
||||
+ if (strcmp(vendor_string, "CentaurHauls") != 0) |
||||
+ return 0; |
||||
+ |
||||
+ /* Check for Centaur Extended Feature Flags presence */ |
||||
+ eax = 0xC0000000; |
||||
+ asm volatile ("cpuid" |
||||
+ : "+a"(eax) : : "rbx", "rcx", "rdx"); |
||||
+ if (eax < 0xC0000001) |
||||
+ return 0; |
||||
+ |
||||
+ /* Read the Centaur Extended Feature Flags */ |
||||
+ eax = 0xC0000001; |
||||
+ asm volatile ("cpuid" |
||||
+ : "+a"(eax), "=d"(edx) : : "rbx", "rcx"); |
||||
+ |
||||
+ /* Fill up some flags */ |
||||
+ padlock_use_ace = ((edx & (0x3<<6)) == (0x3<<6)); |
||||
+ padlock_use_rng = ((edx & (0x3<<2)) == (0x3<<2)); |
||||
+ |
||||
+ return padlock_use_ace + padlock_use_rng; |
||||
+} |
||||
+ |
||||
+/* Force key reload from memory to the CPU microcode. |
||||
+ Loading EFLAGS from the stack clears EFLAGS[30] |
||||
+ which does the trick. */ |
||||
+static inline void |
||||
+padlock_reload_key(void) |
||||
+{ |
||||
+ asm volatile ("pushfq; popfq"); |
||||
+} |
||||
+ |
||||
+#ifndef OPENSSL_NO_AES |
||||
+/* |
||||
+ * This is heuristic key context tracing. At first one |
||||
+ * believes that one should use atomic swap instructions, |
||||
+ * but it's not actually necessary. Point is that if |
||||
+ * padlock_saved_context was changed by another thread |
||||
+ * after we've read it and before we compare it with cdata, |
||||
+ * our key *shall* be reloaded upon thread context switch |
||||
+ * and we are therefore set in either case... |
||||
+ */ |
||||
+static inline void |
||||
+padlock_verify_context(struct padlock_cipher_data *cdata) |
||||
+{ |
||||
+ asm volatile ( |
||||
+ "pushfq\n" |
||||
+" btl $30,(%%rsp)\n" |
||||
+" jnc 1f\n" |
||||
+" cmpq %2,%1\n" |
||||
+" je 1f\n" |
||||
+" popfq\n" |
||||
+" subq $8,%%rsp\n" |
||||
+"1: addq $8,%%rsp\n" |
||||
+" movq %2,%0" |
||||
+ :"+m"(padlock_saved_context) |
||||
+ : "r"(padlock_saved_context), "r"(cdata) : "cc"); |
||||
+} |
||||
+ |
||||
+/* Template for padlock_xcrypt_* modes */ |
||||
+/* BIG FAT WARNING: |
||||
+ * The offsets used with 'leal' instructions |
||||
+ * describe items of the 'padlock_cipher_data' |
||||
+ * structure. |
||||
+ */ |
||||
+#define PADLOCK_XCRYPT_ASM(name,rep_xcrypt) \ |
||||
+static inline void *name(size_t cnt, \ |
||||
+ struct padlock_cipher_data *cdata, \ |
||||
+ void *out, const void *inp) \ |
||||
+{ void *iv; \ |
||||
+ asm volatile ( "leaq 16(%0),%%rdx\n" \ |
||||
+ " leaq 32(%0),%%rbx\n" \ |
||||
+ rep_xcrypt "\n" \ |
||||
+ : "=a"(iv), "=c"(cnt), "=D"(out), "=S"(inp) \ |
||||
+ : "0"(cdata), "1"(cnt), "2"(out), "3"(inp) \ |
||||
+ : "rbx", "rdx", "cc", "memory"); \ |
||||
+ return iv; \ |
||||
+} |
||||
+#endif |
||||
+ |
||||
+#endif /* cpu */ |
||||
+ |
||||
+#ifndef OPENSSL_NO_AES |
||||
/* Generate all functions with appropriate opcodes */ |
||||
PADLOCK_XCRYPT_ASM(padlock_xcrypt_ecb, ".byte 0xf3,0x0f,0xa7,0xc8") /* rep xcryptecb */ |
||||
PADLOCK_XCRYPT_ASM(padlock_xcrypt_cbc, ".byte 0xf3,0x0f,0xa7,0xd0") /* rep xcryptcbc */ |
||||
PADLOCK_XCRYPT_ASM(padlock_xcrypt_cfb, ".byte 0xf3,0x0f,0xa7,0xe0") /* rep xcryptcfb */ |
||||
PADLOCK_XCRYPT_ASM(padlock_xcrypt_ofb, ".byte 0xf3,0x0f,0xa7,0xe8") /* rep xcryptofb */ |
||||
+ |
||||
+/* Our own htonl()/ntohl() */ |
||||
+static inline void |
||||
+padlock_bswapl(AES_KEY *ks) |
||||
+{ |
||||
+ size_t i = sizeof(ks->rd_key)/sizeof(ks->rd_key[0]); |
||||
+ unsigned int *key = ks->rd_key; |
||||
+ |
||||
+ while (i--) { |
||||
+ asm volatile ("bswapl %0" : "+r"(*key)); |
||||
+ key++; |
||||
+ } |
||||
+} |
||||
#endif |
||||
|
||||
/* The RNG call itself */ |
||||
@@ -491,8 +595,8 @@ padlock_xstore(void *addr, unsigned int |
||||
static inline unsigned char * |
||||
padlock_memcpy(void *dst,const void *src,size_t n) |
||||
{ |
||||
- long *d=dst; |
||||
- const long *s=src; |
||||
+ size_t *d=dst; |
||||
+ const size_t *s=src; |
||||
|
||||
n /= sizeof(*d); |
||||
do { *d++ = *s++; } while (--n); |
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
diff -up openssl-1.0.1-beta2/ssl/ssl.h.op-all openssl-1.0.1-beta2/ssl/ssl.h |
||||
--- openssl-1.0.1-beta2/ssl/ssl.h.op-all 2012-02-02 12:49:00.828035916 +0100 |
||||
+++ openssl-1.0.1-beta2/ssl/ssl.h 2012-02-02 12:52:27.297818182 +0100 |
||||
@@ -540,7 +540,7 @@ struct ssl_session_st |
||||
#define SSL_OP_NETSCAPE_CHALLENGE_BUG 0x00000002L |
||||
/* Allow initial connection to servers that don't support RI */ |
||||
#define SSL_OP_LEGACY_SERVER_CONNECT 0x00000004L |
||||
-#define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x00000008L |
||||
+#define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG 0x00000008L /* no effect since 1.0.0c due to CVE-2010-4180 */ |
||||
#define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG 0x00000010L |
||||
#define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER 0x00000020L |
||||
#define SSL_OP_MSIE_SSLV2_RSA_PADDING 0x00000040L /* no effect since 0.9.7h and 0.9.8b */ |
||||
@@ -558,7 +558,7 @@ struct ssl_session_st |
||||
|
||||
/* SSL_OP_ALL: various bug workarounds that should be rather harmless. |
||||
* This used to be 0x000FFFFFL before 0.9.7. */ |
||||
-#define SSL_OP_ALL 0x80000BFFL |
||||
+#define SSL_OP_ALL 0x80000BF7L /* we still have to include SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS */ |
||||
|
||||
/* DTLS options */ |
||||
#define SSL_OP_NO_QUERY_MTU 0x00001000L |
@ -0,0 +1,30 @@
@@ -0,0 +1,30 @@
|
||||
diff -up openssl-1.0.1/Makefile.org.krb5 openssl-1.0.1/Makefile.org |
||||
--- openssl-1.0.1/Makefile.org.krb5 2012-03-14 21:15:04.000000000 +0100 |
||||
+++ openssl-1.0.1/Makefile.org 2012-04-11 16:28:31.254725422 +0200 |
||||
@@ -370,7 +370,7 @@ libcrypto.pc: Makefile |
||||
echo 'Requires: '; \ |
||||
echo 'Libs: -L$${libdir} -lcrypto'; \ |
||||
echo 'Libs.private: $(EX_LIBS)'; \ |
||||
- echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libcrypto.pc |
||||
+ echo 'Cflags: -I$${includedir}' ) > libcrypto.pc |
||||
|
||||
libssl.pc: Makefile |
||||
@ ( echo 'prefix=$(INSTALLTOP)'; \ |
||||
@@ -383,7 +383,7 @@ libssl.pc: Makefile |
||||
echo 'Version: '$(VERSION); \ |
||||
echo 'Requires: '; \ |
||||
echo 'Libs: -L$${libdir} -lssl -lcrypto'; \ |
||||
- echo 'Libs.private: $(EX_LIBS)'; \ |
||||
+ echo 'Libs.private: $(EX_LIBS) $(LIBKRB5)'; \ |
||||
echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > libssl.pc |
||||
|
||||
openssl.pc: Makefile |
||||
@@ -397,7 +397,7 @@ openssl.pc: Makefile |
||||
echo 'Version: '$(VERSION); \ |
||||
echo 'Requires: '; \ |
||||
echo 'Libs: -L$${libdir} -lssl -lcrypto'; \ |
||||
- echo 'Libs.private: $(EX_LIBS)'; \ |
||||
+ echo 'Libs.private: $(EX_LIBS) $(LIBKRB5)'; \ |
||||
echo 'Cflags: -I$${includedir} $(KRB5_INCLUDES)' ) > openssl.pc |
||||
|
||||
Makefile: Makefile.org Configure config |
@ -0,0 +1,77 @@
@@ -0,0 +1,77 @@
|
||||
diff -up openssl-1.0.1a/doc/crypto/EVP_DigestInit.pod.algo-doc openssl-1.0.1a/doc/crypto/EVP_DigestInit.pod |
||||
--- openssl-1.0.1a/doc/crypto/EVP_DigestInit.pod.algo-doc 2012-04-11 00:28:22.000000000 +0200 |
||||
+++ openssl-1.0.1a/doc/crypto/EVP_DigestInit.pod 2012-04-20 09:14:01.865167011 +0200 |
||||
@@ -75,7 +75,7 @@ EVP_MD_CTX_create() allocates, initializ |
||||
|
||||
EVP_DigestInit_ex() sets up digest context B<ctx> to use a digest |
||||
B<type> from ENGINE B<impl>. B<ctx> must be initialized before calling this |
||||
-function. B<type> will typically be supplied by a functionsuch as EVP_sha1(). |
||||
+function. B<type> will typically be supplied by a function such as EVP_sha1(). |
||||
If B<impl> is NULL then the default implementation of digest B<type> is used. |
||||
|
||||
EVP_DigestUpdate() hashes B<cnt> bytes of data at B<d> into the |
||||
@@ -165,7 +165,8 @@ EVP_MD_size(), EVP_MD_block_size(), EVP_ |
||||
EVP_MD_CTX_block_size() and EVP_MD_block_size() return the digest or block |
||||
size in bytes. |
||||
|
||||
-EVP_md_null(), EVP_md2(), EVP_md5(), EVP_sha(), EVP_sha1(), EVP_dss(), |
||||
+EVP_md_null(), EVP_md2(), EVP_md5(), EVP_sha(), EVP_sha1(), |
||||
+EVP_sha224(), EVP_sha256(), EVP_sha384(), EVP_sha512(), EVP_dss(), |
||||
EVP_dss1(), EVP_mdc2() and EVP_ripemd160() return pointers to the |
||||
corresponding EVP_MD structures. |
||||
|
||||
diff -up openssl-1.0.1a/doc/crypto/EVP_EncryptInit.pod.algo-doc openssl-1.0.1a/doc/crypto/EVP_EncryptInit.pod |
||||
--- openssl-1.0.1a/doc/crypto/EVP_EncryptInit.pod.algo-doc 2005-04-15 18:01:35.000000000 +0200 |
||||
+++ openssl-1.0.1a/doc/crypto/EVP_EncryptInit.pod 2012-04-20 09:10:59.114736465 +0200 |
||||
@@ -91,6 +91,32 @@ EVP_CIPHER_CTX_set_padding - EVP cipher |
||||
int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type); |
||||
int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type); |
||||
|
||||
+ const EVP_CIPHER *EVP_des_ede3(void); |
||||
+ const EVP_CIPHER *EVP_des_ede3_ecb(void); |
||||
+ const EVP_CIPHER *EVP_des_ede3_cfb64(void); |
||||
+ const EVP_CIPHER *EVP_des_ede3_cfb1(void); |
||||
+ const EVP_CIPHER *EVP_des_ede3_cfb8(void); |
||||
+ const EVP_CIPHER *EVP_des_ede3_ofb(void); |
||||
+ const EVP_CIPHER *EVP_des_ede3_cbc(void); |
||||
+ const EVP_CIPHER *EVP_aes_128_ecb(void); |
||||
+ const EVP_CIPHER *EVP_aes_128_cbc(void); |
||||
+ const EVP_CIPHER *EVP_aes_128_cfb1(void); |
||||
+ const EVP_CIPHER *EVP_aes_128_cfb8(void); |
||||
+ const EVP_CIPHER *EVP_aes_128_cfb128(void); |
||||
+ const EVP_CIPHER *EVP_aes_128_ofb(void); |
||||
+ const EVP_CIPHER *EVP_aes_192_ecb(void); |
||||
+ const EVP_CIPHER *EVP_aes_192_cbc(void); |
||||
+ const EVP_CIPHER *EVP_aes_192_cfb1(void); |
||||
+ const EVP_CIPHER *EVP_aes_192_cfb8(void); |
||||
+ const EVP_CIPHER *EVP_aes_192_cfb128(void); |
||||
+ const EVP_CIPHER *EVP_aes_192_ofb(void); |
||||
+ const EVP_CIPHER *EVP_aes_256_ecb(void); |
||||
+ const EVP_CIPHER *EVP_aes_256_cbc(void); |
||||
+ const EVP_CIPHER *EVP_aes_256_cfb1(void); |
||||
+ const EVP_CIPHER *EVP_aes_256_cfb8(void); |
||||
+ const EVP_CIPHER *EVP_aes_256_cfb128(void); |
||||
+ const EVP_CIPHER *EVP_aes_256_ofb(void); |
||||
+ |
||||
=head1 DESCRIPTION |
||||
|
||||
The EVP cipher routines are a high level interface to certain |
||||
@@ -297,6 +323,18 @@ Three key triple DES in CBC, ECB, CFB an |
||||
|
||||
DESX algorithm in CBC mode. |
||||
|
||||
+=item EVP_aes_128_cbc(void), EVP_aes_128_ecb(), EVP_aes_128_ofb(void), EVP_aes_128_cfb1(void), EVP_aes_128_cfb8(void), EVP_aes_128_cfb128(void) |
||||
+ |
||||
+AES with 128 bit key length in CBC, ECB, OFB and CFB modes respectively. |
||||
+ |
||||
+=item EVP_aes_192_cbc(void), EVP_aes_192_ecb(), EVP_aes_192_ofb(void), EVP_aes_192_cfb1(void), EVP_aes_192_cfb8(void), EVP_aes_192_cfb128(void) |
||||
+ |
||||
+AES with 192 bit key length in CBC, ECB, OFB and CFB modes respectively. |
||||
+ |
||||
+=item EVP_aes_256_cbc(void), EVP_aes_256_ecb(), EVP_aes_256_ofb(void), EVP_aes_256_cfb1(void), EVP_aes_256_cfb8(void), EVP_aes_256_cfb128(void) |
||||
+ |
||||
+AES with 256 bit key length in CBC, ECB, OFB and CFB modes respectively. |
||||
+ |
||||
=item EVP_rc4(void) |
||||
|
||||
RC4 stream cipher. This is a variable key length cipher with default key length 128 bits. |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
diff -up openssl-1.0.1c/crypto/modes/Makefile.aliasing openssl-1.0.1c/crypto/modes/Makefile |
||||
--- openssl-1.0.1c/crypto/modes/Makefile.aliasing 2011-08-12 00:36:17.000000000 +0200 |
||||
+++ openssl-1.0.1c/crypto/modes/Makefile 2012-07-13 11:32:10.767829077 +0200 |
||||
@@ -12,7 +12,7 @@ AR= ar r |
||||
|
||||
MODES_ASM_OBJ= |
||||
|
||||
-CFLAGS= $(INCLUDES) $(CFLAG) |
||||
+CFLAGS= $(INCLUDES) $(CFLAG) -fno-strict-aliasing |
||||
ASFLAGS= $(INCLUDES) $(ASFLAG) |
||||
AFLAGS= $(ASFLAGS) |
||||
|
@ -0,0 +1,100 @@
@@ -0,0 +1,100 @@
|
||||
diff -up openssl-1.0.1c/apps/s_client.c.default-paths openssl-1.0.1c/apps/s_client.c |
||||
--- openssl-1.0.1c/apps/s_client.c.default-paths 2012-03-18 19:16:05.000000000 +0100 |
||||
+++ openssl-1.0.1c/apps/s_client.c 2012-12-06 18:24:06.425933203 +0100 |
||||
@@ -1166,12 +1166,19 @@ bad: |
||||
if (!set_cert_key_stuff(ctx,cert,key)) |
||||
goto end; |
||||
|
||||
- if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) || |
||||
- (!SSL_CTX_set_default_verify_paths(ctx))) |
||||
+ if (CAfile == NULL && CApath == NULL) |
||||
{ |
||||
- /* BIO_printf(bio_err,"error setting default verify locations\n"); */ |
||||
- ERR_print_errors(bio_err); |
||||
- /* goto end; */ |
||||
+ if (!SSL_CTX_set_default_verify_paths(ctx)) |
||||
+ { |
||||
+ ERR_print_errors(bio_err); |
||||
+ } |
||||
+ } |
||||
+ else |
||||
+ { |
||||
+ if (!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) |
||||
+ { |
||||
+ ERR_print_errors(bio_err); |
||||
+ } |
||||
} |
||||
|
||||
#ifndef OPENSSL_NO_TLSEXT |
||||
diff -up openssl-1.0.1c/apps/s_server.c.default-paths openssl-1.0.1c/apps/s_server.c |
||||
--- openssl-1.0.1c/apps/s_server.c.default-paths 2012-03-18 19:16:05.000000000 +0100 |
||||
+++ openssl-1.0.1c/apps/s_server.c 2012-12-06 18:25:11.199329611 +0100 |
||||
@@ -1565,13 +1565,21 @@ bad: |
||||
} |
||||
#endif |
||||
|
||||
- if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) || |
||||
- (!SSL_CTX_set_default_verify_paths(ctx))) |
||||
+ if (CAfile == NULL && CApath == NULL) |
||||
{ |
||||
- /* BIO_printf(bio_err,"X509_load_verify_locations\n"); */ |
||||
- ERR_print_errors(bio_err); |
||||
- /* goto end; */ |
||||
+ if (!SSL_CTX_set_default_verify_paths(ctx)) |
||||
+ { |
||||
+ ERR_print_errors(bio_err); |
||||
+ } |
||||
+ } |
||||
+ else |
||||
+ { |
||||
+ if (!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) |
||||
+ { |
||||
+ ERR_print_errors(bio_err); |
||||
+ } |
||||
} |
||||
+ |
||||
if (vpm) |
||||
SSL_CTX_set1_param(ctx, vpm); |
||||
|
||||
@@ -1622,8 +1630,11 @@ bad: |
||||
else |
||||
SSL_CTX_sess_set_cache_size(ctx2,128); |
||||
|
||||
- if ((!SSL_CTX_load_verify_locations(ctx2,CAfile,CApath)) || |
||||
- (!SSL_CTX_set_default_verify_paths(ctx2))) |
||||
+ if (!SSL_CTX_load_verify_locations(ctx2,CAfile,CApath)) |
||||
+ { |
||||
+ ERR_print_errors(bio_err); |
||||
+ } |
||||
+ if (!SSL_CTX_set_default_verify_paths(ctx2)) |
||||
{ |
||||
ERR_print_errors(bio_err); |
||||
} |
||||
diff -up openssl-1.0.1c/apps/s_time.c.default-paths openssl-1.0.1c/apps/s_time.c |
||||
--- openssl-1.0.1c/apps/s_time.c.default-paths 2006-04-17 14:22:13.000000000 +0200 |
||||
+++ openssl-1.0.1c/apps/s_time.c 2012-12-06 18:27:41.694574044 +0100 |
||||
@@ -373,12 +373,19 @@ int MAIN(int argc, char **argv) |
||||
|
||||
SSL_load_error_strings(); |
||||
|
||||
- if ((!SSL_CTX_load_verify_locations(tm_ctx,CAfile,CApath)) || |
||||
- (!SSL_CTX_set_default_verify_paths(tm_ctx))) |
||||
+ if (CAfile == NULL && CApath == NULL) |
||||
{ |
||||
- /* BIO_printf(bio_err,"error setting default verify locations\n"); */ |
||||
- ERR_print_errors(bio_err); |
||||
- /* goto end; */ |
||||
+ if (!SSL_CTX_set_default_verify_paths(tm_ctx)) |
||||
+ { |
||||
+ ERR_print_errors(bio_err); |
||||
+ } |
||||
+ } |
||||
+ else |
||||
+ { |
||||
+ if (!SSL_CTX_load_verify_locations(tm_ctx,CAfile,CApath)) |
||||
+ { |
||||
+ ERR_print_errors(bio_err); |
||||
+ } |
||||
} |
||||
|
||||
if (tm_cipher == NULL) |
@ -0,0 +1,61 @@
@@ -0,0 +1,61 @@
|
||||
diff -up openssl-1.0.1c/apps/s_server.c.dh1024 openssl-1.0.1c/apps/s_server.c |
||||
--- openssl-1.0.1c/apps/s_server.c.dh1024 2012-11-14 20:27:50.000000000 +0100 |
||||
+++ openssl-1.0.1c/apps/s_server.c 2012-11-15 20:56:15.247774465 +0100 |
||||
@@ -222,27 +222,31 @@ static void s_server_init(void); |
||||
#endif |
||||
|
||||
#ifndef OPENSSL_NO_DH |
||||
-static unsigned char dh512_p[]={ |
||||
- 0xDA,0x58,0x3C,0x16,0xD9,0x85,0x22,0x89,0xD0,0xE4,0xAF,0x75, |
||||
- 0x6F,0x4C,0xCA,0x92,0xDD,0x4B,0xE5,0x33,0xB8,0x04,0xFB,0x0F, |
||||
- 0xED,0x94,0xEF,0x9C,0x8A,0x44,0x03,0xED,0x57,0x46,0x50,0xD3, |
||||
- 0x69,0x99,0xDB,0x29,0xD7,0x76,0x27,0x6B,0xA2,0xD3,0xD4,0x12, |
||||
- 0xE2,0x18,0xF4,0xDD,0x1E,0x08,0x4C,0xF6,0xD8,0x00,0x3E,0x7C, |
||||
- 0x47,0x74,0xE8,0x33, |
||||
- }; |
||||
-static unsigned char dh512_g[]={ |
||||
- 0x02, |
||||
- }; |
||||
- |
||||
-static DH *get_dh512(void) |
||||
+static DH *get_dh1024() |
||||
{ |
||||
- DH *dh=NULL; |
||||
+ static unsigned char dh1024_p[]={ |
||||
+ 0x99,0x58,0xFA,0x90,0x53,0x2F,0xE0,0x61,0x83,0x9D,0x54,0x63, |
||||
+ 0xBD,0x35,0x5A,0x31,0xF3,0xC6,0x79,0xE5,0xA0,0x0F,0x66,0x79, |
||||
+ 0x3C,0xA0,0x7F,0xE8,0xA2,0x5F,0xDF,0x11,0x08,0xA3,0xF0,0x3C, |
||||
+ 0xC3,0x3C,0x5D,0x50,0x2C,0xD5,0xD6,0x58,0x12,0xDB,0xC1,0xEF, |
||||
+ 0xB4,0x47,0x4A,0x5A,0x39,0x8A,0x4E,0xEB,0x44,0xE2,0x07,0xFB, |
||||
+ 0x3D,0xA3,0xC7,0x6E,0x52,0xF3,0x2B,0x7B,0x10,0xA5,0x98,0xE3, |
||||
+ 0x38,0x2A,0xE2,0x7F,0xA4,0x8F,0x26,0x87,0x9B,0x66,0x7A,0xED, |
||||
+ 0x2D,0x4C,0xE7,0x33,0x77,0x47,0x94,0x43,0xB6,0xAA,0x97,0x23, |
||||
+ 0x8A,0xFC,0xA5,0xA6,0x64,0x09,0xC0,0x27,0xC0,0xEF,0xCB,0x05, |
||||
+ 0x90,0x9D,0xD5,0x75,0xBA,0x00,0xE0,0xFB,0xA8,0x81,0x52,0xA4, |
||||
+ 0xB2,0x83,0x22,0x5B,0xCB,0xD7,0x16,0x93, |
||||
+ }; |
||||
+ static unsigned char dh1024_g[]={ |
||||
+ 0x02, |
||||
+ }; |
||||
+ DH *dh; |
||||
|
||||
if ((dh=DH_new()) == NULL) return(NULL); |
||||
- dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL); |
||||
- dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL); |
||||
+ dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL); |
||||
+ dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL); |
||||
if ((dh->p == NULL) || (dh->g == NULL)) |
||||
- return(NULL); |
||||
+ { DH_free(dh); return(NULL); } |
||||
return(dh); |
||||
} |
||||
#endif |
||||
@@ -1657,7 +1661,7 @@ bad: |
||||
else |
||||
{ |
||||
BIO_printf(bio_s_out,"Using default temp DH parameters\n"); |
||||
- dh=get_dh512(); |
||||
+ dh=get_dh1024(); |
||||
} |
||||
(void)BIO_flush(bio_s_out); |
||||
|
@ -0,0 +1,516 @@
@@ -0,0 +1,516 @@
|
||||
diff -up openssl-1.0.1c/apps/s_apps.h.ipv6-apps openssl-1.0.1c/apps/s_apps.h |
||||
--- openssl-1.0.1c/apps/s_apps.h.ipv6-apps 2012-07-11 22:46:02.409221206 +0200 |
||||
+++ openssl-1.0.1c/apps/s_apps.h 2012-07-11 22:46:02.451222165 +0200 |
||||
@@ -148,7 +148,7 @@ typedef fd_mask fd_set; |
||||
#define PORT_STR "4433" |
||||
#define PROTOCOL "tcp" |
||||
|
||||
-int do_server(int port, int type, int *ret, int (*cb) (char *hostname, int s, unsigned char *context), unsigned char *context); |
||||
+int do_server(char *port, int type, int *ret, int (*cb) (char *hostname, int s, unsigned char *context), unsigned char *context); |
||||
#ifdef HEADER_X509_H |
||||
int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx); |
||||
#endif |
||||
@@ -156,10 +156,9 @@ int MS_CALLBACK verify_callback(int ok, |
||||
int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file); |
||||
int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key); |
||||
#endif |
||||
-int init_client(int *sock, char *server, int port, int type); |
||||
+int init_client(int *sock, char *server, char *port, int type); |
||||
int should_retry(int i); |
||||
-int extract_port(char *str, short *port_ptr); |
||||
-int extract_host_port(char *str,char **host_ptr,unsigned char *ip,short *p); |
||||
+int extract_host_port(char *str,char **host_ptr,char **port_ptr); |
||||
|
||||
long MS_CALLBACK bio_dump_callback(BIO *bio, int cmd, const char *argp, |
||||
int argi, long argl, long ret); |
||||
diff -up openssl-1.0.1c/apps/s_client.c.ipv6-apps openssl-1.0.1c/apps/s_client.c |
||||
--- openssl-1.0.1c/apps/s_client.c.ipv6-apps 2012-07-11 22:46:02.433221754 +0200 |
||||
+++ openssl-1.0.1c/apps/s_client.c 2012-07-11 22:46:02.452222187 +0200 |
||||
@@ -563,7 +563,7 @@ int MAIN(int argc, char **argv) |
||||
int cbuf_len,cbuf_off; |
||||
int sbuf_len,sbuf_off; |
||||
fd_set readfds,writefds; |
||||
- short port=PORT; |
||||
+ char *port_str = PORT_STR; |
||||
int full_log=1; |
||||
char *host=SSL_HOST_NAME; |
||||
char *cert_file=NULL,*key_file=NULL; |
||||
@@ -664,13 +664,12 @@ int MAIN(int argc, char **argv) |
||||
else if (strcmp(*argv,"-port") == 0) |
||||
{ |
||||
if (--argc < 1) goto bad; |
||||
- port=atoi(*(++argv)); |
||||
- if (port == 0) goto bad; |
||||
+ port_str= *(++argv); |
||||
} |
||||
else if (strcmp(*argv,"-connect") == 0) |
||||
{ |
||||
if (--argc < 1) goto bad; |
||||
- if (!extract_host_port(*(++argv),&host,NULL,&port)) |
||||
+ if (!extract_host_port(*(++argv),&host,&port_str)) |
||||
goto bad; |
||||
} |
||||
else if (strcmp(*argv,"-verify") == 0) |
||||
@@ -1253,7 +1252,7 @@ bad: |
||||
|
||||
re_start: |
||||
|
||||
- if (init_client(&s,host,port,socket_type) == 0) |
||||
+ if (init_client(&s,host,port_str,socket_type) == 0) |
||||
{ |
||||
BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error()); |
||||
SHUTDOWN(s); |
||||
diff -up openssl-1.0.1c/apps/s_server.c.ipv6-apps openssl-1.0.1c/apps/s_server.c |
||||
--- openssl-1.0.1c/apps/s_server.c.ipv6-apps 2012-07-11 22:46:02.434221777 +0200 |
||||
+++ openssl-1.0.1c/apps/s_server.c 2012-07-11 22:46:02.453222210 +0200 |
||||
@@ -929,7 +929,7 @@ int MAIN(int argc, char *argv[]) |
||||
{ |
||||
X509_VERIFY_PARAM *vpm = NULL; |
||||
int badarg = 0; |
||||
- short port=PORT; |
||||
+ char *port_str = PORT_STR; |
||||
char *CApath=NULL,*CAfile=NULL; |
||||
unsigned char *context = NULL; |
||||
char *dhfile = NULL; |
||||
@@ -1000,8 +1000,7 @@ int MAIN(int argc, char *argv[]) |
||||
(strcmp(*argv,"-accept") == 0)) |
||||
{ |
||||
if (--argc < 1) goto bad; |
||||
- if (!extract_port(*(++argv),&port)) |
||||
- goto bad; |
||||
+ port_str= *(++argv); |
||||
} |
||||
else if (strcmp(*argv,"-verify") == 0) |
||||
{ |
||||
@@ -1878,9 +1877,9 @@ bad: |
||||
BIO_printf(bio_s_out,"ACCEPT\n"); |
||||
(void)BIO_flush(bio_s_out); |
||||
if (www) |
||||
- do_server(port,socket_type,&accept_socket,www_body, context); |
||||
+ do_server(port_str,socket_type,&accept_socket,www_body, context); |
||||
else |
||||
- do_server(port,socket_type,&accept_socket,sv_body, context); |
||||
+ do_server(port_str,socket_type,&accept_socket,sv_body, context); |
||||
print_stats(bio_s_out,ctx); |
||||
ret=0; |
||||
end: |
||||
diff -up openssl-1.0.1c/apps/s_socket.c.ipv6-apps openssl-1.0.1c/apps/s_socket.c |
||||
--- openssl-1.0.1c/apps/s_socket.c.ipv6-apps 2011-12-02 15:39:40.000000000 +0100 |
||||
+++ openssl-1.0.1c/apps/s_socket.c 2012-07-11 22:49:05.411400450 +0200 |
||||
@@ -102,9 +102,7 @@ static struct hostent *GetHostByName(cha |
||||
static void ssl_sock_cleanup(void); |
||||
#endif |
||||
static int ssl_sock_init(void); |
||||
-static int init_client_ip(int *sock,unsigned char ip[4], int port, int type); |
||||
-static int init_server(int *sock, int port, int type); |
||||
-static int init_server_long(int *sock, int port,char *ip, int type); |
||||
+static int init_server(int *sock, char *port, int type); |
||||
static int do_accept(int acc_sock, int *sock, char **host); |
||||
static int host_ip(char *str, unsigned char ip[4]); |
||||
|
||||
@@ -234,57 +232,70 @@ static int ssl_sock_init(void) |
||||
return(1); |
||||
} |
||||
|
||||
-int init_client(int *sock, char *host, int port, int type) |
||||
+int init_client(int *sock, char *host, char *port, int type) |
||||
{ |
||||
- unsigned char ip[4]; |
||||
- |
||||
- memset(ip, '\0', sizeof ip); |
||||
- if (!host_ip(host,&(ip[0]))) |
||||
- return 0; |
||||
- return init_client_ip(sock,ip,port,type); |
||||
- } |
||||
- |
||||
-static int init_client_ip(int *sock, unsigned char ip[4], int port, int type) |
||||
- { |
||||
- unsigned long addr; |
||||
- struct sockaddr_in them; |
||||
- int s,i; |
||||
+ struct addrinfo *res, *res0, hints; |
||||
+ char * failed_call = NULL; |
||||
+ int s; |
||||
+ int e; |
||||
|
||||
if (!ssl_sock_init()) return(0); |
||||
|
||||
- memset((char *)&them,0,sizeof(them)); |
||||
- them.sin_family=AF_INET; |
||||
- them.sin_port=htons((unsigned short)port); |
||||
- addr=(unsigned long) |
||||
- ((unsigned long)ip[0]<<24L)| |
||||
- ((unsigned long)ip[1]<<16L)| |
||||
- ((unsigned long)ip[2]<< 8L)| |
||||
- ((unsigned long)ip[3]); |
||||
- them.sin_addr.s_addr=htonl(addr); |
||||
- |
||||
- if (type == SOCK_STREAM) |
||||
- s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); |
||||
- else /* ( type == SOCK_DGRAM) */ |
||||
- s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); |
||||
- |
||||
- if (s == INVALID_SOCKET) { perror("socket"); return(0); } |
||||
+ memset(&hints, '\0', sizeof(hints)); |
||||
+ hints.ai_socktype = type; |
||||
+ hints.ai_flags = AI_ADDRCONFIG; |
||||
+ |
||||
+ e = getaddrinfo(host, port, &hints, &res); |
||||
+ if (e) |
||||
+ { |
||||
+ fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(e)); |
||||
+ if (e == EAI_SYSTEM) |
||||
+ perror("getaddrinfo"); |
||||
+ return (0); |
||||
+ } |
||||
|
||||
+ res0 = res; |
||||
+ while (res) |
||||
+ { |
||||
+ s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); |
||||
+ if (s == INVALID_SOCKET) |
||||
+ { |
||||
+ failed_call = "socket"; |
||||
+ goto nextres; |
||||
+ } |
||||
#if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE) |
||||
if (type == SOCK_STREAM) |
||||
{ |
||||
- i=0; |
||||
- i=setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); |
||||
- if (i < 0) { perror("keepalive"); return(0); } |
||||
+ int i=0; |
||||
+ i=setsockopt(s,SOL_SOCKET,SO_KEEPALIVE, |
||||
+ (char *)&i,sizeof(i)); |
||||
+ if (i < 0) { |
||||
+ failed_call = "keepalive"; |
||||
+ goto nextres; |
||||
+ } |
||||
} |
||||
#endif |
||||
- |
||||
- if (connect(s,(struct sockaddr *)&them,sizeof(them)) == -1) |
||||
- { closesocket(s); perror("connect"); return(0); } |
||||
+ if (connect(s,(struct sockaddr *)res->ai_addr, |
||||
+ res->ai_addrlen) == 0) |
||||
+ { |
||||
+ freeaddrinfo(res0); |
||||
*sock=s; |
||||
return(1); |
||||
} |
||||
|
||||
-int do_server(int port, int type, int *ret, int (*cb)(char *hostname, int s, unsigned char *context), unsigned char *context) |
||||
+ failed_call = "socket"; |
||||
+nextres: |
||||
+ if (s != INVALID_SOCKET) |
||||
+ close(s); |
||||
+ res = res->ai_next; |
||||
+ } |
||||
+ freeaddrinfo(res0); |
||||
+ |
||||
+ perror(failed_call); |
||||
+ return(0); |
||||
+ } |
||||
+ |
||||
+int do_server(char *port, int type, int *ret, int (*cb)(char *hostname, int s, unsigned char *context), unsigned char *context) |
||||
{ |
||||
int sock; |
||||
char *name = NULL; |
||||
@@ -322,33 +333,50 @@ int do_server(int port, int type, int *r |
||||
} |
||||
} |
||||
|
||||
-static int init_server_long(int *sock, int port, char *ip, int type) |
||||
+static int init_server(int *sock, char *port, int type) |
||||
{ |
||||
- int ret=0; |
||||
- struct sockaddr_in server; |
||||
- int s= -1; |
||||
+ struct addrinfo *res, *res0 = NULL, hints; |
||||
+ char * failed_call = NULL; |
||||
+ int s = INVALID_SOCKET; |
||||
+ int e; |
||||
|
||||
if (!ssl_sock_init()) return(0); |
||||
|
||||
- memset((char *)&server,0,sizeof(server)); |
||||
- server.sin_family=AF_INET; |
||||
- server.sin_port=htons((unsigned short)port); |
||||
- if (ip == NULL) |
||||
- server.sin_addr.s_addr=INADDR_ANY; |
||||
- else |
||||
-/* Added for T3E, address-of fails on bit field (beckman@acl.lanl.gov) */ |
||||
-#ifndef BIT_FIELD_LIMITS |
||||
- memcpy(&server.sin_addr.s_addr,ip,4); |
||||
-#else |
||||
- memcpy(&server.sin_addr,ip,4); |
||||
-#endif |
||||
+ memset(&hints, '\0', sizeof(hints)); |
||||
+ hints.ai_family = AF_INET6; |
||||
+tryipv4: |
||||
+ hints.ai_socktype = type; |
||||
+ hints.ai_flags = AI_PASSIVE; |
||||
|
||||
- if (type == SOCK_STREAM) |
||||
- s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); |
||||
- else /* type == SOCK_DGRAM */ |
||||
- s=socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP); |
||||
+ e = getaddrinfo(NULL, port, &hints, &res); |
||||
+ if (e) |
||||
+ { |
||||
+ if (hints.ai_family == AF_INET) |
||||
+ { |
||||
+ fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(e)); |
||||
+ if (e == EAI_SYSTEM) |
||||
+ perror("getaddrinfo"); |
||||
+ return (0); |
||||
+ } |
||||
+ else |
||||
+ res = NULL; |
||||
+ } |
||||
|
||||
- if (s == INVALID_SOCKET) goto err; |
||||
+ res0 = res; |
||||
+ while (res) |
||||
+ { |
||||
+ s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); |
||||
+ if (s == INVALID_SOCKET) |
||||
+ { |
||||
+ failed_call = "socket"; |
||||
+ goto nextres; |
||||
+ } |
||||
+ if (hints.ai_family == AF_INET6) |
||||
+ { |
||||
+ int j = 0; |
||||
+ setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, |
||||
+ (void *) &j, sizeof j); |
||||
+ } |
||||
#if defined SOL_SOCKET && defined SO_REUSEADDR |
||||
{ |
||||
int j = 1; |
||||
@@ -356,35 +384,49 @@ static int init_server_long(int *sock, i |
||||
(void *) &j, sizeof j); |
||||
} |
||||
#endif |
||||
- if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1) |
||||
+ |
||||
+ if (bind(s,(struct sockaddr *)res->ai_addr, res->ai_addrlen) == -1) |
||||
{ |
||||
-#ifndef OPENSSL_SYS_WINDOWS |
||||
- perror("bind"); |
||||
-#endif |
||||
- goto err; |
||||
+ failed_call = "bind"; |
||||
+ goto nextres; |
||||
} |
||||
- /* Make it 128 for linux */ |
||||
- if (type==SOCK_STREAM && listen(s,128) == -1) goto err; |
||||
- *sock=s; |
||||
- ret=1; |
||||
-err: |
||||
- if ((ret == 0) && (s != -1)) |
||||
+ if (type==SOCK_STREAM && listen(s,128) == -1) |
||||
{ |
||||
- SHUTDOWN(s); |
||||
+ failed_call = "listen"; |
||||
+ goto nextres; |
||||
} |
||||
- return(ret); |
||||
+ |
||||
+ *sock=s; |
||||
+ return(1); |
||||
+ |
||||
+nextres: |
||||
+ if (s != INVALID_SOCKET) |
||||
+ close(s); |
||||
+ res = res->ai_next; |
||||
} |
||||
+ if (res0) |
||||
+ freeaddrinfo(res0); |
||||
|
||||
-static int init_server(int *sock, int port, int type) |
||||
+ if (s == INVALID_SOCKET) |
||||
{ |
||||
- return(init_server_long(sock, port, NULL, type)); |
||||
+ if (hints.ai_family == AF_INET6) |
||||
+ { |
||||
+ hints.ai_family = AF_INET; |
||||
+ goto tryipv4; |
||||
+ } |
||||
+ perror("socket"); |
||||
+ return(0); |
||||
+ } |
||||
+ |
||||
+ perror(failed_call); |
||||
+ return(0); |
||||
} |
||||
|
||||
static int do_accept(int acc_sock, int *sock, char **host) |
||||
{ |
||||
+ static struct sockaddr_storage from; |
||||
+ char buffer[NI_MAXHOST]; |
||||
int ret; |
||||
- struct hostent *h1,*h2; |
||||
- static struct sockaddr_in from; |
||||
int len; |
||||
/* struct linger ling; */ |
||||
|
||||
@@ -431,135 +473,58 @@ redoit: |
||||
*/ |
||||
|
||||
if (host == NULL) goto end; |
||||
-#ifndef BIT_FIELD_LIMITS |
||||
- /* I should use WSAAsyncGetHostByName() under windows */ |
||||
- h1=gethostbyaddr((char *)&from.sin_addr.s_addr, |
||||
- sizeof(from.sin_addr.s_addr),AF_INET); |
||||
-#else |
||||
- h1=gethostbyaddr((char *)&from.sin_addr, |
||||
- sizeof(struct in_addr),AF_INET); |
||||
-#endif |
||||
- if (h1 == NULL) |
||||
+ |
||||
+ if (getnameinfo((struct sockaddr *)&from, sizeof(from), |
||||
+ buffer, sizeof(buffer), |
||||
+ NULL, 0, 0)) |
||||
{ |
||||
- BIO_printf(bio_err,"bad gethostbyaddr\n"); |
||||
+ BIO_printf(bio_err,"getnameinfo failed\n"); |
||||
*host=NULL; |
||||
/* return(0); */ |
||||
} |
||||
else |
||||
{ |
||||
- if ((*host=(char *)OPENSSL_malloc(strlen(h1->h_name)+1)) == NULL) |
||||
+ if ((*host=(char *)OPENSSL_malloc(strlen(buffer)+1)) == NULL) |
||||
{ |
||||
perror("OPENSSL_malloc"); |
||||
return(0); |
||||
} |
||||
- BUF_strlcpy(*host,h1->h_name,strlen(h1->h_name)+1); |
||||
- |
||||
- h2=GetHostByName(*host); |
||||
- if (h2 == NULL) |
||||
- { |
||||
- BIO_printf(bio_err,"gethostbyname failure\n"); |
||||
- return(0); |
||||
- } |
||||
- if (h2->h_addrtype != AF_INET) |
||||
- { |
||||
- BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n"); |
||||
- return(0); |
||||
- } |
||||
+ strcpy(*host, buffer); |
||||
} |
||||
end: |
||||
*sock=ret; |
||||
return(1); |
||||
} |
||||
|
||||
-int extract_host_port(char *str, char **host_ptr, unsigned char *ip, |
||||
- short *port_ptr) |
||||
+int extract_host_port(char *str, char **host_ptr, |
||||
+ char **port_ptr) |
||||
{ |
||||
- char *h,*p; |
||||
+ char *h,*p,*x; |
||||
|
||||
- h=str; |
||||
- p=strchr(str,':'); |
||||
+ x=h=str; |
||||
+ if (*h == '[') |
||||
+ { |
||||
+ h++; |
||||
+ p=strchr(h,']'); |
||||
if (p == NULL) |
||||
{ |
||||
- BIO_printf(bio_err,"no port defined\n"); |
||||
+ BIO_printf(bio_err,"no ending bracket for IPv6 address\n"); |
||||
return(0); |
||||
} |
||||
*(p++)='\0'; |
||||
- |
||||
- if ((ip != NULL) && !host_ip(str,ip)) |
||||
- goto err; |
||||
- if (host_ptr != NULL) *host_ptr=h; |
||||
- |
||||
- if (!extract_port(p,port_ptr)) |
||||
- goto err; |
||||
- return(1); |
||||
-err: |
||||
- return(0); |
||||
+ x = p; |
||||
} |
||||
- |
||||
-static int host_ip(char *str, unsigned char ip[4]) |
||||
- { |
||||
- unsigned int in[4]; |
||||
- int i; |
||||
- |
||||
- if (sscanf(str,"%u.%u.%u.%u",&(in[0]),&(in[1]),&(in[2]),&(in[3])) == 4) |
||||
- { |
||||
- for (i=0; i<4; i++) |
||||
- if (in[i] > 255) |
||||
- { |
||||
- BIO_printf(bio_err,"invalid IP address\n"); |
||||
- goto err; |
||||
- } |
||||
- ip[0]=in[0]; |
||||
- ip[1]=in[1]; |
||||
- ip[2]=in[2]; |
||||
- ip[3]=in[3]; |
||||
- } |
||||
- else |
||||
- { /* do a gethostbyname */ |
||||
- struct hostent *he; |
||||
- |
||||
- if (!ssl_sock_init()) return(0); |
||||
- |
||||
- he=GetHostByName(str); |
||||
- if (he == NULL) |
||||
- { |
||||
- BIO_printf(bio_err,"gethostbyname failure\n"); |
||||
- goto err; |
||||
- } |
||||
- /* cast to short because of win16 winsock definition */ |
||||
- if ((short)he->h_addrtype != AF_INET) |
||||
+ p=strchr(x,':'); |
||||
+ if (p == NULL) |
||||
{ |
||||
- BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n"); |
||||
- return(0); |
||||
- } |
||||
- ip[0]=he->h_addr_list[0][0]; |
||||
- ip[1]=he->h_addr_list[0][1]; |
||||
- ip[2]=he->h_addr_list[0][2]; |
||||
- ip[3]=he->h_addr_list[0][3]; |
||||
- } |
||||
- return(1); |
||||
-err: |
||||
+ BIO_printf(bio_err,"no port defined\n"); |
||||
return(0); |
||||
} |
||||
+ *(p++)='\0'; |
||||
|
||||
-int extract_port(char *str, short *port_ptr) |
||||
- { |
||||
- int i; |
||||
- struct servent *s; |
||||
+ if (host_ptr != NULL) *host_ptr=h; |
||||
+ if (port_ptr != NULL) *port_ptr=p; |
||||
|
||||
- i=atoi(str); |
||||
- if (i != 0) |
||||
- *port_ptr=(unsigned short)i; |
||||
- else |
||||
- { |
||||
- s=getservbyname(str,"tcp"); |
||||
- if (s == NULL) |
||||
- { |
||||
- BIO_printf(bio_err,"getservbyname failure for %s\n",str); |
||||
- return(0); |
||||
- } |
||||
- *port_ptr=ntohs((unsigned short)s->s_port); |
||||
- } |
||||
return(1); |
||||
} |
||||
|
@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
|
||||
diff -up openssl-1.0.1c/util/perlpath.pl.perlfind openssl-1.0.1c/util/perlpath.pl |
||||
--- openssl-1.0.1c/util/perlpath.pl.perlfind 2012-07-11 22:57:33.000000000 +0200 |
||||
+++ openssl-1.0.1c/util/perlpath.pl 2012-07-12 00:31:12.102156275 +0200 |
||||
@@ -4,10 +4,10 @@ |
||||
# line in all scripts that rely on perl. |
||||
# |
||||
|
||||
-require "find.pl"; |
||||
+use File::Find; |
||||
|
||||
$#ARGV == 0 || print STDERR "usage: perlpath newpath (eg /usr/bin)\n"; |
||||
-&find("."); |
||||
+find(\&wanted, "."); |
||||
|
||||
sub wanted |
||||
{ |
@ -0,0 +1,171 @@
@@ -0,0 +1,171 @@
|
||||
Although the real strength is rather 112 bits we use 128 here as |
||||
we do not want to sort it behind more obscure ciphers. |
||||
AES-128 is preferred anyway. |
||||
diff -up openssl-1.0.1e/ssl/s2_lib.c.3des-strength openssl-1.0.1e/ssl/s2_lib.c |
||||
--- openssl-1.0.1e/ssl/s2_lib.c.3des-strength 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/s2_lib.c 2014-01-22 16:32:45.791700322 +0100 |
||||
@@ -250,7 +250,7 @@ OPENSSL_GLOBAL const SSL_CIPHER ssl2_cip |
||||
SSL_SSLV2, |
||||
SSL_NOT_EXP|SSL_HIGH, |
||||
0, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
diff -up openssl-1.0.1e/ssl/s3_lib.c.3des-strength openssl-1.0.1e/ssl/s3_lib.c |
||||
--- openssl-1.0.1e/ssl/s3_lib.c.3des-strength 2014-01-17 11:41:11.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_lib.c 2014-01-22 16:31:14.713666777 +0100 |
||||
@@ -328,7 +328,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_SSLV3, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -377,7 +377,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_SSLV3, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -425,7 +425,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_SSLV3, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -474,7 +474,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_SSLV3, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -522,7 +522,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_SSLV3, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -602,7 +602,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_SSLV3, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -687,7 +687,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_SSLV3, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -751,7 +751,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_SSLV3, |
||||
SSL_NOT_EXP|SSL_HIGH, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -1685,7 +1685,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_TLSV1, |
||||
SSL_NOT_EXP|SSL_HIGH, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -2062,7 +2062,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_TLSV1, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -2142,7 +2142,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_TLSV1, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -2222,7 +2222,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_TLSV1, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -2302,7 +2302,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_TLSV1, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -2382,7 +2382,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_TLSV1, |
||||
SSL_NOT_EXP|SSL_HIGH|SSL_FIPS, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -2432,7 +2432,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_TLSV1, |
||||
SSL_NOT_EXP|SSL_HIGH, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -2448,7 +2448,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_TLSV1, |
||||
SSL_NOT_EXP|SSL_HIGH, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
||||
@@ -2464,7 +2464,7 @@ OPENSSL_GLOBAL SSL_CIPHER ssl3_ciphers[] |
||||
SSL_TLSV1, |
||||
SSL_NOT_EXP|SSL_HIGH, |
||||
SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF, |
||||
- 168, |
||||
+ 128, |
||||
168, |
||||
}, |
||||
|
@ -0,0 +1,93 @@
@@ -0,0 +1,93 @@
|
||||
diff --git a/crypto/armcap.c b/crypto/armcap.c |
||||
index 5258d2f..efb4009 100644 |
||||
--- a/crypto/armcap.c |
||||
+++ b/crypto/armcap.c |
||||
@@ -9,11 +9,6 @@ |
||||
|
||||
unsigned int OPENSSL_armcap_P; |
||||
|
||||
-static sigset_t all_masked; |
||||
- |
||||
-static sigjmp_buf ill_jmp; |
||||
-static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); } |
||||
- |
||||
/* |
||||
* Following subroutines could have been inlined, but it's not all |
||||
* ARM compilers support inline assembler... |
||||
@@ -29,24 +24,26 @@ unsigned int OPENSSL_rdtsc(void) |
||||
return 0; |
||||
} |
||||
|
||||
-#if defined(__GNUC__) && __GNUC__>=2 |
||||
-void OPENSSL_cpuid_setup(void) __attribute__((constructor)); |
||||
-#endif |
||||
-void OPENSSL_cpuid_setup(void) |
||||
+#if defined(__GLIBC__) && __GLIBC__>=2 && __GLIBC_MINOR__>=16 |
||||
+#include <sys/auxv.h> |
||||
+ |
||||
+void OPENSSL_cpuid_find(void) |
||||
+ { |
||||
+ unsigned long hwcap = getauxval(AT_HWCAP); |
||||
+ char *plat = (char *)getauxval(AT_PLATFORM); |
||||
+ |
||||
+ OPENSSL_armcap_P |= hwcap & HWCAP_ARM_NEON ? ARMV7_NEON : 0; |
||||
+ OPENSSL_armcap_P |= plat ? (plat[1] == '7' ? ARMV7_TICK : 0) : 0; |
||||
+ } |
||||
+#else |
||||
+static sigset_t all_masked; |
||||
+static sigjmp_buf ill_jmp; |
||||
+static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); } |
||||
+ |
||||
+void OPENSSL_cpuid_find(void) |
||||
{ |
||||
- char *e; |
||||
struct sigaction ill_oact,ill_act; |
||||
sigset_t oset; |
||||
- static int trigger=0; |
||||
- |
||||
- if (trigger) return; |
||||
- trigger=1; |
||||
- |
||||
- if ((e=getenv("OPENSSL_armcap"))) |
||||
- { |
||||
- OPENSSL_armcap_P=strtoul(e,NULL,0); |
||||
- return; |
||||
- } |
||||
|
||||
sigfillset(&all_masked); |
||||
sigdelset(&all_masked,SIGILL); |
||||
@@ -55,8 +52,6 @@ void OPENSSL_cpuid_setup(void) |
||||
sigdelset(&all_masked,SIGBUS); |
||||
sigdelset(&all_masked,SIGSEGV); |
||||
|
||||
- OPENSSL_armcap_P = 0; |
||||
- |
||||
memset(&ill_act,0,sizeof(ill_act)); |
||||
ill_act.sa_handler = ill_handler; |
||||
ill_act.sa_mask = all_masked; |
||||
@@ -78,3 +73,25 @@ void OPENSSL_cpuid_setup(void) |
||||
sigaction (SIGILL,&ill_oact,NULL); |
||||
sigprocmask(SIG_SETMASK,&oset,NULL); |
||||
} |
||||
+#endif |
||||
+ |
||||
+#if defined(__GNUC__) && __GNUC__>=2 |
||||
+void OPENSSL_cpuid_setup(void) __attribute__((constructor)); |
||||
+#endif |
||||
+void OPENSSL_cpuid_setup(void) |
||||
+ { |
||||
+ char *e; |
||||
+ static int trigger=0; |
||||
+ |
||||
+ if (trigger) return; |
||||
+ trigger=1; |
||||
+ |
||||
+ if ((e=getenv("OPENSSL_armcap"))) |
||||
+ { |
||||
+ OPENSSL_armcap_P=strtoul(e,NULL,0); |
||||
+ return; |
||||
+ } |
||||
+ |
||||
+ OPENSSL_armcap_P = 0; |
||||
+ OPENSSL_cpuid_find(); |
||||
+ } |
@ -0,0 +1,345 @@
@@ -0,0 +1,345 @@
|
||||
diff -up openssl-1.0.1e/crypto/pem/pem_info.c.backports openssl-1.0.1e/crypto/pem/pem_info.c |
||||
--- openssl-1.0.1e/crypto/pem/pem_info.c.backports 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/pem/pem_info.c 2013-08-16 15:31:35.726003892 +0200 |
||||
@@ -167,6 +167,7 @@ start: |
||||
#ifndef OPENSSL_NO_RSA |
||||
if (strcmp(name,PEM_STRING_RSA) == 0) |
||||
{ |
||||
+ d2i=(D2I_OF(void))d2i_RSAPrivateKey; |
||||
if (xi->x_pkey != NULL) |
||||
{ |
||||
if (!sk_X509_INFO_push(ret,xi)) goto err; |
||||
diff -up openssl-1.0.1e/crypto/rsa/rsa_pmeth.c.backports openssl-1.0.1e/crypto/rsa/rsa_pmeth.c |
||||
--- openssl-1.0.1e/crypto/rsa/rsa_pmeth.c.backports 2013-08-16 15:31:35.697003256 +0200 |
||||
+++ openssl-1.0.1e/crypto/rsa/rsa_pmeth.c 2013-08-16 15:33:37.770673918 +0200 |
||||
@@ -582,6 +582,8 @@ static int pkey_rsa_ctrl_str(EVP_PKEY_CT |
||||
pm = RSA_NO_PADDING; |
||||
else if (!strcmp(value, "oeap")) |
||||
pm = RSA_PKCS1_OAEP_PADDING; |
||||
+ else if (!strcmp(value, "oaep")) |
||||
+ pm = RSA_PKCS1_OAEP_PADDING; |
||||
else if (!strcmp(value, "x931")) |
||||
pm = RSA_X931_PADDING; |
||||
else if (!strcmp(value, "pss")) |
||||
diff -up openssl-1.0.1e/crypto/x509/x509_vfy.c.backports openssl-1.0.1e/crypto/x509/x509_vfy.c |
||||
--- openssl-1.0.1e/crypto/x509/x509_vfy.c.backports 2013-08-16 15:31:35.721003782 +0200 |
||||
+++ openssl-1.0.1e/crypto/x509/x509_vfy.c 2013-08-16 15:31:35.726003892 +0200 |
||||
@@ -696,6 +696,7 @@ static int check_cert(X509_STORE_CTX *ct |
||||
X509_CRL *crl = NULL, *dcrl = NULL; |
||||
X509 *x; |
||||
int ok, cnum; |
||||
+ unsigned int last_reasons; |
||||
cnum = ctx->error_depth; |
||||
x = sk_X509_value(ctx->chain, cnum); |
||||
ctx->current_cert = x; |
||||
@@ -704,6 +705,7 @@ static int check_cert(X509_STORE_CTX *ct |
||||
ctx->current_reasons = 0; |
||||
while (ctx->current_reasons != CRLDP_ALL_REASONS) |
||||
{ |
||||
+ last_reasons = ctx->current_reasons; |
||||
/* Try to retrieve relevant CRL */ |
||||
if (ctx->get_crl) |
||||
ok = ctx->get_crl(ctx, &crl, x); |
||||
@@ -747,6 +749,15 @@ static int check_cert(X509_STORE_CTX *ct |
||||
X509_CRL_free(dcrl); |
||||
crl = NULL; |
||||
dcrl = NULL; |
||||
+ /* If reasons not updated we wont get anywhere by |
||||
+ * another iteration, so exit loop. |
||||
+ */ |
||||
+ if (last_reasons == ctx->current_reasons) |
||||
+ { |
||||
+ ctx->error = X509_V_ERR_UNABLE_TO_GET_CRL; |
||||
+ ok = ctx->verify_cb(0, ctx); |
||||
+ goto err; |
||||
+ } |
||||
} |
||||
err: |
||||
X509_CRL_free(crl); |
||||
diff -up openssl-1.0.1e/crypto/x509/x_all.c.backports openssl-1.0.1e/crypto/x509/x_all.c |
||||
--- openssl-1.0.1e/crypto/x509/x_all.c.backports 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/x509/x_all.c 2013-08-16 15:33:25.247399940 +0200 |
||||
@@ -97,6 +97,7 @@ int X509_sign(X509 *x, EVP_PKEY *pkey, c |
||||
|
||||
int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx) |
||||
{ |
||||
+ x->cert_info->enc.modified = 1; |
||||
return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF), |
||||
x->cert_info->signature, |
||||
x->sig_alg, x->signature, x->cert_info, ctx); |
||||
@@ -123,6 +124,7 @@ int X509_CRL_sign(X509_CRL *x, EVP_PKEY |
||||
|
||||
int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx) |
||||
{ |
||||
+ x->crl->enc.modified = 1; |
||||
return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO), |
||||
x->crl->sig_alg, x->sig_alg, x->signature, x->crl, ctx); |
||||
} |
||||
diff -up openssl-1.0.1e/doc/crypto/X509_STORE_CTX_get_error.pod.backports openssl-1.0.1e/doc/crypto/X509_STORE_CTX_get_error.pod |
||||
--- openssl-1.0.1e/doc/crypto/X509_STORE_CTX_get_error.pod.backports 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/crypto/X509_STORE_CTX_get_error.pod 2013-08-16 15:31:35.727003914 +0200 |
||||
@@ -278,6 +278,8 @@ happen if extended CRL checking is enabl |
||||
an application specific error. This will never be returned unless explicitly |
||||
set by an application. |
||||
|
||||
+=back |
||||
+ |
||||
=head1 NOTES |
||||
|
||||
The above functions should be used instead of directly referencing the fields |
||||
diff -up openssl-1.0.1e/doc/ssl/SSL_accept.pod.backports openssl-1.0.1e/doc/ssl/SSL_accept.pod |
||||
--- openssl-1.0.1e/doc/ssl/SSL_accept.pod.backports 2013-02-11 16:02:48.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/ssl/SSL_accept.pod 2013-08-16 15:31:35.727003914 +0200 |
||||
@@ -44,17 +44,17 @@ The following return values can occur: |
||||
|
||||
=over 4 |
||||
|
||||
-=item 1 |
||||
- |
||||
-The TLS/SSL handshake was successfully completed, a TLS/SSL connection has been |
||||
-established. |
||||
- |
||||
=item 0 |
||||
|
||||
The TLS/SSL handshake was not successful but was shut down controlled and |
||||
by the specifications of the TLS/SSL protocol. Call SSL_get_error() with the |
||||
return value B<ret> to find out the reason. |
||||
|
||||
+=item 1 |
||||
+ |
||||
+The TLS/SSL handshake was successfully completed, a TLS/SSL connection has been |
||||
+established. |
||||
+ |
||||
=item E<lt>0 |
||||
|
||||
The TLS/SSL handshake was not successful because a fatal error occurred either |
||||
diff -up openssl-1.0.1e/doc/ssl/SSL_connect.pod.backports openssl-1.0.1e/doc/ssl/SSL_connect.pod |
||||
--- openssl-1.0.1e/doc/ssl/SSL_connect.pod.backports 2013-02-11 16:02:48.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/ssl/SSL_connect.pod 2013-08-16 15:31:35.727003914 +0200 |
||||
@@ -41,17 +41,17 @@ The following return values can occur: |
||||
|
||||
=over 4 |
||||
|
||||
-=item 1 |
||||
- |
||||
-The TLS/SSL handshake was successfully completed, a TLS/SSL connection has been |
||||
-established. |
||||
- |
||||
=item 0 |
||||
|
||||
The TLS/SSL handshake was not successful but was shut down controlled and |
||||
by the specifications of the TLS/SSL protocol. Call SSL_get_error() with the |
||||
return value B<ret> to find out the reason. |
||||
|
||||
+=item 1 |
||||
+ |
||||
+The TLS/SSL handshake was successfully completed, a TLS/SSL connection has been |
||||
+established. |
||||
+ |
||||
=item E<lt>0 |
||||
|
||||
The TLS/SSL handshake was not successful, because a fatal error occurred either |
||||
diff -up openssl-1.0.1e/doc/ssl/SSL_CTX_set_client_CA_list.pod.backports openssl-1.0.1e/doc/ssl/SSL_CTX_set_client_CA_list.pod |
||||
--- openssl-1.0.1e/doc/ssl/SSL_CTX_set_client_CA_list.pod.backports 2013-02-11 16:02:48.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/ssl/SSL_CTX_set_client_CA_list.pod 2013-08-16 15:31:35.727003914 +0200 |
||||
@@ -66,16 +66,16 @@ values: |
||||
|
||||
=over 4 |
||||
|
||||
-=item 1 |
||||
- |
||||
-The operation succeeded. |
||||
- |
||||
=item 0 |
||||
|
||||
A failure while manipulating the STACK_OF(X509_NAME) object occurred or |
||||
the X509_NAME could not be extracted from B<cacert>. Check the error stack |
||||
to find out the reason. |
||||
|
||||
+=item 1 |
||||
+ |
||||
+The operation succeeded. |
||||
+ |
||||
=back |
||||
|
||||
=head1 EXAMPLES |
||||
diff -up openssl-1.0.1e/doc/ssl/SSL_CTX_use_psk_identity_hint.pod.backports openssl-1.0.1e/doc/ssl/SSL_CTX_use_psk_identity_hint.pod |
||||
--- openssl-1.0.1e/doc/ssl/SSL_CTX_use_psk_identity_hint.pod.backports 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/ssl/SSL_CTX_use_psk_identity_hint.pod 2013-08-16 15:31:35.727003914 +0200 |
||||
@@ -81,6 +81,8 @@ SSL_CTX_use_psk_identity_hint() and SSL_ |
||||
|
||||
Return values from the server callback are interpreted as follows: |
||||
|
||||
+=over 4 |
||||
+ |
||||
=item > 0 |
||||
|
||||
PSK identity was found and the server callback has provided the PSK |
||||
@@ -99,4 +101,6 @@ completely. |
||||
PSK identity was not found. An "unknown_psk_identity" alert message |
||||
will be sent and the connection setup fails. |
||||
|
||||
+=back |
||||
+ |
||||
=cut |
||||
diff -up openssl-1.0.1e/doc/ssl/SSL_do_handshake.pod.backports openssl-1.0.1e/doc/ssl/SSL_do_handshake.pod |
||||
--- openssl-1.0.1e/doc/ssl/SSL_do_handshake.pod.backports 2013-02-11 16:02:48.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/ssl/SSL_do_handshake.pod 2013-08-16 15:31:35.727003914 +0200 |
||||
@@ -45,17 +45,17 @@ The following return values can occur: |
||||
|
||||
=over 4 |
||||
|
||||
-=item 1 |
||||
- |
||||
-The TLS/SSL handshake was successfully completed, a TLS/SSL connection has been |
||||
-established. |
||||
- |
||||
=item 0 |
||||
|
||||
The TLS/SSL handshake was not successful but was shut down controlled and |
||||
by the specifications of the TLS/SSL protocol. Call SSL_get_error() with the |
||||
return value B<ret> to find out the reason. |
||||
|
||||
+=item 1 |
||||
+ |
||||
+The TLS/SSL handshake was successfully completed, a TLS/SSL connection has been |
||||
+established. |
||||
+ |
||||
=item E<lt>0 |
||||
|
||||
The TLS/SSL handshake was not successful because a fatal error occurred either |
||||
diff -up openssl-1.0.1e/doc/ssl/SSL_shutdown.pod.backports openssl-1.0.1e/doc/ssl/SSL_shutdown.pod |
||||
--- openssl-1.0.1e/doc/ssl/SSL_shutdown.pod.backports 2013-02-11 16:02:48.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/ssl/SSL_shutdown.pod 2013-08-16 15:31:35.728003935 +0200 |
||||
@@ -92,11 +92,6 @@ The following return values can occur: |
||||
|
||||
=over 4 |
||||
|
||||
-=item 1 |
||||
- |
||||
-The shutdown was successfully completed. The "close notify" alert was sent |
||||
-and the peer's "close notify" alert was received. |
||||
- |
||||
=item 0 |
||||
|
||||
The shutdown is not yet finished. Call SSL_shutdown() for a second time, |
||||
@@ -104,6 +99,11 @@ if a bidirectional shutdown shall be per |
||||
The output of L<SSL_get_error(3)|SSL_get_error(3)> may be misleading, as an |
||||
erroneous SSL_ERROR_SYSCALL may be flagged even though no error occurred. |
||||
|
||||
+=item 1 |
||||
+ |
||||
+The shutdown was successfully completed. The "close notify" alert was sent |
||||
+and the peer's "close notify" alert was received. |
||||
+ |
||||
=item -1 |
||||
|
||||
The shutdown was not successful because a fatal error occurred either |
||||
diff -up openssl-1.0.1e/ssl/d1_lib.c.backports openssl-1.0.1e/ssl/d1_lib.c |
||||
--- openssl-1.0.1e/ssl/d1_lib.c.backports 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/d1_lib.c 2013-08-16 15:33:33.306576363 +0200 |
||||
@@ -196,6 +196,7 @@ void dtls1_free(SSL *s) |
||||
pqueue_free(s->d1->buffered_app_data.q); |
||||
|
||||
OPENSSL_free(s->d1); |
||||
+ s->d1 = NULL; |
||||
} |
||||
|
||||
void dtls1_clear(SSL *s) |
||||
diff -up openssl-1.0.1e/ssl/d1_pkt.c.backports openssl-1.0.1e/ssl/d1_pkt.c |
||||
--- openssl-1.0.1e/ssl/d1_pkt.c.backports 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/d1_pkt.c 2013-08-16 15:31:35.728003935 +0200 |
||||
@@ -847,6 +847,12 @@ start: |
||||
} |
||||
} |
||||
|
||||
+ if (s->d1->listen && rr->type != SSL3_RT_HANDSHAKE) |
||||
+ { |
||||
+ rr->length = 0; |
||||
+ goto start; |
||||
+ } |
||||
+ |
||||
/* we now have a packet which can be read and processed */ |
||||
|
||||
if (s->s3->change_cipher_spec /* set when we receive ChangeCipherSpec, |
||||
@@ -1051,6 +1057,7 @@ start: |
||||
!(s->s3->flags & SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS) && |
||||
!s->s3->renegotiate) |
||||
{ |
||||
+ s->d1->handshake_read_seq++; |
||||
s->new_session = 1; |
||||
ssl3_renegotiate(s); |
||||
if (ssl3_renegotiate_check(s)) |
||||
diff -up openssl-1.0.1e/ssl/d1_srvr.c.backports openssl-1.0.1e/ssl/d1_srvr.c |
||||
--- openssl-1.0.1e/ssl/d1_srvr.c.backports 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/d1_srvr.c 2013-08-16 15:31:35.728003935 +0200 |
||||
@@ -276,10 +276,11 @@ int dtls1_accept(SSL *s) |
||||
case SSL3_ST_SW_HELLO_REQ_B: |
||||
|
||||
s->shutdown=0; |
||||
+ dtls1_clear_record_buffer(s); |
||||
dtls1_start_timer(s); |
||||
ret=dtls1_send_hello_request(s); |
||||
if (ret <= 0) goto end; |
||||
- s->s3->tmp.next_state=SSL3_ST_SW_HELLO_REQ_C; |
||||
+ s->s3->tmp.next_state=SSL3_ST_SR_CLNT_HELLO_A; |
||||
s->state=SSL3_ST_SW_FLUSH; |
||||
s->init_num=0; |
||||
|
||||
diff -up openssl-1.0.1e/ssl/s3_cbc.c.backports openssl-1.0.1e/ssl/s3_cbc.c |
||||
--- openssl-1.0.1e/ssl/s3_cbc.c.backports 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_cbc.c 2013-08-16 15:31:35.729003956 +0200 |
||||
@@ -148,7 +148,7 @@ int tls1_cbc_remove_padding(const SSL* s |
||||
unsigned padding_length, good, to_check, i; |
||||
const unsigned overhead = 1 /* padding length byte */ + mac_size; |
||||
/* Check if version requires explicit IV */ |
||||
- if (s->version >= TLS1_1_VERSION || s->version == DTLS1_VERSION) |
||||
+ if (s->version >= TLS1_1_VERSION || s->version == DTLS1_BAD_VER) |
||||
{ |
||||
/* These lengths are all public so we can test them in |
||||
* non-constant time. |
||||
diff -up openssl-1.0.1e/ssl/ssl_lib.c.backports openssl-1.0.1e/ssl/ssl_lib.c |
||||
--- openssl-1.0.1e/ssl/ssl_lib.c.backports 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/ssl_lib.c 2013-08-16 15:31:35.729003956 +0200 |
||||
@@ -1797,7 +1797,9 @@ SSL_CTX *SSL_CTX_new(const SSL_METHOD *m |
||||
CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_CTX, ret, &ret->ex_data); |
||||
|
||||
ret->extra_certs=NULL; |
||||
- ret->comp_methods=SSL_COMP_get_compression_methods(); |
||||
+ /* No compression for DTLS */ |
||||
+ if (meth->version != DTLS1_VERSION) |
||||
+ ret->comp_methods=SSL_COMP_get_compression_methods(); |
||||
|
||||
ret->max_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; |
||||
|
||||
@@ -2792,9 +2794,7 @@ void ssl_clear_cipher_ctx(SSL *s) |
||||
/* Fix this function so that it takes an optional type parameter */ |
||||
X509 *SSL_get_certificate(const SSL *s) |
||||
{ |
||||
- if (s->server) |
||||
- return(ssl_get_server_send_cert(s)); |
||||
- else if (s->cert != NULL) |
||||
+ if (s->cert != NULL) |
||||
return(s->cert->key->x509); |
||||
else |
||||
return(NULL); |
||||
diff --git a/crypto/x86cpuid.pl b/crypto/x86cpuid.pl |
||||
index 3b6c469..e8a7518 100644 |
||||
--- a/crypto/x86cpuid.pl |
||||
+++ b/crypto/x86cpuid.pl |
||||
@@ -69,6 +69,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } |
||||
&inc ("esi"); # number of cores |
||||
|
||||
&mov ("eax",1); |
||||
+ &xor ("ecx","ecx"); |
||||
&cpuid (); |
||||
&bt ("edx",28); |
||||
&jnc (&label("generic")); |
||||
@@ -102,6 +103,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); } |
||||
|
||||
&set_label("nocacheinfo"); |
||||
&mov ("eax",1); |
||||
+ &xor ("ecx","ecx"); |
||||
&cpuid (); |
||||
&and ("edx",0xbfefffff); # force reserved bits #20, #30 to 0 |
||||
&cmp ("ebp",0); |
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
From 9ab3ce124616cb12bd39c6aa1e1bde0f46969b29 Mon Sep 17 00:00:00 2001 |
||||
From: Andy Polyakov <appro@openssl.org> |
||||
Date: Mon, 18 Mar 2013 19:29:41 +0100 |
||||
Subject: [PATCH] e_aes_cbc_hmac_sha1.c: fix rare bad record mac on AES-NI |
||||
plaforms. |
||||
|
||||
PR: 3002 |
||||
(cherry picked from commit 5c60046553716fcf160718f59160493194f212dc) |
||||
--- |
||||
crypto/evp/e_aes_cbc_hmac_sha1.c | 5 +++-- |
||||
1 file changed, 3 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/crypto/evp/e_aes_cbc_hmac_sha1.c b/crypto/evp/e_aes_cbc_hmac_sha1.c |
||||
index 483e04b..fb2c884 100644 |
||||
--- a/crypto/evp/e_aes_cbc_hmac_sha1.c |
||||
+++ b/crypto/evp/e_aes_cbc_hmac_sha1.c |
||||
@@ -328,10 +328,11 @@ static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
||||
|
||||
if (res!=SHA_CBLOCK) continue; |
||||
|
||||
- mask = 0-((inp_len+8-j)>>(sizeof(j)*8-1)); |
||||
+ /* j is not incremented yet */ |
||||
+ mask = 0-((inp_len+7-j)>>(sizeof(j)*8-1)); |
||||
data->u[SHA_LBLOCK-1] |= bitlen&mask; |
||||
sha1_block_data_order(&key->md,data,1); |
||||
- mask &= 0-((j-inp_len-73)>>(sizeof(j)*8-1)); |
||||
+ mask &= 0-((j-inp_len-72)>>(sizeof(j)*8-1)); |
||||
pmac->u[0] |= key->md.h0 & mask; |
||||
pmac->u[1] |= key->md.h1 & mask; |
||||
pmac->u[2] |= key->md.h2 & mask; |
||||
-- |
||||
1.7.9.5 |
||||
|
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
diff -up openssl-1.0.1e/crypto/rsa/rsa_gen.c.cc-reqs openssl-1.0.1e/crypto/rsa/rsa_gen.c |
||||
--- openssl-1.0.1e/crypto/rsa/rsa_gen.c.cc-reqs 2015-01-13 12:45:51.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/rsa/rsa_gen.c 2015-01-15 17:35:04.649697922 +0100 |
||||
@@ -438,6 +438,10 @@ static int rsa_builtin_keygen(RSA *rsa, |
||||
if(!rsa->dmq1 && ((rsa->dmq1=BN_new()) == NULL)) goto err; |
||||
if(!rsa->iqmp && ((rsa->iqmp=BN_new()) == NULL)) goto err; |
||||
|
||||
+ /* prepare minimum p and q difference */ |
||||
+ if (!BN_one(r3)) goto err; |
||||
+ if (bitsp > 100 && !BN_lshift(r3, r3, bitsp - 100)) goto err; |
||||
+ |
||||
BN_copy(rsa->e, e_value); |
||||
|
||||
/* generate p and q */ |
||||
@@ -463,7 +467,9 @@ static int rsa_builtin_keygen(RSA *rsa, |
||||
{ |
||||
if(!BN_generate_prime_ex(rsa->q, bitsq, 0, NULL, NULL, cb)) |
||||
goto err; |
||||
- } while((BN_cmp(rsa->p, rsa->q) == 0) && (++degenerate < 3)); |
||||
+ if (!BN_sub(r2, rsa->q, rsa->p)) |
||||
+ goto err; |
||||
+ } while((BN_ucmp(r2, r3) <= 0) && (++degenerate < 3)); |
||||
if(degenerate == 3) |
||||
{ |
||||
ok = 0; /* we set our own err */ |
@ -0,0 +1,46 @@
@@ -0,0 +1,46 @@
|
||||
diff -up openssl-1.0.1e/crypto/dsa/dsa_key.c.compat openssl-1.0.1e/crypto/dsa/dsa_key.c |
||||
--- openssl-1.0.1e/crypto/dsa/dsa_key.c.compat 2013-11-26 14:36:35.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/dsa/dsa_key.c 2013-12-11 16:34:58.638549687 +0100 |
||||
@@ -68,6 +68,11 @@ |
||||
#include <openssl/fips.h> |
||||
#include <openssl/evp.h> |
||||
|
||||
+/* just a compatibility symbol - no-op */ |
||||
+void FIPS_corrupt_dsa_keygen(void) |
||||
+ { |
||||
+ } |
||||
+ |
||||
static int fips_check_dsa(DSA *dsa) |
||||
{ |
||||
EVP_PKEY *pk; |
||||
diff -up openssl-1.0.1e/crypto/engine/eng_all.c.compat openssl-1.0.1e/crypto/engine/eng_all.c |
||||
--- openssl-1.0.1e/crypto/engine/eng_all.c.compat 2013-11-26 14:36:35.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/engine/eng_all.c 2013-12-11 16:32:13.512820424 +0100 |
||||
@@ -62,6 +62,11 @@ |
||||
#include <openssl/fips.h> |
||||
#endif |
||||
|
||||
+/* just backwards compatibility symbol - no-op */ |
||||
+void ENGINE_load_aesni (void) |
||||
+{ |
||||
+} |
||||
+ |
||||
void ENGINE_load_builtin_engines(void) |
||||
{ |
||||
/* Some ENGINEs need this */ |
||||
diff -up openssl-1.0.1e/crypto/fips/fips.c.compat openssl-1.0.1e/crypto/fips/fips.c |
||||
--- openssl-1.0.1e/crypto/fips/fips.c.compat 2013-11-26 14:36:35.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/fips/fips.c 2013-12-11 16:38:52.524831858 +0100 |
||||
@@ -111,6 +111,12 @@ int FIPS_module_mode(void) |
||||
return ret; |
||||
} |
||||
|
||||
+/* just a compat symbol - return NULL */ |
||||
+const void *FIPS_rand_check(void) |
||||
+ { |
||||
+ return NULL; |
||||
+ } |
||||
+ |
||||
int FIPS_selftest_failed(void) |
||||
{ |
||||
int ret = 0; |
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c |
||||
index 6a33b9d..76a5f9e 100644 |
||||
--- a/ssl/ssl_lib.c |
||||
+++ b/ssl/ssl_lib.c |
||||
@@ -3177,15 +3177,26 @@ SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl) |
||||
|
||||
SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx) |
||||
{ |
||||
+ CERT *ocert = ssl->cert; |
||||
if (ssl->ctx == ctx) |
||||
return ssl->ctx; |
||||
#ifndef OPENSSL_NO_TLSEXT |
||||
if (ctx == NULL) |
||||
ctx = ssl->initial_ctx; |
||||
#endif |
||||
- if (ssl->cert != NULL) |
||||
- ssl_cert_free(ssl->cert); |
||||
ssl->cert = ssl_cert_dup(ctx->cert); |
||||
+ if (ocert) |
||||
+ { |
||||
+ int i; |
||||
+ /* Copy negotiated digests from original */ |
||||
+ for (i = 0; i < SSL_PKEY_NUM; i++) |
||||
+ { |
||||
+ CERT_PKEY *cpk = ocert->pkeys + i; |
||||
+ CERT_PKEY *rpk = ssl->cert->pkeys + i; |
||||
+ rpk->digest = cpk->digest; |
||||
+ } |
||||
+ ssl_cert_free(ocert); |
||||
+ } |
||||
CRYPTO_add(&ctx->references,1,CRYPTO_LOCK_SSL_CTX); |
||||
if (ssl->ctx != NULL) |
||||
SSL_CTX_free(ssl->ctx); /* decrement reference count */ |
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
From: Ben Laurie <ben@links.org> |
||||
Date: Wed, 23 Apr 2014 06:24:03 +0000 (+0100) |
||||
Subject: Fix use after free. |
||||
X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff_plain;h=94d1f4b |
||||
|
||||
Fix use after free. |
||||
--- |
||||
|
||||
diff --git a/ssl/s3_pkt.c b/ssl/s3_pkt.c |
||||
index b9e45c7..d601a18 100644 |
||||
--- a/ssl/s3_pkt.c |
||||
+++ b/ssl/s3_pkt.c |
||||
@@ -1334,7 +1334,7 @@ start: |
||||
{ |
||||
s->rstate=SSL_ST_READ_HEADER; |
||||
rr->off=0; |
||||
- if (s->mode & SSL_MODE_RELEASE_BUFFERS) |
||||
+ if (s->mode & SSL_MODE_RELEASE_BUFFERS && s->s3->rbuf.left == 0) |
||||
ssl3_release_read_buffer(s); |
||||
} |
||||
} |
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
Fix for TLS record tampering bug. A carefully crafted invalid |
||||
handshake could crash OpenSSL with a NULL pointer exception. |
||||
Thanks to Anton Johansson for reporting this issues. |
||||
(CVE-2013-4353) |
||||
diff --git a/ssl/s3_both.c b/ssl/s3_both.c |
||||
index 1e5dcab..53b9390 100644 |
||||
--- a/ssl/s3_both.c |
||||
+++ b/ssl/s3_both.c |
||||
@@ -210,7 +210,11 @@ static void ssl3_take_mac(SSL *s) |
||||
{ |
||||
const char *sender; |
||||
int slen; |
||||
- |
||||
+ /* If no new cipher setup return immediately: other functions will |
||||
+ * set the appropriate error. |
||||
+ */ |
||||
+ if (s->s3->tmp.new_cipher == NULL) |
||||
+ return; |
||||
if (s->state & SSL_ST_CONNECT) |
||||
{ |
||||
sender=s->method->ssl3_enc->server_finished_label; |
@ -0,0 +1,111 @@
@@ -0,0 +1,111 @@
|
||||
Use version in SSL_METHOD not SSL structure. |
||||
|
||||
When deciding whether to use TLS 1.2 PRF and record hash algorithms |
||||
use the version number in the corresponding SSL_METHOD structure |
||||
instead of the SSL structure. The SSL structure version is sometimes |
||||
inaccurate. Note: OpenSSL 1.0.2 and later effectively do this already. |
||||
(CVE-2013-6449) |
||||
|
||||
Also preventively check EVP errors for handshake digests. |
||||
|
||||
diff --git a/ssl/s3_lib.c b/ssl/s3_lib.c |
||||
index bf832bb..c4ef273 100644 |
||||
--- a/ssl/s3_lib.c |
||||
+++ b/ssl/s3_lib.c |
||||
@@ -4286,7 +4286,7 @@ need to go to SSL_ST_ACCEPT. |
||||
long ssl_get_algorithm2(SSL *s) |
||||
{ |
||||
long alg2 = s->s3->tmp.new_cipher->algorithm2; |
||||
- if (TLS1_get_version(s) >= TLS1_2_VERSION && |
||||
+ if (s->method->version == TLS1_2_VERSION && |
||||
alg2 == (SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF)) |
||||
return SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256; |
||||
return alg2; |
||||
diff --git a/ssl/s3_both.c b/ssl/s3_both.c |
||||
index ead01c8..1e5dcab 100644 |
||||
--- a/ssl/s3_both.c |
||||
+++ b/ssl/s3_both.c |
||||
@@ -161,6 +161,8 @@ int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) |
||||
|
||||
i=s->method->ssl3_enc->final_finish_mac(s, |
||||
sender,slen,s->s3->tmp.finish_md); |
||||
+ if (i == 0) |
||||
+ return 0; |
||||
s->s3->tmp.finish_md_len = i; |
||||
memcpy(p, s->s3->tmp.finish_md, i); |
||||
p+=i; |
||||
diff --git a/ssl/s3_pkt.c b/ssl/s3_pkt.c |
||||
index 804291e..c4bc4e7 100644 |
||||
--- a/ssl/s3_pkt.c |
||||
+++ b/ssl/s3_pkt.c |
||||
@@ -335,7 +335,7 @@ fprintf(stderr, "Record type=%d, Length=%d\n", rr->type, rr->length); |
||||
if (version != s->version) |
||||
{ |
||||
SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_WRONG_VERSION_NUMBER); |
||||
- if ((s->version & 0xFF00) == (version & 0xFF00)) |
||||
+ if ((s->version & 0xFF00) == (version & 0xFF00) && !s->enc_write_ctx && !s->write_hash) |
||||
/* Send back error using their minor version number :-) */ |
||||
s->version = (unsigned short)version; |
||||
al=SSL_AD_PROTOCOL_VERSION; |
||||
@@ -1459,8 +1459,14 @@ int ssl3_do_change_cipher_spec(SSL *s) |
||||
slen=s->method->ssl3_enc->client_finished_label_len; |
||||
} |
||||
|
||||
- s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s, |
||||
+ i = s->method->ssl3_enc->final_finish_mac(s, |
||||
sender,slen,s->s3->tmp.peer_finish_md); |
||||
+ if (i == 0) |
||||
+ { |
||||
+ SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC, ERR_R_INTERNAL_ERROR); |
||||
+ return 0; |
||||
+ } |
||||
+ s->s3->tmp.peer_finish_md_len = i; |
||||
|
||||
return(1); |
||||
} |
||||
diff --git a/ssl/s3_srvr.c b/ssl/s3_srvr.c |
||||
index e5a8b3f..52efed3 100644 |
||||
--- a/ssl/s3_srvr.c |
||||
+++ b/ssl/s3_srvr.c |
||||
@@ -958,7 +958,8 @@ int ssl3_get_client_hello(SSL *s) |
||||
(s->version != DTLS1_VERSION && s->client_version < s->version)) |
||||
{ |
||||
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_WRONG_VERSION_NUMBER); |
||||
- if ((s->client_version>>8) == SSL3_VERSION_MAJOR) |
||||
+ if ((s->client_version>>8) == SSL3_VERSION_MAJOR && |
||||
+ !s->enc_write_ctx && !s->write_hash) |
||||
{ |
||||
/* similar to ssl3_get_record, send alert using remote version number */ |
||||
s->version = s->client_version; |
||||
diff --git a/ssl/t1_enc.c b/ssl/t1_enc.c |
||||
index 809ad2e..72015f5 100644 |
||||
--- a/ssl/t1_enc.c |
||||
+++ b/ssl/t1_enc.c |
||||
@@ -915,18 +915,19 @@ int tls1_final_finish_mac(SSL *s, |
||||
if (mask & ssl_get_algorithm2(s)) |
||||
{ |
||||
int hashsize = EVP_MD_size(md); |
||||
- if (hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf))) |
||||
+ EVP_MD_CTX *hdgst = s->s3->handshake_dgst[idx]; |
||||
+ if (!hdgst || hashsize < 0 || hashsize > (int)(sizeof buf - (size_t)(q-buf))) |
||||
{ |
||||
/* internal error: 'buf' is too small for this cipersuite! */ |
||||
err = 1; |
||||
} |
||||
else |
||||
{ |
||||
- EVP_MD_CTX_copy_ex(&ctx,s->s3->handshake_dgst[idx]); |
||||
- EVP_DigestFinal_ex(&ctx,q,&i); |
||||
- if (i != (unsigned int)hashsize) /* can't really happen */ |
||||
+ if (!EVP_MD_CTX_copy_ex(&ctx, hdgst) || |
||||
+ !EVP_DigestFinal_ex(&ctx,q,&i) || |
||||
+ (i != (unsigned int)hashsize)) |
||||
err = 1; |
||||
- q+=i; |
||||
+ q+=hashsize; |
||||
} |
||||
} |
||||
} |
||||
-- |
||||
1.8.3.1 |
||||
|
@ -0,0 +1,85 @@
@@ -0,0 +1,85 @@
|
||||
Fix DTLS retransmission from previous session. |
||||
|
||||
For DTLS we might need to retransmit messages from the previous session |
||||
so keep a copy of write context in DTLS retransmission buffers instead |
||||
of replacing it after sending CCS. CVE-2013-6450. |
||||
|
||||
diff --git a/ssl/d1_both.c b/ssl/d1_both.c |
||||
index 65ec001..7a5596a 100644 |
||||
--- a/ssl/d1_both.c |
||||
+++ b/ssl/d1_both.c |
||||
@@ -214,6 +214,12 @@ dtls1_hm_fragment_new(unsigned long frag_len, int reassembly) |
||||
static void |
||||
dtls1_hm_fragment_free(hm_fragment *frag) |
||||
{ |
||||
+ |
||||
+ if (frag->msg_header.is_ccs) |
||||
+ { |
||||
+ EVP_CIPHER_CTX_free(frag->msg_header.saved_retransmit_state.enc_write_ctx); |
||||
+ EVP_MD_CTX_destroy(frag->msg_header.saved_retransmit_state.write_hash); |
||||
+ } |
||||
if (frag->fragment) OPENSSL_free(frag->fragment); |
||||
if (frag->reassembly) OPENSSL_free(frag->reassembly); |
||||
OPENSSL_free(frag); |
||||
diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h |
||||
index 96ce9a7..e485907 100644 |
||||
--- a/ssl/ssl_locl.h |
||||
+++ b/ssl/ssl_locl.h |
||||
@@ -621,6 +621,8 @@ extern SSL3_ENC_METHOD TLSv1_enc_data; |
||||
extern SSL3_ENC_METHOD SSLv3_enc_data; |
||||
extern SSL3_ENC_METHOD DTLSv1_enc_data; |
||||
|
||||
+#define SSL_IS_DTLS(s) (s->method->version == DTLS1_VERSION) |
||||
+ |
||||
#define IMPLEMENT_tls_meth_func(version, func_name, s_accept, s_connect, \ |
||||
s_get_meth) \ |
||||
const SSL_METHOD *func_name(void) \ |
||||
diff --git a/ssl/t1_enc.c b/ssl/t1_enc.c |
||||
index 72015f5..56db834 100644 |
||||
--- a/ssl/t1_enc.c |
||||
+++ b/ssl/t1_enc.c |
||||
@@ -414,15 +414,20 @@ int tls1_change_cipher_state(SSL *s, int which) |
||||
s->mac_flags |= SSL_MAC_FLAG_WRITE_MAC_STREAM; |
||||
else |
||||
s->mac_flags &= ~SSL_MAC_FLAG_WRITE_MAC_STREAM; |
||||
- if (s->enc_write_ctx != NULL) |
||||
+ if (s->enc_write_ctx != NULL && !SSL_IS_DTLS(s)) |
||||
reuse_dd = 1; |
||||
- else if ((s->enc_write_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL) |
||||
+ else if ((s->enc_write_ctx=EVP_CIPHER_CTX_new()) == NULL) |
||||
goto err; |
||||
- else |
||||
- /* make sure it's intialized in case we exit later with an error */ |
||||
- EVP_CIPHER_CTX_init(s->enc_write_ctx); |
||||
dd= s->enc_write_ctx; |
||||
- mac_ctx = ssl_replace_hash(&s->write_hash,NULL); |
||||
+ if (SSL_IS_DTLS(s)) |
||||
+ { |
||||
+ mac_ctx = EVP_MD_CTX_create(); |
||||
+ if (!mac_ctx) |
||||
+ goto err; |
||||
+ s->write_hash = mac_ctx; |
||||
+ } |
||||
+ else |
||||
+ mac_ctx = ssl_replace_hash(&s->write_hash,NULL); |
||||
#ifndef OPENSSL_NO_COMP |
||||
if (s->compress != NULL) |
||||
{ |
||||
diff --git a/crypto/evp/digest.c b/crypto/evp/digest.c |
||||
index 6fc469f..d14e8e4 100644 |
||||
--- a/crypto/evp/digest.c |
||||
+++ b/crypto/evp/digest.c |
||||
@@ -366,8 +366,11 @@ int EVP_Digest(const void *data, size_t count, |
||||
|
||||
void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx) |
||||
{ |
||||
- EVP_MD_CTX_cleanup(ctx); |
||||
- OPENSSL_free(ctx); |
||||
+ if (ctx) |
||||
+ { |
||||
+ EVP_MD_CTX_cleanup(ctx); |
||||
+ OPENSSL_free(ctx); |
||||
+ } |
||||
} |
||||
|
||||
/* This call frees resources associated with the context */ |
@ -0,0 +1,89 @@
@@ -0,0 +1,89 @@
|
||||
diff -up openssl-1.0.1e/ssl/d1_both.c.heartbeat openssl-1.0.1e/ssl/d1_both.c |
||||
--- openssl-1.0.1e/ssl/d1_both.c.heartbeat 2014-04-07 12:52:01.884308971 +0200 |
||||
+++ openssl-1.0.1e/ssl/d1_both.c 2014-04-07 13:04:32.860128295 +0200 |
||||
@@ -1458,26 +1458,36 @@ dtls1_process_heartbeat(SSL *s) |
||||
unsigned int payload; |
||||
unsigned int padding = 16; /* Use minimum padding */ |
||||
|
||||
- /* Read type and payload length first */ |
||||
- hbtype = *p++; |
||||
- n2s(p, payload); |
||||
- pl = p; |
||||
- |
||||
if (s->msg_callback) |
||||
s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, |
||||
&s->s3->rrec.data[0], s->s3->rrec.length, |
||||
s, s->msg_callback_arg); |
||||
|
||||
+ /* Read type and payload length first */ |
||||
+ if (1 + 2 + 16 > s->s3->rrec.length) |
||||
+ return 0; /* silently discard */ |
||||
+ hbtype = *p++; |
||||
+ n2s(p, payload); |
||||
+ if (1 + 2 + payload + 16 > s->s3->rrec.length) |
||||
+ return 0; /* silently discard per RFC 6520 sec. 4 */ |
||||
+ pl = p; |
||||
+ |
||||
if (hbtype == TLS1_HB_REQUEST) |
||||
{ |
||||
unsigned char *buffer, *bp; |
||||
+ unsigned int write_length = 1 /* heartbeat type */ + |
||||
+ 2 /* heartbeat length */ + |
||||
+ payload + padding; |
||||
int r; |
||||
|
||||
+ if (write_length > SSL3_RT_MAX_PLAIN_LENGTH) |
||||
+ return 0; |
||||
+ |
||||
/* Allocate memory for the response, size is 1 byte |
||||
* message type, plus 2 bytes payload length, plus |
||||
* payload, plus padding |
||||
*/ |
||||
- buffer = OPENSSL_malloc(1 + 2 + payload + padding); |
||||
+ buffer = OPENSSL_malloc(write_length); |
||||
bp = buffer; |
||||
|
||||
/* Enter response type, length and copy payload */ |
||||
@@ -1488,11 +1498,11 @@ dtls1_process_heartbeat(SSL *s) |
||||
/* Random padding */ |
||||
RAND_pseudo_bytes(bp, padding); |
||||
|
||||
- r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding); |
||||
+ r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, write_length); |
||||
|
||||
if (r >= 0 && s->msg_callback) |
||||
s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT, |
||||
- buffer, 3 + payload + padding, |
||||
+ buffer, write_length, |
||||
s, s->msg_callback_arg); |
||||
|
||||
OPENSSL_free(buffer); |
||||
diff -up openssl-1.0.1e/ssl/t1_lib.c.heartbeat openssl-1.0.1e/ssl/t1_lib.c |
||||
--- openssl-1.0.1e/ssl/t1_lib.c.heartbeat 2014-04-07 12:52:01.891308997 +0200 |
||||
+++ openssl-1.0.1e/ssl/t1_lib.c 2014-04-07 12:57:45.063603587 +0200 |
||||
@@ -2463,16 +2463,20 @@ tls1_process_heartbeat(SSL *s) |
||||
unsigned int payload; |
||||
unsigned int padding = 16; /* Use minimum padding */ |
||||
|
||||
- /* Read type and payload length first */ |
||||
- hbtype = *p++; |
||||
- n2s(p, payload); |
||||
- pl = p; |
||||
- |
||||
if (s->msg_callback) |
||||
s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, |
||||
&s->s3->rrec.data[0], s->s3->rrec.length, |
||||
s, s->msg_callback_arg); |
||||
|
||||
+ /* Read type and payload length first */ |
||||
+ if (1 + 2 + 16 > s->s3->rrec.length) |
||||
+ return 0; /* silently discard */ |
||||
+ hbtype = *p++; |
||||
+ n2s(p, payload); |
||||
+ if (1 + 2 + payload + 16 > s->s3->rrec.length) |
||||
+ return 0; /* silently discard per RFC 6520 sec. 4 */ |
||||
+ pl = p; |
||||
+ |
||||
if (hbtype == TLS1_HB_REQUEST) |
||||
{ |
||||
unsigned char *buffer, *bp; |
@ -0,0 +1,36 @@
@@ -0,0 +1,36 @@
|
||||
commit 208d54db20d58c9a5e45e856a0650caadd7d9612 |
||||
Author: Dr. Stephen Henson <steve@openssl.org> |
||||
Date: Tue May 13 18:48:31 2014 +0100 |
||||
|
||||
Fix for CVE-2014-0195 |
||||
|
||||
A buffer overrun attack can be triggered by sending invalid DTLS fragments |
||||
to an OpenSSL DTLS client or server. This is potentially exploitable to |
||||
run arbitrary code on a vulnerable client or server. |
||||
|
||||
Fixed by adding consistency check for DTLS fragments. |
||||
|
||||
Thanks to Jüri Aedla for reporting this issue. |
||||
|
||||
diff --git a/ssl/d1_both.c b/ssl/d1_both.c |
||||
index 2e8cf68..07f67f8 100644 |
||||
--- a/ssl/d1_both.c |
||||
+++ b/ssl/d1_both.c |
||||
@@ -627,7 +627,16 @@ dtls1_reassemble_fragment(SSL *s, struct hm_header_st* msg_hdr, int *ok) |
||||
frag->msg_header.frag_off = 0; |
||||
} |
||||
else |
||||
+ { |
||||
frag = (hm_fragment*) item->data; |
||||
+ if (frag->msg_header.msg_len != msg_hdr->msg_len) |
||||
+ { |
||||
+ item = NULL; |
||||
+ frag = NULL; |
||||
+ goto err; |
||||
+ } |
||||
+ } |
||||
+ |
||||
|
||||
/* If message is already reassembled, this must be a |
||||
* retransmit and can be dropped. |
||||
|
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
From: Matt Caswell <matt@openssl.org> |
||||
Date: Sun, 11 May 2014 23:38:37 +0000 (+0100) |
||||
Subject: Fixed NULL pointer dereference. See PR#3321 |
||||
X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff_plain;h=b107586 |
||||
|
||||
Fixed NULL pointer dereference. See PR#3321 |
||||
--- |
||||
|
||||
diff --git a/ssl/s3_pkt.c b/ssl/s3_pkt.c |
||||
index 40eb0dd..d961d12 100644 |
||||
--- a/ssl/s3_pkt.c |
||||
+++ b/ssl/s3_pkt.c |
||||
@@ -657,9 +657,6 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf, |
||||
SSL3_BUFFER *wb=&(s->s3->wbuf); |
||||
SSL_SESSION *sess; |
||||
|
||||
- if (wb->buf == NULL) |
||||
- if (!ssl3_setup_write_buffer(s)) |
||||
- return -1; |
||||
|
||||
/* first check if there is a SSL3_BUFFER still being written |
||||
* out. This will happen with non blocking IO */ |
||||
@@ -675,6 +672,10 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf, |
||||
/* if it went, fall through and send more stuff */ |
||||
} |
||||
|
||||
+ if (wb->buf == NULL) |
||||
+ if (!ssl3_setup_write_buffer(s)) |
||||
+ return -1; |
||||
+ |
||||
if (len == 0 && !create_empty_fragment) |
||||
return 0; |
||||
|
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
commit d30e582446b027868cdabd0994681643682045a4 |
||||
Author: Dr. Stephen Henson <steve@openssl.org> |
||||
Date: Fri May 16 13:00:45 2014 +0100 |
||||
|
||||
Fix CVE-2014-0221 |
||||
|
||||
Unnecessary recursion when receiving a DTLS hello request can be used to |
||||
crash a DTLS client. Fixed by handling DTLS hello request without recursion. |
||||
|
||||
Thanks to Imre Rad (Search-Lab Ltd.) for discovering this issue. |
||||
|
||||
diff --git a/ssl/d1_both.c b/ssl/d1_both.c |
||||
index 07f67f8..4c2fd03 100644 |
||||
--- a/ssl/d1_both.c |
||||
+++ b/ssl/d1_both.c |
||||
@@ -793,6 +793,7 @@ dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok) |
||||
int i,al; |
||||
struct hm_header_st msg_hdr; |
||||
|
||||
+ redo: |
||||
/* see if we have the required fragment already */ |
||||
if ((frag_len = dtls1_retrieve_buffered_fragment(s,max,ok)) || *ok) |
||||
{ |
||||
@@ -851,8 +852,7 @@ dtls1_get_message_fragment(SSL *s, int st1, int stn, long max, int *ok) |
||||
s->msg_callback_arg); |
||||
|
||||
s->init_num = 0; |
||||
- return dtls1_get_message_fragment(s, st1, stn, |
||||
- max, ok); |
||||
+ goto redo; |
||||
} |
||||
else /* Incorrectly formated Hello request */ |
||||
{ |
||||
|
@ -0,0 +1,104 @@
@@ -0,0 +1,104 @@
|
||||
diff -up openssl-1.0.1e/ssl/ssl3.h.keying-mitm openssl-1.0.1e/ssl/ssl3.h |
||||
--- openssl-1.0.1e/ssl/ssl3.h.keying-mitm 2014-06-02 19:48:04.518100562 +0200 |
||||
+++ openssl-1.0.1e/ssl/ssl3.h 2014-06-02 19:48:04.642103429 +0200 |
||||
@@ -388,6 +388,7 @@ typedef struct ssl3_buffer_st |
||||
#define TLS1_FLAGS_TLS_PADDING_BUG 0x0008 |
||||
#define TLS1_FLAGS_SKIP_CERT_VERIFY 0x0010 |
||||
#define TLS1_FLAGS_KEEP_HANDSHAKE 0x0020 |
||||
+#define SSL3_FLAGS_CCS_OK 0x0080 |
||||
|
||||
/* SSL3_FLAGS_SGC_RESTART_DONE is set when we |
||||
* restart a handshake because of MS SGC and so prevents us |
||||
diff -up openssl-1.0.1e/ssl/s3_clnt.c.keying-mitm openssl-1.0.1e/ssl/s3_clnt.c |
||||
--- openssl-1.0.1e/ssl/s3_clnt.c.keying-mitm 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_clnt.c 2014-06-02 19:49:57.042701985 +0200 |
||||
@@ -510,6 +510,7 @@ int ssl3_connect(SSL *s) |
||||
s->method->ssl3_enc->client_finished_label, |
||||
s->method->ssl3_enc->client_finished_label_len); |
||||
if (ret <= 0) goto end; |
||||
+ s->s3->flags |= SSL3_FLAGS_CCS_OK; |
||||
s->state=SSL3_ST_CW_FLUSH; |
||||
|
||||
/* clear flags */ |
||||
@@ -559,6 +560,7 @@ int ssl3_connect(SSL *s) |
||||
case SSL3_ST_CR_FINISHED_A: |
||||
case SSL3_ST_CR_FINISHED_B: |
||||
|
||||
+ s->s3->flags |= SSL3_FLAGS_CCS_OK; |
||||
ret=ssl3_get_finished(s,SSL3_ST_CR_FINISHED_A, |
||||
SSL3_ST_CR_FINISHED_B); |
||||
if (ret <= 0) goto end; |
||||
@@ -901,6 +903,7 @@ int ssl3_get_server_hello(SSL *s) |
||||
{ |
||||
s->session->cipher = pref_cipher ? |
||||
pref_cipher : ssl_get_cipher_by_char(s, p+j); |
||||
+ s->s3->flags |= SSL3_FLAGS_CCS_OK; |
||||
} |
||||
} |
||||
#endif /* OPENSSL_NO_TLSEXT */ |
||||
@@ -916,6 +918,7 @@ int ssl3_get_server_hello(SSL *s) |
||||
SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT); |
||||
goto f_err; |
||||
} |
||||
+ s->s3->flags |= SSL3_FLAGS_CCS_OK; |
||||
s->hit=1; |
||||
} |
||||
else /* a miss or crap from the other end */ |
||||
diff -up openssl-1.0.1e/ssl/s3_pkt.c.keying-mitm openssl-1.0.1e/ssl/s3_pkt.c |
||||
--- openssl-1.0.1e/ssl/s3_pkt.c.keying-mitm 2014-06-02 19:48:04.640103383 +0200 |
||||
+++ openssl-1.0.1e/ssl/s3_pkt.c 2014-06-02 19:48:04.643103452 +0200 |
||||
@@ -1298,6 +1298,15 @@ start: |
||||
goto f_err; |
||||
} |
||||
|
||||
+ if (!(s->s3->flags & SSL3_FLAGS_CCS_OK)) |
||||
+ { |
||||
+ al=SSL_AD_UNEXPECTED_MESSAGE; |
||||
+ SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_CCS_RECEIVED_EARLY); |
||||
+ goto f_err; |
||||
+ } |
||||
+ |
||||
+ s->s3->flags &= ~SSL3_FLAGS_CCS_OK; |
||||
+ |
||||
rr->length=0; |
||||
|
||||
if (s->msg_callback) |
||||
@@ -1432,7 +1441,7 @@ int ssl3_do_change_cipher_spec(SSL *s) |
||||
|
||||
if (s->s3->tmp.key_block == NULL) |
||||
{ |
||||
- if (s->session == NULL) |
||||
+ if (s->session == NULL || s->session->master_key_length == 0) |
||||
{ |
||||
/* might happen if dtls1_read_bytes() calls this */ |
||||
SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC,SSL_R_CCS_RECEIVED_EARLY); |
||||
diff -up openssl-1.0.1e/ssl/s3_srvr.c.keying-mitm openssl-1.0.1e/ssl/s3_srvr.c |
||||
--- openssl-1.0.1e/ssl/s3_srvr.c.keying-mitm 2014-06-02 19:48:04.630103151 +0200 |
||||
+++ openssl-1.0.1e/ssl/s3_srvr.c 2014-06-02 19:48:04.643103452 +0200 |
||||
@@ -673,6 +673,7 @@ int ssl3_accept(SSL *s) |
||||
case SSL3_ST_SR_CERT_VRFY_A: |
||||
case SSL3_ST_SR_CERT_VRFY_B: |
||||
|
||||
+ s->s3->flags |= SSL3_FLAGS_CCS_OK; |
||||
/* we should decide if we expected this one */ |
||||
ret=ssl3_get_cert_verify(s); |
||||
if (ret <= 0) goto end; |
||||
@@ -700,6 +701,7 @@ int ssl3_accept(SSL *s) |
||||
|
||||
case SSL3_ST_SR_FINISHED_A: |
||||
case SSL3_ST_SR_FINISHED_B: |
||||
+ s->s3->flags |= SSL3_FLAGS_CCS_OK; |
||||
ret=ssl3_get_finished(s,SSL3_ST_SR_FINISHED_A, |
||||
SSL3_ST_SR_FINISHED_B); |
||||
if (ret <= 0) goto end; |
||||
@@ -770,7 +772,10 @@ int ssl3_accept(SSL *s) |
||||
s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A; |
||||
#else |
||||
if (s->s3->next_proto_neg_seen) |
||||
+ { |
||||
+ s->s3->flags |= SSL3_FLAGS_CCS_OK; |
||||
s->s3->tmp.next_state=SSL3_ST_SR_NEXT_PROTO_A; |
||||
+ } |
||||
else |
||||
s->s3->tmp.next_state=SSL3_ST_SR_FINISHED_A; |
||||
#endif |
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
commit 4ad43d511f6cf064c66eb4bfd0fb0919b5dd8a86 |
||||
Author: Dr. Stephen Henson <steve@openssl.org> |
||||
Date: Thu May 29 15:00:05 2014 +0100 |
||||
|
||||
Fix CVE-2014-3470 |
||||
|
||||
Check session_cert is not NULL before dereferencing it. |
||||
|
||||
diff --git a/ssl/s3_clnt.c b/ssl/s3_clnt.c |
||||
index d35376d..4324f8d 100644 |
||||
--- a/ssl/s3_clnt.c |
||||
+++ b/ssl/s3_clnt.c |
||||
@@ -2511,6 +2511,13 @@ int ssl3_send_client_key_exchange(SSL *s) |
||||
int ecdh_clnt_cert = 0; |
||||
int field_size = 0; |
||||
|
||||
+ if (s->session->sess_cert == NULL) |
||||
+ { |
||||
+ ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE); |
||||
+ SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE); |
||||
+ goto err; |
||||
+ } |
||||
+ |
||||
/* Did we send out the client's |
||||
* ECDH share for use in premaster |
||||
* computation as part of client certificate? |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
From 2172d4f63c61922487008f42511cc6bdae9b47a0 Mon Sep 17 00:00:00 2001 |
||||
From: Adam Langley <agl@imperialviolet.org> |
||||
Date: Fri, 6 Jun 2014 14:19:21 -0700 |
||||
Subject: [PATCH] Avoid double free when processing DTLS packets. |
||||
MIME-Version: 1.0 |
||||
Content-Type: text/plain; charset=UTF-8 |
||||
Content-Transfer-Encoding: 8bit |
||||
|
||||
The |item| variable, in both of these cases, may contain a pointer to a |
||||
|pitem| structure within |s->d1->buffered_messages|. It was being freed |
||||
in the error case while still being in |buffered_messages|. When the |
||||
error later caused the |SSL*| to be destroyed, the item would be double |
||||
freed. |
||||
|
||||
Thanks to Wah-Teh Chang for spotting that the fix in 1632ef74 was |
||||
inconsistent with the other error paths (but correct). |
||||
|
||||
Fixes CVE-2014-3505 |
||||
|
||||
Reviewed-by: Matt Caswell <matt@openssl.org> |
||||
Reviewed-by: Emilia Käsper <emilia@openssl.org> |
||||
--- |
||||
ssl/d1_both.c | 6 ++---- |
||||
1 file changed, 2 insertions(+), 4 deletions(-) |
||||
|
||||
diff --git a/ssl/d1_both.c b/ssl/d1_both.c |
||||
index c1eb970..cdb83b6 100644 |
||||
--- a/ssl/d1_both.c |
||||
+++ b/ssl/d1_both.c |
||||
@@ -693,8 +693,7 @@ dtls1_reassemble_fragment(SSL *s, struct hm_header_st* msg_hdr, int *ok) |
||||
return DTLS1_HM_FRAGMENT_RETRY; |
||||
|
||||
err: |
||||
- if (frag != NULL) dtls1_hm_fragment_free(frag); |
||||
- if (item != NULL) OPENSSL_free(item); |
||||
+ if (frag != NULL && item == NULL) dtls1_hm_fragment_free(frag); |
||||
*ok = 0; |
||||
return i; |
||||
} |
||||
@@ -778,8 +777,7 @@ dtls1_process_out_of_seq_message(SSL *s, struct hm_header_st* msg_hdr, int *ok) |
||||
return DTLS1_HM_FRAGMENT_RETRY; |
||||
|
||||
err: |
||||
- if ( frag != NULL) dtls1_hm_fragment_free(frag); |
||||
- if ( item != NULL) OPENSSL_free(item); |
||||
+ if (frag != NULL && item == NULL) dtls1_hm_fragment_free(frag); |
||||
*ok = 0; |
||||
return i; |
||||
} |
||||
-- |
||||
1.8.3.1 |
||||
|
@ -0,0 +1,87 @@
@@ -0,0 +1,87 @@
|
||||
From fc7804ec392fcf8051abe6bc9da9108744d2ae35 Mon Sep 17 00:00:00 2001 |
||||
From: Matt Caswell <matt@openssl.org> |
||||
Date: Fri, 6 Jun 2014 14:25:52 -0700 |
||||
Subject: [PATCH] Fix DTLS handshake message size checks. |
||||
MIME-Version: 1.0 |
||||
Content-Type: text/plain; charset=UTF-8 |
||||
Content-Transfer-Encoding: 8bit |
||||
|
||||
In |dtls1_reassemble_fragment|, the value of |
||||
|msg_hdr->frag_off+frag_len| was being checked against the maximum |
||||
handshake message size, but then |msg_len| bytes were allocated for the |
||||
fragment buffer. This means that so long as the fragment was within the |
||||
allowed size, the pending handshake message could consume 16MB + 2MB |
||||
(for the reassembly bitmap). Approx 10 outstanding handshake messages |
||||
are allowed, meaning that an attacker could consume ~180MB per DTLS |
||||
connection. |
||||
|
||||
In the non-fragmented path (in |dtls1_process_out_of_seq_message|), no |
||||
check was applied. |
||||
|
||||
Fixes CVE-2014-3506 |
||||
|
||||
Wholly based on patch by Adam Langley with one minor amendment. |
||||
|
||||
Reviewed-by: Emilia Käsper <emilia@openssl.org> |
||||
--- |
||||
ssl/d1_both.c | 29 ++++++++++++++++------------- |
||||
1 file changed, 16 insertions(+), 13 deletions(-) |
||||
|
||||
diff --git a/ssl/d1_both.c b/ssl/d1_both.c |
||||
index 6559dfc..b9e15df 100644 |
||||
--- a/ssl/d1_both.c |
||||
+++ b/ssl/d1_both.c |
||||
@@ -587,6 +587,16 @@ dtls1_retrieve_buffered_fragment(SSL *s, long max, int *ok) |
||||
return 0; |
||||
} |
||||
|
||||
+/* dtls1_max_handshake_message_len returns the maximum number of bytes |
||||
+ * permitted in a DTLS handshake message for |s|. The minimum is 16KB, but may |
||||
+ * be greater if the maximum certificate list size requires it. */ |
||||
+static unsigned long dtls1_max_handshake_message_len(const SSL *s) |
||||
+ { |
||||
+ unsigned long max_len = DTLS1_HM_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH; |
||||
+ if (max_len < (unsigned long)s->max_cert_list) |
||||
+ return s->max_cert_list; |
||||
+ return max_len; |
||||
+ } |
||||
|
||||
static int |
||||
dtls1_reassemble_fragment(SSL *s, struct hm_header_st* msg_hdr, int *ok) |
||||
@@ -595,20 +605,10 @@ dtls1_reassemble_fragment(SSL *s, struct hm_header_st* msg_hdr, int *ok) |
||||
pitem *item = NULL; |
||||
int i = -1, is_complete; |
||||
unsigned char seq64be[8]; |
||||
- unsigned long frag_len = msg_hdr->frag_len, max_len; |
||||
- |
||||
- if ((msg_hdr->frag_off+frag_len) > msg_hdr->msg_len) |
||||
- goto err; |
||||
- |
||||
- /* Determine maximum allowed message size. Depends on (user set) |
||||
- * maximum certificate length, but 16k is minimum. |
||||
- */ |
||||
- if (DTLS1_HM_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH < s->max_cert_list) |
||||
- max_len = s->max_cert_list; |
||||
- else |
||||
- max_len = DTLS1_HM_HEADER_LENGTH + SSL3_RT_MAX_ENCRYPTED_LENGTH; |
||||
+ unsigned long frag_len = msg_hdr->frag_len; |
||||
|
||||
- if ((msg_hdr->frag_off+frag_len) > max_len) |
||||
+ if ((msg_hdr->frag_off+frag_len) > msg_hdr->msg_len || |
||||
+ msg_hdr->msg_len > dtls1_max_handshake_message_len(s)) |
||||
goto err; |
||||
|
||||
/* Try to find item in queue */ |
||||
@@ -749,6 +749,9 @@ dtls1_process_out_of_seq_message(SSL *s, struct hm_header_st* msg_hdr, int *ok) |
||||
if (frag_len && frag_len < msg_hdr->msg_len) |
||||
return dtls1_reassemble_fragment(s, msg_hdr, ok); |
||||
|
||||
+ if (frag_len > dtls1_max_handshake_message_len(s)) |
||||
+ goto err; |
||||
+ |
||||
frag = dtls1_hm_fragment_new(frag_len, 0); |
||||
if ( frag == NULL) |
||||
goto err; |
||||
-- |
||||
1.8.3.1 |
||||
|
@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
|
||||
diff -up openssl-1.0.1e/ssl/d1_both.c.dtls-memleak openssl-1.0.1e/ssl/d1_both.c |
||||
--- openssl-1.0.1e/ssl/d1_both.c.dtls-memleak 2014-08-07 17:51:18.457493922 +0200 |
||||
+++ openssl-1.0.1e/ssl/d1_both.c 2014-08-07 17:58:28.478558785 +0200 |
||||
@@ -610,6 +610,9 @@ dtls1_reassemble_fragment(SSL *s, struct |
||||
msg_hdr->msg_len > dtls1_max_handshake_message_len(s)) |
||||
goto err; |
||||
|
||||
+ if (frag_len == 0) |
||||
+ return DTLS1_HM_FRAGMENT_RETRY; |
||||
+ |
||||
/* Try to find item in queue */ |
||||
memset(seq64be,0,sizeof(seq64be)); |
||||
seq64be[6] = (unsigned char) (msg_hdr->seq>>8); |
||||
@@ -686,7 +689,12 @@ dtls1_reassemble_fragment(SSL *s, struct |
||||
i = -1; |
||||
} |
||||
|
||||
- pqueue_insert(s->d1->buffered_messages, item); |
||||
+ item = pqueue_insert(s->d1->buffered_messages, item); |
||||
+ /* pqueue_insert fails iff a duplicate item is inserted. |
||||
+ * However, |item| cannot be a duplicate. If it were, |
||||
+ * |pqueue_find|, above, would have returned it and control |
||||
+ * would never have reached this branch. */ |
||||
+ OPENSSL_assert(item != NULL); |
||||
} |
||||
|
||||
return DTLS1_HM_FRAGMENT_RETRY; |
||||
@@ -744,7 +752,7 @@ dtls1_process_out_of_seq_message(SSL *s, |
||||
} |
||||
else |
||||
{ |
||||
- if (frag_len && frag_len < msg_hdr->msg_len) |
||||
+ if (frag_len < msg_hdr->msg_len) |
||||
return dtls1_reassemble_fragment(s, msg_hdr, ok); |
||||
|
||||
if (frag_len > dtls1_max_handshake_message_len(s)) |
||||
@@ -773,7 +781,15 @@ dtls1_process_out_of_seq_message(SSL *s, |
||||
if ( item == NULL) |
||||
goto err; |
||||
|
||||
- pqueue_insert(s->d1->buffered_messages, item); |
||||
+ item = pqueue_insert(s->d1->buffered_messages, item); |
||||
+ /* pqueue_insert fails iff a duplicate item is inserted. |
||||
+ * However, |item| cannot be a duplicate. If it were, |
||||
+ * |pqueue_find|, above, would have returned it. Then, either |
||||
+ * |frag_len| != |msg_hdr->msg_len| in which case |item| is set |
||||
+ * to NULL and it will have been processed with |
||||
+ * |dtls1_reassemble_fragment|, above, or the record will have |
||||
+ * been discarded. */ |
||||
+ OPENSSL_assert(item != NULL); |
||||
} |
||||
|
||||
return DTLS1_HM_FRAGMENT_RETRY; |
@ -0,0 +1,138 @@
@@ -0,0 +1,138 @@
|
||||
From 03b04ddac162c7b7fa3c57eadccc5a583a00d291 Mon Sep 17 00:00:00 2001 |
||||
From: Emilia Kasper <emilia@openssl.org> |
||||
Date: Wed, 2 Jul 2014 19:02:33 +0200 |
||||
Subject: [PATCH] Fix OID handling: |
||||
|
||||
- Upon parsing, reject OIDs with invalid base-128 encoding. |
||||
- Always NUL-terminate the destination buffer in OBJ_obj2txt printing function. |
||||
|
||||
CVE-2014-3508 |
||||
|
||||
Reviewed-by: Dr. Stephen Henson <steve@openssl.org> |
||||
Reviewed-by: Kurt Roeckx <kurt@openssl.org> |
||||
Reviewed-by: Tim Hudson <tjh@openssl.org> |
||||
--- |
||||
crypto/asn1/a_object.c | 30 +++++++++++++++++++++--------- |
||||
crypto/objects/obj_dat.c | 16 +++++++++------- |
||||
2 files changed, 30 insertions(+), 16 deletions(-) |
||||
|
||||
diff --git a/crypto/asn1/a_object.c b/crypto/asn1/a_object.c |
||||
index 3978c91..77b2768 100644 |
||||
--- a/crypto/asn1/a_object.c |
||||
+++ b/crypto/asn1/a_object.c |
||||
@@ -283,17 +283,29 @@ err: |
||||
ASN1err(ASN1_F_D2I_ASN1_OBJECT,i); |
||||
return(NULL); |
||||
} |
||||
+ |
||||
ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, |
||||
long len) |
||||
{ |
||||
ASN1_OBJECT *ret=NULL; |
||||
const unsigned char *p; |
||||
unsigned char *data; |
||||
- int i; |
||||
- /* Sanity check OID encoding: can't have leading 0x80 in |
||||
- * subidentifiers, see: X.690 8.19.2 |
||||
+ int i, length; |
||||
+ |
||||
+ /* Sanity check OID encoding. |
||||
+ * Need at least one content octet. |
||||
+ * MSB must be clear in the last octet. |
||||
+ * can't have leading 0x80 in subidentifiers, see: X.690 8.19.2 |
||||
*/ |
||||
- for (i = 0, p = *pp; i < len; i++, p++) |
||||
+ if (len <= 0 || len > INT_MAX || pp == NULL || (p = *pp) == NULL || |
||||
+ p[len - 1] & 0x80) |
||||
+ { |
||||
+ ASN1err(ASN1_F_C2I_ASN1_OBJECT,ASN1_R_INVALID_OBJECT_ENCODING); |
||||
+ return NULL; |
||||
+ } |
||||
+ /* Now 0 < len <= INT_MAX, so the cast is safe. */ |
||||
+ length = (int)len; |
||||
+ for (i = 0; i < length; i++, p++) |
||||
{ |
||||
if (*p == 0x80 && (!i || !(p[-1] & 0x80))) |
||||
{ |
||||
@@ -316,23 +328,23 @@ ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, |
||||
data = (unsigned char *)ret->data; |
||||
ret->data = NULL; |
||||
/* once detached we can change it */ |
||||
- if ((data == NULL) || (ret->length < len)) |
||||
+ if ((data == NULL) || (ret->length < length)) |
||||
{ |
||||
ret->length=0; |
||||
if (data != NULL) OPENSSL_free(data); |
||||
- data=(unsigned char *)OPENSSL_malloc(len ? (int)len : 1); |
||||
+ data=(unsigned char *)OPENSSL_malloc(length); |
||||
if (data == NULL) |
||||
{ i=ERR_R_MALLOC_FAILURE; goto err; } |
||||
ret->flags|=ASN1_OBJECT_FLAG_DYNAMIC_DATA; |
||||
} |
||||
- memcpy(data,p,(int)len); |
||||
+ memcpy(data,p,length); |
||||
/* reattach data to object, after which it remains const */ |
||||
ret->data =data; |
||||
- ret->length=(int)len; |
||||
+ ret->length=length; |
||||
ret->sn=NULL; |
||||
ret->ln=NULL; |
||||
/* ret->flags=ASN1_OBJECT_FLAG_DYNAMIC; we know it is dynamic */ |
||||
- p+=len; |
||||
+ p+=length; |
||||
|
||||
if (a != NULL) (*a)=ret; |
||||
*pp=p; |
||||
diff --git a/crypto/objects/obj_dat.c b/crypto/objects/obj_dat.c |
||||
index 8a342ba..0b2f442 100644 |
||||
--- a/crypto/objects/obj_dat.c |
||||
+++ b/crypto/objects/obj_dat.c |
||||
@@ -471,11 +471,12 @@ int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name) |
||||
const unsigned char *p; |
||||
char tbuf[DECIMAL_SIZE(i)+DECIMAL_SIZE(l)+2]; |
||||
|
||||
- if ((a == NULL) || (a->data == NULL)) { |
||||
- buf[0]='\0'; |
||||
- return(0); |
||||
- } |
||||
+ /* Ensure that, at every state, |buf| is NUL-terminated. */ |
||||
+ if (buf && buf_len > 0) |
||||
+ buf[0] = '\0'; |
||||
|
||||
+ if ((a == NULL) || (a->data == NULL)) |
||||
+ return(0); |
||||
|
||||
if (!no_name && (nid=OBJ_obj2nid(a)) != NID_undef) |
||||
{ |
||||
@@ -554,9 +555,10 @@ int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name) |
||||
i=(int)(l/40); |
||||
l-=(long)(i*40); |
||||
} |
||||
- if (buf && (buf_len > 0)) |
||||
+ if (buf && (buf_len > 1)) |
||||
{ |
||||
*buf++ = i + '0'; |
||||
+ *buf = '\0'; |
||||
buf_len--; |
||||
} |
||||
n++; |
||||
@@ -571,9 +573,10 @@ int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name) |
||||
i = strlen(bndec); |
||||
if (buf) |
||||
{ |
||||
- if (buf_len > 0) |
||||
+ if (buf_len > 1) |
||||
{ |
||||
*buf++ = '.'; |
||||
+ *buf = '\0'; |
||||
buf_len--; |
||||
} |
||||
BUF_strlcpy(buf,bndec,buf_len); |
||||
@@ -807,4 +810,3 @@ err: |
||||
OPENSSL_free(buf); |
||||
return(ok); |
||||
} |
||||
- |
||||
-- |
||||
1.8.3.1 |
||||
|
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
From 86788e1ee6908a5b3a4c95fa80caa4b724a8a434 Mon Sep 17 00:00:00 2001 |
||||
From: Gabor Tyukasz <Gabor.Tyukasz@logmein.com> |
||||
Date: Wed, 23 Jul 2014 23:42:06 +0200 |
||||
Subject: [PATCH] Fix race condition in ssl_parse_serverhello_tlsext |
||||
|
||||
CVE-2014-3509 |
||||
Reviewed-by: Tim Hudson <tjh@openssl.org> |
||||
Reviewed-by: Dr. Stephen Henson <steve@openssl.org> |
||||
--- |
||||
ssl/t1_lib.c | 17 ++++++++++------- |
||||
1 file changed, 10 insertions(+), 7 deletions(-) |
||||
|
||||
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c |
||||
index 8167a51..022a4fb 100644 |
||||
--- a/ssl/t1_lib.c |
||||
+++ b/ssl/t1_lib.c |
||||
@@ -1555,15 +1555,18 @@ int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in |
||||
*al = TLS1_AD_DECODE_ERROR; |
||||
return 0; |
||||
} |
||||
- s->session->tlsext_ecpointformatlist_length = 0; |
||||
- if (s->session->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->session->tlsext_ecpointformatlist); |
||||
- if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL) |
||||
+ if (!s->hit) |
||||
{ |
||||
- *al = TLS1_AD_INTERNAL_ERROR; |
||||
- return 0; |
||||
+ s->session->tlsext_ecpointformatlist_length = 0; |
||||
+ if (s->session->tlsext_ecpointformatlist != NULL) OPENSSL_free(s->session->tlsext_ecpointformatlist); |
||||
+ if ((s->session->tlsext_ecpointformatlist = OPENSSL_malloc(ecpointformatlist_length)) == NULL) |
||||
+ { |
||||
+ *al = TLS1_AD_INTERNAL_ERROR; |
||||
+ return 0; |
||||
+ } |
||||
+ s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length; |
||||
+ memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length); |
||||
} |
||||
- s->session->tlsext_ecpointformatlist_length = ecpointformatlist_length; |
||||
- memcpy(s->session->tlsext_ecpointformatlist, sdata, ecpointformatlist_length); |
||||
#if 0 |
||||
fprintf(stderr,"ssl_parse_serverhello_tlsext s->session->tlsext_ecpointformatlist "); |
||||
sdata = s->session->tlsext_ecpointformatlist; |
||||
-- |
||||
1.8.3.1 |
||||
|
@ -0,0 +1,86 @@
@@ -0,0 +1,86 @@
|
||||
From 88ae012c8092852f03c50f6461175271104b4c8a Mon Sep 17 00:00:00 2001 |
||||
From: =?UTF-8?q?Emilia=20K=C3=A4sper?= <emilia@openssl.org> |
||||
Date: Thu, 24 Jul 2014 22:15:29 +0200 |
||||
Subject: [PATCH] Fix DTLS anonymous EC(DH) denial of service |
||||
|
||||
CVE-2014-3510 |
||||
|
||||
Reviewed-by: Dr. Stephen Henson <steve@openssl.org> |
||||
--- |
||||
ssl/d1_clnt.c | 23 +++++++++++++++++++++-- |
||||
ssl/s3_clnt.c | 7 +++++++ |
||||
2 files changed, 28 insertions(+), 2 deletions(-) |
||||
|
||||
diff --git a/ssl/d1_clnt.c b/ssl/d1_clnt.c |
||||
index 65dbb4a..fd6562c 100644 |
||||
--- a/ssl/d1_clnt.c |
||||
+++ b/ssl/d1_clnt.c |
||||
@@ -996,6 +996,13 @@ int dtls1_send_client_key_exchange(SSL *s) |
||||
RSA *rsa; |
||||
unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH]; |
||||
|
||||
+ if (s->session->sess_cert == NULL) |
||||
+ { |
||||
+ /* We should always have a server certificate with SSL_kRSA. */ |
||||
+ SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR); |
||||
+ goto err; |
||||
+ } |
||||
+ |
||||
if (s->session->sess_cert->peer_rsa_tmp != NULL) |
||||
rsa=s->session->sess_cert->peer_rsa_tmp; |
||||
else |
||||
@@ -1186,6 +1193,13 @@ int dtls1_send_client_key_exchange(SSL *s) |
||||
{ |
||||
DH *dh_srvr,*dh_clnt; |
||||
|
||||
+ if (s->session->sess_cert == NULL) |
||||
+ { |
||||
+ ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE); |
||||
+ SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE); |
||||
+ goto err; |
||||
+ } |
||||
+ |
||||
if (s->session->sess_cert->peer_dh_tmp != NULL) |
||||
dh_srvr=s->session->sess_cert->peer_dh_tmp; |
||||
else |
||||
@@ -1245,6 +1259,13 @@ int dtls1_send_client_key_exchange(SSL *s) |
||||
int ecdh_clnt_cert = 0; |
||||
int field_size = 0; |
||||
|
||||
+ if (s->session->sess_cert == NULL) |
||||
+ { |
||||
+ ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE); |
||||
+ SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE); |
||||
+ goto err; |
||||
+ } |
||||
+ |
||||
/* Did we send out the client's |
||||
* ECDH share for use in premaster |
||||
* computation as part of client certificate? |
||||
@@ -1720,5 +1741,3 @@ int dtls1_send_client_certificate(SSL *s) |
||||
/* SSL3_ST_CW_CERT_D */ |
||||
return(dtls1_do_write(s,SSL3_RT_HANDSHAKE)); |
||||
} |
||||
- |
||||
- |
||||
diff --git a/ssl/s3_clnt.c b/ssl/s3_clnt.c |
||||
index 2afb892..df05f78 100644 |
||||
--- a/ssl/s3_clnt.c |
||||
+++ b/ssl/s3_clnt.c |
||||
@@ -2253,6 +2253,13 @@ int ssl3_send_client_key_exchange(SSL *s) |
||||
RSA *rsa; |
||||
unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH]; |
||||
|
||||
+ if (s->session->sess_cert == NULL) |
||||
+ { |
||||
+ /* We should always have a server certificate with SSL_kRSA. */ |
||||
+ SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR); |
||||
+ goto err; |
||||
+ } |
||||
+ |
||||
if (s->session->sess_cert->peer_rsa_tmp != NULL) |
||||
rsa=s->session->sess_cert->peer_rsa_tmp; |
||||
else |
||||
-- |
||||
1.8.3.1 |
||||
|
@ -0,0 +1,85 @@
@@ -0,0 +1,85 @@
|
||||
From fc4f4cdb8bf9981904e652abf69b892a45bddacf Mon Sep 17 00:00:00 2001 |
||||
From: David Benjamin <davidben@google.com> |
||||
Date: Wed, 23 Jul 2014 22:32:21 +0200 |
||||
Subject: [PATCH] Fix protocol downgrade bug in case of fragmented packets |
||||
MIME-Version: 1.0 |
||||
Content-Type: text/plain; charset=UTF-8 |
||||
Content-Transfer-Encoding: 8bit |
||||
|
||||
CVE-2014-3511 |
||||
|
||||
Reviewed-by: Emilia Käsper <emilia@openssl.org> |
||||
Reviewed-by: Bodo Möller <bodo@openssl.org> |
||||
--- |
||||
ssl/s23_srvr.c | 30 +++++++++++++++++++++++------- |
||||
1 file changed, 23 insertions(+), 7 deletions(-) |
||||
|
||||
diff --git a/ssl/s23_srvr.c b/ssl/s23_srvr.c |
||||
index 4877849..2901a6b 100644 |
||||
--- a/ssl/s23_srvr.c |
||||
+++ b/ssl/s23_srvr.c |
||||
@@ -348,23 +348,19 @@ int ssl23_get_client_hello(SSL *s) |
||||
* Client Hello message, this would be difficult, and we'd have |
||||
* to read more records to find out. |
||||
* No known SSL 3.0 client fragments ClientHello like this, |
||||
- * so we simply assume TLS 1.0 to avoid protocol version downgrade |
||||
- * attacks. */ |
||||
+ * so we simply reject such connections to avoid |
||||
+ * protocol version downgrade attacks. */ |
||||
if (p[3] == 0 && p[4] < 6) |
||||
{ |
||||
-#if 0 |
||||
SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_SMALL); |
||||
goto err; |
||||
-#else |
||||
- v[1] = TLS1_VERSION_MINOR; |
||||
-#endif |
||||
} |
||||
/* if major version number > 3 set minor to a value |
||||
* which will use the highest version 3 we support. |
||||
* If TLS 2.0 ever appears we will need to revise |
||||
* this.... |
||||
*/ |
||||
- else if (p[9] > SSL3_VERSION_MAJOR) |
||||
+ if (p[9] > SSL3_VERSION_MAJOR) |
||||
v[1]=0xff; |
||||
else |
||||
v[1]=p[10]; /* minor version according to client_version */ |
||||
@@ -444,14 +440,34 @@ int ssl23_get_client_hello(SSL *s) |
||||
v[0] = p[3]; /* == SSL3_VERSION_MAJOR */ |
||||
v[1] = p[4]; |
||||
|
||||
+ /* An SSLv3/TLSv1 backwards-compatible CLIENT-HELLO in an SSLv2 |
||||
+ * header is sent directly on the wire, not wrapped as a TLS |
||||
+ * record. It's format is: |
||||
+ * Byte Content |
||||
+ * 0-1 msg_length |
||||
+ * 2 msg_type |
||||
+ * 3-4 version |
||||
+ * 5-6 cipher_spec_length |
||||
+ * 7-8 session_id_length |
||||
+ * 9-10 challenge_length |
||||
+ * ... ... |
||||
+ */ |
||||
n=((p[0]&0x7f)<<8)|p[1]; |
||||
if (n > (1024*4)) |
||||
{ |
||||
SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_LARGE); |
||||
goto err; |
||||
} |
||||
+ if (n < 9) |
||||
+ { |
||||
+ SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_LENGTH_MISMATCH); |
||||
+ goto err; |
||||
+ } |
||||
|
||||
j=ssl23_read_bytes(s,n+2); |
||||
+ /* We previously read 11 bytes, so if j > 0, we must have |
||||
+ * j == n+2 == s->packet_length. We have at least 11 valid |
||||
+ * packet bytes. */ |
||||
if (j <= 0) return(j); |
||||
|
||||
ssl3_finish_mac(s, s->packet+2, s->packet_length-2); |
||||
-- |
||||
1.8.3.1 |
||||
|
@ -0,0 +1,186 @@
@@ -0,0 +1,186 @@
|
||||
diff -up openssl-1.0.1e/ssl/d1_srtp.c.srtp-leak openssl-1.0.1e/ssl/d1_srtp.c |
||||
--- openssl-1.0.1e/ssl/d1_srtp.c.srtp-leak 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/d1_srtp.c 2014-10-15 13:23:34.253040160 +0200 |
||||
@@ -168,25 +168,6 @@ static int find_profile_by_name(char *pr |
||||
return 1; |
||||
} |
||||
|
||||
-static int find_profile_by_num(unsigned profile_num, |
||||
- SRTP_PROTECTION_PROFILE **pptr) |
||||
- { |
||||
- SRTP_PROTECTION_PROFILE *p; |
||||
- |
||||
- p=srtp_known_profiles; |
||||
- while(p->name) |
||||
- { |
||||
- if(p->id == profile_num) |
||||
- { |
||||
- *pptr=p; |
||||
- return 0; |
||||
- } |
||||
- p++; |
||||
- } |
||||
- |
||||
- return 1; |
||||
- } |
||||
- |
||||
static int ssl_ctx_make_profiles(const char *profiles_string,STACK_OF(SRTP_PROTECTION_PROFILE) **out) |
||||
{ |
||||
STACK_OF(SRTP_PROTECTION_PROFILE) *profiles; |
||||
@@ -209,11 +190,19 @@ static int ssl_ctx_make_profiles(const c |
||||
if(!find_profile_by_name(ptr,&p, |
||||
col ? col-ptr : (int)strlen(ptr))) |
||||
{ |
||||
+ if (sk_SRTP_PROTECTION_PROFILE_find(profiles,p) >= 0) |
||||
+ { |
||||
+ SSLerr(SSL_F_SSL_CTX_MAKE_PROFILES,SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST); |
||||
+ sk_SRTP_PROTECTION_PROFILE_free(profiles); |
||||
+ return 1; |
||||
+ } |
||||
+ |
||||
sk_SRTP_PROTECTION_PROFILE_push(profiles,p); |
||||
} |
||||
else |
||||
{ |
||||
SSLerr(SSL_F_SSL_CTX_MAKE_PROFILES,SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE); |
||||
+ sk_SRTP_PROTECTION_PROFILE_free(profiles); |
||||
return 1; |
||||
} |
||||
|
||||
@@ -305,13 +294,12 @@ int ssl_add_clienthello_use_srtp_ext(SSL |
||||
|
||||
int ssl_parse_clienthello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al) |
||||
{ |
||||
- SRTP_PROTECTION_PROFILE *cprof,*sprof; |
||||
- STACK_OF(SRTP_PROTECTION_PROFILE) *clnt=0,*srvr; |
||||
+ SRTP_PROTECTION_PROFILE *sprof; |
||||
+ STACK_OF(SRTP_PROTECTION_PROFILE) *srvr; |
||||
int ct; |
||||
int mki_len; |
||||
- int i,j; |
||||
- int id; |
||||
- int ret; |
||||
+ int i, srtp_pref; |
||||
+ unsigned int id; |
||||
|
||||
/* Length value + the MKI length */ |
||||
if(len < 3) |
||||
@@ -341,22 +329,32 @@ int ssl_parse_clienthello_use_srtp_ext(S |
||||
return 1; |
||||
} |
||||
|
||||
+ srvr=SSL_get_srtp_profiles(s); |
||||
+ s->srtp_profile = NULL; |
||||
+ /* Search all profiles for a match initially */ |
||||
+ srtp_pref = sk_SRTP_PROTECTION_PROFILE_num(srvr); |
||||
|
||||
- clnt=sk_SRTP_PROTECTION_PROFILE_new_null(); |
||||
- |
||||
while(ct) |
||||
{ |
||||
n2s(d,id); |
||||
ct-=2; |
||||
len-=2; |
||||
|
||||
- if(!find_profile_by_num(id,&cprof)) |
||||
+ /* |
||||
+ * Only look for match in profiles of higher preference than |
||||
+ * current match. |
||||
+ * If no profiles have been have been configured then this |
||||
+ * does nothing. |
||||
+ */ |
||||
+ for (i = 0; i < srtp_pref; i++) |
||||
{ |
||||
- sk_SRTP_PROTECTION_PROFILE_push(clnt,cprof); |
||||
- } |
||||
- else |
||||
- { |
||||
- ; /* Ignore */ |
||||
+ sprof = sk_SRTP_PROTECTION_PROFILE_value(srvr, i); |
||||
+ if (sprof->id == id) |
||||
+ { |
||||
+ s->srtp_profile = sprof; |
||||
+ srtp_pref = i; |
||||
+ break; |
||||
+ } |
||||
} |
||||
} |
||||
|
||||
@@ -371,36 +369,7 @@ int ssl_parse_clienthello_use_srtp_ext(S |
||||
return 1; |
||||
} |
||||
|
||||
- srvr=SSL_get_srtp_profiles(s); |
||||
- |
||||
- /* Pick our most preferred profile. If no profiles have been |
||||
- configured then the outer loop doesn't run |
||||
- (sk_SRTP_PROTECTION_PROFILE_num() = -1) |
||||
- and so we just return without doing anything */ |
||||
- for(i=0;i<sk_SRTP_PROTECTION_PROFILE_num(srvr);i++) |
||||
- { |
||||
- sprof=sk_SRTP_PROTECTION_PROFILE_value(srvr,i); |
||||
- |
||||
- for(j=0;j<sk_SRTP_PROTECTION_PROFILE_num(clnt);j++) |
||||
- { |
||||
- cprof=sk_SRTP_PROTECTION_PROFILE_value(clnt,j); |
||||
- |
||||
- if(cprof->id==sprof->id) |
||||
- { |
||||
- s->srtp_profile=sprof; |
||||
- *al=0; |
||||
- ret=0; |
||||
- goto done; |
||||
- } |
||||
- } |
||||
- } |
||||
- |
||||
- ret=0; |
||||
- |
||||
-done: |
||||
- if(clnt) sk_SRTP_PROTECTION_PROFILE_free(clnt); |
||||
- |
||||
- return ret; |
||||
+ return 0; |
||||
} |
||||
|
||||
int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len, int maxlen) |
||||
diff -up openssl-1.0.1e/ssl/t1_lib.c.srtp-leak openssl-1.0.1e/ssl/t1_lib.c |
||||
--- openssl-1.0.1e/ssl/t1_lib.c.srtp-leak 2014-10-15 13:19:59.955202293 +0200 |
||||
+++ openssl-1.0.1e/ssl/t1_lib.c 2014-10-15 13:23:34.254040182 +0200 |
||||
@@ -696,7 +696,7 @@ unsigned char *ssl_add_clienthello_tlsex |
||||
#endif |
||||
|
||||
#ifndef OPENSSL_NO_SRTP |
||||
- if(SSL_get_srtp_profiles(s)) |
||||
+ if(SSL_IS_DTLS(s) && SSL_get_srtp_profiles(s)) |
||||
{ |
||||
int el; |
||||
|
||||
@@ -829,7 +829,7 @@ unsigned char *ssl_add_serverhello_tlsex |
||||
#endif |
||||
|
||||
#ifndef OPENSSL_NO_SRTP |
||||
- if(s->srtp_profile) |
||||
+ if(SSL_IS_DTLS(s) && s->srtp_profile) |
||||
{ |
||||
int el; |
||||
|
||||
@@ -1377,7 +1377,8 @@ int ssl_parse_clienthello_tlsext(SSL *s, |
||||
|
||||
/* session ticket processed earlier */ |
||||
#ifndef OPENSSL_NO_SRTP |
||||
- else if (type == TLSEXT_TYPE_use_srtp) |
||||
+ else if (SSL_IS_DTLS(s) && SSL_get_srtp_profiles(s) |
||||
+ && type == TLSEXT_TYPE_use_srtp) |
||||
{ |
||||
if(ssl_parse_clienthello_use_srtp_ext(s, data, size, |
||||
al)) |
||||
@@ -1631,7 +1632,7 @@ int ssl_parse_serverhello_tlsext(SSL *s, |
||||
} |
||||
#endif |
||||
#ifndef OPENSSL_NO_SRTP |
||||
- else if (type == TLSEXT_TYPE_use_srtp) |
||||
+ else if (SSL_IS_DTLS(s) && type == TLSEXT_TYPE_use_srtp) |
||||
{ |
||||
if(ssl_parse_serverhello_use_srtp_ext(s, data, size, |
||||
al)) |
@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
|
||||
diff -up openssl-1.0.1e/ssl/t1_lib.c.ticket-leak openssl-1.0.1e/ssl/t1_lib.c |
||||
--- openssl-1.0.1e/ssl/t1_lib.c.ticket-leak 2014-10-15 13:19:26.825454374 +0200 |
||||
+++ openssl-1.0.1e/ssl/t1_lib.c 2014-10-15 13:19:59.955202293 +0200 |
||||
@@ -2280,7 +2280,10 @@ static int tls_decrypt_ticket(SSL *s, co |
||||
HMAC_Final(&hctx, tick_hmac, NULL); |
||||
HMAC_CTX_cleanup(&hctx); |
||||
if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen)) |
||||
+ { |
||||
+ EVP_CIPHER_CTX_cleanup(&ctx); |
||||
return 2; |
||||
+ } |
||||
/* Attempt to decrypt session data */ |
||||
/* Move p after IV to start of encrypted ticket, update length */ |
||||
p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx); |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
diff -up openssl-1.0.1e/ssl/d1_pkt.c.dtls1-reads openssl-1.0.1e/ssl/d1_pkt.c |
||||
--- openssl-1.0.1e/ssl/d1_pkt.c.dtls1-reads 2015-01-12 17:31:41.647213706 +0100 |
||||
+++ openssl-1.0.1e/ssl/d1_pkt.c 2015-01-12 17:38:21.708261411 +0100 |
||||
@@ -641,8 +641,6 @@ again: |
||||
/* now s->packet_length == DTLS1_RT_HEADER_LENGTH */ |
||||
i=rr->length; |
||||
n=ssl3_read_n(s,i,i,1); |
||||
- if (n <= 0) return(n); /* error or non-blocking io */ |
||||
- |
||||
/* this packet contained a partial record, dump it */ |
||||
if ( n != i) |
||||
{ |
||||
@@ -677,7 +675,8 @@ again: |
||||
* would be dropped unnecessarily. |
||||
*/ |
||||
if (!(s->d1->listen && rr->type == SSL3_RT_HANDSHAKE && |
||||
- *p == SSL3_MT_CLIENT_HELLO) && |
||||
+ s->packet_length > DTLS1_RT_HEADER_LENGTH && |
||||
+ s->packet[DTLS1_RT_HEADER_LENGTH] == SSL3_MT_CLIENT_HELLO) && |
||||
!dtls1_record_replay_check(s, bitmap)) |
||||
{ |
||||
rr->length = 0; |
||||
diff -up openssl-1.0.1e/ssl/s3_pkt.c.dtls1-reads openssl-1.0.1e/ssl/s3_pkt.c |
||||
--- openssl-1.0.1e/ssl/s3_pkt.c.dtls1-reads 2015-01-12 17:31:41.680214453 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_pkt.c 2015-01-12 17:38:06.721922482 +0100 |
||||
@@ -182,6 +182,8 @@ int ssl3_read_n(SSL *s, int n, int max, |
||||
* at once (as long as it fits into the buffer). */ |
||||
if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER) |
||||
{ |
||||
+ if (left == 0 && extend) |
||||
+ return 0; |
||||
if (left > 0 && n > left) |
||||
n = left; |
||||
} |
@ -0,0 +1,51 @@
@@ -0,0 +1,51 @@
|
||||
diff -up openssl-1.0.1e/ssl/s3_clnt.c.ecdh-downgrade openssl-1.0.1e/ssl/s3_clnt.c |
||||
--- openssl-1.0.1e/ssl/s3_clnt.c.ecdh-downgrade 2015-01-12 16:37:49.978126895 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_clnt.c 2015-01-12 17:02:01.740959687 +0100 |
||||
@@ -1287,6 +1287,8 @@ int ssl3_get_key_exchange(SSL *s) |
||||
int encoded_pt_len = 0; |
||||
#endif |
||||
|
||||
+ EVP_MD_CTX_init(&md_ctx); |
||||
+ |
||||
/* use same message size as in ssl3_get_certificate_request() |
||||
* as ServerKeyExchange message may be skipped */ |
||||
n=s->method->ssl_get_message(s, |
||||
@@ -1297,14 +1299,26 @@ int ssl3_get_key_exchange(SSL *s) |
||||
&ok); |
||||
if (!ok) return((int)n); |
||||
|
||||
+ alg_k=s->s3->tmp.new_cipher->algorithm_mkey; |
||||
+ |
||||
if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) |
||||
{ |
||||
+ /* |
||||
+ * Can't skip server key exchange if this is an ephemeral |
||||
+ * ciphersuite. |
||||
+ */ |
||||
+ if (alg_k & (SSL_kEDH|SSL_kEECDH)) |
||||
+ { |
||||
+ SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_UNEXPECTED_MESSAGE); |
||||
+ al = SSL_AD_UNEXPECTED_MESSAGE; |
||||
+ goto f_err; |
||||
+ } |
||||
#ifndef OPENSSL_NO_PSK |
||||
/* In plain PSK ciphersuite, ServerKeyExchange can be |
||||
omitted if no identity hint is sent. Set |
||||
session->sess_cert anyway to avoid problems |
||||
later.*/ |
||||
- if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK) |
||||
+ if (alg_k & SSL_kPSK) |
||||
{ |
||||
s->session->sess_cert=ssl_sess_cert_new(); |
||||
if (s->ctx->psk_identity_hint) |
||||
@@ -1347,9 +1361,8 @@ int ssl3_get_key_exchange(SSL *s) |
||||
} |
||||
|
||||
param_len=0; |
||||
- alg_k=s->s3->tmp.new_cipher->algorithm_mkey; |
||||
+ |
||||
alg_a=s->s3->tmp.new_cipher->algorithm_auth; |
||||
- EVP_MD_CTX_init(&md_ctx); |
||||
|
||||
#ifndef OPENSSL_NO_PSK |
||||
if (alg_k & SSL_kPSK) |
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
From bcc311668ede6ffdcd6dc5a65454a548b5404fcc Mon Sep 17 00:00:00 2001 |
||||
From: zhu qun-ying <qunying@yahoo.com> |
||||
Date: Mon, 2 Jun 2014 14:38:52 +0100 |
||||
Subject: [PATCH] Free up s->d1->buffered_app_data.q properly. |
||||
|
||||
PR#3286 |
||||
(cherry picked from commit 71e95000afb2227fe5cac1c79ae884338bcd8d0b) |
||||
--- |
||||
ssl/d1_lib.c | 9 ++++++--- |
||||
1 file changed, 6 insertions(+), 3 deletions(-) |
||||
|
||||
diff --git a/ssl/d1_lib.c b/ssl/d1_lib.c |
||||
index 106939f..6bde16f 100644 |
||||
--- a/ssl/d1_lib.c |
||||
+++ b/ssl/d1_lib.c |
||||
@@ -176,9 +176,12 @@ static void dtls1_clear_queues(SSL *s) |
||||
|
||||
while ( (item = pqueue_pop(s->d1->buffered_app_data.q)) != NULL) |
||||
{ |
||||
- frag = (hm_fragment *)item->data; |
||||
- OPENSSL_free(frag->fragment); |
||||
- OPENSSL_free(frag); |
||||
+ rdata = (DTLS1_RECORD_DATA *) item->data; |
||||
+ if (rdata->rbuf.buf) |
||||
+ { |
||||
+ OPENSSL_free(rdata->rbuf.buf); |
||||
+ } |
||||
+ OPENSSL_free(item->data); |
||||
pitem_free(item); |
||||
} |
||||
} |
||||
-- |
||||
2.1.0 |
||||
|
@ -0,0 +1,202 @@
@@ -0,0 +1,202 @@
|
||||
diff -up openssl-1.0.1e/crypto/asn1/a_bitstr.c.cert-fingerprint openssl-1.0.1e/crypto/asn1/a_bitstr.c |
||||
--- openssl-1.0.1e/crypto/asn1/a_bitstr.c.cert-fingerprint 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/a_bitstr.c 2015-01-13 12:23:36.090478923 +0100 |
||||
@@ -136,11 +136,16 @@ ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN |
||||
|
||||
p= *pp; |
||||
i= *(p++); |
||||
+ if (i > 7) |
||||
+ { |
||||
+ i=ASN1_R_INVALID_BIT_STRING_BITS_LEFT; |
||||
+ goto err; |
||||
+ } |
||||
/* We do this to preserve the settings. If we modify |
||||
* the settings, via the _set_bit function, we will recalculate |
||||
* on output */ |
||||
ret->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); /* clear */ |
||||
- ret->flags|=(ASN1_STRING_FLAG_BITS_LEFT|(i&0x07)); /* set */ |
||||
+ ret->flags|=(ASN1_STRING_FLAG_BITS_LEFT|i); /* set */ |
||||
|
||||
if (len-- > 1) /* using one because of the bits left byte */ |
||||
{ |
||||
diff -up openssl-1.0.1e/crypto/asn1/asn1_err.c.cert-fingerprint openssl-1.0.1e/crypto/asn1/asn1_err.c |
||||
--- openssl-1.0.1e/crypto/asn1/asn1_err.c.cert-fingerprint 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/asn1_err.c 2015-01-13 12:23:36.090478923 +0100 |
||||
@@ -246,6 +246,7 @@ static ERR_STRING_DATA ASN1_str_reasons[ |
||||
{ERR_REASON(ASN1_R_ILLEGAL_TIME_VALUE) ,"illegal time value"}, |
||||
{ERR_REASON(ASN1_R_INTEGER_NOT_ASCII_FORMAT),"integer not ascii format"}, |
||||
{ERR_REASON(ASN1_R_INTEGER_TOO_LARGE_FOR_LONG),"integer too large for long"}, |
||||
+{ERR_REASON(ASN1_R_INVALID_BIT_STRING_BITS_LEFT),"invalid bit string bits left"}, |
||||
{ERR_REASON(ASN1_R_INVALID_BMPSTRING_LENGTH),"invalid bmpstring length"}, |
||||
{ERR_REASON(ASN1_R_INVALID_DIGIT) ,"invalid digit"}, |
||||
{ERR_REASON(ASN1_R_INVALID_MIME_TYPE) ,"invalid mime type"}, |
||||
diff -up openssl-1.0.1e/crypto/asn1/asn1.h.cert-fingerprint openssl-1.0.1e/crypto/asn1/asn1.h |
||||
--- openssl-1.0.1e/crypto/asn1/asn1.h.cert-fingerprint 2015-01-13 11:44:11.999013082 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/asn1.h 2015-01-13 12:23:36.090478923 +0100 |
||||
@@ -776,7 +776,7 @@ DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, |
||||
int ASN1_TYPE_get(ASN1_TYPE *a); |
||||
void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value); |
||||
int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value); |
||||
-int ASN1_TYPE_cmp(ASN1_TYPE *a, ASN1_TYPE *b); |
||||
+int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b); |
||||
|
||||
ASN1_OBJECT * ASN1_OBJECT_new(void ); |
||||
void ASN1_OBJECT_free(ASN1_OBJECT *a); |
||||
@@ -1329,6 +1329,7 @@ void ERR_load_ASN1_strings(void); |
||||
#define ASN1_R_ILLEGAL_TIME_VALUE 184 |
||||
#define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 |
||||
#define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 |
||||
+#define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 |
||||
#define ASN1_R_INVALID_BMPSTRING_LENGTH 129 |
||||
#define ASN1_R_INVALID_DIGIT 130 |
||||
#define ASN1_R_INVALID_MIME_TYPE 205 |
||||
diff -up openssl-1.0.1e/crypto/asn1/a_type.c.cert-fingerprint openssl-1.0.1e/crypto/asn1/a_type.c |
||||
--- openssl-1.0.1e/crypto/asn1/a_type.c.cert-fingerprint 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/a_type.c 2015-01-13 12:43:36.779633480 +0100 |
||||
@@ -113,7 +113,7 @@ IMPLEMENT_STACK_OF(ASN1_TYPE) |
||||
IMPLEMENT_ASN1_SET_OF(ASN1_TYPE) |
||||
|
||||
/* Returns 0 if they are equal, != 0 otherwise. */ |
||||
-int ASN1_TYPE_cmp(ASN1_TYPE *a, ASN1_TYPE *b) |
||||
+int ASN1_TYPE_cmp(const ASN1_TYPE *a, const ASN1_TYPE *b) |
||||
{ |
||||
int result = -1; |
||||
|
||||
diff -up openssl-1.0.1e/crypto/asn1/a_verify.c.cert-fingerprint openssl-1.0.1e/crypto/asn1/a_verify.c |
||||
--- openssl-1.0.1e/crypto/asn1/a_verify.c.cert-fingerprint 2015-01-13 11:44:12.308020070 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/a_verify.c 2015-01-13 11:44:12.413022445 +0100 |
||||
@@ -93,6 +93,12 @@ int ASN1_verify(i2d_of_void *i2d, X509_A |
||||
ASN1err(ASN1_F_ASN1_VERIFY,ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM); |
||||
goto err; |
||||
} |
||||
+ |
||||
+ if (signature->type == V_ASN1_BIT_STRING && signature->flags & 0x7) |
||||
+ { |
||||
+ ASN1err(ASN1_F_ASN1_VERIFY, ASN1_R_INVALID_BIT_STRING_BITS_LEFT); |
||||
+ goto err; |
||||
+ } |
||||
|
||||
inl=i2d(data,NULL); |
||||
buf_in=OPENSSL_malloc((unsigned int)inl); |
||||
@@ -149,6 +155,12 @@ int ASN1_item_verify(const ASN1_ITEM *it |
||||
return -1; |
||||
} |
||||
|
||||
+ if (signature->type == V_ASN1_BIT_STRING && signature->flags & 0x7) |
||||
+ { |
||||
+ ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ASN1_R_INVALID_BIT_STRING_BITS_LEFT); |
||||
+ return -1; |
||||
+ } |
||||
+ |
||||
EVP_MD_CTX_init(&ctx); |
||||
|
||||
/* Convert signature OID into digest and public key OIDs */ |
||||
diff -up openssl-1.0.1e/crypto/asn1/x_algor.c.cert-fingerprint openssl-1.0.1e/crypto/asn1/x_algor.c |
||||
--- openssl-1.0.1e/crypto/asn1/x_algor.c.cert-fingerprint 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/x_algor.c 2015-01-13 12:43:36.780633502 +0100 |
||||
@@ -142,3 +142,14 @@ void X509_ALGOR_set_md(X509_ALGOR *alg, |
||||
X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); |
||||
|
||||
} |
||||
+ |
||||
+int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b) |
||||
+ { |
||||
+ int rv; |
||||
+ rv = OBJ_cmp(a->algorithm, b->algorithm); |
||||
+ if (rv) |
||||
+ return rv; |
||||
+ if (!a->parameter && !b->parameter) |
||||
+ return 0; |
||||
+ return ASN1_TYPE_cmp(a->parameter, b->parameter); |
||||
+ } |
||||
diff -up openssl-1.0.1e/crypto/dsa/dsa_asn1.c.cert-fingerprint openssl-1.0.1e/crypto/dsa/dsa_asn1.c |
||||
--- openssl-1.0.1e/crypto/dsa/dsa_asn1.c.cert-fingerprint 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/dsa/dsa_asn1.c 2015-01-13 11:44:12.414022468 +0100 |
||||
@@ -176,13 +176,25 @@ int DSA_verify(int type, const unsigned |
||||
const unsigned char *sigbuf, int siglen, DSA *dsa) |
||||
{ |
||||
DSA_SIG *s; |
||||
+ const unsigned char *p = sigbuf; |
||||
+ unsigned char *der = NULL; |
||||
+ int derlen = -1; |
||||
int ret=-1; |
||||
|
||||
s = DSA_SIG_new(); |
||||
if (s == NULL) return(ret); |
||||
- if (d2i_DSA_SIG(&s,&sigbuf,siglen) == NULL) goto err; |
||||
+ if (d2i_DSA_SIG(&s,&p,siglen) == NULL) goto err; |
||||
+ /* Ensure signature uses DER and doesn't have trailing garbage */ |
||||
+ derlen = i2d_DSA_SIG(s, &der); |
||||
+ if (derlen != siglen || memcmp(sigbuf, der, derlen)) |
||||
+ goto err; |
||||
ret=DSA_do_verify(dgst,dgst_len,s,dsa); |
||||
err: |
||||
+ if (derlen > 0) |
||||
+ { |
||||
+ OPENSSL_cleanse(der, derlen); |
||||
+ OPENSSL_free(der); |
||||
+ } |
||||
DSA_SIG_free(s); |
||||
return(ret); |
||||
} |
||||
diff -up openssl-1.0.1e/crypto/ecdsa/ecs_vrf.c.cert-fingerprint openssl-1.0.1e/crypto/ecdsa/ecs_vrf.c |
||||
--- openssl-1.0.1e/crypto/ecdsa/ecs_vrf.c.cert-fingerprint 2013-02-11 16:02:48.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/ecdsa/ecs_vrf.c 2015-01-13 11:44:12.414022468 +0100 |
||||
@@ -57,6 +57,7 @@ |
||||
*/ |
||||
|
||||
#include "ecs_locl.h" |
||||
+#include "cryptlib.h" |
||||
#ifndef OPENSSL_NO_ENGINE |
||||
#include <openssl/engine.h> |
||||
#endif |
||||
@@ -84,13 +85,25 @@ int ECDSA_verify(int type, const unsigne |
||||
const unsigned char *sigbuf, int sig_len, EC_KEY *eckey) |
||||
{ |
||||
ECDSA_SIG *s; |
||||
+ const unsigned char *p = sigbuf; |
||||
+ unsigned char *der = NULL; |
||||
+ int derlen = -1; |
||||
int ret=-1; |
||||
|
||||
s = ECDSA_SIG_new(); |
||||
if (s == NULL) return(ret); |
||||
- if (d2i_ECDSA_SIG(&s, &sigbuf, sig_len) == NULL) goto err; |
||||
+ if (d2i_ECDSA_SIG(&s, &p, sig_len) == NULL) goto err; |
||||
+ /* Ensure signature uses DER and doesn't have trailing garbage */ |
||||
+ derlen = i2d_ECDSA_SIG(s, &der); |
||||
+ if (derlen != sig_len || memcmp(sigbuf, der, derlen)) |
||||
+ goto err; |
||||
ret=ECDSA_do_verify(dgst, dgst_len, s, eckey); |
||||
err: |
||||
+ if (derlen > 0) |
||||
+ { |
||||
+ OPENSSL_cleanse(der, derlen); |
||||
+ OPENSSL_free(der); |
||||
+ } |
||||
ECDSA_SIG_free(s); |
||||
return(ret); |
||||
} |
||||
diff -up openssl-1.0.1e/crypto/x509/x_all.c.cert-fingerprint openssl-1.0.1e/crypto/x509/x_all.c |
||||
--- openssl-1.0.1e/crypto/x509/x_all.c.cert-fingerprint 2015-01-13 11:44:12.330020568 +0100 |
||||
+++ openssl-1.0.1e/crypto/x509/x_all.c 2015-01-13 11:44:12.414022468 +0100 |
||||
@@ -72,6 +72,8 @@ |
||||
|
||||
int X509_verify(X509 *a, EVP_PKEY *r) |
||||
{ |
||||
+ if (X509_ALGOR_cmp(a->sig_alg, a->cert_info->signature)) |
||||
+ return 0; |
||||
return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF),a->sig_alg, |
||||
a->signature,a->cert_info,r)); |
||||
} |
||||
diff -up openssl-1.0.1e/crypto/x509/x509.h.cert-fingerprint openssl-1.0.1e/crypto/x509/x509.h |
||||
--- openssl-1.0.1e/crypto/x509/x509.h.cert-fingerprint 2015-01-13 11:44:12.126015954 +0100 |
||||
+++ openssl-1.0.1e/crypto/x509/x509.h 2015-01-13 12:43:36.780633502 +0100 |
||||
@@ -768,6 +768,7 @@ int X509_ALGOR_set0(X509_ALGOR *alg, ASN |
||||
void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, |
||||
X509_ALGOR *algor); |
||||
void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); |
||||
+int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); |
||||
|
||||
X509_NAME *X509_NAME_dup(X509_NAME *xn); |
||||
X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); |
@ -0,0 +1,158 @@
@@ -0,0 +1,158 @@
|
||||
diff -up openssl-1.0.1e/doc/ssl/SSL_CTX_set_options.pod.rsa-ephemeral openssl-1.0.1e/doc/ssl/SSL_CTX_set_options.pod |
||||
--- openssl-1.0.1e/doc/ssl/SSL_CTX_set_options.pod.rsa-ephemeral 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/ssl/SSL_CTX_set_options.pod 2015-01-13 11:15:25.096957795 +0100 |
||||
@@ -151,15 +151,7 @@ temporary/ephemeral DH parameters are us |
||||
|
||||
=item SSL_OP_EPHEMERAL_RSA |
||||
|
||||
-Always use ephemeral (temporary) RSA key when doing RSA operations |
||||
-(see L<SSL_CTX_set_tmp_rsa_callback(3)|SSL_CTX_set_tmp_rsa_callback(3)>). |
||||
-According to the specifications this is only done, when a RSA key |
||||
-can only be used for signature operations (namely under export ciphers |
||||
-with restricted RSA keylength). By setting this option, ephemeral |
||||
-RSA keys are always used. This option breaks compatibility with the |
||||
-SSL/TLS specifications and may lead to interoperability problems with |
||||
-clients and should therefore never be used. Ciphers with EDH (ephemeral |
||||
-Diffie-Hellman) key exchange should be used instead. |
||||
+This option is no longer implemented and is treated as no op. |
||||
|
||||
=item SSL_OP_CIPHER_SERVER_PREFERENCE |
||||
|
||||
diff -up openssl-1.0.1e/doc/ssl/SSL_CTX_set_tmp_rsa_callback.pod.rsa-ephemeral openssl-1.0.1e/doc/ssl/SSL_CTX_set_tmp_rsa_callback.pod |
||||
--- openssl-1.0.1e/doc/ssl/SSL_CTX_set_tmp_rsa_callback.pod.rsa-ephemeral 2013-02-11 16:02:48.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/ssl/SSL_CTX_set_tmp_rsa_callback.pod 2015-01-13 11:15:25.096957795 +0100 |
||||
@@ -74,21 +74,14 @@ exchange and use EDH (Ephemeral Diffie-H |
||||
in order to achieve forward secrecy (see |
||||
L<SSL_CTX_set_tmp_dh_callback(3)|SSL_CTX_set_tmp_dh_callback(3)>). |
||||
|
||||
-On OpenSSL servers ephemeral RSA key exchange is therefore disabled by default |
||||
-and must be explicitly enabled using the SSL_OP_EPHEMERAL_RSA option of |
||||
-L<SSL_CTX_set_options(3)|SSL_CTX_set_options(3)>, violating the TLS/SSL |
||||
-standard. When ephemeral RSA key exchange is required for export ciphers, |
||||
-it will automatically be used without this option! |
||||
- |
||||
-An application may either directly specify the key or can supply the key via |
||||
-a callback function. The callback approach has the advantage, that the |
||||
-callback may generate the key only in case it is actually needed. As the |
||||
-generation of a RSA key is however costly, it will lead to a significant |
||||
-delay in the handshake procedure. Another advantage of the callback function |
||||
-is that it can supply keys of different size (e.g. for SSL_OP_EPHEMERAL_RSA |
||||
-usage) while the explicit setting of the key is only useful for key size of |
||||
-512 bits to satisfy the export restricted ciphers and does give away key length |
||||
-if a longer key would be allowed. |
||||
+An application may either directly specify the key or can supply the key via a |
||||
+callback function. The callback approach has the advantage, that the callback |
||||
+may generate the key only in case it is actually needed. As the generation of a |
||||
+RSA key is however costly, it will lead to a significant delay in the handshake |
||||
+procedure. Another advantage of the callback function is that it can supply |
||||
+keys of different size while the explicit setting of the key is only useful for |
||||
+key size of 512 bits to satisfy the export restricted ciphers and does give |
||||
+away key length if a longer key would be allowed. |
||||
|
||||
The B<tmp_rsa_callback> is called with the B<keylength> needed and |
||||
the B<is_export> information. The B<is_export> flag is set, when the |
||||
diff -up openssl-1.0.1e/CHANGES.rsa-ephemeral openssl-1.0.1e/CHANGES |
||||
diff -up openssl-1.0.1e/ssl/d1_srvr.c.rsa-ephemeral openssl-1.0.1e/ssl/d1_srvr.c |
||||
--- openssl-1.0.1e/ssl/d1_srvr.c.rsa-ephemeral 2015-01-12 17:49:04.912808002 +0100 |
||||
+++ openssl-1.0.1e/ssl/d1_srvr.c 2015-01-13 11:15:25.096957795 +0100 |
||||
@@ -450,24 +450,15 @@ int dtls1_accept(SSL *s) |
||||
case SSL3_ST_SW_KEY_EXCH_B: |
||||
alg_k = s->s3->tmp.new_cipher->algorithm_mkey; |
||||
|
||||
- /* clear this, it may get reset by |
||||
- * send_server_key_exchange */ |
||||
- if ((s->options & SSL_OP_EPHEMERAL_RSA) |
||||
-#ifndef OPENSSL_NO_KRB5 |
||||
- && !(alg_k & SSL_kKRB5) |
||||
-#endif /* OPENSSL_NO_KRB5 */ |
||||
- ) |
||||
- /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key |
||||
- * even when forbidden by protocol specs |
||||
- * (handshake may fail as clients are not required to |
||||
- * be able to handle this) */ |
||||
- s->s3->tmp.use_rsa_tmp=1; |
||||
- else |
||||
- s->s3->tmp.use_rsa_tmp=0; |
||||
+ /* |
||||
+ * clear this, it may get reset by |
||||
+ * send_server_key_exchange |
||||
+ */ |
||||
+ s->s3->tmp.use_rsa_tmp=0; |
||||
|
||||
/* only send if a DH key exchange or |
||||
* RSA but we have a sign only certificate */ |
||||
- if (s->s3->tmp.use_rsa_tmp |
||||
+ if (0 |
||||
/* PSK: send ServerKeyExchange if PSK identity |
||||
* hint if provided */ |
||||
#ifndef OPENSSL_NO_PSK |
||||
diff -up openssl-1.0.1e/ssl/ssl.h.rsa-ephemeral openssl-1.0.1e/ssl/ssl.h |
||||
--- openssl-1.0.1e/ssl/ssl.h.rsa-ephemeral 2015-01-12 17:49:04.936808545 +0100 |
||||
+++ openssl-1.0.1e/ssl/ssl.h 2015-01-13 11:15:25.098957840 +0100 |
||||
@@ -587,9 +587,8 @@ struct ssl_session_st |
||||
#define SSL_OP_SINGLE_ECDH_USE 0x00080000L |
||||
/* If set, always create a new key when using tmp_dh parameters */ |
||||
#define SSL_OP_SINGLE_DH_USE 0x00100000L |
||||
-/* Set to always use the tmp_rsa key when doing RSA operations, |
||||
- * even when this violates protocol specs */ |
||||
-#define SSL_OP_EPHEMERAL_RSA 0x00200000L |
||||
+/* Does nothing: retained for compatibiity */ |
||||
+#define SSL_OP_EPHEMERAL_RSA 0x0 |
||||
/* Set on servers to choose the cipher according to the server's |
||||
* preferences */ |
||||
#define SSL_OP_CIPHER_SERVER_PREFERENCE 0x00400000L |
||||
diff -up openssl-1.0.1e/ssl/s3_clnt.c.rsa-ephemeral openssl-1.0.1e/ssl/s3_clnt.c |
||||
--- openssl-1.0.1e/ssl/s3_clnt.c.rsa-ephemeral 2015-01-12 17:49:04.946808771 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_clnt.c 2015-01-13 11:15:25.097957817 +0100 |
||||
@@ -1492,6 +1492,13 @@ int ssl3_get_key_exchange(SSL *s) |
||||
#ifndef OPENSSL_NO_RSA |
||||
if (alg_k & SSL_kRSA) |
||||
{ |
||||
+ /* Temporary RSA keys only allowed in export ciphersuites */ |
||||
+ if (!SSL_C_IS_EXPORT(s->s3->tmp.new_cipher)) |
||||
+ { |
||||
+ al=SSL_AD_UNEXPECTED_MESSAGE; |
||||
+ SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE); |
||||
+ goto f_err; |
||||
+ } |
||||
if ((rsa=RSA_new()) == NULL) |
||||
{ |
||||
SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE); |
||||
diff -up openssl-1.0.1e/ssl/s3_srvr.c.rsa-ephemeral openssl-1.0.1e/ssl/s3_srvr.c |
||||
--- openssl-1.0.1e/ssl/s3_srvr.c.rsa-ephemeral 2015-01-12 17:51:32.044135496 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_srvr.c 2015-01-13 11:15:25.098957840 +0100 |
||||
@@ -441,20 +441,11 @@ int ssl3_accept(SSL *s) |
||||
case SSL3_ST_SW_KEY_EXCH_B: |
||||
alg_k = s->s3->tmp.new_cipher->algorithm_mkey; |
||||
|
||||
- /* clear this, it may get reset by |
||||
- * send_server_key_exchange */ |
||||
- if ((s->options & SSL_OP_EPHEMERAL_RSA) |
||||
-#ifndef OPENSSL_NO_KRB5 |
||||
- && !(alg_k & SSL_kKRB5) |
||||
-#endif /* OPENSSL_NO_KRB5 */ |
||||
- ) |
||||
- /* option SSL_OP_EPHEMERAL_RSA sends temporary RSA key |
||||
- * even when forbidden by protocol specs |
||||
- * (handshake may fail as clients are not required to |
||||
- * be able to handle this) */ |
||||
- s->s3->tmp.use_rsa_tmp=1; |
||||
- else |
||||
- s->s3->tmp.use_rsa_tmp=0; |
||||
+ /* |
||||
+ * clear this, it may get reset by |
||||
+ * send_server_key_exchange |
||||
+ */ |
||||
+ s->s3->tmp.use_rsa_tmp=0; |
||||
|
||||
|
||||
/* only send if a DH key exchange, fortezza or |
||||
@@ -468,7 +459,7 @@ int ssl3_accept(SSL *s) |
||||
* server certificate contains the server's |
||||
* public key for key exchange. |
||||
*/ |
||||
- if (s->s3->tmp.use_rsa_tmp |
||||
+ if (0 |
||||
/* PSK: send ServerKeyExchange if PSK identity |
||||
* hint if provided */ |
||||
#ifndef OPENSSL_NO_PSK |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
diff -up openssl-1.0.1e/ssl/s3_srvr.c.dh-unauthenticated openssl-1.0.1e/ssl/s3_srvr.c |
||||
--- openssl-1.0.1e/ssl/s3_srvr.c.dh-unauthenticated 2015-01-12 17:49:04.930808409 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_srvr.c 2015-01-13 11:15:25.098957840 +0100 |
||||
@@ -2951,7 +2951,7 @@ int ssl3_get_cert_verify(SSL *s) |
||||
if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_VERIFY) |
||||
{ |
||||
s->s3->tmp.reuse_message=1; |
||||
- if ((peer != NULL) && (type & EVP_PKT_SIGN)) |
||||
+ if (peer != NULL) |
||||
{ |
||||
al=SSL_AD_UNEXPECTED_MESSAGE; |
||||
SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_MISSING_VERIFY_MESSAGE); |
@ -0,0 +1,116 @@
@@ -0,0 +1,116 @@
|
||||
diff -up openssl-1.0.1e/ssl/d1_pkt.c.dtls-recleak openssl-1.0.1e/ssl/d1_pkt.c |
||||
--- openssl-1.0.1e/ssl/d1_pkt.c.dtls-rec-leak 2015-01-13 11:44:12.410022377 +0100 |
||||
+++ openssl-1.0.1e/ssl/d1_pkt.c 2015-01-13 11:50:40.062789458 +0100 |
||||
@@ -212,7 +212,7 @@ dtls1_buffer_record(SSL *s, record_pqueu |
||||
/* Limit the size of the queue to prevent DOS attacks */ |
||||
if (pqueue_size(queue->q) >= 100) |
||||
return 0; |
||||
- |
||||
+ |
||||
rdata = OPENSSL_malloc(sizeof(DTLS1_RECORD_DATA)); |
||||
item = pitem_new(priority, rdata); |
||||
if (rdata == NULL || item == NULL) |
||||
@@ -239,14 +239,6 @@ dtls1_buffer_record(SSL *s, record_pqueu |
||||
} |
||||
#endif |
||||
|
||||
- /* insert should not fail, since duplicates are dropped */ |
||||
- if (pqueue_insert(queue->q, item) == NULL) |
||||
- { |
||||
- OPENSSL_free(rdata); |
||||
- pitem_free(item); |
||||
- return(0); |
||||
- } |
||||
- |
||||
s->packet = NULL; |
||||
s->packet_length = 0; |
||||
memset(&(s->s3->rbuf), 0, sizeof(SSL3_BUFFER)); |
||||
@@ -255,11 +247,24 @@ dtls1_buffer_record(SSL *s, record_pqueu |
||||
if (!ssl3_setup_buffers(s)) |
||||
{ |
||||
SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR); |
||||
+ if (rdata->rbuf.buf != NULL) |
||||
+ OPENSSL_free(rdata->rbuf.buf); |
||||
OPENSSL_free(rdata); |
||||
pitem_free(item); |
||||
- return(0); |
||||
+ return(-1); |
||||
} |
||||
- |
||||
+ |
||||
+ /* insert should not fail, since duplicates are dropped */ |
||||
+ if (pqueue_insert(queue->q, item) == NULL) |
||||
+ { |
||||
+ SSLerr(SSL_F_DTLS1_BUFFER_RECORD, ERR_R_INTERNAL_ERROR); |
||||
+ if (rdata->rbuf.buf != NULL) |
||||
+ OPENSSL_free(rdata->rbuf.buf); |
||||
+ OPENSSL_free(rdata); |
||||
+ pitem_free(item); |
||||
+ return(-1); |
||||
+ } |
||||
+ |
||||
return(1); |
||||
} |
||||
|
||||
@@ -313,8 +318,9 @@ dtls1_process_buffered_records(SSL *s) |
||||
dtls1_get_unprocessed_record(s); |
||||
if ( ! dtls1_process_record(s)) |
||||
return(0); |
||||
- dtls1_buffer_record(s, &(s->d1->processed_rcds), |
||||
- s->s3->rrec.seq_num); |
||||
+ if(dtls1_buffer_record(s, &(s->d1->processed_rcds), |
||||
+ s->s3->rrec.seq_num)<0) |
||||
+ return -1; |
||||
} |
||||
} |
||||
|
||||
@@ -529,7 +535,6 @@ printf("\n"); |
||||
|
||||
/* we have pulled in a full packet so zero things */ |
||||
s->packet_length=0; |
||||
- dtls1_record_bitmap_update(s, &(s->d1->bitmap));/* Mark receipt of record. */ |
||||
return(1); |
||||
|
||||
f_err: |
||||
@@ -562,7 +567,8 @@ int dtls1_get_record(SSL *s) |
||||
|
||||
/* The epoch may have changed. If so, process all the |
||||
* pending records. This is a non-blocking operation. */ |
||||
- dtls1_process_buffered_records(s); |
||||
+ if(dtls1_process_buffered_records(s)<0) |
||||
+ return -1; |
||||
|
||||
/* if we're renegotiating, then there may be buffered records */ |
||||
if (dtls1_get_processed_record(s)) |
||||
@@ -699,7 +705,9 @@ again: |
||||
{ |
||||
if ((SSL_in_init(s) || s->in_handshake) && !s->d1->listen) |
||||
{ |
||||
- dtls1_buffer_record(s, &(s->d1->unprocessed_rcds), rr->seq_num); |
||||
+ if(dtls1_buffer_record(s, &(s->d1->unprocessed_rcds), rr->seq_num)<0) |
||||
+ return -1; |
||||
+ dtls1_record_bitmap_update(s, bitmap);/* Mark receipt of record. */ |
||||
} |
||||
rr->length = 0; |
||||
s->packet_length = 0; |
||||
@@ -712,6 +720,7 @@ again: |
||||
s->packet_length = 0; /* dump this record */ |
||||
goto again; /* get another record */ |
||||
} |
||||
+ dtls1_record_bitmap_update(s, bitmap);/* Mark receipt of record. */ |
||||
|
||||
return(1); |
||||
|
||||
@@ -863,7 +872,11 @@ start: |
||||
* buffer the application data for later processing rather |
||||
* than dropping the connection. |
||||
*/ |
||||
- dtls1_buffer_record(s, &(s->d1->buffered_app_data), rr->seq_num); |
||||
+ if(dtls1_buffer_record(s, &(s->d1->buffered_app_data), rr->seq_num)<0) |
||||
+ { |
||||
+ SSLerr(SSL_F_DTLS1_READ_BYTES, ERR_R_INTERNAL_ERROR); |
||||
+ return -1; |
||||
+ } |
||||
rr->length = 0; |
||||
goto start; |
||||
} |
@ -0,0 +1,82 @@
@@ -0,0 +1,82 @@
|
||||
diff -up openssl-1.0.1e/crypto/asn1/x_x509.c.use-after-free openssl-1.0.1e/crypto/asn1/x_x509.c |
||||
--- openssl-1.0.1e/crypto/asn1/x_x509.c.use-after-free 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/x_x509.c 2015-06-11 11:14:52.581856349 +0200 |
||||
@@ -170,8 +170,14 @@ X509 *d2i_X509_AUX(X509 **a, const unsig |
||||
{ |
||||
const unsigned char *q; |
||||
X509 *ret; |
||||
+ int freeret = 0; |
||||
+ |
||||
/* Save start position */ |
||||
q = *pp; |
||||
+ |
||||
+ if(!a || *a == NULL) { |
||||
+ freeret = 1; |
||||
+ } |
||||
ret = d2i_X509(a, pp, length); |
||||
/* If certificate unreadable then forget it */ |
||||
if(!ret) return NULL; |
||||
@@ -181,7 +187,11 @@ X509 *d2i_X509_AUX(X509 **a, const unsig |
||||
if(!d2i_X509_CERT_AUX(&ret->aux, pp, length)) goto err; |
||||
return ret; |
||||
err: |
||||
- X509_free(ret); |
||||
+ if(freeret) { |
||||
+ X509_free(ret); |
||||
+ if (a) |
||||
+ *a = NULL; |
||||
+ } |
||||
return NULL; |
||||
} |
||||
|
||||
diff -up openssl-1.0.1e/crypto/ec/ec_asn1.c.use-after-free openssl-1.0.1e/crypto/ec/ec_asn1.c |
||||
--- openssl-1.0.1e/crypto/ec/ec_asn1.c.use-after-free 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/ec/ec_asn1.c 2015-06-11 11:14:52.581856349 +0200 |
||||
@@ -1140,8 +1140,6 @@ EC_KEY *d2i_ECPrivateKey(EC_KEY **a, con |
||||
ERR_R_MALLOC_FAILURE); |
||||
goto err; |
||||
} |
||||
- if (a) |
||||
- *a = ret; |
||||
} |
||||
else |
||||
ret = *a; |
||||
@@ -1206,11 +1204,13 @@ EC_KEY *d2i_ECPrivateKey(EC_KEY **a, con |
||||
} |
||||
} |
||||
|
||||
+ if (a) |
||||
+ *a = ret; |
||||
ok = 1; |
||||
err: |
||||
if (!ok) |
||||
{ |
||||
- if (ret) |
||||
+ if (ret && (a == NULL || *a != ret)) |
||||
EC_KEY_free(ret); |
||||
ret = NULL; |
||||
} |
||||
@@ -1358,8 +1358,6 @@ EC_KEY *d2i_ECParameters(EC_KEY **a, con |
||||
ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_MALLOC_FAILURE); |
||||
return NULL; |
||||
} |
||||
- if (a) |
||||
- *a = ret; |
||||
} |
||||
else |
||||
ret = *a; |
||||
@@ -1367,9 +1365,14 @@ EC_KEY *d2i_ECParameters(EC_KEY **a, con |
||||
if (!d2i_ECPKParameters(&ret->group, in, len)) |
||||
{ |
||||
ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_EC_LIB); |
||||
+ if (a == NULL || *a != ret) |
||||
+ EC_KEY_free(ret); |
||||
return NULL; |
||||
} |
||||
|
||||
+ if (a) |
||||
+ *a = ret; |
||||
+ |
||||
return ret; |
||||
} |
||||
|
@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
|
||||
diff -up openssl-1.0.1e/crypto/asn1/a_type.c.bool-cmp openssl-1.0.1e/crypto/asn1/a_type.c |
||||
--- openssl-1.0.1e/crypto/asn1/a_type.c.bool-cmp 2015-03-18 13:02:36.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/a_type.c 2015-03-18 14:38:07.111401390 +0100 |
||||
@@ -124,6 +124,9 @@ int ASN1_TYPE_cmp(const ASN1_TYPE *a, co |
||||
case V_ASN1_OBJECT: |
||||
result = OBJ_cmp(a->value.object, b->value.object); |
||||
break; |
||||
+ case V_ASN1_BOOLEAN: |
||||
+ result = a->value.boolean - b->value.boolean; |
||||
+ break; |
||||
case V_ASN1_NULL: |
||||
result = 0; /* They do not have content. */ |
||||
break; |
@ -0,0 +1,46 @@
@@ -0,0 +1,46 @@
|
||||
diff -up openssl-1.0.1e/crypto/asn1/tasn_dec.c.item-reuse openssl-1.0.1e/crypto/asn1/tasn_dec.c |
||||
--- openssl-1.0.1e/crypto/asn1/tasn_dec.c.item-reuse 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/tasn_dec.c 2015-03-19 15:46:51.097022616 +0100 |
||||
@@ -310,9 +310,19 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, |
||||
case ASN1_ITYPE_CHOICE: |
||||
if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL)) |
||||
goto auxerr; |
||||
- |
||||
- /* Allocate structure */ |
||||
- if (!*pval && !ASN1_item_ex_new(pval, it)) |
||||
+ if (*pval) |
||||
+ { |
||||
+ /* Free up and zero CHOICE value if initialised */ |
||||
+ i = asn1_get_choice_selector(pval, it); |
||||
+ if ((i >= 0) && (i < it->tcount)) |
||||
+ { |
||||
+ tt = it->templates + i; |
||||
+ pchptr = asn1_get_field_ptr(pval, tt); |
||||
+ ASN1_template_free(pchptr, tt); |
||||
+ asn1_set_choice_selector(pval, -1, it); |
||||
+ } |
||||
+ } |
||||
+ else if (!ASN1_item_ex_new(pval, it)) |
||||
{ |
||||
ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, |
||||
ERR_R_NESTED_ASN1_ERROR); |
||||
@@ -407,6 +417,19 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, |
||||
if (asn1_cb && !asn1_cb(ASN1_OP_D2I_PRE, pval, it, NULL)) |
||||
goto auxerr; |
||||
|
||||
+ /* Free up and zero any ADB found */ |
||||
+ for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) |
||||
+ { |
||||
+ if (tt->flags & ASN1_TFLG_ADB_MASK) |
||||
+ { |
||||
+ const ASN1_TEMPLATE *seqtt; |
||||
+ ASN1_VALUE **pseqval; |
||||
+ seqtt = asn1_do_adb(pval, tt, 1); |
||||
+ pseqval = asn1_get_field_ptr(pval, seqtt); |
||||
+ ASN1_template_free(pseqval, seqtt); |
||||
+ } |
||||
+ } |
||||
+ |
||||
/* Get each field entry */ |
||||
for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) |
||||
{ |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
diff -up openssl-1.0.1e/crypto/x509/x509_req.c.req-null-deref openssl-1.0.1e/crypto/x509/x509_req.c |
||||
--- openssl-1.0.1e/crypto/x509/x509_req.c.req-null-deref 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/x509/x509_req.c 2015-03-18 18:34:35.732448017 +0100 |
||||
@@ -92,6 +92,8 @@ X509_REQ *X509_to_X509_REQ(X509 *x, EVP_ |
||||
goto err; |
||||
|
||||
pktmp = X509_get_pubkey(x); |
||||
+ if (pktmp == NULL) |
||||
+ goto err; |
||||
i=X509_REQ_set_pubkey(ret,pktmp); |
||||
EVP_PKEY_free(pktmp); |
||||
if (!i) goto err; |
@ -0,0 +1,184 @@
@@ -0,0 +1,184 @@
|
||||
diff -up openssl-1.0.1e/crypto/pkcs7/pk7_doit.c.pkcs7-null-deref openssl-1.0.1e/crypto/pkcs7/pk7_doit.c |
||||
--- openssl-1.0.1e/crypto/pkcs7/pk7_doit.c.pkcs7-null-deref 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/pkcs7/pk7_doit.c 2015-03-18 18:54:10.064871658 +0100 |
||||
@@ -272,6 +272,27 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio) |
||||
PKCS7_RECIP_INFO *ri=NULL; |
||||
ASN1_OCTET_STRING *os=NULL; |
||||
|
||||
+ if (p7 == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATAINIT, PKCS7_R_INVALID_NULL_POINTER); |
||||
+ return NULL; |
||||
+ } |
||||
+ /* |
||||
+ * The content field in the PKCS7 ContentInfo is optional, but that really |
||||
+ * only applies to inner content (precisely, detached signatures). |
||||
+ * |
||||
+ * When reading content, missing outer content is therefore treated as an |
||||
+ * error. |
||||
+ * |
||||
+ * When creating content, PKCS7_content_new() must be called before |
||||
+ * calling this method, so a NULL p7->d is always an error. |
||||
+ */ |
||||
+ if (p7->d.ptr == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATAINIT, PKCS7_R_NO_CONTENT); |
||||
+ return NULL; |
||||
+ } |
||||
+ |
||||
i=OBJ_obj2nid(p7->type); |
||||
p7->state=PKCS7_S_HEADER; |
||||
|
||||
@@ -433,6 +454,18 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKE |
||||
unsigned char *ek = NULL, *tkey = NULL; |
||||
int eklen = 0, tkeylen = 0; |
||||
|
||||
+ if (p7 == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATADECODE, PKCS7_R_INVALID_NULL_POINTER); |
||||
+ return NULL; |
||||
+ } |
||||
+ |
||||
+ if (p7->d.ptr == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATADECODE, PKCS7_R_NO_CONTENT); |
||||
+ return NULL; |
||||
+ } |
||||
+ |
||||
i=OBJ_obj2nid(p7->type); |
||||
p7->state=PKCS7_S_HEADER; |
||||
|
||||
@@ -440,6 +473,12 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKE |
||||
{ |
||||
case NID_pkcs7_signed: |
||||
data_body=PKCS7_get_octet_string(p7->d.sign->contents); |
||||
+ if (!PKCS7_is_detached(p7) && data_body == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATADECODE, |
||||
+ PKCS7_R_NO_CONTENT); |
||||
+ goto err; |
||||
+ } |
||||
md_sk=p7->d.sign->md_algs; |
||||
break; |
||||
case NID_pkcs7_signedAndEnveloped: |
||||
@@ -747,6 +786,18 @@ int PKCS7_dataFinal(PKCS7 *p7, BIO *bio) |
||||
STACK_OF(PKCS7_SIGNER_INFO) *si_sk=NULL; |
||||
ASN1_OCTET_STRING *os=NULL; |
||||
|
||||
+ if (p7 == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATAFINAL, PKCS7_R_INVALID_NULL_POINTER); |
||||
+ return 0; |
||||
+ } |
||||
+ |
||||
+ if (p7->d.ptr == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATAFINAL, PKCS7_R_NO_CONTENT); |
||||
+ return 0; |
||||
+ } |
||||
+ |
||||
EVP_MD_CTX_init(&ctx_tmp); |
||||
i=OBJ_obj2nid(p7->type); |
||||
p7->state=PKCS7_S_HEADER; |
||||
@@ -791,6 +842,7 @@ int PKCS7_dataFinal(PKCS7 *p7, BIO *bio) |
||||
/* If detached data then the content is excluded */ |
||||
if(PKCS7_type_is_data(p7->d.sign->contents) && p7->detached) { |
||||
M_ASN1_OCTET_STRING_free(os); |
||||
+ os = NULL; |
||||
p7->d.sign->contents->d.data = NULL; |
||||
} |
||||
break; |
||||
@@ -801,6 +853,7 @@ int PKCS7_dataFinal(PKCS7 *p7, BIO *bio) |
||||
if(PKCS7_type_is_data(p7->d.digest->contents) && p7->detached) |
||||
{ |
||||
M_ASN1_OCTET_STRING_free(os); |
||||
+ os = NULL; |
||||
p7->d.digest->contents->d.data = NULL; |
||||
} |
||||
break; |
||||
@@ -873,23 +926,32 @@ int PKCS7_dataFinal(PKCS7 *p7, BIO *bio) |
||||
M_ASN1_OCTET_STRING_set(p7->d.digest->digest, md_data, md_len); |
||||
} |
||||
|
||||
- if (!PKCS7_is_detached(p7) && !(os->flags & ASN1_STRING_FLAG_NDEF)) |
||||
+ if (!PKCS7_is_detached(p7)) |
||||
{ |
||||
- char *cont; |
||||
- long contlen; |
||||
- btmp=BIO_find_type(bio,BIO_TYPE_MEM); |
||||
- if (btmp == NULL) |
||||
- { |
||||
- PKCS7err(PKCS7_F_PKCS7_DATAFINAL,PKCS7_R_UNABLE_TO_FIND_MEM_BIO); |
||||
+ /* |
||||
+ * NOTE(emilia): I think we only reach os == NULL here because detached |
||||
+ * digested data support is broken. |
||||
+ */ |
||||
+ if (os == NULL) |
||||
goto err; |
||||
+ if (!(os->flags & ASN1_STRING_FLAG_NDEF)) |
||||
+ { |
||||
+ char *cont; |
||||
+ long contlen; |
||||
+ btmp=BIO_find_type(bio,BIO_TYPE_MEM); |
||||
+ if (btmp == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATAFINAL,PKCS7_R_UNABLE_TO_FIND_MEM_BIO); |
||||
+ goto err; |
||||
+ } |
||||
+ contlen = BIO_get_mem_data(btmp, &cont); |
||||
+ /* Mark the BIO read only then we can use its copy of the data |
||||
+ * instead of making an extra copy. |
||||
+ */ |
||||
+ BIO_set_flags(btmp, BIO_FLAGS_MEM_RDONLY); |
||||
+ BIO_set_mem_eof_return(btmp, 0); |
||||
+ ASN1_STRING_set0(os, (unsigned char *)cont, contlen); |
||||
} |
||||
- contlen = BIO_get_mem_data(btmp, &cont); |
||||
- /* Mark the BIO read only then we can use its copy of the data |
||||
- * instead of making an extra copy. |
||||
- */ |
||||
- BIO_set_flags(btmp, BIO_FLAGS_MEM_RDONLY); |
||||
- BIO_set_mem_eof_return(btmp, 0); |
||||
- ASN1_STRING_set0(os, (unsigned char *)cont, contlen); |
||||
} |
||||
ret=1; |
||||
err: |
||||
@@ -928,6 +990,7 @@ int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_ |
||||
if (EVP_DigestSignUpdate(&mctx,abuf,alen) <= 0) |
||||
goto err; |
||||
OPENSSL_free(abuf); |
||||
+ abuf = NULL; |
||||
if (EVP_DigestSignFinal(&mctx, NULL, &siglen) <= 0) |
||||
goto err; |
||||
abuf = OPENSSL_malloc(siglen); |
||||
@@ -965,6 +1028,18 @@ int PKCS7_dataVerify(X509_STORE *cert_st |
||||
STACK_OF(X509) *cert; |
||||
X509 *x509; |
||||
|
||||
+ if (p7 == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATAVERIFY, PKCS7_R_INVALID_NULL_POINTER); |
||||
+ return 0; |
||||
+ } |
||||
+ |
||||
+ if (p7->d.ptr == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATAVERIFY, PKCS7_R_NO_CONTENT); |
||||
+ return 0; |
||||
+ } |
||||
+ |
||||
if (PKCS7_type_is_signed(p7)) |
||||
{ |
||||
cert=p7->d.sign->cert; |
||||
diff -up openssl-1.0.1e/crypto/pkcs7/pk7_lib.c.pkcs7-null-deref openssl-1.0.1e/crypto/pkcs7/pk7_lib.c |
||||
--- openssl-1.0.1e/crypto/pkcs7/pk7_lib.c.pkcs7-null-deref 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/pkcs7/pk7_lib.c 2015-03-18 18:05:58.398767116 +0100 |
||||
@@ -459,6 +459,8 @@ int PKCS7_set_digest(PKCS7 *p7, const EV |
||||
|
||||
STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7) |
||||
{ |
||||
+ if (p7 == NULL || p7->d.ptr == NULL) |
||||
+ return NULL; |
||||
if (PKCS7_type_is_signed(p7)) |
||||
{ |
||||
return(p7->d.sign->signer_info); |
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
diff -up openssl-1.0.1e/crypto/evp/encode.c.b64-underflow openssl-1.0.1e/crypto/evp/encode.c |
||||
--- openssl-1.0.1e/crypto/evp/encode.c.b64-underflow 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/evp/encode.c 2015-03-18 18:16:26.452331934 +0100 |
||||
@@ -324,6 +324,7 @@ int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx |
||||
v=EVP_DecodeBlock(out,d,n); |
||||
n=0; |
||||
if (v < 0) { rv=0; goto end; } |
||||
+ if (eof > v) { rv=-1; goto end; } |
||||
ret+=(v-eof); |
||||
} |
||||
else |
@ -0,0 +1,102 @@
@@ -0,0 +1,102 @@
|
||||
diff -up openssl-1.0.1e/ssl/s2_lib.c.ssl2-assert openssl-1.0.1e/ssl/s2_lib.c |
||||
--- openssl-1.0.1e/ssl/s2_lib.c.ssl2-assert 2015-03-18 13:02:36.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/s2_lib.c 2015-03-18 18:22:20.195322489 +0100 |
||||
@@ -488,7 +488,7 @@ int ssl2_generate_key_material(SSL *s) |
||||
|
||||
OPENSSL_assert(s->session->master_key_length >= 0 |
||||
&& s->session->master_key_length |
||||
- < (int)sizeof(s->session->master_key)); |
||||
+ <= (int)sizeof(s->session->master_key)); |
||||
EVP_DigestUpdate(&ctx,s->session->master_key,s->session->master_key_length); |
||||
EVP_DigestUpdate(&ctx,&c,1); |
||||
c++; |
||||
diff -up openssl-1.0.1e/ssl/s2_srvr.c.ssl2-assert openssl-1.0.1e/ssl/s2_srvr.c |
||||
--- openssl-1.0.1e/ssl/s2_srvr.c.ssl2-assert 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/s2_srvr.c 2015-03-18 18:30:11.403974038 +0100 |
||||
@@ -446,9 +446,6 @@ static int get_client_master_key(SSL *s) |
||||
SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_NO_PRIVATEKEY); |
||||
return(-1); |
||||
} |
||||
- i=ssl_rsa_private_decrypt(s->cert,s->s2->tmp.enc, |
||||
- &(p[s->s2->tmp.clear]),&(p[s->s2->tmp.clear]), |
||||
- (s->s2->ssl2_rollback)?RSA_SSLV23_PADDING:RSA_PKCS1_PADDING); |
||||
|
||||
is_export=SSL_C_IS_EXPORT(s->session->cipher); |
||||
|
||||
@@ -467,21 +464,61 @@ static int get_client_master_key(SSL *s) |
||||
else |
||||
ek=5; |
||||
|
||||
+ /* |
||||
+ * The format of the CLIENT-MASTER-KEY message is |
||||
+ * 1 byte message type |
||||
+ * 3 bytes cipher |
||||
+ * 2-byte clear key length (stored in s->s2->tmp.clear) |
||||
+ * 2-byte encrypted key length (stored in s->s2->tmp.enc) |
||||
+ * 2-byte key args length (IV etc) |
||||
+ * clear key |
||||
+ * encrypted key |
||||
+ * key args |
||||
+ * |
||||
+ * If the cipher is an export cipher, then the encrypted key bytes |
||||
+ * are a fixed portion of the total key (5 or 8 bytes). The size of |
||||
+ * this portion is in |ek|. If the cipher is not an export cipher, |
||||
+ * then the entire key material is encrypted (i.e., clear key length |
||||
+ * must be zero). |
||||
+ */ |
||||
+ if ((!is_export && s->s2->tmp.clear != 0) || |
||||
+ (is_export && s->s2->tmp.clear + ek != EVP_CIPHER_key_length(c))) |
||||
+ { |
||||
+ ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR); |
||||
+ SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_BAD_LENGTH); |
||||
+ return -1; |
||||
+ } |
||||
+ /* |
||||
+ * The encrypted blob must decrypt to the encrypted portion of the key. |
||||
+ * Decryption can't be expanding, so if we don't have enough encrypted |
||||
+ * bytes to fit the key in the buffer, stop now. |
||||
+ */ |
||||
+ if ((is_export && s->s2->tmp.enc < ek) || |
||||
+ (!is_export && s->s2->tmp.enc < EVP_CIPHER_key_length(c))) |
||||
+ { |
||||
+ ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); |
||||
+ SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_LENGTH_TOO_SHORT); |
||||
+ return -1; |
||||
+ } |
||||
+ |
||||
+ i = ssl_rsa_private_decrypt(s->cert, s->s2->tmp.enc, |
||||
+ &(p[s->s2->tmp.clear]), |
||||
+ &(p[s->s2->tmp.clear]), |
||||
+ (s->s2->ssl2_rollback) ? RSA_SSLV23_PADDING : RSA_PKCS1_PADDING); |
||||
+ |
||||
/* bad decrypt */ |
||||
#if 1 |
||||
/* If a bad decrypt, continue with protocol but with a |
||||
* random master secret (Bleichenbacher attack) */ |
||||
- if ((i < 0) || |
||||
- ((!is_export && (i != EVP_CIPHER_key_length(c))) |
||||
- || (is_export && ((i != ek) || (s->s2->tmp.clear+(unsigned int)i != |
||||
- (unsigned int)EVP_CIPHER_key_length(c)))))) |
||||
+ if ((i < 0) || ((!is_export && i != EVP_CIPHER_key_length(c)) |
||||
+ || (is_export && i != ek))) |
||||
{ |
||||
ERR_clear_error(); |
||||
if (is_export) |
||||
i=ek; |
||||
else |
||||
i=EVP_CIPHER_key_length(c); |
||||
- if (RAND_pseudo_bytes(p,i) <= 0) |
||||
+ if (RAND_pseudo_bytes(&p[s->s2->tmp.clear],i) <= 0) |
||||
return 0; |
||||
} |
||||
#else |
||||
@@ -505,7 +542,8 @@ static int get_client_master_key(SSL *s) |
||||
} |
||||
#endif |
||||
|
||||
- if (is_export) i+=s->s2->tmp.clear; |
||||
+ if (is_export) |
||||
+ i = EVP_CIPHER_key_length(c); |
||||
|
||||
if (i > SSL_MAX_MASTER_KEY_LENGTH) |
||||
{ |
@ -0,0 +1,103 @@
@@ -0,0 +1,103 @@
|
||||
diff -up openssl-1.0.1e/crypto/x509/x509_vfy.c.oob-read openssl-1.0.1e/crypto/x509/x509_vfy.c |
||||
--- openssl-1.0.1e/crypto/x509/x509_vfy.c.oob-read 2015-05-25 12:03:41.000000000 +0200 |
||||
+++ openssl-1.0.1e/crypto/x509/x509_vfy.c 2015-06-09 15:01:51.688640453 +0200 |
||||
@@ -1702,49 +1702,92 @@ int X509_cmp_time(const ASN1_TIME *ctm, |
||||
ASN1_TIME atm; |
||||
long offset; |
||||
char buff1[24],buff2[24],*p; |
||||
- int i,j; |
||||
+ int i, j, remaining; |
||||
|
||||
p=buff1; |
||||
- i=ctm->length; |
||||
+ remaining=ctm->length; |
||||
str=(char *)ctm->data; |
||||
+ /* |
||||
+ * Note that the following (historical) code allows much more slack in the |
||||
+ * time format than RFC5280. In RFC5280, the representation is fixed: |
||||
+ * UTCTime: YYMMDDHHMMSSZ |
||||
+ * GeneralizedTime: YYYYMMDDHHMMSSZ |
||||
+ */ |
||||
if (ctm->type == V_ASN1_UTCTIME) |
||||
{ |
||||
- if ((i < 11) || (i > 17)) return 0; |
||||
+ /* YYMMDDHHMM[SS]Z or YYMMDDHHMM[SS](+-)hhmm */ |
||||
+ int min_length = sizeof("YYMMDDHHMMZ") - 1; |
||||
+ int max_length = sizeof("YYMMDDHHMMSS+hhmm") - 1; |
||||
+ if (remaining < min_length || remaining > max_length) |
||||
+ return 0; |
||||
memcpy(p,str,10); |
||||
p+=10; |
||||
str+=10; |
||||
+ remaining -= 10; |
||||
} |
||||
else |
||||
{ |
||||
- if (i < 13) return 0; |
||||
+ /* YYYYMMDDHHMM[SS[.fff]]Z or YYYYMMDDHHMM[SS[.f[f[f]]]](+-)hhmm */ |
||||
+ int min_length = sizeof("YYYYMMDDHHMMZ") - 1; |
||||
+ int max_length = sizeof("YYYYMMDDHHMMSS.fff+hhmm") - 1; |
||||
+ if (remaining < min_length || remaining > max_length) |
||||
+ return 0; |
||||
memcpy(p,str,12); |
||||
p+=12; |
||||
str+=12; |
||||
+ remaining -= 12; |
||||
} |
||||
|
||||
if ((*str == 'Z') || (*str == '-') || (*str == '+')) |
||||
{ *(p++)='0'; *(p++)='0'; } |
||||
else |
||||
{ |
||||
+ /* SS (seconds) */ |
||||
+ if (remaining < 2) |
||||
+ return 0; |
||||
*(p++)= *(str++); |
||||
*(p++)= *(str++); |
||||
- /* Skip any fractional seconds... */ |
||||
- if (*str == '.') |
||||
+ remaining -= 2; |
||||
+ /* |
||||
+ * Skip any (up to three) fractional seconds... |
||||
+ * TODO(emilia): in RFC5280, fractional seconds are forbidden. |
||||
+ * Can we just kill them altogether? |
||||
+ */ |
||||
+ if (remaining && *str == '.') |
||||
{ |
||||
str++; |
||||
- while ((*str >= '0') && (*str <= '9')) str++; |
||||
+ remaining--; |
||||
+ for (i = 0; i < 3 && remaining; i++, str++, remaining--) |
||||
+ { |
||||
+ if (*str < '0' || *str > '9') |
||||
+ break; |
||||
+ } |
||||
} |
||||
|
||||
} |
||||
*(p++)='Z'; |
||||
*(p++)='\0'; |
||||
|
||||
+ /* We now need either a terminating 'Z' or an offset. */ |
||||
+ if (!remaining) |
||||
+ return 0; |
||||
if (*str == 'Z') |
||||
+ { |
||||
+ if (remaining != 1) |
||||
+ return 0; |
||||
offset=0; |
||||
+ } |
||||
else |
||||
{ |
||||
+ /* (+-)HHMM */ |
||||
if ((*str != '+') && (*str != '-')) |
||||
return 0; |
||||
+ /* Historical behaviour: the (+-)hhmm offset is forbidden in RFC5280. */ |
||||
+ if (remaining != 5) |
||||
+ return 0; |
||||
+ if (str[1] < '0' || str[1] > '9' || str[2] < '0' || str[2] > '9' || |
||||
+ str[3] < '0' || str[3] > '9' || str[4] < '0' || str[4] > '9') |
||||
+ return 0; |
||||
offset=((str[1]-'0')*10+(str[2]-'0'))*60; |
||||
offset+=(str[3]-'0')*10+(str[4]-'0'); |
||||
if (*str == '-') |
@ -0,0 +1,55 @@
@@ -0,0 +1,55 @@
|
||||
diff -up openssl-1.0.1e/crypto/pkcs7/pk7_doit.c.missing-content openssl-1.0.1e/crypto/pkcs7/pk7_doit.c |
||||
--- openssl-1.0.1e/crypto/pkcs7/pk7_doit.c.missing-content 2015-05-25 12:03:41.000000000 +0200 |
||||
+++ openssl-1.0.1e/crypto/pkcs7/pk7_doit.c 2015-06-09 15:21:21.377951520 +0200 |
||||
@@ -472,6 +472,12 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKE |
||||
switch (i) |
||||
{ |
||||
case NID_pkcs7_signed: |
||||
+ /* |
||||
+ * p7->d.sign->contents is a PKCS7 structure consisting of a contentType |
||||
+ * field and optional content. |
||||
+ * data_body is NULL if that structure has no (=detached) content |
||||
+ * or if the contentType is wrong (i.e., not "data"). |
||||
+ */ |
||||
data_body=PKCS7_get_octet_string(p7->d.sign->contents); |
||||
if (!PKCS7_is_detached(p7) && data_body == NULL) |
||||
{ |
||||
@@ -484,6 +490,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKE |
||||
case NID_pkcs7_signedAndEnveloped: |
||||
rsk=p7->d.signed_and_enveloped->recipientinfo; |
||||
md_sk=p7->d.signed_and_enveloped->md_algs; |
||||
+ /* data_body is NULL if the optional EncryptedContent is missing. */ |
||||
data_body=p7->d.signed_and_enveloped->enc_data->enc_data; |
||||
enc_alg=p7->d.signed_and_enveloped->enc_data->algorithm; |
||||
evp_cipher=EVP_get_cipherbyobj(enc_alg->algorithm); |
||||
@@ -496,6 +503,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKE |
||||
case NID_pkcs7_enveloped: |
||||
rsk=p7->d.enveloped->recipientinfo; |
||||
enc_alg=p7->d.enveloped->enc_data->algorithm; |
||||
+ /* data_body is NULL if the optional EncryptedContent is missing. */ |
||||
data_body=p7->d.enveloped->enc_data->enc_data; |
||||
evp_cipher=EVP_get_cipherbyobj(enc_alg->algorithm); |
||||
if (evp_cipher == NULL) |
||||
@@ -509,6 +517,13 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKE |
||||
goto err; |
||||
} |
||||
|
||||
+ /* Detached content must be supplied via in_bio instead. */ |
||||
+ if (data_body == NULL && in_bio == NULL) |
||||
+ { |
||||
+ PKCS7err(PKCS7_F_PKCS7_DATADECODE, PKCS7_R_NO_CONTENT); |
||||
+ goto err; |
||||
+ } |
||||
+ |
||||
/* We will be checking the signature */ |
||||
if (md_sk != NULL) |
||||
{ |
||||
@@ -665,7 +680,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKE |
||||
} |
||||
|
||||
#if 1 |
||||
- if (PKCS7_is_detached(p7) || (in_bio != NULL)) |
||||
+ if (in_bio != NULL) |
||||
{ |
||||
bio=in_bio; |
||||
} |
@ -0,0 +1,231 @@
@@ -0,0 +1,231 @@
|
||||
diff -up openssl-1.0.1e/ssl/ssl_err.c.ticket-race openssl-1.0.1e/ssl/ssl_err.c |
||||
--- openssl-1.0.1e/ssl/ssl_err.c.ticket-race 2015-06-09 15:40:41.000000000 +0200 |
||||
+++ openssl-1.0.1e/ssl/ssl_err.c 2015-06-09 15:45:06.879198463 +0200 |
||||
@@ -245,6 +245,7 @@ static ERR_STRING_DATA SSL_str_functs[]= |
||||
{ERR_FUNC(SSL_F_SSL_READ), "SSL_read"}, |
||||
{ERR_FUNC(SSL_F_SSL_RSA_PRIVATE_DECRYPT), "SSL_RSA_PRIVATE_DECRYPT"}, |
||||
{ERR_FUNC(SSL_F_SSL_RSA_PUBLIC_ENCRYPT), "SSL_RSA_PUBLIC_ENCRYPT"}, |
||||
+{ERR_FUNC(SSL_F_SSL_SESSION_DUP), "ssl_session_dup"}, |
||||
{ERR_FUNC(SSL_F_SSL_SESSION_NEW), "SSL_SESSION_new"}, |
||||
{ERR_FUNC(SSL_F_SSL_SESSION_PRINT_FP), "SSL_SESSION_print_fp"}, |
||||
{ERR_FUNC(SSL_F_SSL_SESSION_SET1_ID_CONTEXT), "SSL_SESSION_set1_id_context"}, |
||||
diff -up openssl-1.0.1e/ssl/ssl.h.ticket-race openssl-1.0.1e/ssl/ssl.h |
||||
--- openssl-1.0.1e/ssl/ssl.h.ticket-race 2015-06-09 15:40:41.000000000 +0200 |
||||
+++ openssl-1.0.1e/ssl/ssl.h 2015-06-09 15:44:22.696191291 +0200 |
||||
@@ -2176,6 +2176,7 @@ void ERR_load_SSL_strings(void); |
||||
#define SSL_F_SSL_READ 223 |
||||
#define SSL_F_SSL_RSA_PRIVATE_DECRYPT 187 |
||||
#define SSL_F_SSL_RSA_PUBLIC_ENCRYPT 188 |
||||
+#define SSL_F_SSL_SESSION_DUP 348 |
||||
#define SSL_F_SSL_SESSION_NEW 189 |
||||
#define SSL_F_SSL_SESSION_PRINT_FP 190 |
||||
#define SSL_F_SSL_SESSION_SET1_ID_CONTEXT 312 |
||||
diff -up openssl-1.0.1e/ssl/ssl_locl.h.ticket-race openssl-1.0.1e/ssl/ssl_locl.h |
||||
--- openssl-1.0.1e/ssl/ssl_locl.h.ticket-race 2015-06-09 15:40:41.000000000 +0200 |
||||
+++ openssl-1.0.1e/ssl/ssl_locl.h 2015-06-09 16:02:41.105243796 +0200 |
||||
@@ -822,6 +822,7 @@ void ssl_sess_cert_free(SESS_CERT *sc); |
||||
int ssl_set_peer_cert_type(SESS_CERT *c, int type); |
||||
int ssl_get_new_session(SSL *s, int session); |
||||
int ssl_get_prev_session(SSL *s, unsigned char *session,int len, const unsigned char *limit); |
||||
+SSL_SESSION *ssl_session_dup(SSL_SESSION *src, int ticket); |
||||
int ssl_cipher_id_cmp(const SSL_CIPHER *a,const SSL_CIPHER *b); |
||||
DECLARE_OBJ_BSEARCH_GLOBAL_CMP_FN(SSL_CIPHER, SSL_CIPHER, |
||||
ssl_cipher_id); |
||||
diff -up openssl-1.0.1e/ssl/ssl_sess.c.ticket-race openssl-1.0.1e/ssl/ssl_sess.c |
||||
--- openssl-1.0.1e/ssl/ssl_sess.c.ticket-race 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/ssl_sess.c 2015-06-11 13:48:26.724348868 +0200 |
||||
@@ -224,6 +224,146 @@ SSL_SESSION *SSL_SESSION_new(void) |
||||
return(ss); |
||||
} |
||||
|
||||
+/* |
||||
+ * Create a new SSL_SESSION and duplicate the contents of |src| into it. If |
||||
+ * ticket == 0 then no ticket information is duplicated, otherwise it is. |
||||
+ */ |
||||
+SSL_SESSION *ssl_session_dup(SSL_SESSION *src, int ticket) |
||||
+{ |
||||
+ SSL_SESSION *dest; |
||||
+ |
||||
+ dest = OPENSSL_malloc(sizeof(*src)); |
||||
+ if (dest == NULL) |
||||
+ { |
||||
+ goto err; |
||||
+ } |
||||
+ memcpy(dest, src, sizeof(*dest)); |
||||
+ |
||||
+ /* |
||||
+ * Set the various pointers to NULL so that we can call SSL_SESSION_free in |
||||
+ * the case of an error whilst halfway through constructing dest |
||||
+ */ |
||||
+#ifndef OPENSSL_NO_PSK |
||||
+ dest->psk_identity_hint = NULL; |
||||
+ dest->psk_identity = NULL; |
||||
+#endif |
||||
+ dest->ciphers = NULL; |
||||
+#ifndef OPENSSL_NO_TLSEXT |
||||
+ dest->tlsext_hostname = NULL; |
||||
+# ifndef OPENSSL_NO_EC |
||||
+ dest->tlsext_ecpointformatlist = NULL; |
||||
+ dest->tlsext_ellipticcurvelist = NULL; |
||||
+# endif |
||||
+#endif |
||||
+ dest->tlsext_tick = NULL; |
||||
+#ifndef OPENSSL_NO_SRP |
||||
+ dest->srp_username = NULL; |
||||
+#endif |
||||
+ memset(&dest->ex_data, 0, sizeof(dest->ex_data)); |
||||
+ |
||||
+ /* We deliberately don't copy the prev and next pointers */ |
||||
+ dest->prev = NULL; |
||||
+ dest->next = NULL; |
||||
+ |
||||
+ dest->references = 1; |
||||
+ |
||||
+ if (src->sess_cert != NULL) |
||||
+ CRYPTO_add(&src->sess_cert->references, 1, CRYPTO_LOCK_SSL_SESS_CERT); |
||||
+ |
||||
+ if (src->peer != NULL) |
||||
+ CRYPTO_add(&src->peer->references, 1, CRYPTO_LOCK_X509); |
||||
+ |
||||
+#ifndef OPENSSL_NO_PSK |
||||
+ if (src->psk_identity_hint) |
||||
+ { |
||||
+ dest->psk_identity_hint = BUF_strdup(src->psk_identity_hint); |
||||
+ if (dest->psk_identity_hint == NULL) |
||||
+ { |
||||
+ goto err; |
||||
+ } |
||||
+ } |
||||
+ if (src->psk_identity) |
||||
+ { |
||||
+ dest->psk_identity = BUF_strdup(src->psk_identity); |
||||
+ if (dest->psk_identity == NULL) |
||||
+ { |
||||
+ goto err; |
||||
+ } |
||||
+ } |
||||
+#endif |
||||
+ |
||||
+ if(src->ciphers != NULL) |
||||
+ { |
||||
+ dest->ciphers = sk_SSL_CIPHER_dup(src->ciphers); |
||||
+ if (dest->ciphers == NULL) |
||||
+ goto err; |
||||
+ } |
||||
+ |
||||
+ if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, |
||||
+ &dest->ex_data, &src->ex_data)) |
||||
+ { |
||||
+ goto err; |
||||
+ } |
||||
+ |
||||
+#ifndef OPENSSL_NO_TLSEXT |
||||
+ if (src->tlsext_hostname) |
||||
+ { |
||||
+ dest->tlsext_hostname = BUF_strdup(src->tlsext_hostname); |
||||
+ if (dest->tlsext_hostname == NULL) |
||||
+ { |
||||
+ goto err; |
||||
+ } |
||||
+ } |
||||
+# ifndef OPENSSL_NO_EC |
||||
+ if (src->tlsext_ecpointformatlist) |
||||
+ { |
||||
+ dest->tlsext_ecpointformatlist = |
||||
+ BUF_memdup(src->tlsext_ecpointformatlist, |
||||
+ src->tlsext_ecpointformatlist_length); |
||||
+ if (dest->tlsext_ecpointformatlist == NULL) |
||||
+ goto err; |
||||
+ } |
||||
+ if (src->tlsext_ellipticcurvelist) |
||||
+ { |
||||
+ dest->tlsext_ellipticcurvelist = |
||||
+ BUF_memdup(src->tlsext_ellipticcurvelist, |
||||
+ src->tlsext_ellipticcurvelist_length); |
||||
+ if (dest->tlsext_ellipticcurvelist == NULL) |
||||
+ goto err; |
||||
+ } |
||||
+# endif |
||||
+#endif |
||||
+ |
||||
+ if (ticket != 0) |
||||
+ { |
||||
+ dest->tlsext_tick = BUF_memdup(src->tlsext_tick, src->tlsext_ticklen); |
||||
+ if(dest->tlsext_tick == NULL) |
||||
+ goto err; |
||||
+ } |
||||
+ else |
||||
+ { |
||||
+ dest->tlsext_tick_lifetime_hint = 0; |
||||
+ dest->tlsext_ticklen = 0; |
||||
+ } |
||||
+ |
||||
+#ifndef OPENSSL_NO_SRP |
||||
+ if (src->srp_username) |
||||
+ { |
||||
+ dest->srp_username = BUF_strdup(src->srp_username); |
||||
+ if (dest->srp_username == NULL) |
||||
+ { |
||||
+ goto err; |
||||
+ } |
||||
+ } |
||||
+#endif |
||||
+ |
||||
+ return dest; |
||||
+err: |
||||
+ SSLerr(SSL_F_SSL_SESSION_DUP, ERR_R_MALLOC_FAILURE); |
||||
+ SSL_SESSION_free(dest); |
||||
+ return NULL; |
||||
+} |
||||
+ |
||||
const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len) |
||||
{ |
||||
if(len) |
||||
diff -up openssl-1.0.1e/ssl/s3_clnt.c.ticket-race openssl-1.0.1e/ssl/s3_clnt.c |
||||
--- openssl-1.0.1e/ssl/s3_clnt.c.ticket-race 2015-06-09 15:40:41.000000000 +0200 |
||||
+++ openssl-1.0.1e/ssl/s3_clnt.c 2015-06-09 15:39:56.315119013 +0200 |
||||
@@ -2092,6 +2092,44 @@ int ssl3_get_new_session_ticket(SSL *s) |
||||
} |
||||
|
||||
p=d=(unsigned char *)s->init_msg; |
||||
+ |
||||
+ if (s->session->session_id_length > 0) |
||||
+ { |
||||
+ int i = s->session_ctx->session_cache_mode; |
||||
+ SSL_SESSION *new_sess; |
||||
+ /* |
||||
+ * We reused an existing session, so we need to replace it with a new |
||||
+ * one |
||||
+ */ |
||||
+ if (i & SSL_SESS_CACHE_CLIENT) |
||||
+ { |
||||
+ /* |
||||
+ * Remove the old session from the cache |
||||
+ */ |
||||
+ if (i & SSL_SESS_CACHE_NO_INTERNAL_STORE) |
||||
+ { |
||||
+ if (s->session_ctx->remove_session_cb != NULL) |
||||
+ s->session_ctx->remove_session_cb(s->session_ctx, |
||||
+ s->session); |
||||
+ } |
||||
+ else |
||||
+ { |
||||
+ /* We carry on if this fails */ |
||||
+ SSL_CTX_remove_session(s->session_ctx, s->session); |
||||
+ } |
||||
+ } |
||||
+ |
||||
+ if ((new_sess = ssl_session_dup(s->session, 0)) == 0) |
||||
+ { |
||||
+ al = SSL_AD_INTERNAL_ERROR; |
||||
+ SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, ERR_R_MALLOC_FAILURE); |
||||
+ goto f_err; |
||||
+ } |
||||
+ |
||||
+ SSL_SESSION_free(s->session); |
||||
+ s->session = new_sess; |
||||
+ } |
||||
+ |
||||
n2l(p, s->session->tlsext_tick_lifetime_hint); |
||||
n2s(p, ticklen); |
||||
/* ticket_lifetime_hint + ticket_length + ticket */ |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
diff -up openssl-1.0.1e/crypto/cms/cms_smime.c.unknown-hash openssl-1.0.1e/crypto/cms/cms_smime.c |
||||
--- openssl-1.0.1e/crypto/cms/cms_smime.c.unknown-hash 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/cms/cms_smime.c 2015-06-09 16:07:16.001516190 +0200 |
||||
@@ -141,7 +141,7 @@ static void do_free_upto(BIO *f, BIO *up |
||||
BIO_free(f); |
||||
f = tbio; |
||||
} |
||||
- while (f != upto); |
||||
+ while (f && f != upto); |
||||
} |
||||
else |
||||
BIO_free_all(f); |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
diff -up openssl-1.0.1e/crypto/rsa/rsa_ameth.c.pss-check openssl-1.0.1e/crypto/rsa/rsa_ameth.c |
||||
--- openssl-1.0.1e/crypto/rsa/rsa_ameth.c.pss-check 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/rsa/rsa_ameth.c 2015-12-04 09:03:18.300660817 +0100 |
||||
@@ -287,7 +287,7 @@ static RSA_PSS_PARAMS *rsa_pss_decode(co |
||||
{ |
||||
ASN1_TYPE *param = pss->maskGenAlgorithm->parameter; |
||||
if (OBJ_obj2nid(pss->maskGenAlgorithm->algorithm) == NID_mgf1 |
||||
- && param->type == V_ASN1_SEQUENCE) |
||||
+ && param && param->type == V_ASN1_SEQUENCE) |
||||
{ |
||||
p = param->value.sequence->data; |
||||
plen = param->value.sequence->length; |
@ -0,0 +1,31 @@
@@ -0,0 +1,31 @@
|
||||
diff -up openssl-1.0.1e/crypto/asn1/tasn_dec.c.combine-leak openssl-1.0.1e/crypto/asn1/tasn_dec.c |
||||
--- openssl-1.0.1e/crypto/asn1/tasn_dec.c.combine-leak 2015-12-04 09:01:53.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/tasn_dec.c 2015-12-04 09:09:30.629793475 +0100 |
||||
@@ -169,6 +169,8 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, |
||||
int otag; |
||||
int ret = 0; |
||||
ASN1_VALUE **pchptr, *ptmpval; |
||||
+ int combine = aclass & ASN1_TFLG_COMBINE; |
||||
+ aclass &= ~ASN1_TFLG_COMBINE; |
||||
if (!pval) |
||||
return 0; |
||||
if (aux && aux->asn1_cb) |
||||
@@ -539,7 +541,8 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, |
||||
auxerr: |
||||
ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ASN1_R_AUX_ERROR); |
||||
err: |
||||
- ASN1_item_ex_free(pval, it); |
||||
+ if (combine == 0) |
||||
+ ASN1_item_ex_free(pval, it); |
||||
if (errtt) |
||||
ERR_add_error_data(4, "Field=", errtt->field_name, |
||||
", Type=", it->sname); |
||||
@@ -767,7 +770,7 @@ static int asn1_template_noexp_d2i(ASN1_ |
||||
{ |
||||
/* Nothing special */ |
||||
ret = ASN1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item), |
||||
- -1, 0, opt, ctx); |
||||
+ -1, tt->flags & ASN1_TFLG_COMBINE, opt, ctx); |
||||
if (!ret) |
||||
{ |
||||
ASN1err(ASN1_F_ASN1_TEMPLATE_NOEXP_D2I, |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
diff -up openssl-1.0.1e/ssl/s3_clnt.c.psk-identity openssl-1.0.1e/ssl/s3_clnt.c |
||||
--- openssl-1.0.1e/ssl/s3_clnt.c.psk-identity 2015-12-04 09:01:53.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_clnt.c 2015-12-04 09:36:24.182010426 +0100 |
||||
@@ -1367,8 +1367,6 @@ int ssl3_get_key_exchange(SSL *s) |
||||
#ifndef OPENSSL_NO_PSK |
||||
if (alg_k & SSL_kPSK) |
||||
{ |
||||
- char tmp_id_hint[PSK_MAX_IDENTITY_LEN+1]; |
||||
- |
||||
al=SSL_AD_HANDSHAKE_FAILURE; |
||||
n2s(p,i); |
||||
param_len=i+2; |
||||
@@ -1389,16 +1387,8 @@ int ssl3_get_key_exchange(SSL *s) |
||||
SSL_R_BAD_PSK_IDENTITY_HINT_LENGTH); |
||||
goto f_err; |
||||
} |
||||
- /* If received PSK identity hint contains NULL |
||||
- * characters, the hint is truncated from the first |
||||
- * NULL. p may not be ending with NULL, so create a |
||||
- * NULL-terminated string. */ |
||||
- memcpy(tmp_id_hint, p, i); |
||||
- memset(tmp_id_hint+i, 0, PSK_MAX_IDENTITY_LEN+1-i); |
||||
- if (s->ctx->psk_identity_hint != NULL) |
||||
- OPENSSL_free(s->ctx->psk_identity_hint); |
||||
- s->ctx->psk_identity_hint = BUF_strdup(tmp_id_hint); |
||||
- if (s->ctx->psk_identity_hint == NULL) |
||||
+ s->session->psk_identity_hint = BUF_strndup((char *)p, i); |
||||
+ if (s->session->psk_identity_hint == NULL) |
||||
{ |
||||
SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE); |
||||
goto f_err; |
||||
@@ -2904,7 +2894,7 @@ int ssl3_send_client_key_exchange(SSL *s |
||||
goto err; |
||||
} |
||||
|
||||
- psk_len = s->psk_client_callback(s, s->ctx->psk_identity_hint, |
||||
+ psk_len = s->psk_client_callback(s, s->session->psk_identity_hint, |
||||
identity, PSK_MAX_IDENTITY_LEN, |
||||
psk_or_pre_ms, sizeof(psk_or_pre_ms)); |
||||
if (psk_len > PSK_MAX_PSK_LEN) |
||||
diff -up openssl-1.0.1e/ssl/s3_srvr.c.psk-identity openssl-1.0.1e/ssl/s3_srvr.c |
||||
--- openssl-1.0.1e/ssl/s3_srvr.c.psk-identity 2015-12-04 09:01:53.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_srvr.c 2015-12-04 09:43:45.144086868 +0100 |
||||
@@ -2751,7 +2751,7 @@ int ssl3_get_client_key_exchange(SSL *s) |
||||
|
||||
if (s->session->psk_identity != NULL) |
||||
OPENSSL_free(s->session->psk_identity); |
||||
- s->session->psk_identity = BUF_strdup((char *)p); |
||||
+ s->session->psk_identity = BUF_strndup((char *)p, i); |
||||
if (s->session->psk_identity == NULL) |
||||
{ |
||||
SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, |
@ -0,0 +1,42 @@
@@ -0,0 +1,42 @@
|
||||
diff -up openssl-1.0.1e/ssl/s2_srvr.c.ssl2-ciphers openssl-1.0.1e/ssl/s2_srvr.c |
||||
--- openssl-1.0.1e/ssl/s2_srvr.c.ssl2-ciphers 2016-01-14 17:38:50.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/s2_srvr.c 2016-02-16 16:18:59.790225008 +0100 |
||||
@@ -392,7 +392,7 @@ static int get_client_master_key(SSL *s) |
||||
} |
||||
|
||||
cp=ssl2_get_cipher_by_char(p); |
||||
- if (cp == NULL) |
||||
+ if (cp == NULL || sk_SSL_CIPHER_find(s->session->ciphers, cp) < 0) |
||||
{ |
||||
ssl2_return_error(s,SSL2_PE_NO_CIPHER); |
||||
SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_NO_CIPHER_MATCH); |
||||
@@ -692,9 +692,13 @@ static int get_client_hello(SSL *s) |
||||
prio = cs; |
||||
allow = cl; |
||||
} |
||||
+ |
||||
+ /* Generate list of SSLv2 ciphers shared between client and server */ |
||||
for (z=0; z<sk_SSL_CIPHER_num(prio); z++) |
||||
{ |
||||
- if (sk_SSL_CIPHER_find(allow,sk_SSL_CIPHER_value(prio,z)) < 0) |
||||
+ const SSL_CIPHER *cp = sk_SSL_CIPHER_value(prio, z); |
||||
+ if ((cp->algorithm_ssl & SSL_SSLV2) == 0 || |
||||
+ sk_SSL_CIPHER_find(allow,cp) < 0) |
||||
{ |
||||
(void)sk_SSL_CIPHER_delete(prio,z); |
||||
z--; |
||||
@@ -705,6 +709,14 @@ static int get_client_hello(SSL *s) |
||||
sk_SSL_CIPHER_free(s->session->ciphers); |
||||
s->session->ciphers = prio; |
||||
} |
||||
+ |
||||
+ /* Make sure we have at least one cipher in common */ |
||||
+ if (sk_SSL_CIPHER_num(s->session->ciphers) == 0) |
||||
+ { |
||||
+ ssl2_return_error(s, SSL2_PE_NO_CIPHER); |
||||
+ SSLerr(SSL_F_GET_CLIENT_HELLO, SSL_R_NO_CIPHER_MATCH); |
||||
+ return -1; |
||||
+ } |
||||
/* s->session->ciphers should now have a list of |
||||
* ciphers that are on both the client and server. |
||||
* This list is ordered by the order the client sent |
@ -0,0 +1,241 @@
@@ -0,0 +1,241 @@
|
||||
diff -up openssl-1.0.1e/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod.logjam openssl-1.0.1e/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod |
||||
--- openssl-1.0.1e/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod.logjam 2013-02-11 16:02:48.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod 2015-05-25 11:37:08.893049771 +0200 |
||||
@@ -12,12 +12,10 @@ SSL_CTX_set_tmp_dh_callback, SSL_CTX_set |
||||
DH *(*tmp_dh_callback)(SSL *ssl, int is_export, int keylength)); |
||||
long SSL_CTX_set_tmp_dh(SSL_CTX *ctx, DH *dh); |
||||
|
||||
- void SSL_set_tmp_dh_callback(SSL_CTX *ctx, |
||||
+ void SSL_set_tmp_dh_callback(SSL *ctx, |
||||
DH *(*tmp_dh_callback)(SSL *ssl, int is_export, int keylength)); |
||||
long SSL_set_tmp_dh(SSL *ssl, DH *dh) |
||||
|
||||
- DH *(*tmp_dh_callback)(SSL *ssl, int is_export, int keylength)); |
||||
- |
||||
=head1 DESCRIPTION |
||||
|
||||
SSL_CTX_set_tmp_dh_callback() sets the callback function for B<ctx> to be |
||||
@@ -50,24 +48,25 @@ even if he gets hold of the normal (cert |
||||
only used for signing. |
||||
|
||||
In order to perform a DH key exchange the server must use a DH group |
||||
-(DH parameters) and generate a DH key. The server will always generate a new |
||||
-DH key during the negotiation, when the DH parameters are supplied via |
||||
-callback and/or when the SSL_OP_SINGLE_DH_USE option of |
||||
-L<SSL_CTX_set_options(3)|SSL_CTX_set_options(3)> is set. It will |
||||
-immediately create a DH key, when DH parameters are supplied via |
||||
-SSL_CTX_set_tmp_dh() and SSL_OP_SINGLE_DH_USE is not set. In this case, |
||||
+(DH parameters) and generate a DH key. |
||||
+The server will always generate a new DH key during the negotiation |
||||
+if either the DH parameters are supplied via callback or the |
||||
+SSL_OP_SINGLE_DH_USE option of SSL_CTX_set_options(3) is set (or both). |
||||
+It will immediately create a DH key if DH parameters are supplied via |
||||
+SSL_CTX_set_tmp_dh() and SSL_OP_SINGLE_DH_USE is not set. |
||||
+In this case, |
||||
it may happen that a key is generated on initialization without later |
||||
being needed, while on the other hand the computer time during the |
||||
negotiation is being saved. |
||||
|
||||
If "strong" primes were used to generate the DH parameters, it is not strictly |
||||
necessary to generate a new key for each handshake but it does improve forward |
||||
-secrecy. If it is not assured, that "strong" primes were used (see especially |
||||
-the section about DSA parameters below), SSL_OP_SINGLE_DH_USE must be used |
||||
-in order to prevent small subgroup attacks. Always using SSL_OP_SINGLE_DH_USE |
||||
-has an impact on the computer time needed during negotiation, but it is not |
||||
-very large, so application authors/users should consider to always enable |
||||
-this option. |
||||
+secrecy. If it is not assured that "strong" primes were used, |
||||
+SSL_OP_SINGLE_DH_USE must be used in order to prevent small subgroup |
||||
+attacks. Always using SSL_OP_SINGLE_DH_USE has an impact on the |
||||
+computer time needed during negotiation, but it is not very large, so |
||||
+application authors/users should consider always enabling this option. |
||||
+The option is required to implement perfect forward secrecy (PFS). |
||||
|
||||
As generating DH parameters is extremely time consuming, an application |
||||
should not generate the parameters on the fly but supply the parameters. |
||||
@@ -75,82 +74,62 @@ DH parameters can be reused, as the actu |
||||
the negotiation. The risk in reusing DH parameters is that an attacker |
||||
may specialize on a very often used DH group. Applications should therefore |
||||
generate their own DH parameters during the installation process using the |
||||
-openssl L<dhparam(1)|dhparam(1)> application. In order to reduce the computer |
||||
-time needed for this generation, it is possible to use DSA parameters |
||||
-instead (see L<dhparam(1)|dhparam(1)>), but in this case SSL_OP_SINGLE_DH_USE |
||||
-is mandatory. |
||||
+openssl L<dhparam(1)|dhparam(1)> application. This application |
||||
+guarantees that "strong" primes are used. |
||||
|
||||
-Application authors may compile in DH parameters. Files dh512.pem, |
||||
-dh1024.pem, dh2048.pem, and dh4096 in the 'apps' directory of current |
||||
+Files dh2048.pem, and dh4096.pem in the 'apps' directory of the current |
||||
version of the OpenSSL distribution contain the 'SKIP' DH parameters, |
||||
which use safe primes and were generated verifiably pseudo-randomly. |
||||
These files can be converted into C code using the B<-C> option of the |
||||
-L<dhparam(1)|dhparam(1)> application. |
||||
-Authors may also generate their own set of parameters using |
||||
-L<dhparam(1)|dhparam(1)>, but a user may not be sure how the parameters were |
||||
-generated. The generation of DH parameters during installation is therefore |
||||
-recommended. |
||||
+L<dhparam(1)|dhparam(1)> application. Generation of custom DH |
||||
+parameters during installation should still be preferred to stop an |
||||
+attacker from specializing on a commonly used group. Files dh1024.pem |
||||
+and dh512.pem contain old parameters that must not be used by |
||||
+applications. |
||||
|
||||
An application may either directly specify the DH parameters or |
||||
-can supply the DH parameters via a callback function. The callback approach |
||||
-has the advantage, that the callback may supply DH parameters for different |
||||
-key lengths. |
||||
- |
||||
-The B<tmp_dh_callback> is called with the B<keylength> needed and |
||||
-the B<is_export> information. The B<is_export> flag is set, when the |
||||
-ephemeral DH key exchange is performed with an export cipher. |
||||
+can supply the DH parameters via a callback function. |
||||
+ |
||||
+Previous versions of the callback used B<is_export> and B<keylength> |
||||
+parameters to control parameter generation for export and non-export |
||||
+cipher suites. Modern servers that do not support export ciphersuites |
||||
+are advised to either use SSL_CTX_set_tmp_dh() in combination with |
||||
+SSL_OP_SINGLE_DH_USE, or alternatively, use the callback but ignore |
||||
+B<keylength> and B<is_export> and simply supply at least 2048-bit |
||||
+parameters in the callback. |
||||
|
||||
=head1 EXAMPLES |
||||
|
||||
-Handle DH parameters for key lengths of 512 and 1024 bits. (Error handling |
||||
+Setup DH parameters with a key length of 2048 bits. (Error handling |
||||
partly left out.) |
||||
|
||||
- ... |
||||
- /* Set up ephemeral DH stuff */ |
||||
- DH *dh_512 = NULL; |
||||
- DH *dh_1024 = NULL; |
||||
- FILE *paramfile; |
||||
+ Command-line parameter generation: |
||||
+ $ openssl dhparam -out dh_param_2048.pem 2048 |
||||
|
||||
+ Code for setting up parameters during server initialization: |
||||
+ |
||||
+ ... |
||||
+ SSL_CTX ctx = SSL_CTX_new(); |
||||
... |
||||
- /* "openssl dhparam -out dh_param_512.pem -2 512" */ |
||||
- paramfile = fopen("dh_param_512.pem", "r"); |
||||
+ |
||||
+ /* Set up ephemeral DH parameters. */ |
||||
+ DH *dh_2048 = NULL; |
||||
+ FILE *paramfile; |
||||
+ paramfile = fopen("dh_param_2048.pem", "r"); |
||||
if (paramfile) { |
||||
- dh_512 = PEM_read_DHparams(paramfile, NULL, NULL, NULL); |
||||
+ dh_2048 = PEM_read_DHparams(paramfile, NULL, NULL, NULL); |
||||
fclose(paramfile); |
||||
+ } else { |
||||
+ /* Error. */ |
||||
} |
||||
- /* "openssl dhparam -out dh_param_1024.pem -2 1024" */ |
||||
- paramfile = fopen("dh_param_1024.pem", "r"); |
||||
- if (paramfile) { |
||||
- dh_1024 = PEM_read_DHparams(paramfile, NULL, NULL, NULL); |
||||
- fclose(paramfile); |
||||
+ if (dh_2048 == NULL) { |
||||
+ /* Error. */ |
||||
} |
||||
- ... |
||||
- |
||||
- /* "openssl dhparam -C -2 512" etc... */ |
||||
- DH *get_dh512() { ... } |
||||
- DH *get_dh1024() { ... } |
||||
- |
||||
- DH *tmp_dh_callback(SSL *s, int is_export, int keylength) |
||||
- { |
||||
- DH *dh_tmp=NULL; |
||||
- |
||||
- switch (keylength) { |
||||
- case 512: |
||||
- if (!dh_512) |
||||
- dh_512 = get_dh512(); |
||||
- dh_tmp = dh_512; |
||||
- break; |
||||
- case 1024: |
||||
- if (!dh_1024) |
||||
- dh_1024 = get_dh1024(); |
||||
- dh_tmp = dh_1024; |
||||
- break; |
||||
- default: |
||||
- /* Generating a key on the fly is very costly, so use what is there */ |
||||
- setup_dh_parameters_like_above(); |
||||
- } |
||||
- return(dh_tmp); |
||||
+ if (SSL_CTX_set_tmp_dh(ctx, dh_2048) != 1) { |
||||
+ /* Error. */ |
||||
} |
||||
+ SSL_CTX_set_options(ctx, SSL_OP_SINGLE_DH_USE); |
||||
+ ... |
||||
|
||||
=head1 RETURN VALUES |
||||
|
||||
diff -up openssl-1.0.1e/ssl/ssl_err.c.logjam openssl-1.0.1e/ssl/ssl_err.c |
||||
--- openssl-1.0.1e/ssl/ssl_err.c.logjam 2015-05-25 11:38:29.834858712 +0200 |
||||
+++ openssl-1.0.1e/ssl/ssl_err.c 2015-05-25 11:42:01.041578905 +0200 |
||||
@@ -361,6 +361,7 @@ static ERR_STRING_DATA SSL_str_reasons[] |
||||
{ERR_REASON(SSL_R_DATA_LENGTH_TOO_LONG) ,"data length too long"}, |
||||
{ERR_REASON(SSL_R_DECRYPTION_FAILED) ,"decryption failed"}, |
||||
{ERR_REASON(SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC),"decryption failed or bad record mac"}, |
||||
+{ERR_REASON(SSL_R_DH_KEY_TOO_SMALL) ,"dh key too small"}, |
||||
{ERR_REASON(SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG),"dh public value length is wrong"}, |
||||
{ERR_REASON(SSL_R_DIGEST_CHECK_FAILED) ,"digest check failed"}, |
||||
{ERR_REASON(SSL_R_DTLS_MESSAGE_TOO_BIG) ,"dtls message too big"}, |
||||
diff -up openssl-1.0.1e/ssl/ssl.h.logjam openssl-1.0.1e/ssl/ssl.h |
||||
--- openssl-1.0.1e/ssl/ssl.h.logjam 2015-05-25 11:38:29.834858712 +0200 |
||||
+++ openssl-1.0.1e/ssl/ssl.h 2015-05-25 11:40:42.482823220 +0200 |
||||
@@ -2289,6 +2289,7 @@ void ERR_load_SSL_strings(void); |
||||
#define SSL_R_DATA_LENGTH_TOO_LONG 146 |
||||
#define SSL_R_DECRYPTION_FAILED 147 |
||||
#define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC 281 |
||||
+#define SSL_R_DH_KEY_TOO_SMALL 372 |
||||
#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG 148 |
||||
#define SSL_R_DIGEST_CHECK_FAILED 149 |
||||
#define SSL_R_DTLS_MESSAGE_TOO_BIG 334 |
||||
diff -up openssl-1.0.1e/ssl/s3_clnt.c.logjam openssl-1.0.1e/ssl/s3_clnt.c |
||||
--- openssl-1.0.1e/ssl/s3_clnt.c.logjam 2015-05-25 11:38:29.833858690 +0200 |
||||
+++ openssl-1.0.1e/ssl/s3_clnt.c 2015-05-25 11:51:05.845754562 +0200 |
||||
@@ -3277,24 +3277,34 @@ int ssl3_check_cert_and_algorithm(SSL *s |
||||
} |
||||
#endif |
||||
#ifndef OPENSSL_NO_DH |
||||
- if ((alg_k & SSL_kEDH) && |
||||
- !(has_bits(i,EVP_PK_DH|EVP_PKT_EXCH) || (dh != NULL))) |
||||
+ if ((alg_k & SSL_kEDH) && dh == NULL) |
||||
{ |
||||
- SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_KEY); |
||||
+ SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,ERR_R_INTERNAL_ERROR); |
||||
goto f_err; |
||||
} |
||||
- else if ((alg_k & SSL_kDHr) && !has_bits(i,EVP_PK_DH|EVP_PKS_RSA)) |
||||
+ if ((alg_k & SSL_kDHr) && !has_bits(i,EVP_PK_DH|EVP_PKS_RSA)) |
||||
{ |
||||
SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_RSA_CERT); |
||||
goto f_err; |
||||
} |
||||
#ifndef OPENSSL_NO_DSA |
||||
- else if ((alg_k & SSL_kDHd) && !has_bits(i,EVP_PK_DH|EVP_PKS_DSA)) |
||||
+ if ((alg_k & SSL_kDHd) && !has_bits(i,EVP_PK_DH|EVP_PKS_DSA)) |
||||
{ |
||||
SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM,SSL_R_MISSING_DH_DSA_CERT); |
||||
goto f_err; |
||||
} |
||||
#endif |
||||
+ /* Check DHE only: static DH not implemented. */ |
||||
+ if (alg_k & SSL_kEDH) |
||||
+ { |
||||
+ int dh_size = BN_num_bits(dh->p); |
||||
+ if ((!SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && dh_size < 768) |
||||
+ || (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && dh_size < 512)) |
||||
+ { |
||||
+ SSLerr(SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM, SSL_R_DH_KEY_TOO_SMALL); |
||||
+ goto f_err; |
||||
+ } |
||||
+ } |
||||
#endif |
||||
|
||||
if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) && !has_bits(i,EVP_PKT_EXP)) |
@ -0,0 +1,38 @@
@@ -0,0 +1,38 @@
|
||||
diff -up openssl-1.0.1e/ssl/t1_lib.c.no-md5-tls openssl-1.0.1e/ssl/t1_lib.c |
||||
--- openssl-1.0.1e/ssl/t1_lib.c.no-md5-tls 2015-12-04 09:51:39.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/t1_lib.c 2015-12-21 14:09:35.239084727 +0100 |
||||
@@ -390,19 +390,11 @@ static unsigned char tls12_sigalgs[] = { |
||||
#ifndef OPENSSL_NO_SHA |
||||
tlsext_sigalg(TLSEXT_hash_sha1) |
||||
#endif |
||||
-#ifndef OPENSSL_NO_MD5 |
||||
- tlsext_sigalg_rsa(TLSEXT_hash_md5) |
||||
-#endif |
||||
}; |
||||
|
||||
int tls12_get_req_sig_algs(SSL *s, unsigned char *p) |
||||
{ |
||||
size_t slen = sizeof(tls12_sigalgs); |
||||
-#ifdef OPENSSL_FIPS |
||||
- /* If FIPS mode don't include MD5 which is last */ |
||||
- if (FIPS_mode()) |
||||
- slen -= 2; |
||||
-#endif |
||||
if (p) |
||||
memcpy(p, tls12_sigalgs, slen); |
||||
return (int)slen; |
||||
@@ -2413,14 +2405,6 @@ const EVP_MD *tls12_get_hash(unsigned ch |
||||
{ |
||||
switch(hash_alg) |
||||
{ |
||||
-#ifndef OPENSSL_NO_MD5 |
||||
- case TLSEXT_hash_md5: |
||||
-#ifdef OPENSSL_FIPS |
||||
- if (FIPS_mode()) |
||||
- return NULL; |
||||
-#endif |
||||
- return EVP_md5(); |
||||
-#endif |
||||
#ifndef OPENSSL_NO_SHA |
||||
case TLSEXT_hash_sha1: |
||||
return EVP_sha1(); |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
diff -up openssl-1.0.1e/crypto/dsa/dsa_ameth.c.dsa-doublefree openssl-1.0.1e/crypto/dsa/dsa_ameth.c |
||||
--- openssl-1.0.1e/crypto/dsa/dsa_ameth.c.dsa-doublefree 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/dsa/dsa_ameth.c 2016-02-24 14:38:46.075165304 +0100 |
||||
@@ -201,6 +201,8 @@ static int dsa_priv_decode(EVP_PKEY *pke |
||||
STACK_OF(ASN1_TYPE) *ndsa = NULL; |
||||
DSA *dsa = NULL; |
||||
|
||||
+ int ret = 0; |
||||
+ |
||||
if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8)) |
||||
return 0; |
||||
X509_ALGOR_get0(NULL, &ptype, &pval, palg); |
||||
@@ -281,23 +283,21 @@ static int dsa_priv_decode(EVP_PKEY *pke |
||||
} |
||||
|
||||
EVP_PKEY_assign_DSA(pkey, dsa); |
||||
- BN_CTX_free (ctx); |
||||
- if(ndsa) |
||||
- sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); |
||||
- else |
||||
- ASN1_INTEGER_free(privkey); |
||||
|
||||
- return 1; |
||||
+ ret = 1; |
||||
+ goto done; |
||||
|
||||
decerr: |
||||
DSAerr(DSA_F_DSA_PRIV_DECODE, EVP_R_DECODE_ERROR); |
||||
dsaerr: |
||||
- BN_CTX_free (ctx); |
||||
- if (privkey) |
||||
- ASN1_INTEGER_free(privkey); |
||||
- sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); |
||||
DSA_free(dsa); |
||||
- return 0; |
||||
+ done: |
||||
+ BN_CTX_free (ctx); |
||||
+ if (ndsa) |
||||
+ sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free); |
||||
+ else |
||||
+ ASN1_INTEGER_free(privkey); |
||||
+ return ret; |
||||
} |
||||
|
||||
static int dsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey) |
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
diff -up openssl-1.0.1e/crypto/bn/bn.h.bn-hex openssl-1.0.1e/crypto/bn/bn.h |
||||
--- openssl-1.0.1e/crypto/bn/bn.h.bn-hex 2016-02-24 14:23:33.020233047 +0100 |
||||
+++ openssl-1.0.1e/crypto/bn/bn.h 2016-02-24 14:23:06.078615397 +0100 |
||||
@@ -129,6 +129,7 @@ |
||||
#ifndef OPENSSL_NO_FP_API |
||||
#include <stdio.h> /* FILE */ |
||||
#endif |
||||
+#include <limits.h> |
||||
#include <openssl/ossl_typ.h> |
||||
#include <openssl/crypto.h> |
||||
|
||||
@@ -640,7 +641,8 @@ const BIGNUM *BN_get0_nist_prime_521(voi |
||||
|
||||
/* library internal functions */ |
||||
|
||||
-#define bn_expand(a,bits) ((((((bits+BN_BITS2-1))/BN_BITS2)) <= (a)->dmax)?\ |
||||
+#define bn_expand(a,bits) (bits > (INT_MAX - BN_BITS2 + 1)?\ |
||||
+ NULL:(((((bits+BN_BITS2-1))/BN_BITS2)) <= (a)->dmax)?\ |
||||
(a):bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2)) |
||||
#define bn_wexpand(a,words) (((words) <= (a)->dmax)?(a):bn_expand2((a),(words))) |
||||
BIGNUM *bn_expand2(BIGNUM *a, int words); |
||||
diff -up openssl-1.0.1e/crypto/bn/bn_print.c.bn-hex openssl-1.0.1e/crypto/bn/bn_print.c |
||||
--- openssl-1.0.1e/crypto/bn/bn_print.c.bn-hex 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/bn/bn_print.c 2016-02-24 14:15:21.215948376 +0100 |
||||
@@ -58,6 +58,7 @@ |
||||
|
||||
#include <stdio.h> |
||||
#include <ctype.h> |
||||
+#include <limits.h> |
||||
#include "cryptlib.h" |
||||
#include <openssl/buffer.h> |
||||
#include "bn_lcl.h" |
||||
@@ -180,8 +181,10 @@ int BN_hex2bn(BIGNUM **bn, const char *a |
||||
|
||||
if (*a == '-') { neg=1; a++; } |
||||
|
||||
- for (i=0; isxdigit((unsigned char) a[i]); i++) |
||||
+ for (i=0; i <= (INT_MAX/4) && isxdigit((unsigned char) a[i]); i++) |
||||
; |
||||
+ if (i > INT_MAX/4) |
||||
+ goto err; |
||||
|
||||
num=i+neg; |
||||
if (bn == NULL) return(num); |
||||
@@ -197,7 +200,7 @@ int BN_hex2bn(BIGNUM **bn, const char *a |
||||
BN_zero(ret); |
||||
} |
||||
|
||||
- /* i is the number of hex digests; */ |
||||
+ /* i is the number of hex digits */ |
||||
if (bn_expand(ret,i*4) == NULL) goto err; |
||||
|
||||
j=i; /* least significant 'hex' */ |
||||
@@ -246,8 +249,10 @@ int BN_dec2bn(BIGNUM **bn, const char *a |
||||
if ((a == NULL) || (*a == '\0')) return(0); |
||||
if (*a == '-') { neg=1; a++; } |
||||
|
||||
- for (i=0; isdigit((unsigned char) a[i]); i++) |
||||
+ for (i=0; i <= (INT_MAX/4) && isdigit((unsigned char) a[i]); i++) |
||||
; |
||||
+ if (i > INT_MAX/4) |
||||
+ goto err; |
||||
|
||||
num=i+neg; |
||||
if (bn == NULL) return(num); |
||||
@@ -264,7 +269,7 @@ int BN_dec2bn(BIGNUM **bn, const char *a |
||||
BN_zero(ret); |
||||
} |
||||
|
||||
- /* i is the number of digests, a bit of an over expand; */ |
||||
+ /* i is the number of digits, a bit of an over expand */ |
||||
if (bn_expand(ret,i*4) == NULL) goto err; |
||||
|
||||
j=BN_DEC_NUM-(i%BN_DEC_NUM); |
@ -0,0 +1,437 @@
@@ -0,0 +1,437 @@
|
||||
diff -up openssl-1.0.1e/crypto/bio/b_print.c.bio-printf openssl-1.0.1e/crypto/bio/b_print.c |
||||
--- openssl-1.0.1e/crypto/bio/b_print.c.bio-printf 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/bio/b_print.c 2016-04-07 14:36:55.538117697 +0200 |
||||
@@ -125,14 +125,14 @@ |
||||
#define LLONG long |
||||
#endif |
||||
|
||||
-static void fmtstr (char **, char **, size_t *, size_t *, |
||||
+static int fmtstr(char **, char **, size_t *, size_t *, |
||||
const char *, int, int, int); |
||||
-static void fmtint (char **, char **, size_t *, size_t *, |
||||
+static int fmtint(char **, char **, size_t *, size_t *, |
||||
LLONG, int, int, int, int); |
||||
-static void fmtfp (char **, char **, size_t *, size_t *, |
||||
+static int fmtfp(char **, char **, size_t *, size_t *, |
||||
LDOUBLE, int, int, int); |
||||
-static void doapr_outch (char **, char **, size_t *, size_t *, int); |
||||
-static void _dopr(char **sbuffer, char **buffer, |
||||
+static int doapr_outch(char **, char **, size_t *, size_t *, int); |
||||
+static int _dopr(char **sbuffer, char **buffer, |
||||
size_t *maxlen, size_t *retlen, int *truncated, |
||||
const char *format, va_list args); |
||||
|
||||
@@ -165,7 +165,7 @@ static void _dopr(char **sbuffer, char * |
||||
#define char_to_int(p) (p - '0') |
||||
#define OSSL_MAX(p,q) ((p >= q) ? p : q) |
||||
|
||||
-static void |
||||
+static int |
||||
_dopr( |
||||
char **sbuffer, |
||||
char **buffer, |
||||
@@ -200,7 +200,8 @@ _dopr( |
||||
if (ch == '%') |
||||
state = DP_S_FLAGS; |
||||
else |
||||
- doapr_outch(sbuffer,buffer, &currlen, maxlen, ch); |
||||
+ if (!doapr_outch(sbuffer, buffer, &currlen, maxlen, ch)) |
||||
+ return 0; |
||||
ch = *format++; |
||||
break; |
||||
case DP_S_FLAGS: |
||||
@@ -306,8 +307,9 @@ _dopr( |
||||
value = va_arg(args, int); |
||||
break; |
||||
} |
||||
- fmtint(sbuffer, buffer, &currlen, maxlen, |
||||
- value, 10, min, max, flags); |
||||
+ if (!fmtint(sbuffer, buffer, &currlen, maxlen, value, 10, min, |
||||
+ max, flags)) |
||||
+ return 0; |
||||
break; |
||||
case 'X': |
||||
flags |= DP_F_UP; |
||||
@@ -332,17 +334,19 @@ _dopr( |
||||
unsigned int); |
||||
break; |
||||
} |
||||
- fmtint(sbuffer, buffer, &currlen, maxlen, value, |
||||
+ if (!fmtint(sbuffer, buffer, &currlen, maxlen, value, |
||||
ch == 'o' ? 8 : (ch == 'u' ? 10 : 16), |
||||
- min, max, flags); |
||||
+ min, max, flags)) |
||||
+ return 0; |
||||
break; |
||||
case 'f': |
||||
if (cflags == DP_C_LDOUBLE) |
||||
fvalue = va_arg(args, LDOUBLE); |
||||
else |
||||
fvalue = va_arg(args, double); |
||||
- fmtfp(sbuffer, buffer, &currlen, maxlen, |
||||
- fvalue, min, max, flags); |
||||
+ if (!fmtfp(sbuffer, buffer, &currlen, maxlen, fvalue, min, max, |
||||
+ flags)) |
||||
+ return 0; |
||||
break; |
||||
case 'E': |
||||
flags |= DP_F_UP; |
||||
@@ -361,8 +365,9 @@ _dopr( |
||||
fvalue = va_arg(args, double); |
||||
break; |
||||
case 'c': |
||||
- doapr_outch(sbuffer, buffer, &currlen, maxlen, |
||||
- va_arg(args, int)); |
||||
+ if(!doapr_outch(sbuffer, buffer, &currlen, maxlen, |
||||
+ va_arg(args, int))) |
||||
+ return 0; |
||||
break; |
||||
case 's': |
||||
strvalue = va_arg(args, char *); |
||||
@@ -372,13 +377,15 @@ _dopr( |
||||
else |
||||
max = *maxlen; |
||||
} |
||||
- fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue, |
||||
- flags, min, max); |
||||
+ if (!fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue, |
||||
+ flags, min, max)) |
||||
+ return 0; |
||||
break; |
||||
case 'p': |
||||
value = (long)va_arg(args, void *); |
||||
- fmtint(sbuffer, buffer, &currlen, maxlen, |
||||
- value, 16, min, max, flags|DP_F_NUM); |
||||
+ if (!fmtint(sbuffer, buffer, &currlen, maxlen, |
||||
+ value, 16, min, max, flags | DP_F_NUM)) |
||||
+ return 0; |
||||
break; |
||||
case 'n': /* XXX */ |
||||
if (cflags == DP_C_SHORT) { |
||||
@@ -400,7 +407,8 @@ _dopr( |
||||
} |
||||
break; |
||||
case '%': |
||||
- doapr_outch(sbuffer, buffer, &currlen, maxlen, ch); |
||||
+ if(!doapr_outch(sbuffer, buffer, &currlen, maxlen, ch)) |
||||
+ return 0; |
||||
break; |
||||
case 'w': |
||||
/* not supported yet, treat as next char */ |
||||
@@ -424,12 +432,13 @@ _dopr( |
||||
*truncated = (currlen > *maxlen - 1); |
||||
if (*truncated) |
||||
currlen = *maxlen - 1; |
||||
- doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0'); |
||||
+ if(!doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0')) |
||||
+ return 0; |
||||
*retlen = currlen - 1; |
||||
- return; |
||||
+ return 1; |
||||
} |
||||
|
||||
-static void |
||||
+static int |
||||
fmtstr( |
||||
char **sbuffer, |
||||
char **buffer, |
||||
@@ -440,36 +449,44 @@ fmtstr( |
||||
int min, |
||||
int max) |
||||
{ |
||||
- int padlen, strln; |
||||
+ int padlen; |
||||
+ size_t strln; |
||||
int cnt = 0; |
||||
|
||||
if (value == 0) |
||||
value = "<NULL>"; |
||||
- for (strln = 0; value[strln]; ++strln) |
||||
- ; |
||||
+ |
||||
+ strln = strlen(value); |
||||
+ if (strln > INT_MAX) |
||||
+ strln = INT_MAX; |
||||
+ |
||||
padlen = min - strln; |
||||
- if (padlen < 0) |
||||
+ if (min < 0 || padlen < 0) |
||||
padlen = 0; |
||||
if (flags & DP_F_MINUS) |
||||
padlen = -padlen; |
||||
|
||||
while ((padlen > 0) && (cnt < max)) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
||||
+ if(!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) |
||||
+ return 0; |
||||
--padlen; |
||||
++cnt; |
||||
} |
||||
while (*value && (cnt < max)) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, *value++); |
||||
+ if(!doapr_outch(sbuffer, buffer, currlen, maxlen, *value++)) |
||||
+ return 0; |
||||
++cnt; |
||||
} |
||||
while ((padlen < 0) && (cnt < max)) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
||||
+ if(!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) |
||||
+ return 0; |
||||
++padlen; |
||||
++cnt; |
||||
} |
||||
+ return 1; |
||||
} |
||||
|
||||
-static void |
||||
+static int |
||||
fmtint( |
||||
char **sbuffer, |
||||
char **buffer, |
||||
@@ -533,37 +550,44 @@ fmtint( |
||||
|
||||
/* spaces */ |
||||
while (spadlen > 0) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
||||
+ if(!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) |
||||
+ return 0; |
||||
--spadlen; |
||||
} |
||||
|
||||
/* sign */ |
||||
if (signvalue) |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); |
||||
+ if(!doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue)) |
||||
+ return 0; |
||||
|
||||
/* prefix */ |
||||
while (*prefix) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix); |
||||
+ if(!doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix)) |
||||
+ return 0; |
||||
prefix++; |
||||
} |
||||
|
||||
/* zeros */ |
||||
if (zpadlen > 0) { |
||||
while (zpadlen > 0) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); |
||||
+ if(!doapr_outch(sbuffer, buffer, currlen, maxlen, '0')) |
||||
+ return 0; |
||||
--zpadlen; |
||||
} |
||||
} |
||||
/* digits */ |
||||
- while (place > 0) |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]); |
||||
+ while (place > 0) { |
||||
+ if (!doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place])) |
||||
+ return 0; |
||||
+ } |
||||
|
||||
/* left justified spaces */ |
||||
while (spadlen < 0) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
||||
+ if (!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) |
||||
+ return 0; |
||||
++spadlen; |
||||
} |
||||
- return; |
||||
+ return 1; |
||||
} |
||||
|
||||
static LDOUBLE |
||||
@@ -597,7 +621,7 @@ roundv(LDOUBLE value) |
||||
return intpart; |
||||
} |
||||
|
||||
-static void |
||||
+static int |
||||
fmtfp( |
||||
char **sbuffer, |
||||
char **buffer, |
||||
@@ -616,7 +640,6 @@ fmtfp( |
||||
int fplace = 0; |
||||
int padlen = 0; |
||||
int zpadlen = 0; |
||||
- int caps = 0; |
||||
long intpart; |
||||
long fracpart; |
||||
long max10; |
||||
@@ -650,9 +673,7 @@ fmtfp( |
||||
|
||||
/* convert integer part */ |
||||
do { |
||||
- iconvert[iplace++] = |
||||
- (caps ? "0123456789ABCDEF" |
||||
- : "0123456789abcdef")[intpart % 10]; |
||||
+ iconvert[iplace++] = "0123456789"[intpart % 10]; |
||||
intpart = (intpart / 10); |
||||
} while (intpart && (iplace < (int)sizeof(iconvert))); |
||||
if (iplace == sizeof iconvert) |
||||
@@ -661,9 +682,7 @@ fmtfp( |
||||
|
||||
/* convert fractional part */ |
||||
do { |
||||
- fconvert[fplace++] = |
||||
- (caps ? "0123456789ABCDEF" |
||||
- : "0123456789abcdef")[fracpart % 10]; |
||||
+ fconvert[fplace++] = "0123456789"[fracpart % 10]; |
||||
fracpart = (fracpart / 10); |
||||
} while (fplace < max); |
||||
if (fplace == sizeof fconvert) |
||||
@@ -682,47 +701,61 @@ fmtfp( |
||||
|
||||
if ((flags & DP_F_ZERO) && (padlen > 0)) { |
||||
if (signvalue) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); |
||||
+ if (!doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue)) |
||||
+ return 0; |
||||
--padlen; |
||||
signvalue = 0; |
||||
} |
||||
while (padlen > 0) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); |
||||
+ if (!doapr_outch(sbuffer, buffer, currlen, maxlen, '0')) |
||||
+ return 0; |
||||
--padlen; |
||||
} |
||||
} |
||||
while (padlen > 0) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
||||
+ if (!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) |
||||
+ return 0; |
||||
--padlen; |
||||
} |
||||
- if (signvalue) |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); |
||||
+ if (signvalue && !doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue)) |
||||
+ return 0; |
||||
|
||||
- while (iplace > 0) |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]); |
||||
+ while (iplace > 0) { |
||||
+ if (!doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace])) |
||||
+ return 0; |
||||
+ } |
||||
|
||||
/* |
||||
* Decimal point. This should probably use locale to find the correct |
||||
* char to print out. |
||||
*/ |
||||
if (max > 0 || (flags & DP_F_NUM)) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, '.'); |
||||
+ if (!doapr_outch(sbuffer, buffer, currlen, maxlen, '.')) |
||||
+ return 0; |
||||
|
||||
- while (fplace > 0) |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]); |
||||
+ while (fplace > 0) { |
||||
+ if(!doapr_outch(sbuffer, buffer, currlen, maxlen, |
||||
+ fconvert[--fplace])) |
||||
+ return 0; |
||||
+ } |
||||
} |
||||
while (zpadlen > 0) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, '0'); |
||||
+ if (!doapr_outch(sbuffer, buffer, currlen, maxlen, '0')) |
||||
+ return 0; |
||||
--zpadlen; |
||||
} |
||||
|
||||
while (padlen < 0) { |
||||
- doapr_outch(sbuffer, buffer, currlen, maxlen, ' '); |
||||
+ if (!doapr_outch(sbuffer, buffer, currlen, maxlen, ' ')) |
||||
+ return 0; |
||||
++padlen; |
||||
} |
||||
+ return 1; |
||||
} |
||||
|
||||
-static void |
||||
+#define BUFFER_INC 1024 |
||||
+ |
||||
+static int |
||||
doapr_outch( |
||||
char **sbuffer, |
||||
char **buffer, |
||||
@@ -733,24 +766,30 @@ doapr_outch( |
||||
/* If we haven't at least one buffer, someone has doe a big booboo */ |
||||
assert(*sbuffer != NULL || buffer != NULL); |
||||
|
||||
- if (buffer) { |
||||
- while (*currlen >= *maxlen) { |
||||
- if (*buffer == NULL) { |
||||
- if (*maxlen == 0) |
||||
- *maxlen = 1024; |
||||
+ /* |currlen| must always be <= |*maxlen| */ |
||||
+ assert(*currlen <= *maxlen); |
||||
+ |
||||
+ if (buffer && *currlen == *maxlen) { |
||||
+ if (*maxlen > INT_MAX - BUFFER_INC) |
||||
+ return 0; |
||||
+ |
||||
+ *maxlen += BUFFER_INC; |
||||
+ if (*buffer == NULL) { |
||||
*buffer = OPENSSL_malloc(*maxlen); |
||||
+ if (*buffer == NULL) |
||||
+ return 0; |
||||
if (*currlen > 0) { |
||||
assert(*sbuffer != NULL); |
||||
memcpy(*buffer, *sbuffer, *currlen); |
||||
} |
||||
*sbuffer = NULL; |
||||
- } else { |
||||
- *maxlen += 1024; |
||||
- *buffer = OPENSSL_realloc(*buffer, *maxlen); |
||||
- } |
||||
+ } else { |
||||
+ char *tmpbuf; |
||||
+ tmpbuf = OPENSSL_realloc(*buffer, *maxlen); |
||||
+ if (tmpbuf == NULL) |
||||
+ return 0; |
||||
+ *buffer = tmpbuf; |
||||
} |
||||
- /* What to do if *buffer is NULL? */ |
||||
- assert(*sbuffer != NULL || *buffer != NULL); |
||||
} |
||||
|
||||
if (*currlen < *maxlen) { |
||||
@@ -760,7 +799,7 @@ doapr_outch( |
||||
(*buffer)[(*currlen)++] = (char)c; |
||||
} |
||||
|
||||
- return; |
||||
+ return 1; |
||||
} |
||||
|
||||
/***************************************************************************/ |
||||
@@ -792,11 +831,15 @@ int BIO_vprintf (BIO *bio, const char *f |
||||
|
||||
dynbuf = NULL; |
||||
CRYPTO_push_info("doapr()"); |
||||
- _dopr(&hugebufp, &dynbuf, &hugebufsize, |
||||
- &retlen, &ignored, format, args); |
||||
+ if (!_dopr(&hugebufp, &dynbuf, &hugebufsize, &retlen, &ignored, format, |
||||
+ args)) |
||||
+ { |
||||
+ OPENSSL_free(dynbuf); |
||||
+ return -1; |
||||
+ } |
||||
if (dynbuf) |
||||
{ |
||||
- ret=BIO_write(bio, dynbuf, (int)retlen); |
||||
+ ret = BIO_write(bio, dynbuf, (int)retlen); |
||||
OPENSSL_free(dynbuf); |
||||
} |
||||
else |
||||
@@ -829,7 +872,8 @@ int BIO_vsnprintf(char *buf, size_t n, c |
||||
size_t retlen; |
||||
int truncated; |
||||
|
||||
- _dopr(&buf, NULL, &n, &retlen, &truncated, format, args); |
||||
+ if(!_dopr(&buf, NULL, &n, &retlen, &truncated, format, args)) |
||||
+ return -1; |
||||
|
||||
if (truncated) |
||||
/* In case of truncation, return -1 like traditional snprintf. |
@ -0,0 +1,40 @@
@@ -0,0 +1,40 @@
|
||||
diff -up openssl-1.0.1e/crypto/evp/encode.c.b64-overflow openssl-1.0.1e/crypto/evp/encode.c |
||||
--- openssl-1.0.1e/crypto/evp/encode.c.b64-overflow 2016-04-07 15:45:20.000000000 +0200 |
||||
+++ openssl-1.0.1e/crypto/evp/encode.c 2016-04-29 12:46:34.232656522 +0200 |
||||
@@ -132,12 +132,12 @@ void EVP_EncodeUpdate(EVP_ENCODE_CTX *ct |
||||
const unsigned char *in, int inl) |
||||
{ |
||||
int i,j; |
||||
- unsigned int total=0; |
||||
+ size_t total=0; |
||||
|
||||
*outl=0; |
||||
if (inl == 0) return; |
||||
OPENSSL_assert(ctx->length <= (int)sizeof(ctx->enc_data)); |
||||
- if ((ctx->num+inl) < ctx->length) |
||||
+ if (ctx->length - ctx->num > inl) |
||||
{ |
||||
memcpy(&(ctx->enc_data[ctx->num]),in,inl); |
||||
ctx->num+=inl; |
||||
@@ -156,7 +156,7 @@ void EVP_EncodeUpdate(EVP_ENCODE_CTX *ct |
||||
*out='\0'; |
||||
total=j+1; |
||||
} |
||||
- while (inl >= ctx->length) |
||||
+ while (inl >= ctx->length && total <= INT_MAX) |
||||
{ |
||||
j=EVP_EncodeBlock(out,in,ctx->length); |
||||
in+=ctx->length; |
||||
@@ -166,6 +166,12 @@ void EVP_EncodeUpdate(EVP_ENCODE_CTX *ct |
||||
*out='\0'; |
||||
total+=j+1; |
||||
} |
||||
+ if (total > INT_MAX) |
||||
+ { |
||||
+ /* Too much output data! */ |
||||
+ *outl = 0; |
||||
+ return; |
||||
+ } |
||||
if (inl != 0) |
||||
memcpy(&(ctx->enc_data[0]),in,inl); |
||||
ctx->num=inl; |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
diff -up openssl-1.0.1e/crypto/evp/evp_enc.c.enc-overflow openssl-1.0.1e/crypto/evp/evp_enc.c |
||||
--- openssl-1.0.1e/crypto/evp/evp_enc.c.enc-overflow 2016-04-29 12:42:43.000000000 +0200 |
||||
+++ openssl-1.0.1e/crypto/evp/evp_enc.c 2016-04-29 12:56:50.253736555 +0200 |
||||
@@ -408,7 +408,7 @@ int EVP_EncryptUpdate(EVP_CIPHER_CTX *ct |
||||
OPENSSL_assert(bl <= (int)sizeof(ctx->buf)); |
||||
if (i != 0) |
||||
{ |
||||
- if (i+inl < bl) |
||||
+ if (bl - i > inl) |
||||
{ |
||||
memcpy(&(ctx->buf[i]),in,inl); |
||||
ctx->buf_len+=inl; |
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
diff -up openssl-1.0.1e/crypto/evp/e_aes_cbc_hmac_sha1.c.padding-check openssl-1.0.1e/crypto/evp/e_aes_cbc_hmac_sha1.c |
||||
--- openssl-1.0.1e/crypto/evp/e_aes_cbc_hmac_sha1.c.padding-check 2016-04-29 12:42:43.000000000 +0200 |
||||
+++ openssl-1.0.1e/crypto/evp/e_aes_cbc_hmac_sha1.c 2016-04-29 13:10:13.441125487 +0200 |
||||
@@ -59,6 +59,7 @@ |
||||
#include <openssl/aes.h> |
||||
#include <openssl/sha.h> |
||||
#include "evp_locl.h" |
||||
+#include "constant_time_locl.h" |
||||
|
||||
#ifndef EVP_CIPH_FLAG_AEAD_CIPHER |
||||
#define EVP_CIPH_FLAG_AEAD_CIPHER 0x200000 |
||||
@@ -278,6 +279,8 @@ static int aesni_cbc_hmac_sha1_cipher(EV |
||||
maxpad |= (255-maxpad)>>(sizeof(maxpad)*8-8); |
||||
maxpad &= 255; |
||||
|
||||
+ ret &= constant_time_ge(maxpad, pad); |
||||
+ |
||||
inp_len = len - (SHA_DIGEST_LENGTH+pad+1); |
||||
mask = (0-((inp_len-len)>>(sizeof(inp_len)*8-1))); |
||||
inp_len &= mask; |
@ -0,0 +1,69 @@
@@ -0,0 +1,69 @@
|
||||
diff -up openssl-1.0.1e/crypto/asn1/a_int.c.asn1-negative openssl-1.0.1e/crypto/asn1/a_int.c |
||||
--- openssl-1.0.1e/crypto/asn1/a_int.c.asn1-negative 2016-04-29 13:23:05.221797998 +0200 |
||||
+++ openssl-1.0.1e/crypto/asn1/a_int.c 2016-04-29 13:26:51.030957218 +0200 |
||||
@@ -124,6 +124,8 @@ int i2c_ASN1_INTEGER(ASN1_INTEGER *a, un |
||||
{ |
||||
ret=a->length; |
||||
i=a->data[0]; |
||||
+ if (ret == 1 && i == 0) |
||||
+ neg = 0; |
||||
if (!neg && (i > 127)) { |
||||
pad=1; |
||||
pb=0; |
||||
@@ -157,7 +159,7 @@ int i2c_ASN1_INTEGER(ASN1_INTEGER *a, un |
||||
p += a->length - 1; |
||||
i = a->length; |
||||
/* Copy zeros to destination as long as source is zero */ |
||||
- while(!*n) { |
||||
+ while(!*n && i > 1) { |
||||
*(p--) = 0; |
||||
n--; |
||||
i--; |
||||
@@ -415,7 +417,7 @@ ASN1_INTEGER *BN_to_ASN1_INTEGER(const B |
||||
ASN1err(ASN1_F_BN_TO_ASN1_INTEGER,ERR_R_NESTED_ASN1_ERROR); |
||||
goto err; |
||||
} |
||||
- if (BN_is_negative(bn)) |
||||
+ if (BN_is_negative(bn) && !BN_is_zero(bn)) |
||||
ret->type = V_ASN1_NEG_INTEGER; |
||||
else ret->type=V_ASN1_INTEGER; |
||||
j=BN_num_bits(bn); |
||||
diff -up openssl-1.0.1e/crypto/asn1/a_type.c.asn1-negative openssl-1.0.1e/crypto/asn1/a_type.c |
||||
--- openssl-1.0.1e/crypto/asn1/a_type.c.asn1-negative 2016-04-29 12:42:43.000000000 +0200 |
||||
+++ openssl-1.0.1e/crypto/asn1/a_type.c 2016-04-29 13:28:40.202443787 +0200 |
||||
@@ -131,9 +131,7 @@ int ASN1_TYPE_cmp(const ASN1_TYPE *a, co |
||||
result = 0; /* They do not have content. */ |
||||
break; |
||||
case V_ASN1_INTEGER: |
||||
- case V_ASN1_NEG_INTEGER: |
||||
case V_ASN1_ENUMERATED: |
||||
- case V_ASN1_NEG_ENUMERATED: |
||||
case V_ASN1_BIT_STRING: |
||||
case V_ASN1_OCTET_STRING: |
||||
case V_ASN1_SEQUENCE: |
||||
diff -up openssl-1.0.1e/crypto/asn1/tasn_dec.c.asn1-negative openssl-1.0.1e/crypto/asn1/tasn_dec.c |
||||
--- openssl-1.0.1e/crypto/asn1/tasn_dec.c.asn1-negative 2016-04-29 12:42:43.000000000 +0200 |
||||
+++ openssl-1.0.1e/crypto/asn1/tasn_dec.c 2016-04-29 13:30:08.560456293 +0200 |
||||
@@ -1011,9 +1011,7 @@ int asn1_ex_c2i(ASN1_VALUE **pval, const |
||||
break; |
||||
|
||||
case V_ASN1_INTEGER: |
||||
- case V_ASN1_NEG_INTEGER: |
||||
case V_ASN1_ENUMERATED: |
||||
- case V_ASN1_NEG_ENUMERATED: |
||||
tint = (ASN1_INTEGER **)pval; |
||||
if (!c2i_ASN1_INTEGER(tint, &cont, len)) |
||||
goto err; |
||||
diff -up openssl-1.0.1e/crypto/asn1/tasn_enc.c.asn1-negative openssl-1.0.1e/crypto/asn1/tasn_enc.c |
||||
--- openssl-1.0.1e/crypto/asn1/tasn_enc.c.asn1-negative 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/tasn_enc.c 2016-04-29 13:30:34.688051394 +0200 |
||||
@@ -638,9 +638,7 @@ int asn1_ex_i2c(ASN1_VALUE **pval, unsig |
||||
break; |
||||
|
||||
case V_ASN1_INTEGER: |
||||
- case V_ASN1_NEG_INTEGER: |
||||
case V_ASN1_ENUMERATED: |
||||
- case V_ASN1_NEG_ENUMERATED: |
||||
/* These are all have the same content format |
||||
* as ASN1_INTEGER |
||||
*/ |
@ -0,0 +1,72 @@
@@ -0,0 +1,72 @@
|
||||
diff -up openssl-1.0.1e/crypto/asn1/a_d2i_fp.c.asn1-bio-dos openssl-1.0.1e/crypto/asn1/a_d2i_fp.c |
||||
--- openssl-1.0.1e/crypto/asn1/a_d2i_fp.c.asn1-bio-dos 2013-02-11 16:02:47.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/asn1/a_d2i_fp.c 2016-04-29 13:44:52.205538739 +0200 |
||||
@@ -139,6 +139,7 @@ void *ASN1_item_d2i_fp(const ASN1_ITEM * |
||||
#endif |
||||
|
||||
#define HEADER_SIZE 8 |
||||
+#define ASN1_CHUNK_INITIAL_SIZE (16 * 1024) |
||||
static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb) |
||||
{ |
||||
BUF_MEM *b; |
||||
@@ -230,6 +231,8 @@ static int asn1_d2i_read_bio(BIO *in, BU |
||||
want=c.slen; |
||||
if (want > (len-off)) |
||||
{ |
||||
+ size_t chunk_max = ASN1_CHUNK_INITIAL_SIZE; |
||||
+ |
||||
want-=(len-off); |
||||
if (want > INT_MAX /* BIO_read takes an int length */ || |
||||
len+want < len) |
||||
@@ -237,24 +240,38 @@ static int asn1_d2i_read_bio(BIO *in, BU |
||||
ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ASN1_R_TOO_LONG); |
||||
goto err; |
||||
} |
||||
- if (!BUF_MEM_grow_clean(b,len+want)) |
||||
- { |
||||
- ASN1err(ASN1_F_ASN1_D2I_READ_BIO,ERR_R_MALLOC_FAILURE); |
||||
- goto err; |
||||
- } |
||||
while (want > 0) |
||||
{ |
||||
- i=BIO_read(in,&(b->data[len]),want); |
||||
- if (i <= 0) |
||||
+ /* |
||||
+ * Read content in chunks of increasing size |
||||
+ * so we can return an error for EOF without |
||||
+ * having to allocate the entire content length |
||||
+ * in one go. |
||||
+ */ |
||||
+ size_t chunk = want > chunk_max ? chunk_max : want; |
||||
+ |
||||
+ if (!BUF_MEM_grow_clean(b, len + chunk)) |
||||
{ |
||||
- ASN1err(ASN1_F_ASN1_D2I_READ_BIO, |
||||
- ASN1_R_NOT_ENOUGH_DATA); |
||||
+ ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ERR_R_MALLOC_FAILURE); |
||||
goto err; |
||||
} |
||||
- /* This can't overflow because |
||||
- * |len+want| didn't overflow. */ |
||||
- len+=i; |
||||
- want-=i; |
||||
+ want -= chunk; |
||||
+ while (chunk > 0) |
||||
+ { |
||||
+ i = BIO_read(in, &(b->data[len]), chunk); |
||||
+ if (i <= 0) |
||||
+ { |
||||
+ ASN1err(ASN1_F_ASN1_D2I_READ_BIO, |
||||
+ ASN1_R_NOT_ENOUGH_DATA); |
||||
+ goto err; |
||||
+ } |
||||
+ /* This can't overflow because |
||||
+ * |len+want| didn't overflow. */ |
||||
+ len += i; |
||||
+ chunk -= i; |
||||
+ } |
||||
+ if (chunk_max < INT_MAX/2) |
||||
+ chunk_max *= 2; |
||||
} |
||||
} |
||||
if (off + c.slen < off) |
@ -0,0 +1,62 @@
@@ -0,0 +1,62 @@
|
||||
diff -up openssl-1.0.1e/apps/openssl.cnf.defaults openssl-1.0.1e/apps/openssl.cnf |
||||
--- openssl-1.0.1e/apps/openssl.cnf.defaults 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/apps/openssl.cnf 2014-02-06 18:00:00.170929334 +0100 |
||||
@@ -72,7 +72,7 @@ cert_opt = ca_default # Certificate fi |
||||
|
||||
default_days = 365 # how long to certify for |
||||
default_crl_days= 30 # how long before next CRL |
||||
-default_md = default # use public key default MD |
||||
+default_md = sha256 # use SHA-256 by default |
||||
preserve = no # keep passed DN ordering |
||||
|
||||
# A few difference way of specifying how similar the request should look |
||||
@@ -103,7 +103,8 @@ emailAddress = optional |
||||
|
||||
#################################################################### |
||||
[ req ] |
||||
-default_bits = 1024 |
||||
+default_bits = 2048 |
||||
+default_md = sha256 |
||||
default_keyfile = privkey.pem |
||||
distinguished_name = req_distinguished_name |
||||
attributes = req_attributes |
||||
@@ -126,17 +127,18 @@ string_mask = utf8only |
||||
|
||||
[ req_distinguished_name ] |
||||
countryName = Country Name (2 letter code) |
||||
-countryName_default = AU |
||||
+countryName_default = XX |
||||
countryName_min = 2 |
||||
countryName_max = 2 |
||||
|
||||
stateOrProvinceName = State or Province Name (full name) |
||||
-stateOrProvinceName_default = Some-State |
||||
+#stateOrProvinceName_default = Default Province |
||||
|
||||
localityName = Locality Name (eg, city) |
||||
+localityName_default = Default City |
||||
|
||||
0.organizationName = Organization Name (eg, company) |
||||
-0.organizationName_default = Internet Widgits Pty Ltd |
||||
+0.organizationName_default = Default Company Ltd |
||||
|
||||
# we can do this but it is not needed normally :-) |
||||
#1.organizationName = Second Organization Name (eg, company) |
||||
@@ -145,7 +147,7 @@ localityName = Locality Name (eg, city |
||||
organizationalUnitName = Organizational Unit Name (eg, section) |
||||
#organizationalUnitName_default = |
||||
|
||||
-commonName = Common Name (e.g. server FQDN or YOUR name) |
||||
+commonName = Common Name (eg, your name or your server\'s hostname) |
||||
commonName_max = 64 |
||||
|
||||
emailAddress = Email Address |
||||
@@ -339,7 +341,7 @@ signer_key = $dir/private/tsakey.pem # T |
||||
default_policy = tsa_policy1 # Policy if request did not specify it |
||||
# (optional) |
||||
other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) |
||||
-digests = md5, sha1 # Acceptable message digests (mandatory) |
||||
+digests = sha1, sha256, sha384, sha512 # Acceptable message digests (mandatory) |
||||
accuracy = secs:1, millisecs:500, microsecs:100 # (optional) |
||||
clock_precision_digits = 0 # number of digits after dot. (optional) |
||||
ordering = yes # Is ordering defined for timestamps? |
@ -0,0 +1,83 @@
@@ -0,0 +1,83 @@
|
||||
diff -up openssl-1.0.1e/ssl/ssl_lib.c.disable-sslv2 openssl-1.0.1e/ssl/ssl_lib.c |
||||
--- openssl-1.0.1e/ssl/ssl_lib.c.disable-sslv2 2016-01-14 17:38:50.018210499 +0100 |
||||
+++ openssl-1.0.1e/ssl/ssl_lib.c 2016-02-16 16:00:57.151508715 +0100 |
||||
@@ -1903,6 +1903,9 @@ SSL_CTX *SSL_CTX_new(const SSL_METHOD *m |
||||
*/ |
||||
ret->options |= SSL_OP_LEGACY_SERVER_CONNECT; |
||||
|
||||
+ /* Disable SSLv2 by default (affects the SSLv23_method() only) */ |
||||
+ ret->options |= SSL_OP_NO_SSLv2; |
||||
+ |
||||
return(ret); |
||||
err: |
||||
SSLerr(SSL_F_SSL_CTX_NEW,ERR_R_MALLOC_FAILURE); |
||||
diff -up openssl-1.0.1e/doc/apps/ciphers.pod.disable-sslv2 openssl-1.0.1e/doc/apps/ciphers.pod |
||||
--- openssl-1.0.1e/doc/apps/ciphers.pod.disable-sslv2 2016-01-14 17:38:50.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/apps/ciphers.pod 2016-02-24 11:17:36.297955053 +0100 |
||||
@@ -572,11 +572,11 @@ Note: these ciphers can also be used in |
||||
=head2 Deprecated SSL v2.0 cipher suites. |
||||
|
||||
SSL_CK_RC4_128_WITH_MD5 RC4-MD5 |
||||
- SSL_CK_RC4_128_EXPORT40_WITH_MD5 EXP-RC4-MD5 |
||||
- SSL_CK_RC2_128_CBC_WITH_MD5 RC2-MD5 |
||||
- SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5 EXP-RC2-MD5 |
||||
+ SSL_CK_RC4_128_EXPORT40_WITH_MD5 Not implemented. |
||||
+ SSL_CK_RC2_128_CBC_WITH_MD5 RC2-CBC-MD5 |
||||
+ SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5 Not implemented. |
||||
SSL_CK_IDEA_128_CBC_WITH_MD5 IDEA-CBC-MD5 |
||||
- SSL_CK_DES_64_CBC_WITH_MD5 DES-CBC-MD5 |
||||
+ SSL_CK_DES_64_CBC_WITH_MD5 Not implemented. |
||||
SSL_CK_DES_192_EDE3_CBC_WITH_MD5 DES-CBC3-MD5 |
||||
|
||||
=head1 NOTES |
||||
diff -up openssl-1.0.1e/ssl/s2_lib.c.disable-sslv2 openssl-1.0.1e/ssl/s2_lib.c |
||||
--- openssl-1.0.1e/ssl/s2_lib.c.disable-sslv2 2016-02-24 11:23:24.012237164 +0100 |
||||
+++ openssl-1.0.1e/ssl/s2_lib.c 2016-02-24 11:19:34.623773423 +0100 |
||||
@@ -156,6 +156,7 @@ OPENSSL_GLOBAL const SSL_CIPHER ssl2_cip |
||||
128, |
||||
}, |
||||
|
||||
+#if 0 |
||||
/* RC4_128_EXPORT40_WITH_MD5 */ |
||||
{ |
||||
1, |
||||
@@ -171,6 +172,7 @@ OPENSSL_GLOBAL const SSL_CIPHER ssl2_cip |
||||
40, |
||||
128, |
||||
}, |
||||
+#endif |
||||
|
||||
/* RC2_128_CBC_WITH_MD5 */ |
||||
{ |
||||
@@ -188,6 +190,7 @@ OPENSSL_GLOBAL const SSL_CIPHER ssl2_cip |
||||
128, |
||||
}, |
||||
|
||||
+#if 0 |
||||
/* RC2_128_CBC_EXPORT40_WITH_MD5 */ |
||||
{ |
||||
1, |
||||
@@ -203,6 +206,7 @@ OPENSSL_GLOBAL const SSL_CIPHER ssl2_cip |
||||
40, |
||||
128, |
||||
}, |
||||
+#endif |
||||
|
||||
#ifndef OPENSSL_NO_IDEA |
||||
/* IDEA_128_CBC_WITH_MD5 */ |
||||
@@ -222,6 +226,7 @@ OPENSSL_GLOBAL const SSL_CIPHER ssl2_cip |
||||
}, |
||||
#endif |
||||
|
||||
+#if 0 |
||||
/* DES_64_CBC_WITH_MD5 */ |
||||
{ |
||||
1, |
||||
@@ -237,6 +242,7 @@ OPENSSL_GLOBAL const SSL_CIPHER ssl2_cip |
||||
56, |
||||
56, |
||||
}, |
||||
+#endif |
||||
|
||||
/* DES_192_EDE3_CBC_WITH_MD5 */ |
||||
{ |
@ -0,0 +1,304 @@
@@ -0,0 +1,304 @@
|
||||
From 87887a7a658bf305bfe6619eedcbc6c3972cc188 Mon Sep 17 00:00:00 2001 |
||||
From: Hubert Kario <hkario@redhat.com> |
||||
Date: Tue, 10 Jun 2014 14:13:33 +0200 |
||||
Subject: [PATCH] backport changes to ciphers(1) man page |
||||
|
||||
Backport of the patch: |
||||
add ECC strings to ciphers(1), point out difference between DH and ECDH |
||||
and few other changes applicable to the 1.0.1 code base. |
||||
|
||||
* Make a clear distinction between DH and ECDH key exchange. |
||||
* Group all key exchange cipher suite identifiers, first DH then ECDH |
||||
* add descriptions for all supported *DH* identifiers |
||||
* add ECDSA authentication descriptions |
||||
* add example showing how to disable all suites that offer no |
||||
authentication or encryption |
||||
* backport listing of elliptic curve cipher suites. |
||||
* backport listing of TLS 1.2 cipher suites, add note that DH_RSA |
||||
and DH_DSS is not implemented in this version |
||||
* backport of description of PSK and listing of PSK cipher suites |
||||
* backport description of AES128, AES256 and AESGCM options |
||||
* backport description of CAMELLIA128, CAMELLIA256 options |
||||
--- |
||||
doc/apps/ciphers.pod | 195 ++++++++++++++++++++++++++++++++++++++++++++------ |
||||
1 file changed, 173 insertions(+), 22 deletions(-) |
||||
|
||||
diff --git a/doc/apps/ciphers.pod b/doc/apps/ciphers.pod |
||||
index f44aa00..6086d0a 100644 |
||||
--- a/doc/apps/ciphers.pod |
||||
+++ b/doc/apps/ciphers.pod |
||||
@@ -36,7 +36,7 @@ SSL v2 and for SSL v3/TLS v1. |
||||
|
||||
=item B<-V> |
||||
|
||||
-Like B<-V>, but include cipher suite codes in output (hex format). |
||||
+Like B<-v>, but include cipher suite codes in output (hex format). |
||||
|
||||
=item B<-ssl3> |
||||
|
||||
@@ -116,8 +116,8 @@ specified. |
||||
=item B<COMPLEMENTOFDEFAULT> |
||||
|
||||
the ciphers included in B<ALL>, but not enabled by default. Currently |
||||
-this is B<ADH>. Note that this rule does not cover B<eNULL>, which is |
||||
-not included by B<ALL> (use B<COMPLEMENTOFALL> if necessary). |
||||
+this is B<ADH> and B<AECDH>. Note that this rule does not cover B<eNULL>, |
||||
+which is not included by B<ALL> (use B<COMPLEMENTOFALL> if necessary). |
||||
|
||||
=item B<ALL> |
||||
|
||||
@@ -165,21 +165,58 @@ included. |
||||
=item B<aNULL> |
||||
|
||||
the cipher suites offering no authentication. This is currently the anonymous |
||||
-DH algorithms. These cipher suites are vulnerable to a "man in the middle" |
||||
-attack and so their use is normally discouraged. |
||||
+DH algorithms and anonymous ECDH algorithms. These cipher suites are vulnerable |
||||
+to a "man in the middle" attack and so their use is normally discouraged. |
||||
|
||||
=item B<kRSA>, B<RSA> |
||||
|
||||
cipher suites using RSA key exchange. |
||||
|
||||
+=item B<kDHr>, B<kDHd>, B<kDH> |
||||
+ |
||||
+cipher suites using DH key agreement and DH certificates signed by CAs with RSA |
||||
+and DSS keys or either respectively. Not implemented. |
||||
+ |
||||
=item B<kEDH> |
||||
|
||||
-cipher suites using ephemeral DH key agreement. |
||||
+cipher suites using ephemeral DH key agreement, including anonymous cipher |
||||
+suites. |
||||
|
||||
-=item B<kDHr>, B<kDHd> |
||||
+=item B<EDH> |
||||
|
||||
-cipher suites using DH key agreement and DH certificates signed by CAs with RSA |
||||
-and DSS keys respectively. Not implemented. |
||||
+cipher suites using authenticated ephemeral DH key agreement. |
||||
+ |
||||
+=item B<ADH> |
||||
+ |
||||
+anonymous DH cipher suites, note that this does not include anonymous Elliptic |
||||
+Curve DH (ECDH) cipher suites. |
||||
+ |
||||
+=item B<DH> |
||||
+ |
||||
+cipher suites using DH, including anonymous DH, ephemeral DH and fixed DH. |
||||
+ |
||||
+=item B<kECDHr>, B<kECDHe>, B<kECDH> |
||||
+ |
||||
+cipher suites using fixed ECDH key agreement signed by CAs with RSA and ECDSA |
||||
+keys or either respectively. |
||||
+ |
||||
+=item B<kEECDH> |
||||
+ |
||||
+cipher suites using ephemeral ECDH key agreement, including anonymous |
||||
+cipher suites. |
||||
+ |
||||
+=item B<EECDHE> |
||||
+ |
||||
+cipher suites using authenticated ephemeral ECDH key agreement. |
||||
+ |
||||
+=item B<AECDH> |
||||
+ |
||||
+anonymous Elliptic Curve Diffie Hellman cipher suites. |
||||
+ |
||||
+=item B<ECDH> |
||||
+ |
||||
+cipher suites using ECDH key exchange, including anonymous, ephemeral and |
||||
+fixed ECDH. |
||||
|
||||
=item B<aRSA> |
||||
|
||||
@@ -194,30 +231,39 @@ cipher suites using DSS authentication, i.e. the certificates carry DSS keys. |
||||
cipher suites effectively using DH authentication, i.e. the certificates carry |
||||
DH keys. Not implemented. |
||||
|
||||
+=item B<aECDH> |
||||
+ |
||||
+cipher suites effectively using ECDH authentication, i.e. the certificates |
||||
+carry ECDH keys. |
||||
+ |
||||
+=item B<aECDSA>, B<ECDSA> |
||||
+ |
||||
+cipher suites using ECDSA authentication, i.e. the certificates carry ECDSA |
||||
+keys. |
||||
+ |
||||
=item B<kFZA>, B<aFZA>, B<eFZA>, B<FZA> |
||||
|
||||
ciphers suites using FORTEZZA key exchange, authentication, encryption or all |
||||
FORTEZZA algorithms. Not implemented. |
||||
|
||||
-=item B<TLSv1>, B<SSLv3>, B<SSLv2> |
||||
- |
||||
-TLS v1.0, SSL v3.0 or SSL v2.0 cipher suites respectively. |
||||
+=item B<TLSv1.2>, B<TLSv1>, B<SSLv3>, B<SSLv2> |
||||
|
||||
-=item B<DH> |
||||
- |
||||
-cipher suites using DH, including anonymous DH. |
||||
+TLS v1.2, TLS v1.0, SSL v3.0 or SSL v2.0 cipher suites respectively. Note: |
||||
+there are no ciphersuites specific to TLS v1.1. |
||||
|
||||
-=item B<ADH> |
||||
+=item B<AES128>, B<AES256>, B<AES> |
||||
|
||||
-anonymous DH cipher suites. |
||||
+cipher suites using 128 bit AES, 256 bit AES or either 128 or 256 bit AES. |
||||
|
||||
-=item B<AES> |
||||
+=item B<AESGCM> |
||||
|
||||
-cipher suites using AES. |
||||
+AES in Galois Counter Mode (GCM): these ciphersuites are only supported |
||||
+in TLS v1.2. |
||||
|
||||
-=item B<CAMELLIA> |
||||
+=item B<CAMELLIA128>, B<CAMELLIA256>, B<CAMELLIA> |
||||
|
||||
-cipher suites using Camellia. |
||||
+cipher suites using 128 bit CAMELLIA, 256 bit CAMELLIA or either 128 or 256 bit |
||||
+CAMELLIA. |
||||
|
||||
=item B<3DES> |
||||
|
||||
@@ -251,6 +297,10 @@ cipher suites using MD5. |
||||
|
||||
cipher suites using SHA1. |
||||
|
||||
+=item B<SHA256>, B<SHA384> |
||||
+ |
||||
+ciphersuites using SHA256 or SHA384. |
||||
+ |
||||
=item B<aGOST> |
||||
|
||||
cipher suites using GOST R 34.10 (either 2001 or 94) for authenticaction |
||||
@@ -277,6 +327,9 @@ cipher suites, using HMAC based on GOST R 34.11-94. |
||||
|
||||
cipher suites using GOST 28147-89 MAC B<instead of> HMAC. |
||||
|
||||
+=item B<PSK> |
||||
+ |
||||
+cipher suites using pre-shared keys (PSK). |
||||
|
||||
=back |
||||
|
||||
@@ -423,7 +476,100 @@ Note: these ciphers can also be used in SSL v3. |
||||
TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA EXP1024-DHE-DSS-RC4-SHA |
||||
TLS_DHE_DSS_WITH_RC4_128_SHA DHE-DSS-RC4-SHA |
||||
|
||||
-=head2 SSL v2.0 cipher suites. |
||||
+=head2 Elliptic curve cipher suites. |
||||
+ |
||||
+ TLS_ECDH_RSA_WITH_NULL_SHA ECDH-RSA-NULL-SHA |
||||
+ TLS_ECDH_RSA_WITH_RC4_128_SHA ECDH-RSA-RC4-SHA |
||||
+ TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA ECDH-RSA-DES-CBC3-SHA |
||||
+ TLS_ECDH_RSA_WITH_AES_128_CBC_SHA ECDH-RSA-AES128-SHA |
||||
+ TLS_ECDH_RSA_WITH_AES_256_CBC_SHA ECDH-RSA-AES256-SHA |
||||
+ |
||||
+ TLS_ECDH_ECDSA_WITH_NULL_SHA ECDH-ECDSA-NULL-SHA |
||||
+ TLS_ECDH_ECDSA_WITH_RC4_128_SHA ECDH-ECDSA-RC4-SHA |
||||
+ TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA ECDH-ECDSA-DES-CBC3-SHA |
||||
+ TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA ECDH-ECDSA-AES128-SHA |
||||
+ TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA ECDH-ECDSA-AES256-SHA |
||||
+ |
||||
+ TLS_ECDHE_RSA_WITH_NULL_SHA ECDHE-RSA-NULL-SHA |
||||
+ TLS_ECDHE_RSA_WITH_RC4_128_SHA ECDHE-RSA-RC4-SHA |
||||
+ TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA ECDHE-RSA-DES-CBC3-SHA |
||||
+ TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ECDHE-RSA-AES128-SHA |
||||
+ TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA ECDHE-RSA-AES256-SHA |
||||
+ |
||||
+ TLS_ECDHE_ECDSA_WITH_NULL_SHA ECDHE-ECDSA-NULL-SHA |
||||
+ TLS_ECDHE_ECDSA_WITH_RC4_128_SHA ECDHE-ECDSA-RC4-SHA |
||||
+ TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA ECDHE-ECDSA-DES-CBC3-SHA |
||||
+ TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA ECDHE-ECDSA-AES128-SHA |
||||
+ TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA ECDHE-ECDSA-AES256-SHA |
||||
+ |
||||
+ TLS_ECDH_anon_WITH_NULL_SHA AECDH-NULL-SHA |
||||
+ TLS_ECDH_anon_WITH_RC4_128_SHA AECDH-RC4-SHA |
||||
+ TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA AECDH-DES-CBC3-SHA |
||||
+ TLS_ECDH_anon_WITH_AES_128_CBC_SHA AECDH-AES128-SHA |
||||
+ TLS_ECDH_anon_WITH_AES_256_CBC_SHA AECDH-AES256-SHA |
||||
+ |
||||
+=head2 TLS v1.2 cipher suites |
||||
+ |
||||
+ TLS_RSA_WITH_NULL_SHA256 NULL-SHA256 |
||||
+ |
||||
+ TLS_RSA_WITH_AES_128_CBC_SHA256 AES128-SHA256 |
||||
+ TLS_RSA_WITH_AES_256_CBC_SHA256 AES256-SHA256 |
||||
+ TLS_RSA_WITH_AES_128_GCM_SHA256 AES128-GCM-SHA256 |
||||
+ TLS_RSA_WITH_AES_256_GCM_SHA384 AES256-GCM-SHA384 |
||||
+ |
||||
+ TLS_DH_RSA_WITH_AES_128_CBC_SHA256 Not implemented. |
||||
+ TLS_DH_RSA_WITH_AES_256_CBC_SHA256 Not implemented. |
||||
+ TLS_DH_RSA_WITH_AES_128_GCM_SHA256 Not implemented. |
||||
+ TLS_DH_RSA_WITH_AES_256_GCM_SHA384 Not implemented. |
||||
+ |
||||
+ TLS_DH_DSS_WITH_AES_128_CBC_SHA256 Not implemented. |
||||
+ TLS_DH_DSS_WITH_AES_256_CBC_SHA256 Not implemented. |
||||
+ TLS_DH_DSS_WITH_AES_128_GCM_SHA256 Not implemented. |
||||
+ TLS_DH_DSS_WITH_AES_256_GCM_SHA384 Not implemented. |
||||
+ |
||||
+ TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 DHE-RSA-AES128-SHA256 |
||||
+ TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 DHE-RSA-AES256-SHA256 |
||||
+ TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 DHE-RSA-AES128-GCM-SHA256 |
||||
+ TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 DHE-RSA-AES256-GCM-SHA384 |
||||
+ |
||||
+ TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 DHE-DSS-AES128-SHA256 |
||||
+ TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 DHE-DSS-AES256-SHA256 |
||||
+ TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 DHE-DSS-AES128-GCM-SHA256 |
||||
+ TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 DHE-DSS-AES256-GCM-SHA384 |
||||
+ |
||||
+ TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 ECDH-RSA-AES128-SHA256 |
||||
+ TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 ECDH-RSA-AES256-SHA384 |
||||
+ TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 ECDH-RSA-AES128-GCM-SHA256 |
||||
+ TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 ECDH-RSA-AES256-GCM-SHA384 |
||||
+ |
||||
+ TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 ECDH-ECDSA-AES128-SHA256 |
||||
+ TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 ECDH-ECDSA-AES256-SHA384 |
||||
+ TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 ECDH-ECDSA-AES128-GCM-SHA256 |
||||
+ TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 ECDH-ECDSA-AES256-GCM-SHA384 |
||||
+ |
||||
+ TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 ECDHE-RSA-AES128-SHA256 |
||||
+ TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 ECDHE-RSA-AES256-SHA384 |
||||
+ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 |
||||
+ TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ECDHE-RSA-AES256-GCM-SHA384 |
||||
+ |
||||
+ TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 ECDHE-ECDSA-AES128-SHA256 |
||||
+ TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 ECDHE-ECDSA-AES256-SHA384 |
||||
+ TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ECDHE-ECDSA-AES128-GCM-SHA256 |
||||
+ TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ECDHE-ECDSA-AES256-GCM-SHA384 |
||||
+ |
||||
+ TLS_DH_anon_WITH_AES_128_CBC_SHA256 ADH-AES128-SHA256 |
||||
+ TLS_DH_anon_WITH_AES_256_CBC_SHA256 ADH-AES256-SHA256 |
||||
+ TLS_DH_anon_WITH_AES_128_GCM_SHA256 ADH-AES128-GCM-SHA256 |
||||
+ TLS_DH_anon_WITH_AES_256_GCM_SHA384 ADH-AES256-GCM-SHA384 |
||||
+ |
||||
+=head2 Pre shared keying (PSK) cipheruites |
||||
+ |
||||
+ TLS_PSK_WITH_RC4_128_SHA PSK-RC4-SHA |
||||
+ TLS_PSK_WITH_3DES_EDE_CBC_SHA PSK-3DES-EDE-CBC-SHA |
||||
+ TLS_PSK_WITH_AES_128_CBC_SHA PSK-AES128-CBC-SHA |
||||
+ TLS_PSK_WITH_AES_256_CBC_SHA PSK-AES256-CBC-SHA |
||||
+ |
||||
+=head2 Deprecated SSL v2.0 cipher suites. |
||||
|
||||
SSL_CK_RC4_128_WITH_MD5 RC4-MD5 |
||||
SSL_CK_RC4_128_EXPORT40_WITH_MD5 EXP-RC4-MD5 |
||||
@@ -452,6 +598,11 @@ strength: |
||||
|
||||
openssl ciphers -v 'ALL:!ADH:@STRENGTH' |
||||
|
||||
+Include all ciphers except ones with no encryption (eNULL) or no |
||||
+authentication (aNULL): |
||||
+ |
||||
+ openssl ciphers -v 'ALL:!aNULL' |
||||
+ |
||||
Include only 3DES ciphers and then place RSA ciphers last: |
||||
|
||||
openssl ciphers -v '3DES:+RSA' |
||||
-- |
||||
1.7.9.5 |
||||
|
@ -0,0 +1,119 @@
@@ -0,0 +1,119 @@
|
||||
From 2054eb771ea29378f90d3a77c2f4015b17de702d Mon Sep 17 00:00:00 2001 |
||||
From: "Dr. Stephen Henson" <steve@openssl.org> |
||||
Date: Tue, 15 Jul 2014 12:20:30 +0100 |
||||
Subject: [PATCH] Add ECC extensions with DTLS. |
||||
|
||||
PR#3449 |
||||
--- |
||||
ssl/d1_clnt.c | 8 +++++++- |
||||
ssl/d1_srvr.c | 5 +++++ |
||||
ssl/t1_lib.c | 18 ++++++------------ |
||||
3 files changed, 18 insertions(+), 13 deletions(-) |
||||
|
||||
diff --git a/ssl/d1_clnt.c b/ssl/d1_clnt.c |
||||
index 48e5e06..65dbb4a 100644 |
||||
--- a/ssl/d1_clnt.c |
||||
+++ b/ssl/d1_clnt.c |
||||
@@ -876,12 +876,18 @@ int dtls1_client_hello(SSL *s) |
||||
*(p++)=0; /* Add the NULL method */ |
||||
|
||||
#ifndef OPENSSL_NO_TLSEXT |
||||
+ /* TLS extensions*/ |
||||
+ if (ssl_prepare_clienthello_tlsext(s) <= 0) |
||||
+ { |
||||
+ SSLerr(SSL_F_DTLS1_CLIENT_HELLO,SSL_R_CLIENTHELLO_TLSEXT); |
||||
+ goto err; |
||||
+ } |
||||
if ((p = ssl_add_clienthello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) |
||||
{ |
||||
SSLerr(SSL_F_DTLS1_CLIENT_HELLO,ERR_R_INTERNAL_ERROR); |
||||
goto err; |
||||
} |
||||
-#endif |
||||
+#endif |
||||
|
||||
l=(p-d); |
||||
d=buf; |
||||
diff --git a/ssl/d1_srvr.c b/ssl/d1_srvr.c |
||||
index 1384ab0..ef9c347 100644 |
||||
--- a/ssl/d1_srvr.c |
||||
+++ b/ssl/d1_srvr.c |
||||
@@ -980,6 +980,11 @@ int dtls1_send_server_hello(SSL *s) |
||||
#endif |
||||
|
||||
#ifndef OPENSSL_NO_TLSEXT |
||||
+ if (ssl_prepare_serverhello_tlsext(s) <= 0) |
||||
+ { |
||||
+ SSLerr(SSL_F_DTLS1_SEND_SERVER_HELLO,SSL_R_SERVERHELLO_TLSEXT); |
||||
+ return -1; |
||||
+ } |
||||
if ((p = ssl_add_serverhello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) |
||||
{ |
||||
SSLerr(SSL_F_DTLS1_SEND_SERVER_HELLO,ERR_R_INTERNAL_ERROR); |
||||
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c |
||||
index f6a480d..8167a51 100644 |
||||
--- a/ssl/t1_lib.c |
||||
+++ b/ssl/t1_lib.c |
||||
@@ -453,8 +453,7 @@ unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf, unsigned c |
||||
#endif |
||||
|
||||
#ifndef OPENSSL_NO_EC |
||||
- if (s->tlsext_ecpointformatlist != NULL && |
||||
- s->version != DTLS1_VERSION) |
||||
+ if (s->tlsext_ecpointformatlist != NULL) |
||||
{ |
||||
/* Add TLS extension ECPointFormats to the ClientHello message */ |
||||
long lenmax; |
||||
@@ -473,8 +472,7 @@ unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf, unsigned c |
||||
memcpy(ret, s->tlsext_ecpointformatlist, s->tlsext_ecpointformatlist_length); |
||||
ret+=s->tlsext_ecpointformatlist_length; |
||||
} |
||||
- if (s->tlsext_ellipticcurvelist != NULL && |
||||
- s->version != DTLS1_VERSION) |
||||
+ if (s->tlsext_ellipticcurvelist != NULL) |
||||
{ |
||||
/* Add TLS extension EllipticCurves to the ClientHello message */ |
||||
long lenmax; |
||||
@@ -750,8 +748,7 @@ unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf, unsigned c |
||||
} |
||||
|
||||
#ifndef OPENSSL_NO_EC |
||||
- if (s->tlsext_ecpointformatlist != NULL && |
||||
- s->version != DTLS1_VERSION) |
||||
+ if (s->tlsext_ecpointformatlist != NULL) |
||||
{ |
||||
/* Add TLS extension ECPointFormats to the ServerHello message */ |
||||
long lenmax; |
||||
@@ -1154,8 +1151,7 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in |
||||
#endif |
||||
|
||||
#ifndef OPENSSL_NO_EC |
||||
- else if (type == TLSEXT_TYPE_ec_point_formats && |
||||
- s->version != DTLS1_VERSION) |
||||
+ else if (type == TLSEXT_TYPE_ec_point_formats) |
||||
{ |
||||
unsigned char *sdata = data; |
||||
int ecpointformatlist_length = *(sdata++); |
||||
@@ -1189,8 +1185,7 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in |
||||
fprintf(stderr,"\n"); |
||||
#endif |
||||
} |
||||
- else if (type == TLSEXT_TYPE_elliptic_curves && |
||||
- s->version != DTLS1_VERSION) |
||||
+ else if (type == TLSEXT_TYPE_elliptic_curves) |
||||
{ |
||||
unsigned char *sdata = data; |
||||
int ellipticcurvelist_length = (*(sdata++) << 8); |
||||
@@ -1549,8 +1544,7 @@ int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in |
||||
} |
||||
|
||||
#ifndef OPENSSL_NO_EC |
||||
- else if (type == TLSEXT_TYPE_ec_point_formats && |
||||
- s->version != DTLS1_VERSION) |
||||
+ else if (type == TLSEXT_TYPE_ec_point_formats) |
||||
{ |
||||
unsigned char *sdata = data; |
||||
int ecpointformatlist_length = *(sdata++); |
||||
-- |
||||
1.8.3.1 |
||||
|
@ -0,0 +1,124 @@
@@ -0,0 +1,124 @@
|
||||
diff -up openssl-1.0.1e/apps/speed.c.suiteb openssl-1.0.1e/apps/speed.c |
||||
--- openssl-1.0.1e/apps/speed.c.suiteb 2013-11-08 18:02:53.815229706 +0100 |
||||
+++ openssl-1.0.1e/apps/speed.c 2013-11-08 18:04:47.016724297 +0100 |
||||
@@ -966,49 +966,23 @@ int MAIN(int argc, char **argv) |
||||
else |
||||
#endif |
||||
#ifndef OPENSSL_NO_ECDSA |
||||
- if (strcmp(*argv,"ecdsap160") == 0) ecdsa_doit[R_EC_P160]=2; |
||||
- else if (strcmp(*argv,"ecdsap192") == 0) ecdsa_doit[R_EC_P192]=2; |
||||
- else if (strcmp(*argv,"ecdsap224") == 0) ecdsa_doit[R_EC_P224]=2; |
||||
- else if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2; |
||||
+ if (strcmp(*argv,"ecdsap256") == 0) ecdsa_doit[R_EC_P256]=2; |
||||
else if (strcmp(*argv,"ecdsap384") == 0) ecdsa_doit[R_EC_P384]=2; |
||||
else if (strcmp(*argv,"ecdsap521") == 0) ecdsa_doit[R_EC_P521]=2; |
||||
- else if (strcmp(*argv,"ecdsak163") == 0) ecdsa_doit[R_EC_K163]=2; |
||||
- else if (strcmp(*argv,"ecdsak233") == 0) ecdsa_doit[R_EC_K233]=2; |
||||
- else if (strcmp(*argv,"ecdsak283") == 0) ecdsa_doit[R_EC_K283]=2; |
||||
- else if (strcmp(*argv,"ecdsak409") == 0) ecdsa_doit[R_EC_K409]=2; |
||||
- else if (strcmp(*argv,"ecdsak571") == 0) ecdsa_doit[R_EC_K571]=2; |
||||
- else if (strcmp(*argv,"ecdsab163") == 0) ecdsa_doit[R_EC_B163]=2; |
||||
- else if (strcmp(*argv,"ecdsab233") == 0) ecdsa_doit[R_EC_B233]=2; |
||||
- else if (strcmp(*argv,"ecdsab283") == 0) ecdsa_doit[R_EC_B283]=2; |
||||
- else if (strcmp(*argv,"ecdsab409") == 0) ecdsa_doit[R_EC_B409]=2; |
||||
- else if (strcmp(*argv,"ecdsab571") == 0) ecdsa_doit[R_EC_B571]=2; |
||||
else if (strcmp(*argv,"ecdsa") == 0) |
||||
{ |
||||
- for (i=0; i < EC_NUM; i++) |
||||
+ for (i=R_EC_P256; i <= R_EC_P521; i++) |
||||
ecdsa_doit[i]=1; |
||||
} |
||||
else |
||||
#endif |
||||
#ifndef OPENSSL_NO_ECDH |
||||
- if (strcmp(*argv,"ecdhp160") == 0) ecdh_doit[R_EC_P160]=2; |
||||
- else if (strcmp(*argv,"ecdhp192") == 0) ecdh_doit[R_EC_P192]=2; |
||||
- else if (strcmp(*argv,"ecdhp224") == 0) ecdh_doit[R_EC_P224]=2; |
||||
- else if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2; |
||||
+ if (strcmp(*argv,"ecdhp256") == 0) ecdh_doit[R_EC_P256]=2; |
||||
else if (strcmp(*argv,"ecdhp384") == 0) ecdh_doit[R_EC_P384]=2; |
||||
else if (strcmp(*argv,"ecdhp521") == 0) ecdh_doit[R_EC_P521]=2; |
||||
- else if (strcmp(*argv,"ecdhk163") == 0) ecdh_doit[R_EC_K163]=2; |
||||
- else if (strcmp(*argv,"ecdhk233") == 0) ecdh_doit[R_EC_K233]=2; |
||||
- else if (strcmp(*argv,"ecdhk283") == 0) ecdh_doit[R_EC_K283]=2; |
||||
- else if (strcmp(*argv,"ecdhk409") == 0) ecdh_doit[R_EC_K409]=2; |
||||
- else if (strcmp(*argv,"ecdhk571") == 0) ecdh_doit[R_EC_K571]=2; |
||||
- else if (strcmp(*argv,"ecdhb163") == 0) ecdh_doit[R_EC_B163]=2; |
||||
- else if (strcmp(*argv,"ecdhb233") == 0) ecdh_doit[R_EC_B233]=2; |
||||
- else if (strcmp(*argv,"ecdhb283") == 0) ecdh_doit[R_EC_B283]=2; |
||||
- else if (strcmp(*argv,"ecdhb409") == 0) ecdh_doit[R_EC_B409]=2; |
||||
- else if (strcmp(*argv,"ecdhb571") == 0) ecdh_doit[R_EC_B571]=2; |
||||
else if (strcmp(*argv,"ecdh") == 0) |
||||
{ |
||||
- for (i=0; i < EC_NUM; i++) |
||||
+ for (i=R_EC_P256; i <= R_EC_P521; i++) |
||||
ecdh_doit[i]=1; |
||||
} |
||||
else |
||||
@@ -1097,15 +1071,11 @@ int MAIN(int argc, char **argv) |
||||
BIO_printf(bio_err,"dsa512 dsa1024 dsa2048\n"); |
||||
#endif |
||||
#ifndef OPENSSL_NO_ECDSA |
||||
- BIO_printf(bio_err,"ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n"); |
||||
- BIO_printf(bio_err,"ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571\n"); |
||||
- BIO_printf(bio_err,"ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571\n"); |
||||
+ BIO_printf(bio_err,"ecdsap256 ecdsap384 ecdsap521\n"); |
||||
BIO_printf(bio_err,"ecdsa\n"); |
||||
#endif |
||||
#ifndef OPENSSL_NO_ECDH |
||||
- BIO_printf(bio_err,"ecdhp160 ecdhp192 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n"); |
||||
- BIO_printf(bio_err,"ecdhk163 ecdhk233 ecdhk283 ecdhk409 ecdhk571\n"); |
||||
- BIO_printf(bio_err,"ecdhb163 ecdhb233 ecdhb283 ecdhb409 ecdhb571\n"); |
||||
+ BIO_printf(bio_err,"ecdhp256 ecdhp384 ecdhp521\n"); |
||||
BIO_printf(bio_err,"ecdh\n"); |
||||
#endif |
||||
|
||||
@@ -1184,11 +1154,11 @@ int MAIN(int argc, char **argv) |
||||
if (!FIPS_mode() || i != R_DSA_512) |
||||
dsa_doit[i]=1; |
||||
#ifndef OPENSSL_NO_ECDSA |
||||
- for (i=0; i<EC_NUM; i++) |
||||
+ for (i=R_EC_P256; i <= R_EC_P521; i++) |
||||
ecdsa_doit[i]=1; |
||||
#endif |
||||
#ifndef OPENSSL_NO_ECDH |
||||
- for (i=0; i<EC_NUM; i++) |
||||
+ for (i=R_EC_P256; i <= R_EC_P521; i++) |
||||
ecdh_doit[i]=1; |
||||
#endif |
||||
} |
||||
diff -up openssl-1.0.1e/ssl/t1_lib.c.suiteb openssl-1.0.1e/ssl/t1_lib.c |
||||
--- openssl-1.0.1e/ssl/t1_lib.c.suiteb 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/t1_lib.c 2013-11-08 18:05:27.551617554 +0100 |
||||
@@ -204,31 +204,9 @@ static int nid_list[] = |
||||
|
||||
static int pref_list[] = |
||||
{ |
||||
- NID_sect571r1, /* sect571r1 (14) */ |
||||
- NID_sect571k1, /* sect571k1 (13) */ |
||||
NID_secp521r1, /* secp521r1 (25) */ |
||||
- NID_sect409k1, /* sect409k1 (11) */ |
||||
- NID_sect409r1, /* sect409r1 (12) */ |
||||
NID_secp384r1, /* secp384r1 (24) */ |
||||
- NID_sect283k1, /* sect283k1 (9) */ |
||||
- NID_sect283r1, /* sect283r1 (10) */ |
||||
- NID_secp256k1, /* secp256k1 (22) */ |
||||
NID_X9_62_prime256v1, /* secp256r1 (23) */ |
||||
- NID_sect239k1, /* sect239k1 (8) */ |
||||
- NID_sect233k1, /* sect233k1 (6) */ |
||||
- NID_sect233r1, /* sect233r1 (7) */ |
||||
- NID_secp224k1, /* secp224k1 (20) */ |
||||
- NID_secp224r1, /* secp224r1 (21) */ |
||||
- NID_sect193r1, /* sect193r1 (4) */ |
||||
- NID_sect193r2, /* sect193r2 (5) */ |
||||
- NID_secp192k1, /* secp192k1 (18) */ |
||||
- NID_X9_62_prime192v1, /* secp192r1 (19) */ |
||||
- NID_sect163k1, /* sect163k1 (1) */ |
||||
- NID_sect163r1, /* sect163r1 (2) */ |
||||
- NID_sect163r2, /* sect163r2 (3) */ |
||||
- NID_secp160k1, /* secp160k1 (15) */ |
||||
- NID_secp160r1, /* secp160r1 (16) */ |
||||
- NID_secp160r2, /* secp160r2 (17) */ |
||||
}; |
||||
|
||||
int tls1_ec_curve_id2nid(int curve_id) |
@ -0,0 +1,248 @@
@@ -0,0 +1,248 @@
|
||||
diff -up openssl-1.0.1e/apps/s_server.c.ecdh-auto openssl-1.0.1e/apps/s_server.c |
||||
--- openssl-1.0.1e/apps/s_server.c.ecdh-auto 2014-09-17 15:52:01.659445244 +0200 |
||||
+++ openssl-1.0.1e/apps/s_server.c 2014-09-17 16:24:44.378754502 +0200 |
||||
@@ -1708,7 +1708,7 @@ bad: |
||||
{ |
||||
EC_KEY *ecdh=NULL; |
||||
|
||||
- if (named_curve) |
||||
+ if (named_curve && strcmp(named_curve, "auto")) |
||||
{ |
||||
int nid = OBJ_sn2nid(named_curve); |
||||
|
||||
@@ -1731,6 +1731,8 @@ bad: |
||||
{ |
||||
BIO_printf(bio_s_out,"Setting temp ECDH parameters\n"); |
||||
} |
||||
+ else if (named_curve) |
||||
+ SSL_CTX_set_ecdh_auto(ctx, 1); |
||||
else |
||||
{ |
||||
BIO_printf(bio_s_out,"Using default temp ECDH parameters\n"); |
||||
diff -up openssl-1.0.1e/ssl/ssl_cert.c.ecdh-auto openssl-1.0.1e/ssl/ssl_cert.c |
||||
--- openssl-1.0.1e/ssl/ssl_cert.c.ecdh-auto 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/ssl_cert.c 2014-09-17 16:20:24.355884360 +0200 |
||||
@@ -270,6 +270,7 @@ CERT *ssl_cert_dup(CERT *cert) |
||||
} |
||||
} |
||||
ret->ecdh_tmp_cb = cert->ecdh_tmp_cb; |
||||
+ ret->ecdh_tmp_auto = cert->ecdh_tmp_auto; |
||||
#endif |
||||
|
||||
for (i = 0; i < SSL_PKEY_NUM; i++) |
||||
diff -up openssl-1.0.1e/ssl/ssl.h.ecdh-auto openssl-1.0.1e/ssl/ssl.h |
||||
--- openssl-1.0.1e/ssl/ssl.h.ecdh-auto 2014-09-17 16:20:24.354884336 +0200 |
||||
+++ openssl-1.0.1e/ssl/ssl.h 2014-09-17 16:49:29.135273514 +0200 |
||||
@@ -1563,6 +1563,7 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) |
||||
#define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 |
||||
#define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 |
||||
|
||||
+#define SSL_CTRL_SET_ECDH_AUTO 94 |
||||
#define SSL_CTRL_GET_SERVER_TMP_KEY 109 |
||||
|
||||
#define DTLSv1_get_timeout(ssl, arg) \ |
||||
@@ -1606,6 +1607,11 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) |
||||
#define SSL_CTX_clear_extra_chain_certs(ctx) \ |
||||
SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) |
||||
|
||||
+#define SSL_CTX_set_ecdh_auto(ctx, onoff) \ |
||||
+ SSL_CTX_ctrl(ctx,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) |
||||
+#define SSL_set_ecdh_auto(s, onoff) \ |
||||
+ SSL_ctrl(s,SSL_CTRL_SET_ECDH_AUTO,onoff,NULL) |
||||
+ |
||||
#define SSL_get_server_tmp_key(s, pk) \ |
||||
SSL_ctrl(s,SSL_CTRL_GET_SERVER_TMP_KEY,0,pk) |
||||
|
||||
diff -up openssl-1.0.1e/ssl/ssl_lib.c.ecdh-auto openssl-1.0.1e/ssl/ssl_lib.c |
||||
--- openssl-1.0.1e/ssl/ssl_lib.c.ecdh-auto 2014-09-17 15:52:01.616444274 +0200 |
||||
+++ openssl-1.0.1e/ssl/ssl_lib.c 2014-09-17 16:20:24.356884383 +0200 |
||||
@@ -2045,7 +2045,7 @@ void ssl_set_cert_masks(CERT *c, const S |
||||
#endif |
||||
|
||||
#ifndef OPENSSL_NO_ECDH |
||||
- have_ecdh_tmp=(c->ecdh_tmp != NULL || c->ecdh_tmp_cb != NULL); |
||||
+ have_ecdh_tmp=(c->ecdh_tmp || c->ecdh_tmp_cb || c->ecdh_tmp_auto); |
||||
#endif |
||||
cpk= &(c->pkeys[SSL_PKEY_RSA_ENC]); |
||||
rsa_enc= (cpk->x509 != NULL && cpk->privatekey != NULL); |
||||
diff -up openssl-1.0.1e/ssl/ssl_locl.h.ecdh-auto openssl-1.0.1e/ssl/ssl_locl.h |
||||
--- openssl-1.0.1e/ssl/ssl_locl.h.ecdh-auto 2014-09-17 15:52:01.632444635 +0200 |
||||
+++ openssl-1.0.1e/ssl/ssl_locl.h 2014-09-17 17:26:29.764405189 +0200 |
||||
@@ -511,6 +511,8 @@ typedef struct cert_st |
||||
EC_KEY *ecdh_tmp; |
||||
/* Callback for generating ephemeral ECDH keys */ |
||||
EC_KEY *(*ecdh_tmp_cb)(SSL *ssl,int is_export,int keysize); |
||||
+ /* Select ECDH parameters automatically */ |
||||
+ int ecdh_tmp_auto; |
||||
#endif |
||||
|
||||
CERT_PKEY pkeys[SSL_PKEY_NUM]; |
||||
@@ -1091,6 +1093,7 @@ SSL_COMP *ssl3_comp_find(STACK_OF(SSL_CO |
||||
#ifndef OPENSSL_NO_EC |
||||
int tls1_ec_curve_id2nid(int curve_id); |
||||
int tls1_ec_nid2curve_id(int nid); |
||||
+int tls1_shared_curve(SSL *s, int nmatch); |
||||
#endif /* OPENSSL_NO_EC */ |
||||
|
||||
#ifndef OPENSSL_NO_TLSEXT |
||||
diff -up openssl-1.0.1e/ssl/s3_lib.c.ecdh-auto openssl-1.0.1e/ssl/s3_lib.c |
||||
--- openssl-1.0.1e/ssl/s3_lib.c.ecdh-auto 2014-09-17 16:20:24.352884288 +0200 |
||||
+++ openssl-1.0.1e/ssl/s3_lib.c 2014-09-17 17:37:26.274226185 +0200 |
||||
@@ -3350,6 +3350,12 @@ long ssl3_ctrl(SSL *s, int cmd, long lar |
||||
#endif |
||||
|
||||
#endif /* !OPENSSL_NO_TLSEXT */ |
||||
+ |
||||
+#ifndef OPENSSL_NO_EC |
||||
+ case SSL_CTRL_SET_ECDH_AUTO: |
||||
+ s->cert->ecdh_tmp_auto = larg; |
||||
+ return 1; |
||||
+#endif |
||||
case SSL_CTRL_GET_SERVER_TMP_KEY: |
||||
if (s->server || !s->session || !s->session->sess_cert) |
||||
return 0; |
||||
@@ -3651,6 +3657,12 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd |
||||
ctx->srp_ctx.strength=larg; |
||||
break; |
||||
#endif |
||||
+ |
||||
+#ifndef OPENSSL_NO_EC |
||||
+ case SSL_CTRL_SET_ECDH_AUTO: |
||||
+ ctx->cert->ecdh_tmp_auto = larg; |
||||
+ return 1; |
||||
+#endif |
||||
#endif /* !OPENSSL_NO_TLSEXT */ |
||||
|
||||
/* A Thawte special :-) */ |
||||
@@ -4003,6 +4015,14 @@ SSL_CIPHER *ssl3_choose_cipher(SSL *s, S |
||||
if ( |
||||
/* if we are considering an ECC cipher suite that uses an ephemeral EC key */ |
||||
(alg_k & SSL_kEECDH) |
||||
+ && (s->cert->ecdh_tmp_auto) |
||||
+ ) |
||||
+ { |
||||
+ ok = ok && tls1_shared_curve(s, 0); |
||||
+ } |
||||
+ else if ( |
||||
+ /* if we are considering an ECC cipher suite that uses an ephemeral EC key */ |
||||
+ (alg_k & SSL_kEECDH) |
||||
/* and we have an ephemeral EC key */ |
||||
&& (s->cert->ecdh_tmp != NULL) |
||||
/* and the client specified an EllipticCurves extension */ |
||||
diff -up openssl-1.0.1e/ssl/s3_srvr.c.ecdh-auto openssl-1.0.1e/ssl/s3_srvr.c |
||||
--- openssl-1.0.1e/ssl/s3_srvr.c.ecdh-auto 2014-09-17 15:52:01.644444906 +0200 |
||||
+++ openssl-1.0.1e/ssl/s3_srvr.c 2014-09-17 16:20:24.353884312 +0200 |
||||
@@ -1693,7 +1693,14 @@ int ssl3_send_server_key_exchange(SSL *s |
||||
const EC_GROUP *group; |
||||
|
||||
ecdhp=cert->ecdh_tmp; |
||||
- if ((ecdhp == NULL) && (s->cert->ecdh_tmp_cb != NULL)) |
||||
+ if (s->cert->ecdh_tmp_auto) |
||||
+ { |
||||
+ /* Get NID of first shared curve */ |
||||
+ int nid = tls1_shared_curve(s, 0); |
||||
+ if (nid != NID_undef) |
||||
+ ecdhp = EC_KEY_new_by_curve_name(nid); |
||||
+ } |
||||
+ else if ((ecdhp == NULL) && s->cert->ecdh_tmp_cb) |
||||
{ |
||||
ecdhp=s->cert->ecdh_tmp_cb(s, |
||||
SSL_C_IS_EXPORT(s->s3->tmp.new_cipher), |
||||
@@ -1718,7 +1725,9 @@ int ssl3_send_server_key_exchange(SSL *s |
||||
SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB); |
||||
goto err; |
||||
} |
||||
- if ((ecdh = EC_KEY_dup(ecdhp)) == NULL) |
||||
+ if (s->cert->ecdh_tmp_auto) |
||||
+ ecdh = ecdhp; |
||||
+ else if ((ecdh = EC_KEY_dup(ecdhp)) == NULL) |
||||
{ |
||||
SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB); |
||||
goto err; |
||||
diff -up openssl-1.0.1e/ssl/t1_lib.c.ecdh-auto openssl-1.0.1e/ssl/t1_lib.c |
||||
--- openssl-1.0.1e/ssl/t1_lib.c.ecdh-auto 2014-09-17 16:20:24.358884427 +0200 |
||||
+++ openssl-1.0.1e/ssl/t1_lib.c 2014-09-17 17:32:04.054951942 +0200 |
||||
@@ -202,6 +202,13 @@ static int nid_list[] = |
||||
NID_secp521r1 /* secp521r1 (25) */ |
||||
}; |
||||
|
||||
+static const unsigned char eccurves_default[] = |
||||
+ { |
||||
+ 0,23, /* secp256r1 (23) */ |
||||
+ 0,24, /* secp384r1 (24) */ |
||||
+ 0,25, /* secp521r1 (25) */ |
||||
+ }; |
||||
+ |
||||
static int pref_list[] = |
||||
{ |
||||
NID_secp521r1, /* secp521r1 (25) */ |
||||
@@ -277,6 +284,69 @@ int tls1_ec_nid2curve_id(int nid) |
||||
return 0; |
||||
} |
||||
} |
||||
+/* Get curves list, if "sess" is set return client curves otherwise |
||||
+ * preferred list |
||||
+ */ |
||||
+static void tls1_get_curvelist(SSL *s, int sess, |
||||
+ const unsigned char **pcurves, |
||||
+ size_t *pcurveslen) |
||||
+ { |
||||
+ if (sess) |
||||
+ { |
||||
+ *pcurves = s->session->tlsext_ellipticcurvelist; |
||||
+ *pcurveslen = s->session->tlsext_ellipticcurvelist_length; |
||||
+ } |
||||
+ else |
||||
+ { |
||||
+ *pcurves = s->tlsext_ellipticcurvelist; |
||||
+ *pcurveslen = s->tlsext_ellipticcurvelist_length; |
||||
+ } |
||||
+ if (!*pcurves) |
||||
+ { |
||||
+ *pcurves = eccurves_default; |
||||
+ *pcurveslen = sizeof(eccurves_default); |
||||
+ } |
||||
+ } |
||||
+/* Return nth shared curve. If nmatch == -1 return number of |
||||
+ * matches. |
||||
+ */ |
||||
+ |
||||
+int tls1_shared_curve(SSL *s, int nmatch) |
||||
+ { |
||||
+ const unsigned char *pref, *supp; |
||||
+ size_t preflen, supplen, i, j; |
||||
+ int k; |
||||
+ /* Can't do anything on client side */ |
||||
+ if (s->server == 0) |
||||
+ return -1; |
||||
+ tls1_get_curvelist(s, !!(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE), |
||||
+ &supp, &supplen); |
||||
+ tls1_get_curvelist(s, !(s->options & SSL_OP_CIPHER_SERVER_PREFERENCE), |
||||
+ &pref, &preflen); |
||||
+ preflen /= 2; |
||||
+ supplen /= 2; |
||||
+ k = 0; |
||||
+ for (i = 0; i < preflen; i++, pref+=2) |
||||
+ { |
||||
+ const unsigned char *tsupp = supp; |
||||
+ for (j = 0; j < supplen; j++, tsupp+=2) |
||||
+ { |
||||
+ if (pref[0] == tsupp[0] && pref[1] == tsupp[1]) |
||||
+ { |
||||
+ if (nmatch == k) |
||||
+ { |
||||
+ int id = (pref[0] << 8) | pref[1]; |
||||
+ return tls1_ec_curve_id2nid(id); |
||||
+ } |
||||
+ k++; |
||||
+ } |
||||
+ } |
||||
+ } |
||||
+ if (nmatch == -1) |
||||
+ return k; |
||||
+ return 0; |
||||
+ } |
||||
+ |
||||
#endif /* OPENSSL_NO_EC */ |
||||
|
||||
#ifndef OPENSSL_NO_TLSEXT |
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
diff -up openssl-1.0.1e/crypto/evp/bio_enc.c.enc-fail openssl-1.0.1e/crypto/evp/bio_enc.c |
||||
--- openssl-1.0.1e/crypto/evp/bio_enc.c.enc-fail 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/crypto/evp/bio_enc.c 2014-03-04 15:21:12.185821738 +0100 |
||||
@@ -198,10 +198,15 @@ static int enc_read(BIO *b, char *out, i |
||||
} |
||||
else |
||||
{ |
||||
- EVP_CipherUpdate(&(ctx->cipher), |
||||
+ if (!EVP_CipherUpdate(&(ctx->cipher), |
||||
(unsigned char *)ctx->buf,&ctx->buf_len, |
||||
- (unsigned char *)&(ctx->buf[BUF_OFFSET]),i); |
||||
- ctx->cont=1; |
||||
+ (unsigned char *)&(ctx->buf[BUF_OFFSET]),i)) |
||||
+ { |
||||
+ ctx->ok = 0; |
||||
+ ctx->cont = 0; |
||||
+ } |
||||
+ else |
||||
+ ctx->cont=1; |
||||
/* Note: it is possible for EVP_CipherUpdate to |
||||
* decrypt zero bytes because this is or looks like |
||||
* the final block: if this happens we should retry |
||||
@@ -257,9 +262,14 @@ static int enc_write(BIO *b, const char |
||||
while (inl > 0) |
||||
{ |
||||
n=(inl > ENC_BLOCK_SIZE)?ENC_BLOCK_SIZE:inl; |
||||
- EVP_CipherUpdate(&(ctx->cipher), |
||||
+ if (!EVP_CipherUpdate(&(ctx->cipher), |
||||
(unsigned char *)ctx->buf,&ctx->buf_len, |
||||
- (unsigned char *)in,n); |
||||
+ (unsigned char *)in,n)) |
||||
+ { |
||||
+ BIO_copy_next_retry(b); |
||||
+ ctx->ok = 0; |
||||
+ return ret - inl; |
||||
+ } |
||||
inl-=n; |
||||
in+=n; |
||||
|
@ -0,0 +1,38 @@
@@ -0,0 +1,38 @@
|
||||
diff -up openssl-1.0.1e/doc/ssl/SSL_COMP_add_compression_method.pod.env-zlib openssl-1.0.1e/doc/ssl/SSL_COMP_add_compression_method.pod |
||||
--- openssl-1.0.1e/doc/ssl/SSL_COMP_add_compression_method.pod.env-zlib 2013-02-11 16:02:48.000000000 +0100 |
||||
+++ openssl-1.0.1e/doc/ssl/SSL_COMP_add_compression_method.pod 2013-02-19 16:32:51.000000000 +0100 |
||||
@@ -47,6 +47,13 @@ Once the identities of the compression m |
||||
been standardized, the compression API will most likely be changed. Using |
||||
it in the current state is not recommended. |
||||
|
||||
+It is also not recommended to use compression if data transfered contain |
||||
+untrusted parts that can be manipulated by an attacker as he could then |
||||
+get information about the encrypted data. See the CRIME attack. For |
||||
+that reason the default loading of the zlib compression method is |
||||
+disabled and enabled only if the environment variable B<OPENSSL_DEFAULT_ZLIB> |
||||
+is present during the library initialization. |
||||
+ |
||||
=head1 RETURN VALUES |
||||
|
||||
SSL_COMP_add_compression_method() may return the following values: |
||||
diff -up openssl-1.0.1e/ssl/ssl_ciph.c.env-zlib openssl-1.0.1e/ssl/ssl_ciph.c |
||||
--- openssl-1.0.1e/ssl/ssl_ciph.c.env-zlib 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/ssl/ssl_ciph.c 2013-02-19 16:37:36.163545085 +0100 |
||||
@@ -140,6 +140,8 @@ |
||||
* OTHERWISE. |
||||
*/ |
||||
|
||||
+/* for secure_getenv */ |
||||
+#define _GNU_SOURCE |
||||
#include <stdio.h> |
||||
#include <openssl/objects.h> |
||||
#ifndef OPENSSL_NO_COMP |
||||
@@ -455,7 +457,7 @@ static void load_builtin_compressions(vo |
||||
|
||||
MemCheck_off(); |
||||
ssl_comp_methods=sk_SSL_COMP_new(sk_comp_cmp); |
||||
- if (ssl_comp_methods != NULL) |
||||
+ if (ssl_comp_methods != NULL && secure_getenv("OPENSSL_DEFAULT_ZLIB") != NULL) |
||||
{ |
||||
comp=(SSL_COMP *)OPENSSL_malloc(sizeof(SSL_COMP)); |
||||
if (comp != NULL) |
@ -0,0 +1,135 @@
@@ -0,0 +1,135 @@
|
||||
diff -up openssl-1.0.1e/apps/s_apps.h.ephemeral openssl-1.0.1e/apps/s_apps.h |
||||
--- openssl-1.0.1e/apps/s_apps.h.ephemeral 2014-02-12 14:49:14.333513753 +0100 |
||||
+++ openssl-1.0.1e/apps/s_apps.h 2014-02-12 14:49:14.417515629 +0100 |
||||
@@ -156,6 +156,7 @@ int MS_CALLBACK verify_callback(int ok, |
||||
int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file); |
||||
int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key); |
||||
#endif |
||||
+int ssl_print_tmp_key(BIO *out, SSL *s); |
||||
int init_client(int *sock, char *server, char *port, int type); |
||||
int should_retry(int i); |
||||
int extract_host_port(char *str,char **host_ptr,char **port_ptr); |
||||
diff -up openssl-1.0.1e/apps/s_cb.c.ephemeral openssl-1.0.1e/apps/s_cb.c |
||||
--- openssl-1.0.1e/apps/s_cb.c.ephemeral 2013-02-11 16:26:04.000000000 +0100 |
||||
+++ openssl-1.0.1e/apps/s_cb.c 2014-02-12 14:56:25.584142499 +0100 |
||||
@@ -338,6 +338,38 @@ void MS_CALLBACK apps_ssl_info_callback( |
||||
} |
||||
} |
||||
|
||||
+int ssl_print_tmp_key(BIO *out, SSL *s) |
||||
+ { |
||||
+ EVP_PKEY *key; |
||||
+ if (!SSL_get_server_tmp_key(s, &key)) |
||||
+ return 1; |
||||
+ BIO_puts(out, "Server Temp Key: "); |
||||
+ switch (EVP_PKEY_id(key)) |
||||
+ { |
||||
+ case EVP_PKEY_RSA: |
||||
+ BIO_printf(out, "RSA, %d bits\n", EVP_PKEY_bits(key)); |
||||
+ break; |
||||
+ |
||||
+ case EVP_PKEY_DH: |
||||
+ BIO_printf(out, "DH, %d bits\n", EVP_PKEY_bits(key)); |
||||
+ break; |
||||
+ |
||||
+ case EVP_PKEY_EC: |
||||
+ { |
||||
+ EC_KEY *ec = EVP_PKEY_get1_EC_KEY(key); |
||||
+ int nid; |
||||
+ const char *cname; |
||||
+ nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec)); |
||||
+ EC_KEY_free(ec); |
||||
+ cname = OBJ_nid2sn(nid); |
||||
+ BIO_printf(out, "ECDH, %s, %d bits\n", |
||||
+ cname, EVP_PKEY_bits(key)); |
||||
+ } |
||||
+ } |
||||
+ EVP_PKEY_free(key); |
||||
+ return 1; |
||||
+ } |
||||
+ |
||||
|
||||
void MS_CALLBACK msg_cb(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg) |
||||
{ |
||||
diff -up openssl-1.0.1e/apps/s_client.c.ephemeral openssl-1.0.1e/apps/s_client.c |
||||
--- openssl-1.0.1e/apps/s_client.c.ephemeral 2014-02-12 14:49:14.407515406 +0100 |
||||
+++ openssl-1.0.1e/apps/s_client.c 2014-02-12 14:49:14.418515652 +0100 |
||||
@@ -2032,6 +2032,8 @@ static void print_stuff(BIO *bio, SSL *s |
||||
BIO_write(bio,"\n",1); |
||||
} |
||||
|
||||
+ ssl_print_tmp_key(bio, s); |
||||
+ |
||||
BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n", |
||||
BIO_number_read(SSL_get_rbio(s)), |
||||
BIO_number_written(SSL_get_wbio(s))); |
||||
diff -up openssl-1.0.1e/ssl/ssl.h.ephemeral openssl-1.0.1e/ssl/ssl.h |
||||
--- openssl-1.0.1e/ssl/ssl.h.ephemeral 2014-02-12 14:49:14.391515049 +0100 |
||||
+++ openssl-1.0.1e/ssl/ssl.h 2014-02-12 14:49:14.418515652 +0100 |
||||
@@ -1563,6 +1563,8 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) |
||||
#define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 |
||||
#define SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS 83 |
||||
|
||||
+#define SSL_CTRL_GET_SERVER_TMP_KEY 109 |
||||
+ |
||||
#define DTLSv1_get_timeout(ssl, arg) \ |
||||
SSL_ctrl(ssl,DTLS_CTRL_GET_TIMEOUT,0, (void *)arg) |
||||
#define DTLSv1_handle_timeout(ssl) \ |
||||
@@ -1604,6 +1606,9 @@ DECLARE_PEM_rw(SSL_SESSION, SSL_SESSION) |
||||
#define SSL_CTX_clear_extra_chain_certs(ctx) \ |
||||
SSL_CTX_ctrl(ctx,SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS,0,NULL) |
||||
|
||||
+#define SSL_get_server_tmp_key(s, pk) \ |
||||
+ SSL_ctrl(s,SSL_CTRL_GET_SERVER_TMP_KEY,0,pk) |
||||
+ |
||||
#ifndef OPENSSL_NO_BIO |
||||
BIO_METHOD *BIO_f_ssl(void); |
||||
BIO *BIO_new_ssl(SSL_CTX *ctx,int client); |
||||
diff -up openssl-1.0.1e/ssl/s3_lib.c.ephemeral openssl-1.0.1e/ssl/s3_lib.c |
||||
--- openssl-1.0.1e/ssl/s3_lib.c.ephemeral 2014-02-12 14:49:14.412515518 +0100 |
||||
+++ openssl-1.0.1e/ssl/s3_lib.c 2014-02-12 14:49:14.418515652 +0100 |
||||
@@ -3350,6 +3350,44 @@ long ssl3_ctrl(SSL *s, int cmd, long lar |
||||
#endif |
||||
|
||||
#endif /* !OPENSSL_NO_TLSEXT */ |
||||
+ case SSL_CTRL_GET_SERVER_TMP_KEY: |
||||
+ if (s->server || !s->session || !s->session->sess_cert) |
||||
+ return 0; |
||||
+ else |
||||
+ { |
||||
+ SESS_CERT *sc; |
||||
+ EVP_PKEY *ptmp; |
||||
+ int rv = 0; |
||||
+ sc = s->session->sess_cert; |
||||
+#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DH) && !defined(OPENSSL_NO_EC) |
||||
+ if (!sc->peer_rsa_tmp && !sc->peer_dh_tmp |
||||
+ && !sc->peer_ecdh_tmp) |
||||
+ return 0; |
||||
+#endif |
||||
+ ptmp = EVP_PKEY_new(); |
||||
+ if (!ptmp) |
||||
+ return 0; |
||||
+ if (0); |
||||
+#ifndef OPENSSL_NO_RSA |
||||
+ else if (sc->peer_rsa_tmp) |
||||
+ rv = EVP_PKEY_set1_RSA(ptmp, sc->peer_rsa_tmp); |
||||
+#endif |
||||
+#ifndef OPENSSL_NO_DH |
||||
+ else if (sc->peer_dh_tmp) |
||||
+ rv = EVP_PKEY_set1_DH(ptmp, sc->peer_dh_tmp); |
||||
+#endif |
||||
+#ifndef OPENSSL_NO_ECDH |
||||
+ else if (sc->peer_ecdh_tmp) |
||||
+ rv = EVP_PKEY_set1_EC_KEY(ptmp, sc->peer_ecdh_tmp); |
||||
+#endif |
||||
+ if (rv) |
||||
+ { |
||||
+ *(EVP_PKEY **)parg = ptmp; |
||||
+ return 1; |
||||
+ } |
||||
+ EVP_PKEY_free(ptmp); |
||||
+ return 0; |
||||
+ } |
||||
default: |
||||
break; |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue