Latest update.

This commit is contained in:
2020-05-17 20:27:18 +09:00
parent ad9fce94c2
commit 3a6d64bb68
619 changed files with 13638 additions and 4698 deletions
-1
View File
@@ -3,6 +3,5 @@ Acknowlegements
Please see our [Thanks!][] page for the current acknowledgements. Please see our [Thanks!][] page for the current acknowledgements.
[Thanks!]: https://www.openssl.org/community/thanks.html [Thanks!]: https://www.openssl.org/community/thanks.html
+28 -30
View File
@@ -7,40 +7,38 @@ since in some cases, their employer may be the copyright holder.
To see the full list of contributors, see the revision history in To see the full list of contributors, see the revision history in
source control. source control.
Groups Groups
------ ------
* OpenSSL Software Services, Inc. * OpenSSL Software Services, Inc.
* OpenSSL Software Foundation, Inc. * OpenSSL Software Foundation, Inc.
Individuals Individuals
----------- -----------
* Andy Polyakov * Andy Polyakov
* Ben Laurie * Ben Laurie
* Ben Kaduk * Ben Kaduk
* Bernd Edlinger * Bernd Edlinger
* Bodo Möller * Bodo Möller
* David Benjamin * David Benjamin
* Emilia Käsper * Emilia Käsper
* Eric Young * Eric Young
* Geoff Thorpe * Geoff Thorpe
* Holger Reif * Holger Reif
* Kurt Roeckx * Kurt Roeckx
* Lutz Jänicke * Lutz Jänicke
* Mark J. Cox * Mark J. Cox
* Matt Caswell * Matt Caswell
* Matthias St. Pierre * Matthias St. Pierre
* Nils Larsch * Nils Larsch
* Paul Dale * Paul Dale
* Paul C. Sutton * Paul C. Sutton
* Ralf S. Engelschall * Ralf S. Engelschall
* Rich Salz * Rich Salz
* Richard Levitte * Richard Levitte
* Stephen Henson * Stephen Henson
* Steve Marquess * Steve Marquess
* Tim Hudson * Tim Hudson
* Ulf Möller * Ulf Möller
* Viktor Dukhovni * Viktor Dukhovni
+476 -506
View File
@@ -7,7 +7,6 @@ pick the appropriate release branch.
[log]: https://github.com/openssl/openssl/commits/ [log]: https://github.com/openssl/openssl/commits/
OpenSSL Releases OpenSSL Releases
---------------- ----------------
@@ -22,7 +21,19 @@ OpenSSL Releases
OpenSSL 3.0 OpenSSL 3.0
----------- -----------
### Changes between 1.1.1 and 3.0 [xx XXX xxxx] ### ### Changes between 1.1.1 and 3.0 [xx XXX xxxx]
* Deprecated EC_POINTs_mul(). This function is not widely used and applications
should instead use the L<EC_POINT_mul(3)> function.
*Billy Bob Brumley*
* Removed FIPS_mode() and FIPS_mode_set(). These functions are legacy API's
that are not applicable to the new provider model. Applications should
instead use EVP_default_properties_is_fips_enabled() and
EVP_default_properties_enable_fips().
*Shane Lontis*
* Deprecated EC_POINT_set_Jprojective_coordinates_GFp() and * Deprecated EC_POINT_set_Jprojective_coordinates_GFp() and
EC_POINT_get_Jprojective_coordinates_GFp(). These functions are not widely EC_POINT_get_Jprojective_coordinates_GFp(). These functions are not widely
@@ -80,7 +91,6 @@ OpenSSL 3.0
*Matthias St. Pierre* *Matthias St. Pierre*
* The test suite is changed to preserve results of each test recipe. * The test suite is changed to preserve results of each test recipe.
A new directory test-runs/ with subdirectories named like the A new directory test-runs/ with subdirectories named like the
test recipes are created in the build tree for this purpose. test recipes are created in the build tree for this purpose.
@@ -88,10 +98,10 @@ OpenSSL 3.0
*Richard Levitte* *Richard Levitte*
* Added an implementation of CMP and CRMF (RFC 4210, RFC 4211 RFC 6712). * Added an implementation of CMP and CRMF (RFC 4210, RFC 4211 RFC 6712).
This adds crypto/cmp/, crpyto/crmf/, and test/cmp_*. This adds crypto/cmp/, crpyto/crmf/, apps/cmp.c, and test/cmp_*.
See L<OSSL_CMP_exec_IR_ses(3)> as starting point. See L<openssl-cmp(1)> and L<OSSL_CMP_exec_IR_ses(3)> as starting points.
*David von Oheimb* *David von Oheimb, Martin Peylo*
* Generalized the HTTP client code from crypto/ocsp/ into crpyto/http/. * Generalized the HTTP client code from crypto/ocsp/ into crpyto/http/.
The legacy OCSP-focused and only partly documented API is retained. The legacy OCSP-focused and only partly documented API is retained.
@@ -101,24 +111,22 @@ OpenSSL 3.0
* All of the low level RSA functions have been deprecated including: * All of the low level RSA functions have been deprecated including:
RSA_new_method, RSA_bits, RSA_size, RSA_security_bits, RSA_new_method, RSA_size, RSA_security_bits, RSA_get0_pss_params,
RSA_get0_pss_params, RSA_get_version, RSA_get0_engine, RSA_get_version, RSA_get0_engine, RSA_generate_key_ex,
RSA_generate_key_ex, RSA_generate_multi_prime_key, RSA_generate_multi_prime_key, RSA_X931_derive_ex, RSA_X931_generate_key_ex,
RSA_X931_derive_ex, RSA_X931_generate_key_ex, RSA_check_key, RSA_check_key, RSA_check_key_ex, RSA_public_encrypt, RSA_private_encrypt,
RSA_check_key_ex, RSA_public_encrypt, RSA_private_encrypt,
RSA_public_decrypt, RSA_private_decrypt, RSA_set_default_method, RSA_public_decrypt, RSA_private_decrypt, RSA_set_default_method,
RSA_get_default_method, RSA_null_method, RSA_get_method, RSA_set_method, RSA_get_default_method, RSA_null_method, RSA_get_method, RSA_set_method,
RSA_PKCS1_OpenSSL, RSA_print_fp, RSA_print, RSA_sign, RSA_verify, RSA_PKCS1_OpenSSL, RSA_print_fp, RSA_print, RSA_sign, RSA_verify,
RSA_sign_ASN1_OCTET_STRING, RSA_verify_ASN1_OCTET_STRING, RSA_sign_ASN1_OCTET_STRING, RSA_verify_ASN1_OCTET_STRING, RSA_blinding_on,
RSA_blinding_on, RSA_blinding_off, RSA_setup_blinding, RSA_blinding_off, RSA_setup_blinding, RSA_padding_add_PKCS1_type_1,
RSA_padding_add_PKCS1_type_1, RSA_padding_check_PKCS1_type_1, RSA_padding_check_PKCS1_type_1, RSA_padding_add_PKCS1_type_2,
RSA_padding_add_PKCS1_type_2, RSA_padding_check_PKCS1_type_2, RSA_padding_check_PKCS1_type_2, PKCS1_MGF1, RSA_padding_add_PKCS1_OAEP,
PKCS1_MGF1, RSA_padding_add_PKCS1_OAEP, RSA_padding_check_PKCS1_OAEP, RSA_padding_check_PKCS1_OAEP, RSA_padding_add_PKCS1_OAEP_mgf1,
RSA_padding_add_PKCS1_OAEP_mgf1, RSA_padding_check_PKCS1_OAEP_mgf1, RSA_padding_check_PKCS1_OAEP_mgf1, RSA_padding_add_SSLv23,
RSA_padding_add_SSLv23, RSA_padding_check_SSLv23, RSA_padding_check_SSLv23, RSA_padding_add_none, RSA_padding_check_none,
RSA_padding_add_none, RSA_padding_check_none, RSA_padding_add_X931, RSA_padding_add_X931, RSA_padding_check_X931, RSA_X931_hash_id,
RSA_padding_check_X931, RSA_X931_hash_id, RSA_verify_PKCS1_PSS, RSA_verify_PKCS1_PSS, RSA_padding_add_PKCS1_PSS, RSA_verify_PKCS1_PSS_mgf1,
RSA_padding_add_PKCS1_PSS, RSA_verify_PKCS1_PSS_mgf1,
RSA_padding_add_PKCS1_PSS_mgf1, RSA_set_ex_data, RSA_get_ex_data, RSA_padding_add_PKCS1_PSS_mgf1, RSA_set_ex_data, RSA_get_ex_data,
RSA_meth_new, RSA_meth_free, RSA_meth_dup, RSA_meth_get0_name, RSA_meth_new, RSA_meth_free, RSA_meth_dup, RSA_meth_get0_name,
RSA_meth_set1_name, RSA_meth_get_flags, RSA_meth_set_flags, RSA_meth_set1_name, RSA_meth_get_flags, RSA_meth_set_flags,
@@ -171,20 +179,19 @@ OpenSSL 3.0
* All of the low level DH functions have been deprecated including: * All of the low level DH functions have been deprecated including:
DH_OpenSSL, DH_set_default_method, DH_get_default_method, DH_OpenSSL, DH_set_default_method, DH_get_default_method, DH_set_method,
DH_set_method, DH_new_method, DH_bits, DH_size, DH_security_bits, DH_new_method, DH_size, DH_security_bits, DH_get_ex_new_index,
DH_get_ex_new_index, DH_set_ex_data, DH_get_ex_data, DH_set_ex_data, DH_get_ex_data, DH_generate_parameters_ex,
DH_generate_parameters_ex, DH_check_params_ex, DH_check_ex, DH_check_params_ex, DH_check_ex, DH_check_pub_key_ex,
DH_check_pub_key_ex, DH_check, DH_check_pub_key, DH_generate_key, DH_check, DH_check_pub_key, DH_generate_key, DH_compute_key,
DH_compute_key, DH_compute_key_padded, DHparams_print_fp, DH_compute_key_padded, DHparams_print_fp, DHparams_print, DH_get_nid,
DHparams_print, DH_get_nid, DH_KDF_X9_42, DH_get0_engine, DH_meth_new, DH_KDF_X9_42, DH_get0_engine, DH_meth_new, DH_meth_free, DH_meth_dup,
DH_meth_free, DH_meth_dup, DH_meth_get0_name, DH_meth_set1_name, DH_meth_get0_name, DH_meth_set1_name, DH_meth_get_flags, DH_meth_set_flags,
DH_meth_get_flags, DH_meth_set_flags, DH_meth_get0_app_data, DH_meth_get0_app_data, DH_meth_set0_app_data, DH_meth_get_generate_key,
DH_meth_set0_app_data, DH_meth_get_generate_key, DH_meth_set_generate_key, DH_meth_set_generate_key, DH_meth_get_compute_key, DH_meth_set_compute_key,
DH_meth_get_compute_key, DH_meth_set_compute_key, DH_meth_get_bn_mod_exp, DH_meth_get_bn_mod_exp, DH_meth_set_bn_mod_exp, DH_meth_get_init,
DH_meth_set_bn_mod_exp, DH_meth_get_init, DH_meth_set_init, DH_meth_set_init, DH_meth_get_finish, DH_meth_set_finish,
DH_meth_get_finish, DH_meth_set_finish, DH_meth_get_generate_params DH_meth_get_generate_params and DH_meth_set_generate_params.
and DH_meth_set_generate_params.
Use of these low level functions has been informally discouraged for a long Use of these low level functions has been informally discouraged for a long
time. Instead applications should use L<EVP_PKEY_derive_init(3)> time. Instead applications should use L<EVP_PKEY_derive_init(3)>
@@ -195,18 +202,19 @@ OpenSSL 3.0
* All of the low level DSA functions have been deprecated including: * All of the low level DSA functions have been deprecated including:
DSA_do_sign, DSA_do_verify, DSA_OpenSSL, DSA_set_default_method, DSA_do_sign, DSA_do_verify, DSA_OpenSSL, DSA_set_default_method,
DSA_get_default_method, DSA_set_method, DSA_get_method, DSA_new_method, DSA_get_default_method, DSA_set_method, DSA_get_method,
DSA_sign_setup, DSA_sign, DSA_verify, DSA_get_ex_new_index, DSA_new_method, DSA_size, DSA_security_bits, DSA_sign_setup, DSA_sign,
DSA_set_ex_data, DSA_get_ex_data, DSA_generate_parameters_ex, DSA_verify, DSA_get_ex_new_index, DSA_set_ex_data, DSA_get_ex_data,
DSA_generate_key, DSA_meth_new, DSA_get0_engine, DSA_meth_free, DSA_generate_parameters_ex, DSA_generate_key, DSA_meth_new, DSA_get0_engine,
DSA_meth_dup, DSA_meth_get0_name, DSA_meth_set1_name, DSA_meth_get_flags, DSA_meth_free, DSA_meth_dup, DSA_meth_get0_name, DSA_meth_set1_name,
DSA_meth_set_flags, DSA_meth_get0_app_data, DSA_meth_set0_app_data, DSA_meth_get_flags, DSA_meth_set_flags, DSA_meth_get0_app_data,
DSA_meth_get_sign, DSA_meth_set_sign, DSA_meth_get_sign_setup, DSA_meth_set0_app_data, DSA_meth_get_sign, DSA_meth_set_sign,
DSA_meth_set_sign_setup, DSA_meth_get_verify, DSA_meth_set_verify, DSA_meth_get_sign_setup, DSA_meth_set_sign_setup, DSA_meth_get_verify,
DSA_meth_get_mod_exp, DSA_meth_set_mod_exp, DSA_meth_get_bn_mod_exp, DSA_meth_set_verify, DSA_meth_get_mod_exp, DSA_meth_set_mod_exp,
DSA_meth_set_bn_mod_exp, DSA_meth_get_init, DSA_meth_set_init, DSA_meth_get_bn_mod_exp, DSA_meth_set_bn_mod_exp, DSA_meth_get_init,
DSA_meth_get_finish, DSA_meth_set_finish, DSA_meth_get_paramgen, DSA_meth_set_init, DSA_meth_get_finish, DSA_meth_set_finish,
DSA_meth_set_paramgen, DSA_meth_get_keygen and DSA_meth_set_keygen. DSA_meth_get_paramgen, DSA_meth_set_paramgen, DSA_meth_get_keygen and
DSA_meth_set_keygen.
Use of these low level functions has been informally discouraged for a long Use of these low level functions has been informally discouraged for a long
time. Instead applications should use L<EVP_DigestSignInit_ex(3)>, time. Instead applications should use L<EVP_DigestSignInit_ex(3)>,
@@ -330,7 +338,7 @@ OpenSSL 3.0
*Paul Dale* *Paul Dale*
* Corrected the documentation of the return values from the EVP_DigestSign* * Corrected the documentation of the return values from the `EVP_DigestSign*`
set of functions. The documentation mentioned negative values for some set of functions. The documentation mentioned negative values for some
errors, but this was never the case, so the mention of negative values errors, but this was never the case, so the mention of negative values
was removed. was removed.
@@ -418,6 +426,11 @@ OpenSSL 3.0
*Rich Salz* *Rich Salz*
* Added documentation for the STACK API. OpenSSL only defines the STACK
functions where they are used.
*Rich Salz*
* Introduced a new method type and API, OSSL_SERIALIZER, to * Introduced a new method type and API, OSSL_SERIALIZER, to
represent generic serializers. An implementation is expected to represent generic serializers. An implementation is expected to
be able to serialize an object associated with a given name (such be able to serialize an object associated with a given name (such
@@ -579,7 +592,6 @@ OpenSSL 3.0
$ mms /macro=(VF=1) test ! OpenVMS $ mms /macro=(VF=1) test ! OpenVMS
$ nmake VF=1 test # Windows $ nmake VF=1 test # Windows
*Richard Levitte* *Richard Levitte*
* For built-in EC curves, ensure an EC_GROUP built from the curve name is * For built-in EC curves, ensure an EC_GROUP built from the curve name is
@@ -631,7 +643,7 @@ OpenSSL 3.0
when primes for RSA keys are computed. when primes for RSA keys are computed.
Since we previously always generated primes == 2 (mod 3) for RSA keys, Since we previously always generated primes == 2 (mod 3) for RSA keys,
the 2-prime and 3-prime RSA modules were easy to distinguish, since the 2-prime and 3-prime RSA modules were easy to distinguish, since
N = p*q = 1 (mod 3), but N = p*q*r = 2 (mod 3). Therefore fingerprinting `N = p*q = 1 (mod 3)`, but `N = p*q*r = 2 (mod 3)`. Therefore fingerprinting
2-prime vs. 3-prime RSA keys was possible by computing N mod 3. 2-prime vs. 3-prime RSA keys was possible by computing N mod 3.
This avoids possible fingerprinting of newly generated RSA modules. This avoids possible fingerprinting of newly generated RSA modules.
@@ -682,7 +694,7 @@ OpenSSL 3.0
*Paul Dale* *Paul Dale*
* {CRYPTO,OPENSSL}_mem_debug_{push,pop} are now no-ops and have been * `{CRYPTO,OPENSSL}_mem_debug_{push,pop}` are now no-ops and have been
deprecated. deprecated.
*Rich Salz* *Rich Salz*
@@ -797,7 +809,7 @@ OpenSSL 3.0
*Paul Dale* *Paul Dale*
* Added newline escaping functionality to a filename when using openssl dgst. * Added newline escaping functionality to a filename when using openssl dgst.
This output format is to replicate the output format found in the '*sum' This output format is to replicate the output format found in the `*sum`
checksum programs. This aims to preserve backward compatibility. checksum programs. This aims to preserve backward compatibility.
*Matt Eaton, Richard Levitte, and Paul Dale* *Matt Eaton, Richard Levitte, and Paul Dale*
@@ -957,7 +969,7 @@ OpenSSL 3.0
the attacked described in "Efficient Instantiations of Tweakable the attacked described in "Efficient Instantiations of Tweakable
Blockciphers and Refinements to Modes OCB and PMAC" by Phillip Rogaway. Blockciphers and Refinements to Modes OCB and PMAC" by Phillip Rogaway.
Details of this attack can be obtained from: Details of this attack can be obtained from:
http://web.cs.ucdavis.edu/%7Erogaway/papers/offsets.pdf <http://web.cs.ucdavis.edu/%7Erogaway/papers/offsets.pdf>
*Paul Dale* *Paul Dale*
@@ -978,14 +990,12 @@ OpenSSL 3.0
*Boris Pismenny* *Boris Pismenny*
OpenSSL 1.1.1 OpenSSL 1.1.1
------------- -------------
### Changes between 1.1.1e and 1.1.1f [xx XXX xxxx] ### ### Changes between 1.1.1e and 1.1.1f [xx XXX xxxx]
### Changes between 1.1.1d and 1.1.1e [17 Mar 2020]
### Changes between 1.1.1d and 1.1.1e [17 Mar 2020] ###
* Properly detect EOF while reading in libssl. Previously if we hit an EOF * Properly detect EOF while reading in libssl. Previously if we hit an EOF
while reading in libssl then we would report an error back to the while reading in libssl then we would report an error back to the
@@ -1029,7 +1039,7 @@ OpenSSL 1.1.1
*Richard Levitte* *Richard Levitte*
* Added newline escaping functionality to a filename when using openssl dgst. * Added newline escaping functionality to a filename when using openssl dgst.
This output format is to replicate the output format found in the '*sum' This output format is to replicate the output format found in the `*sum`
checksum programs. This aims to preserve backward compatibility. checksum programs. This aims to preserve backward compatibility.
*Matt Eaton, Richard Levitte, and Paul Dale* *Matt Eaton, Richard Levitte, and Paul Dale*
@@ -1039,7 +1049,7 @@ OpenSSL 1.1.1
*Jon Spillett* *Jon Spillett*
### Changes between 1.1.1c and 1.1.1d [10 Sep 2019] ### ### Changes between 1.1.1c and 1.1.1d [10 Sep 2019]
* Fixed a fork protection issue. OpenSSL 1.1.1 introduced a rewritten random * Fixed a fork protection issue. OpenSSL 1.1.1 introduced a rewritten random
number generator (RNG). This was intended to include protection in the number generator (RNG). This was intended to include protection in the
@@ -1144,7 +1154,7 @@ OpenSSL 1.1.1
*Matthias St. Pierre* *Matthias St. Pierre*
### Changes between 1.1.1b and 1.1.1c [28 May 2019] ### ### Changes between 1.1.1b and 1.1.1c [28 May 2019]
* Add build tests for C++. These are generated files that only do one * Add build tests for C++. These are generated files that only do one
thing, to include one public OpenSSL head file each. This tests that thing, to include one public OpenSSL head file each. This tests that
@@ -1235,7 +1245,7 @@ OpenSSL 1.1.1
*Paul Yang* *Paul Yang*
### Changes between 1.1.1a and 1.1.1b [26 Feb 2019] ### ### Changes between 1.1.1a and 1.1.1b [26 Feb 2019]
* Change the info callback signals for the start and end of a post-handshake * Change the info callback signals for the start and end of a post-handshake
message exchange in TLSv1.3. In 1.1.1/1.1.1a we used SSL_CB_HANDSHAKE_START message exchange in TLSv1.3. In 1.1.1/1.1.1a we used SSL_CB_HANDSHAKE_START
@@ -1249,7 +1259,7 @@ OpenSSL 1.1.1
*Matt Caswell* *Matt Caswell*
### Changes between 1.1.1 and 1.1.1a [20 Nov 2018] ### ### Changes between 1.1.1 and 1.1.1a [20 Nov 2018]
* Timing vulnerability in DSA signature generation * Timing vulnerability in DSA signature generation
@@ -1282,7 +1292,7 @@ OpenSSL 1.1.1
automatically and is fully functional even without additional randomness automatically and is fully functional even without additional randomness
provided by the application. provided by the application.
### Changes between 1.1.0i and 1.1.1 [11 Sep 2018] ### ### Changes between 1.1.0i and 1.1.1 [11 Sep 2018]
* Add a new ClientHello callback. Provides a callback interface that gives * Add a new ClientHello callback. Provides a callback interface that gives
the application the ability to adjust the nascent SSL object at the the application the ability to adjust the nascent SSL object at the
@@ -1552,7 +1562,7 @@ OpenSSL 1.1.1
* Support for TLSv1.3 added. Note that users upgrading from an earlier * Support for TLSv1.3 added. Note that users upgrading from an earlier
version of OpenSSL should review their configuration settings to ensure version of OpenSSL should review their configuration settings to ensure
that they are still appropriate for TLSv1.3. For further information see: that they are still appropriate for TLSv1.3. For further information see:
https://wiki.openssl.org/index.php/TLS1.3 <https://wiki.openssl.org/index.php/TLS1.3>
*Matt Caswell* *Matt Caswell*
@@ -1805,7 +1815,7 @@ OpenSSL 1.1.1
* 'openssl passwd' can now produce SHA256 and SHA512 based output, * 'openssl passwd' can now produce SHA256 and SHA512 based output,
using the algorithm defined in using the algorithm defined in
https://www.akkadia.org/drepper/SHA-crypt.txt <https://www.akkadia.org/drepper/SHA-crypt.txt>
*Richard Levitte* *Richard Levitte*
@@ -1825,8 +1835,7 @@ OpenSSL 1.1.1
OpenSSL 1.1.0 OpenSSL 1.1.0
------------- -------------
### Changes between 1.1.0k and 1.1.0l [10 Sep 2019]
### Changes between 1.1.0k and 1.1.0l [10 Sep 2019] ###
* For built-in EC curves, ensure an EC_GROUP built from the curve name is * For built-in EC curves, ensure an EC_GROUP built from the curve name is
used even when parsing explicit parameters, when loading a serialized key used even when parsing explicit parameters, when loading a serialized key
@@ -1872,7 +1881,7 @@ OpenSSL 1.1.0
*Richard Levitte* *Richard Levitte*
### Changes between 1.1.0j and 1.1.0k [28 May 2019] ### ### Changes between 1.1.0j and 1.1.0k [28 May 2019]
* Change the default RSA, DSA and DH size to 2048 bit instead of 1024. * Change the default RSA, DSA and DH size to 2048 bit instead of 1024.
This changes the size when using the genpkey app when no size is given. It This changes the size when using the genpkey app when no size is given. It
@@ -1935,7 +1944,7 @@ OpenSSL 1.1.0
*Richard Levitte* *Richard Levitte*
### Changes between 1.1.0i and 1.1.0j [20 Nov 2018] ### ### Changes between 1.1.0i and 1.1.0j [20 Nov 2018]
* Timing vulnerability in DSA signature generation * Timing vulnerability in DSA signature generation
@@ -1965,7 +1974,7 @@ OpenSSL 1.1.0
*Sohaib ul Hassan, Nicola Tuveri, Billy Bob Brumley* *Sohaib ul Hassan, Nicola Tuveri, Billy Bob Brumley*
### Changes between 1.1.0h and 1.1.0i [14 Aug 2018] ### ### Changes between 1.1.0h and 1.1.0i [14 Aug 2018]
* Client DoS due to large DH parameter * Client DoS due to large DH parameter
@@ -2050,7 +2059,7 @@ OpenSSL 1.1.0
*Matt Caswell* *Matt Caswell*
### Changes between 1.1.0g and 1.1.0h [27 Mar 2018] ### ### Changes between 1.1.0g and 1.1.0h [27 Mar 2018]
* Constructed ASN.1 types with a recursive definition could exceed the stack * Constructed ASN.1 types with a recursive definition could exceed the stack
@@ -2129,7 +2138,7 @@ OpenSSL 1.1.0
*Andy Polyakov* *Andy Polyakov*
### Changes between 1.1.0f and 1.1.0g [2 Nov 2017] ### ### Changes between 1.1.0f and 1.1.0g [2 Nov 2017]
* bn_sqrx8x_internal carry bug on x86_64 * bn_sqrx8x_internal carry bug on x86_64
@@ -2164,7 +2173,7 @@ OpenSSL 1.1.0
*Rich Salz* *Rich Salz*
### Changes between 1.1.0e and 1.1.0f [25 May 2017] ### ### Changes between 1.1.0e and 1.1.0f [25 May 2017]
* Have 'config' recognise 64-bit mingw and choose 'mingw64' as the target * Have 'config' recognise 64-bit mingw and choose 'mingw64' as the target
platform rather than 'mingw'. platform rather than 'mingw'.
@@ -2177,7 +2186,7 @@ OpenSSL 1.1.0
*Richard Levitte* *Richard Levitte*
### Changes between 1.1.0d and 1.1.0e [16 Feb 2017] ### ### Changes between 1.1.0d and 1.1.0e [16 Feb 2017]
* Encrypt-Then-Mac renegotiation crash * Encrypt-Then-Mac renegotiation crash
@@ -2191,7 +2200,7 @@ OpenSSL 1.1.0
*Matt Caswell* *Matt Caswell*
### Changes between 1.1.0c and 1.1.0d [26 Jan 2017] ### ### Changes between 1.1.0c and 1.1.0d [26 Jan 2017]
* Truncated packet could crash via OOB read * Truncated packet could crash via OOB read
@@ -2237,11 +2246,11 @@ OpenSSL 1.1.0
*Andy Polyakov* *Andy Polyakov*
### Changes between 1.1.0b and 1.1.0c [10 Nov 2016] ### ### Changes between 1.1.0b and 1.1.0c [10 Nov 2016]
* ChaCha20/Poly1305 heap-buffer-overflow * ChaCha20/Poly1305 heap-buffer-overflow
TLS connections using *-CHACHA20-POLY1305 ciphersuites are susceptible to TLS connections using `*-CHACHA20-POLY1305` ciphersuites are susceptible to
a DoS attack by corrupting larger payloads. This can result in an OpenSSL a DoS attack by corrupting larger payloads. This can result in an OpenSSL
crash. This issue is not considered to be exploitable beyond a DoS. crash. This issue is not considered to be exploitable beyond a DoS.
@@ -2293,7 +2302,7 @@ OpenSSL 1.1.0
*Richard Levitte* *Richard Levitte*
### Changes between 1.1.0a and 1.1.0b [26 Sep 2016] ### ### Changes between 1.1.0a and 1.1.0b [26 Sep 2016]
* Fix Use After Free for large message sizes * Fix Use After Free for large message sizes
@@ -2311,7 +2320,7 @@ OpenSSL 1.1.0
*Matt Caswell* *Matt Caswell*
### Changes between 1.1.0 and 1.1.0a [22 Sep 2016] ### ### Changes between 1.1.0 and 1.1.0a [22 Sep 2016]
* OCSP Status Request extension unbounded memory growth * OCSP Status Request extension unbounded memory growth
@@ -2390,7 +2399,7 @@ OpenSSL 1.1.0
*Andy Polyakov* *Andy Polyakov*
### Changes between 1.0.2h and 1.1.0 [25 Aug 2016] ### ### Changes between 1.0.2h and 1.1.0 [25 Aug 2016]
* Windows command-line tool supports UTF-8 opt-in option for arguments * Windows command-line tool supports UTF-8 opt-in option for arguments
and console input. Setting OPENSSL_WIN32_UTF8 environment variable and console input. Setting OPENSSL_WIN32_UTF8 environment variable
@@ -2433,8 +2442,8 @@ OpenSSL 1.1.0
*Joseph Wylie Yandle, Rich Salz* *Joseph Wylie Yandle, Rich Salz*
* The stack and lhash API's were renamed to start with OPENSSL_SK_ * The stack and lhash API's were renamed to start with `OPENSSL_SK_`
and OPENSSL_LH_, respectively. The old names are available and `OPENSSL_LH_`, respectively. The old names are available
with API compatibility. They new names are now completely documented. with API compatibility. They new names are now completely documented.
*Rich Salz* *Rich Salz*
@@ -2612,12 +2621,12 @@ OpenSSL 1.1.0
*Todd Short* *Todd Short*
* Changes to the DEFAULT cipherlist: * Changes to the DEFAULT cipherlist:
- Prefer (EC)DHE handshakes over plain RSA. - Prefer (EC)DHE handshakes over plain RSA.
- Prefer AEAD ciphers over legacy ciphers. - Prefer AEAD ciphers over legacy ciphers.
- Prefer ECDSA over RSA when both certificates are available. - Prefer ECDSA over RSA when both certificates are available.
- Prefer TLSv1.2 ciphers/PRF. - Prefer TLSv1.2 ciphers/PRF.
- Remove DSS, SEED, IDEA, CAMELLIA, and AES-CCM from the - Remove DSS, SEED, IDEA, CAMELLIA, and AES-CCM from the
default cipherlist. default cipherlist.
*Emilia Käsper* *Emilia Käsper*
@@ -2779,8 +2788,8 @@ OpenSSL 1.1.0
* The signature of the session callback configured with * The signature of the session callback configured with
SSL_CTX_sess_set_get_cb was changed. The read-only input buffer SSL_CTX_sess_set_get_cb was changed. The read-only input buffer
was explicitly marked as 'const unsigned char*' instead of was explicitly marked as `const unsigned char*` instead of
'unsigned char*'. `unsigned char*`.
*Emilia Käsper* *Emilia Käsper*
@@ -2812,7 +2821,7 @@ OpenSSL 1.1.0
Makefile. Instead, Configure produces a perl module in Makefile. Instead, Configure produces a perl module in
configdata.pm which holds most of the config data (in the hash configdata.pm which holds most of the config data (in the hash
table %config), the target data that comes from the target table %config), the target data that comes from the target
configuration in one of the Configurations/*.conf files (in configuration in one of the `Configurations/*.conf~ files (in
%target). %target).
*Richard Levitte* *Richard Levitte*
@@ -2841,7 +2850,7 @@ OpenSSL 1.1.0
* The GOST engine was out of date and therefore it has been removed. An up * The GOST engine was out of date and therefore it has been removed. An up
to date GOST engine is now being maintained in an external repository. to date GOST engine is now being maintained in an external repository.
See: https://wiki.openssl.org/index.php/Binaries. Libssl still retains See: <https://wiki.openssl.org/index.php/Binaries>. Libssl still retains
support for GOST ciphersuites (these are only activated if a GOST engine support for GOST ciphersuites (these are only activated if a GOST engine
is present). is present).
@@ -3195,7 +3204,7 @@ OpenSSL 1.1.0
* Added support for OCB mode. OpenSSL has been granted a patent license * Added support for OCB mode. OpenSSL has been granted a patent license
compatible with the OpenSSL license for use of OCB. Details are available compatible with the OpenSSL license for use of OCB. Details are available
at https://www.openssl.org/source/OCB-patent-grant-OpenSSL.pdf. Support at <https://www.openssl.org/source/OCB-patent-grant-OpenSSL.pdf>. Support
for OCB can be removed by calling config with no-ocb. for OCB can be removed by calling config with no-ocb.
*Matt Caswell* *Matt Caswell*
@@ -3234,16 +3243,16 @@ OpenSSL 1.1.0
*Rich Salz* *Rich Salz*
* Clean up OPENSSL_NO_xxx #define's * Clean up OPENSSL_NO_xxx #define's
- Use setbuf() and remove OPENSSL_NO_SETVBUF_IONBF - Use setbuf() and remove OPENSSL_NO_SETVBUF_IONBF
- Rename OPENSSL_SYSNAME_xxx to OPENSSL_SYS_xxx - Rename OPENSSL_SYSNAME_xxx to OPENSSL_SYS_xxx
- OPENSSL_NO_EC{DH,DSA} merged into OPENSSL_NO_EC - OPENSSL_NO_EC{DH,DSA} merged into OPENSSL_NO_EC
- OPENSSL_NO_RIPEMD160, OPENSSL_NO_RIPEMD merged into OPENSSL_NO_RMD160 - OPENSSL_NO_RIPEMD160, OPENSSL_NO_RIPEMD merged into OPENSSL_NO_RMD160
- OPENSSL_NO_FP_API merged into OPENSSL_NO_STDIO - OPENSSL_NO_FP_API merged into OPENSSL_NO_STDIO
- Remove OPENSSL_NO_BIO OPENSSL_NO_BUFFER OPENSSL_NO_CHAIN_VERIFY - Remove OPENSSL_NO_BIO OPENSSL_NO_BUFFER OPENSSL_NO_CHAIN_VERIFY
OPENSSL_NO_EVP OPENSSL_NO_FIPS_ERR OPENSSL_NO_HASH_COMP OPENSSL_NO_EVP OPENSSL_NO_FIPS_ERR OPENSSL_NO_HASH_COMP
OPENSSL_NO_LHASH OPENSSL_NO_OBJECT OPENSSL_NO_SPEED OPENSSL_NO_STACK OPENSSL_NO_LHASH OPENSSL_NO_OBJECT OPENSSL_NO_SPEED OPENSSL_NO_STACK
OPENSSL_NO_X509 OPENSSL_NO_X509_VERIFY OPENSSL_NO_X509 OPENSSL_NO_X509_VERIFY
- Remove MS_STATIC; it's a relic from platforms <32 bits. - Remove MS_STATIC; it's a relic from platforms <32 bits.
*Rich Salz* *Rich Salz*
@@ -3301,7 +3310,7 @@ OpenSSL 1.1.0
* Fix for the attack described in the paper "Recovering OpenSSL * Fix for the attack described in the paper "Recovering OpenSSL
ECDSA Nonces Using the FLUSH+RELOAD Cache Side-channel Attack" ECDSA Nonces Using the FLUSH+RELOAD Cache Side-channel Attack"
by Yuval Yarom and Naomi Benger. Details can be obtained from: by Yuval Yarom and Naomi Benger. Details can be obtained from:
http://eprint.iacr.org/2014/140 <http://eprint.iacr.org/2014/140>
Thanks to Yuval Yarom and Naomi Benger for discovering this Thanks to Yuval Yarom and Naomi Benger for discovering this
flaw and to Yuval Yarom for supplying a fix [CVE-2014-0076][] flaw and to Yuval Yarom for supplying a fix [CVE-2014-0076][]
@@ -3326,7 +3335,6 @@ OpenSSL 1.1.0
WARNING: EXPERIMENTAL, SUBJECT TO CHANGE. WARNING: EXPERIMENTAL, SUBJECT TO CHANGE.
*Steve Henson* *Steve Henson*
* Add EVP support for key wrapping algorithms, to avoid problems with * Add EVP support for key wrapping algorithms, to avoid problems with
@@ -3532,7 +3540,7 @@ OpenSSL 1.1.0
*Steve Henson* *Steve Henson*
* Initial, experimental EVP support for AES-GCM. AAD can be input by * Initial, experimental EVP support for AES-GCM. AAD can be input by
setting output buffer to NULL. The *Final function must be setting output buffer to NULL. The `*Final` function must be
called although it will not retrieve any additional data. The tag called although it will not retrieve any additional data. The tag
can be set or retrieved with a ctrl. The IV length is by default 12 can be set or retrieved with a ctrl. The IV length is by default 12
bytes (96 bits) but can be set to an alternative value. If the IV bytes (96 bits) but can be set to an alternative value. If the IV
@@ -3624,7 +3632,7 @@ OpenSSL 1.1.0
OpenSSL 1.0.2 OpenSSL 1.0.2
------------- -------------
### Changes between 1.0.2s and 1.0.2t [10 Sep 2019] ### ### Changes between 1.0.2s and 1.0.2t [10 Sep 2019]
* For built-in EC curves, ensure an EC_GROUP built from the curve name is * For built-in EC curves, ensure an EC_GROUP built from the curve name is
used even when parsing explicit parameters, when loading a serialized key used even when parsing explicit parameters, when loading a serialized key
@@ -3670,7 +3678,7 @@ OpenSSL 1.0.2
*Richard Levitte* *Richard Levitte*
### Changes between 1.0.2r and 1.0.2s [28 May 2019] ### ### Changes between 1.0.2r and 1.0.2s [28 May 2019]
* Change the default RSA, DSA and DH size to 2048 bit instead of 1024. * Change the default RSA, DSA and DH size to 2048 bit instead of 1024.
This changes the size when using the genpkey app when no size is given. It This changes the size when using the genpkey app when no size is given. It
@@ -3689,7 +3697,7 @@ OpenSSL 1.0.2
*Matthias St. Pierre* *Matthias St. Pierre*
### Changes between 1.0.2q and 1.0.2r [26 Feb 2019] ### ### Changes between 1.0.2q and 1.0.2r [26 Feb 2019]
* 0-byte record padding oracle * 0-byte record padding oracle
@@ -3718,7 +3726,7 @@ OpenSSL 1.0.2
*Richard Levitte* *Richard Levitte*
### Changes between 1.0.2p and 1.0.2q [20 Nov 2018] ### ### Changes between 1.0.2p and 1.0.2q [20 Nov 2018]
* Microarchitecture timing vulnerability in ECC scalar multiplication * Microarchitecture timing vulnerability in ECC scalar multiplication
@@ -3751,7 +3759,7 @@ OpenSSL 1.0.2
*Nicola Tuveri* *Nicola Tuveri*
### Changes between 1.0.2o and 1.0.2p [14 Aug 2018] ### ### Changes between 1.0.2o and 1.0.2p [14 Aug 2018]
* Client DoS due to large DH parameter * Client DoS due to large DH parameter
@@ -3818,7 +3826,7 @@ OpenSSL 1.0.2
*Emilia Käsper* *Emilia Käsper*
### Changes between 1.0.2n and 1.0.2o [27 Mar 2018] ### ### Changes between 1.0.2n and 1.0.2o [27 Mar 2018]
* Constructed ASN.1 types with a recursive definition could exceed the stack * Constructed ASN.1 types with a recursive definition could exceed the stack
@@ -3834,7 +3842,7 @@ OpenSSL 1.0.2
*Matt Caswell* *Matt Caswell*
### Changes between 1.0.2m and 1.0.2n [7 Dec 2017] ### ### Changes between 1.0.2m and 1.0.2n [7 Dec 2017]
* Read/write after SSL object in error state * Read/write after SSL object in error state
@@ -3881,7 +3889,7 @@ OpenSSL 1.0.2
*Andy Polyakov* *Andy Polyakov*
### Changes between 1.0.2l and 1.0.2m [2 Nov 2017] ### ### Changes between 1.0.2l and 1.0.2m [2 Nov 2017]
* bn_sqrx8x_internal carry bug on x86_64 * bn_sqrx8x_internal carry bug on x86_64
@@ -3916,14 +3924,14 @@ OpenSSL 1.0.2
*Rich Salz* *Rich Salz*
### Changes between 1.0.2k and 1.0.2l [25 May 2017] ### ### Changes between 1.0.2k and 1.0.2l [25 May 2017]
* Have 'config' recognise 64-bit mingw and choose 'mingw64' as the target * Have 'config' recognise 64-bit mingw and choose 'mingw64' as the target
platform rather than 'mingw'. platform rather than 'mingw'.
*Richard Levitte* *Richard Levitte*
### Changes between 1.0.2j and 1.0.2k [26 Jan 2017] ### ### Changes between 1.0.2j and 1.0.2k [26 Jan 2017]
* Truncated packet could crash via OOB read * Truncated packet could crash via OOB read
@@ -3988,7 +3996,7 @@ OpenSSL 1.0.2
*Matt Caswell* *Matt Caswell*
### Changes between 1.0.2i and 1.0.2j [26 Sep 2016] ### ### Changes between 1.0.2i and 1.0.2j [26 Sep 2016]
* Missing CRL sanity check * Missing CRL sanity check
@@ -4001,7 +4009,7 @@ OpenSSL 1.0.2
*Matt Caswell* *Matt Caswell*
### Changes between 1.0.2h and 1.0.2i [22 Sep 2016] ### ### Changes between 1.0.2h and 1.0.2i [22 Sep 2016]
* OCSP Status Request extension unbounded memory growth * OCSP Status Request extension unbounded memory growth
@@ -4172,7 +4180,7 @@ OpenSSL 1.0.2
*Stephen Henson* *Stephen Henson*
### Changes between 1.0.2g and 1.0.2h [3 May 2016] ### ### Changes between 1.0.2g and 1.0.2h [3 May 2016]
* Prevent padding oracle in AES-NI CBC MAC check * Prevent padding oracle in AES-NI CBC MAC check
@@ -4200,7 +4208,7 @@ OpenSSL 1.0.2
corruption. corruption.
Internally to OpenSSL the EVP_EncodeUpdate() function is primarily used by Internally to OpenSSL the EVP_EncodeUpdate() function is primarily used by
the PEM_write_bio* family of functions. These are mainly used within the the `PEM_write_bio*` family of functions. These are mainly used within the
OpenSSL command line applications, so any application which processes data OpenSSL command line applications, so any application which processes data
from an untrusted source and outputs it as a PEM file should be considered from an untrusted source and outputs it as a PEM file should be considered
vulnerable to this issue. User applications that call these APIs directly vulnerable to this issue. User applications that call these APIs directly
@@ -4277,7 +4285,7 @@ OpenSSL 1.0.2
*Kurt Roeckx* *Kurt Roeckx*
### Changes between 1.0.2f and 1.0.2g [1 Mar 2016] ### ### Changes between 1.0.2f and 1.0.2g [1 Mar 2016]
* Disable weak ciphers in SSLv3 and up in default builds of OpenSSL. * Disable weak ciphers in SSLv3 and up in default builds of OpenSSL.
Builds that are not configured with "enable-weak-ssl-ciphers" will not Builds that are not configured with "enable-weak-ssl-ciphers" will not
@@ -4362,10 +4370,10 @@ OpenSSL 1.0.2
*Matt Caswell* *Matt Caswell*
* Fix memory issues in BIO_*printf functions * Fix memory issues in `BIO_*printf` functions
The internal |fmtstr| function used in processing a "%s" format string in The internal |fmtstr| function used in processing a "%s" format string in
the BIO_*printf functions could overflow while calculating the length of a the `BIO_*printf` functions could overflow while calculating the length of a
string and cause an OOB read when printing very long strings. string and cause an OOB read when printing very long strings.
Additionally the internal |doapr_outch| function can attempt to write to an Additionally the internal |doapr_outch| function can attempt to write to an
@@ -4377,7 +4385,7 @@ OpenSSL 1.0.2
The first issue may mask the second issue dependent on compiler behaviour. The first issue may mask the second issue dependent on compiler behaviour.
These problems could enable attacks where large amounts of untrusted data These problems could enable attacks where large amounts of untrusted data
is passed to the BIO_*printf functions. If applications use these functions is passed to the `BIO_*printf` functions. If applications use these functions
in this way then they could be vulnerable. OpenSSL itself uses these in this way then they could be vulnerable. OpenSSL itself uses these
functions when printing out human-readable dumps of ASN.1 data. Therefore functions when printing out human-readable dumps of ASN.1 data. Therefore
applications that print this data could be vulnerable if the data is from applications that print this data could be vulnerable if the data is from
@@ -4405,7 +4413,7 @@ OpenSSL 1.0.2
This issue was reported to OpenSSL by Yuval Yarom, The University of This issue was reported to OpenSSL by Yuval Yarom, The University of
Adelaide and NICTA, Daniel Genkin, Technion and Tel Aviv University, and Adelaide and NICTA, Daniel Genkin, Technion and Tel Aviv University, and
Nadia Heninger, University of Pennsylvania with more information at Nadia Heninger, University of Pennsylvania with more information at
http://cachebleed.info. <http://cachebleed.info>.
[CVE-2016-0702][] [CVE-2016-0702][]
*Andy Polyakov* *Andy Polyakov*
@@ -4417,7 +4425,8 @@ OpenSSL 1.0.2
*Emilia Käsper* *Emilia Käsper*
### Changes between 1.0.2e and 1.0.2f [28 Jan 2016] ### ### Changes between 1.0.2e and 1.0.2f [28 Jan 2016]
* DH small subgroups * DH small subgroups
Historically OpenSSL only ever generated DH parameters based on "safe" Historically OpenSSL only ever generated DH parameters based on "safe"
@@ -4463,7 +4472,7 @@ OpenSSL 1.0.2
*Viktor Dukhovni* *Viktor Dukhovni*
### Changes between 1.0.2d and 1.0.2e [3 Dec 2015] ### ### Changes between 1.0.2d and 1.0.2e [3 Dec 2015]
* BN_mod_exp may produce incorrect results on x86_64 * BN_mod_exp may produce incorrect results on x86_64
@@ -4526,7 +4535,7 @@ OpenSSL 1.0.2
*Rich Salz and Ismo Puustinen <ismo.puustinen@intel.com>* *Rich Salz and Ismo Puustinen <ismo.puustinen@intel.com>*
### Changes between 1.0.2c and 1.0.2d [9 Jul 2015] ### ### Changes between 1.0.2c and 1.0.2d [9 Jul 2015]
* Alternate chains certificate forgery * Alternate chains certificate forgery
@@ -4542,7 +4551,7 @@ OpenSSL 1.0.2
*Matt Caswell* *Matt Caswell*
### Changes between 1.0.2b and 1.0.2c [12 Jun 2015] ### ### Changes between 1.0.2b and 1.0.2c [12 Jun 2015]
* Fix HMAC ABI incompatibility. The previous version introduced an ABI * Fix HMAC ABI incompatibility. The previous version introduced an ABI
incompatibility in the handling of HMAC. The previous ABI has now been incompatibility in the handling of HMAC. The previous ABI has now been
@@ -4550,7 +4559,7 @@ OpenSSL 1.0.2
*Matt Caswell* *Matt Caswell*
### Changes between 1.0.2a and 1.0.2b [11 Jun 2015] ### ### Changes between 1.0.2a and 1.0.2b [11 Jun 2015]
* Malformed ECParameters causes infinite loop * Malformed ECParameters causes infinite loop
@@ -4629,7 +4638,7 @@ OpenSSL 1.0.2
*Emilia Kasper* *Emilia Kasper*
### Changes between 1.0.2 and 1.0.2a [19 Mar 2015] ### ### Changes between 1.0.2 and 1.0.2a [19 Mar 2015]
* ClientHello sigalgs DoS fix * ClientHello sigalgs DoS fix
@@ -4805,7 +4814,7 @@ OpenSSL 1.0.2
*Kurt Roeckx* *Kurt Roeckx*
### Changes between 1.0.1l and 1.0.2 [22 Jan 2015] ### ### Changes between 1.0.1l and 1.0.2 [22 Jan 2015]
* Facilitate "universal" ARM builds targeting range of ARM ISAs, e.g. * Facilitate "universal" ARM builds targeting range of ARM ISAs, e.g.
ARMv5 through ARMv8, as opposite to "locking" it to single one. ARMv5 through ARMv8, as opposite to "locking" it to single one.
@@ -4956,7 +4965,7 @@ OpenSSL 1.0.2
*Steve Henson* *Steve Henson*
* SSL_CONF* functions. These provide a common framework for application * `SSL_CONF*` functions. These provide a common framework for application
configuration using configuration files or command lines. configuration using configuration files or command lines.
*Steve Henson* *Steve Henson*
@@ -5024,7 +5033,6 @@ OpenSSL 1.0.2
Note: if the CERT based stores are not set then the parent SSL_CTX Note: if the CERT based stores are not set then the parent SSL_CTX
store is used to retain compatibility with existing behaviour. store is used to retain compatibility with existing behaviour.
*Steve Henson* *Steve Henson*
* New function ssl_set_client_disabled to set a ciphersuite disabled * New function ssl_set_client_disabled to set a ciphersuite disabled
@@ -5200,11 +5208,10 @@ OpenSSL 1.0.2
X509_CINF_set_modified, X509_CINF_get_issuer, X509_CINF_get_extensions and X509_CINF_set_modified, X509_CINF_get_issuer, X509_CINF_get_extensions and
X509_CINF_get_signature were reverted post internal team review. X509_CINF_get_signature were reverted post internal team review.
OpenSSL 1.0.1 OpenSSL 1.0.1
------------- -------------
### Changes between 1.0.1t and 1.0.1u [22 Sep 2016] ### ### Changes between 1.0.1t and 1.0.1u [22 Sep 2016]
* OCSP Status Request extension unbounded memory growth * OCSP Status Request extension unbounded memory growth
@@ -5375,7 +5382,7 @@ OpenSSL 1.0.1
*Stephen Henson* *Stephen Henson*
### Changes between 1.0.1s and 1.0.1t [3 May 2016] ### ### Changes between 1.0.1s and 1.0.1t [3 May 2016]
* Prevent padding oracle in AES-NI CBC MAC check * Prevent padding oracle in AES-NI CBC MAC check
@@ -5403,7 +5410,7 @@ OpenSSL 1.0.1
corruption. corruption.
Internally to OpenSSL the EVP_EncodeUpdate() function is primarly used by Internally to OpenSSL the EVP_EncodeUpdate() function is primarly used by
the PEM_write_bio* family of functions. These are mainly used within the the `PEM_write_bio*` family of functions. These are mainly used within the
OpenSSL command line applications, so any application which processes data OpenSSL command line applications, so any application which processes data
from an untrusted source and outputs it as a PEM file should be considered from an untrusted source and outputs it as a PEM file should be considered
vulnerable to this issue. User applications that call these APIs directly vulnerable to this issue. User applications that call these APIs directly
@@ -5480,7 +5487,7 @@ OpenSSL 1.0.1
*Kurt Roeckx* *Kurt Roeckx*
### Changes between 1.0.1r and 1.0.1s [1 Mar 2016] ### ### Changes between 1.0.1r and 1.0.1s [1 Mar 2016]
* Disable weak ciphers in SSLv3 and up in default builds of OpenSSL. * Disable weak ciphers in SSLv3 and up in default builds of OpenSSL.
Builds that are not configured with "enable-weak-ssl-ciphers" will not Builds that are not configured with "enable-weak-ssl-ciphers" will not
@@ -5565,10 +5572,10 @@ OpenSSL 1.0.1
*Matt Caswell* *Matt Caswell*
* Fix memory issues in BIO_*printf functions * Fix memory issues in `BIO_*printf` functions
The internal |fmtstr| function used in processing a "%s" format string in The internal |fmtstr| function used in processing a "%s" format string in
the BIO_*printf functions could overflow while calculating the length of a the `BIO_*printf` functions could overflow while calculating the length of a
string and cause an OOB read when printing very long strings. string and cause an OOB read when printing very long strings.
Additionally the internal |doapr_outch| function can attempt to write to an Additionally the internal |doapr_outch| function can attempt to write to an
@@ -5580,7 +5587,7 @@ OpenSSL 1.0.1
The first issue may mask the second issue dependent on compiler behaviour. The first issue may mask the second issue dependent on compiler behaviour.
These problems could enable attacks where large amounts of untrusted data These problems could enable attacks where large amounts of untrusted data
is passed to the BIO_*printf functions. If applications use these functions is passed to the `BIO_*printf` functions. If applications use these functions
in this way then they could be vulnerable. OpenSSL itself uses these in this way then they could be vulnerable. OpenSSL itself uses these
functions when printing out human-readable dumps of ASN.1 data. Therefore functions when printing out human-readable dumps of ASN.1 data. Therefore
applications that print this data could be vulnerable if the data is from applications that print this data could be vulnerable if the data is from
@@ -5608,7 +5615,7 @@ OpenSSL 1.0.1
This issue was reported to OpenSSL by Yuval Yarom, The University of This issue was reported to OpenSSL by Yuval Yarom, The University of
Adelaide and NICTA, Daniel Genkin, Technion and Tel Aviv University, and Adelaide and NICTA, Daniel Genkin, Technion and Tel Aviv University, and
Nadia Heninger, University of Pennsylvania with more information at Nadia Heninger, University of Pennsylvania with more information at
http://cachebleed.info. <http://cachebleed.info>.
[CVE-2016-0702][] [CVE-2016-0702][]
*Andy Polyakov* *Andy Polyakov*
@@ -5620,7 +5627,7 @@ OpenSSL 1.0.1
*Emilia Käsper* *Emilia Käsper*
### Changes between 1.0.1q and 1.0.1r [28 Jan 2016] ### ### Changes between 1.0.1q and 1.0.1r [28 Jan 2016]
* Protection for DH small subgroup attacks * Protection for DH small subgroup attacks
@@ -5647,7 +5654,7 @@ OpenSSL 1.0.1
*Kurt Roeckx* *Kurt Roeckx*
### Changes between 1.0.1p and 1.0.1q [3 Dec 2015] ### ### Changes between 1.0.1p and 1.0.1q [3 Dec 2015]
* Certificate verify crash with missing PSS parameter * Certificate verify crash with missing PSS parameter
@@ -5690,7 +5697,7 @@ OpenSSL 1.0.1
*Rich Salz and Ismo Puustinen <ismo.puustinen@intel.com>* *Rich Salz and Ismo Puustinen <ismo.puustinen@intel.com>*
### Changes between 1.0.1o and 1.0.1p [9 Jul 2015] ### ### Changes between 1.0.1o and 1.0.1p [9 Jul 2015]
* Alternate chains certificate forgery * Alternate chains certificate forgery
@@ -5717,12 +5724,13 @@ OpenSSL 1.0.1
*Stephen Henson* *Stephen Henson*
### Changes between 1.0.1n and 1.0.1o [12 Jun 2015] ### ### Changes between 1.0.1n and 1.0.1o [12 Jun 2015]
* Fix HMAC ABI incompatibility. The previous version introduced an ABI * Fix HMAC ABI incompatibility. The previous version introduced an ABI
incompatibility in the handling of HMAC. The previous ABI has now been incompatibility in the handling of HMAC. The previous ABI has now been
restored. restored.
### Changes between 1.0.1m and 1.0.1n [11 Jun 2015] ### ### Changes between 1.0.1m and 1.0.1n [11 Jun 2015]
* Malformed ECParameters causes infinite loop * Malformed ECParameters causes infinite loop
@@ -5803,7 +5811,7 @@ OpenSSL 1.0.1
*Kurt Roeckx and Emilia Kasper* *Kurt Roeckx and Emilia Kasper*
### Changes between 1.0.1l and 1.0.1m [19 Mar 2015] ### ### Changes between 1.0.1l and 1.0.1m [19 Mar 2015]
* Segmentation fault in ASN1_TYPE_cmp fix * Segmentation fault in ASN1_TYPE_cmp fix
@@ -5887,13 +5895,13 @@ OpenSSL 1.0.1
*Kurt Roeckx* *Kurt Roeckx*
### Changes between 1.0.1k and 1.0.1l [15 Jan 2015] ### ### Changes between 1.0.1k and 1.0.1l [15 Jan 2015]
* Build fixes for the Windows and OpenVMS platforms * Build fixes for the Windows and OpenVMS platforms
*Matt Caswell and Richard Levitte* *Matt Caswell and Richard Levitte*
### Changes between 1.0.1j and 1.0.1k [8 Jan 2015] ### ### Changes between 1.0.1j and 1.0.1k [8 Jan 2015]
* Fix DTLS segmentation fault in dtls1_get_record. A carefully crafted DTLS * Fix DTLS segmentation fault in dtls1_get_record. A carefully crafted DTLS
message can cause a segmentation fault in OpenSSL due to a NULL pointer message can cause a segmentation fault in OpenSSL due to a NULL pointer
@@ -5998,44 +6006,44 @@ OpenSSL 1.0.1
*Steve Henson* *Steve Henson*
*) Correct Bignum squaring. Bignum squaring (BN_sqr) may produce incorrect * Correct Bignum squaring. Bignum squaring (BN_sqr) may produce incorrect
results on some platforms, including x86_64. This bug occurs at random results on some platforms, including x86_64. This bug occurs at random
with a very low probability, and is not known to be exploitable in any with a very low probability, and is not known to be exploitable in any
way, though its exact impact is difficult to determine. Thanks to Pieter way, though its exact impact is difficult to determine. Thanks to Pieter
Wuille (Blockstream) who reported this issue and also suggested an initial Wuille (Blockstream) who reported this issue and also suggested an initial
fix. Further analysis was conducted by the OpenSSL development team and fix. Further analysis was conducted by the OpenSSL development team and
Adam Langley of Google. The final fix was developed by Andy Polyakov of Adam Langley of Google. The final fix was developed by Andy Polyakov of
the OpenSSL core team. the OpenSSL core team.
[CVE-2014-3570][] [CVE-2014-3570][]
*Andy Polyakov* *Andy Polyakov*
*) Do not resume sessions on the server if the negotiated protocol * Do not resume sessions on the server if the negotiated protocol
version does not match the session's version. Resuming with a different version does not match the session's version. Resuming with a different
version, while not strictly forbidden by the RFC, is of questionable version, while not strictly forbidden by the RFC, is of questionable
sanity and breaks all known clients. sanity and breaks all known clients.
*David Benjamin, Emilia Käsper* *David Benjamin, Emilia Käsper*
*) Tighten handling of the ChangeCipherSpec (CCS) message: reject * Tighten handling of the ChangeCipherSpec (CCS) message: reject
early CCS messages during renegotiation. (Note that because early CCS messages during renegotiation. (Note that because
renegotiation is encrypted, this early CCS was not exploitable.) renegotiation is encrypted, this early CCS was not exploitable.)
*Emilia Käsper* *Emilia Käsper*
*) Tighten client-side session ticket handling during renegotiation: * Tighten client-side session ticket handling during renegotiation:
ensure that the client only accepts a session ticket if the server sends ensure that the client only accepts a session ticket if the server sends
the extension anew in the ServerHello. Previously, a TLS client would the extension anew in the ServerHello. Previously, a TLS client would
reuse the old extension state and thus accept a session ticket if one was reuse the old extension state and thus accept a session ticket if one was
announced in the initial ServerHello. announced in the initial ServerHello.
Similarly, ensure that the client requires a session ticket if one Similarly, ensure that the client requires a session ticket if one
was advertised in the ServerHello. Previously, a TLS client would was advertised in the ServerHello. Previously, a TLS client would
ignore a missing NewSessionTicket message. ignore a missing NewSessionTicket message.
*Emilia Käsper* *Emilia Käsper*
### Changes between 1.0.1i and 1.0.1j [15 Oct 2014] ### ### Changes between 1.0.1i and 1.0.1j [15 Oct 2014]
* SRTP Memory Leak. * SRTP Memory Leak.
@@ -6088,10 +6096,9 @@ OpenSSL 1.0.1
Note: this is a precautionary measure and no attacks are currently known. Note: this is a precautionary measure and no attacks are currently known.
*Steve Henson* *Steve Henson*
### Changes between 1.0.1h and 1.0.1i [6 Aug 2014] ### ### Changes between 1.0.1h and 1.0.1i [6 Aug 2014]
* Fix SRP buffer overrun vulnerability. Invalid parameters passed to the * Fix SRP buffer overrun vulnerability. Invalid parameters passed to the
SRP code can be overrun an internal buffer. Add sanity check that SRP code can be overrun an internal buffer. Add sanity check that
@@ -6187,7 +6194,7 @@ OpenSSL 1.0.1
*Bodo Moeller* *Bodo Moeller*
### Changes between 1.0.1g and 1.0.1h [5 Jun 2014] ### ### Changes between 1.0.1g and 1.0.1h [5 Jun 2014]
* Fix for SSL/TLS MITM flaw. An attacker using a carefully crafted * Fix for SSL/TLS MITM flaw. An attacker using a carefully crafted
handshake can force the use of weak keying material in OpenSSL handshake can force the use of weak keying material in OpenSSL
@@ -6238,7 +6245,7 @@ OpenSSL 1.0.1
*mancha <mancha1@zoho.com>* *mancha <mancha1@zoho.com>*
### Changes between 1.0.1f and 1.0.1g [7 Apr 2014] ### ### Changes between 1.0.1f and 1.0.1g [7 Apr 2014]
* A missing bounds check in the handling of the TLS heartbeat extension * A missing bounds check in the handling of the TLS heartbeat extension
can be used to reveal up to 64k of memory to a connected client or can be used to reveal up to 64k of memory to a connected client or
@@ -6253,7 +6260,7 @@ OpenSSL 1.0.1
* Fix for the attack described in the paper "Recovering OpenSSL * Fix for the attack described in the paper "Recovering OpenSSL
ECDSA Nonces Using the FLUSH+RELOAD Cache Side-channel Attack" ECDSA Nonces Using the FLUSH+RELOAD Cache Side-channel Attack"
by Yuval Yarom and Naomi Benger. Details can be obtained from: by Yuval Yarom and Naomi Benger. Details can be obtained from:
http://eprint.iacr.org/2014/140 <http://eprint.iacr.org/2014/140>
Thanks to Yuval Yarom and Naomi Benger for discovering this Thanks to Yuval Yarom and Naomi Benger for discovering this
flaw and to Yuval Yarom for supplying a fix [CVE-2014-0076][] flaw and to Yuval Yarom for supplying a fix [CVE-2014-0076][]
@@ -6267,10 +6274,9 @@ OpenSSL 1.0.1
less that 512 pad with a dummy extension containing zeroes so it less that 512 pad with a dummy extension containing zeroes so it
is at least 512 bytes long. is at least 512 bytes long.
*Adam Langley, Steve Henson* *Adam Langley, Steve Henson*
### Changes between 1.0.1e and 1.0.1f [6 Jan 2014] ### ### Changes between 1.0.1e and 1.0.1f [6 Jan 2014]
* Fix for TLS record tampering bug. A carefully crafted invalid * Fix for TLS record tampering bug. A carefully crafted invalid
handshake could crash OpenSSL with a NULL pointer exception. handshake could crash OpenSSL with a NULL pointer exception.
@@ -6292,20 +6298,20 @@ OpenSSL 1.0.1
*Rob Stradling, Adam Langley* *Rob Stradling, Adam Langley*
### Changes between 1.0.1d and 1.0.1e [11 Feb 2013] ### ### Changes between 1.0.1d and 1.0.1e [11 Feb 2013]
* Correct fix for CVE-2013-0169. The original didn't work on AES-NI * Correct fix for CVE-2013-0169. The original didn't work on AES-NI
supporting platforms or when small records were transferred. supporting platforms or when small records were transferred.
*Andy Polyakov, Steve Henson* *Andy Polyakov, Steve Henson*
### Changes between 1.0.1c and 1.0.1d [5 Feb 2013] ### ### Changes between 1.0.1c and 1.0.1d [5 Feb 2013]
* Make the decoding of SSLv3, TLS and DTLS CBC records constant time. * Make the decoding of SSLv3, TLS and DTLS CBC records constant time.
This addresses the flaw in CBC record processing discovered by This addresses the flaw in CBC record processing discovered by
Nadhem Alfardan and Kenny Paterson. Details of this attack can be found Nadhem Alfardan and Kenny Paterson. Details of this attack can be found
at: http://www.isg.rhul.ac.uk/tls/ at: <http://www.isg.rhul.ac.uk/tls/>
Thanks go to Nadhem Alfardan and Kenny Paterson of the Information Thanks go to Nadhem Alfardan and Kenny Paterson of the Information
Security Group at Royal Holloway, University of London Security Group at Royal Holloway, University of London
@@ -6336,7 +6342,7 @@ OpenSSL 1.0.1
* Call OCSP Stapling callback after ciphersuite has been chosen, so * Call OCSP Stapling callback after ciphersuite has been chosen, so
the right response is stapled. Also change SSL_get_certificate() the right response is stapled. Also change SSL_get_certificate()
so it returns the certificate actually sent. so it returns the certificate actually sent.
See http://rt.openssl.org/Ticket/Display.html?id=2836. See <http://rt.openssl.org/Ticket/Display.html?id=2836>.
*Rob Stradling <rob.stradling@comodo.com>* *Rob Stradling <rob.stradling@comodo.com>*
@@ -6349,7 +6355,7 @@ OpenSSL 1.0.1
*Steve Henson* *Steve Henson*
### Changes between 1.0.1b and 1.0.1c [10 May 2012] ### ### Changes between 1.0.1b and 1.0.1c [10 May 2012]
* Sanity check record length before skipping explicit IV in TLS * Sanity check record length before skipping explicit IV in TLS
1.2, 1.1 and DTLS to fix DoS attack. 1.2, 1.1 and DTLS to fix DoS attack.
@@ -6370,7 +6376,7 @@ OpenSSL 1.0.1
*Steve Henson* *Steve Henson*
### Changes between 1.0.1a and 1.0.1b [26 Apr 2012] ### ### Changes between 1.0.1a and 1.0.1b [26 Apr 2012]
* OpenSSL 1.0.0 sets SSL_OP_ALL to 0x80000FFFL and OpenSSL 1.0.1 and * OpenSSL 1.0.0 sets SSL_OP_ALL to 0x80000FFFL and OpenSSL 1.0.1 and
1.0.1a set SSL_OP_NO_TLSv1_1 to 0x00000400L which would unfortunately 1.0.1a set SSL_OP_NO_TLSv1_1 to 0x00000400L which would unfortunately
@@ -6395,7 +6401,7 @@ OpenSSL 1.0.1
*Andy Polyakov* *Andy Polyakov*
### Changes between 1.0.1 and 1.0.1a [19 Apr 2012] ### ### Changes between 1.0.1 and 1.0.1a [19 Apr 2012]
* Check for potentially exploitable overflows in asn1_d2i_read_bio * Check for potentially exploitable overflows in asn1_d2i_read_bio
BUF_mem_grow and BUF_mem_grow_clean. Refuse attempts to shrink buffer BUF_mem_grow and BUF_mem_grow_clean. Refuse attempts to shrink buffer
@@ -6430,7 +6436,7 @@ OpenSSL 1.0.1
*Andy Polyakov* *Andy Polyakov*
### Changes between 1.0.0h and 1.0.1 [14 Mar 2012] ### ### Changes between 1.0.0h and 1.0.1 [14 Mar 2012]
* Add compatibility with old MDC2 signatures which use an ASN1 OCTET * Add compatibility with old MDC2 signatures which use an ASN1 OCTET
STRING form instead of a DigestInfo. STRING form instead of a DigestInfo.
@@ -6467,12 +6473,12 @@ OpenSSL 1.0.1
* Extensive assembler packs updates, most notably: * Extensive assembler packs updates, most notably:
- x86[_64]: AES-NI, PCLMULQDQ, RDRAND support; - x86[_64]: AES-NI, PCLMULQDQ, RDRAND support;
- x86[_64]: SSSE3 support (SHA1, vector-permutation AES); - x86[_64]: SSSE3 support (SHA1, vector-permutation AES);
- x86_64: bit-sliced AES implementation; - x86_64: bit-sliced AES implementation;
- ARM: NEON support, contemporary platforms optimizations; - ARM: NEON support, contemporary platforms optimizations;
- s390x: z196 support; - s390x: z196 support;
- *: GHASH and GF(2^m) multiplication implementations; - `*`: GHASH and GF(2^m) multiplication implementations;
*Andy Polyakov* *Andy Polyakov*
@@ -6490,7 +6496,7 @@ OpenSSL 1.0.1
*Eric Rescorla* *Eric Rescorla*
* Add Next Protocol Negotiation, * Add Next Protocol Negotiation,
http://tools.ietf.org/html/draft-agl-tls-nextprotoneg-00. Can be <http://tools.ietf.org/html/draft-agl-tls-nextprotoneg-00>. Can be
disabled with a no-npn flag to config or Configure. Code donated disabled with a no-npn flag to config or Configure. Code donated
by Google. by Google.
@@ -6598,7 +6604,7 @@ OpenSSL 1.0.1
* Add GCM support to TLS library. Some custom code is needed to split * Add GCM support to TLS library. Some custom code is needed to split
the IV between the fixed (from PRF) and explicit (from TLS record) the IV between the fixed (from PRF) and explicit (from TLS record)
portions. This adds all GCM ciphersuites supported by RFC5288 and portions. This adds all GCM ciphersuites supported by RFC5288 and
RFC5289. Generalise some AES* cipherstrings to include GCM and RFC5289. Generalise some `AES*` cipherstrings to include GCM and
add a special AESGCM string for GCM only. add a special AESGCM string for GCM only.
*Steve Henson* *Steve Henson*
@@ -6660,7 +6666,7 @@ OpenSSL 1.0.1
* Low level digest APIs are not approved in FIPS mode: any attempt * Low level digest APIs are not approved in FIPS mode: any attempt
to use these will cause a fatal error. Applications that *really* want to use these will cause a fatal error. Applications that *really* want
to use them can use the private_* version instead. to use them can use the `private_*` version instead.
*Steve Henson* *Steve Henson*
@@ -6772,7 +6778,7 @@ OpenSSL 1.0.1
OpenSSL 1.0.0 OpenSSL 1.0.0
------------- -------------
### Changes between 1.0.0s and 1.0.0t [3 Dec 2015] ### ### Changes between 1.0.0s and 1.0.0t [3 Dec 2015]
* X509_ATTRIBUTE memory leak * X509_ATTRIBUTE memory leak
@@ -6797,7 +6803,7 @@ OpenSSL 1.0.0
*Stephen Henson* *Stephen Henson*
### Changes between 1.0.0r and 1.0.0s [11 Jun 2015] ### ### Changes between 1.0.0r and 1.0.0s [11 Jun 2015]
* Malformed ECParameters causes infinite loop * Malformed ECParameters causes infinite loop
@@ -6870,7 +6876,7 @@ OpenSSL 1.0.0
*Matt Caswell* *Matt Caswell*
### Changes between 1.0.0q and 1.0.0r [19 Mar 2015] ### ### Changes between 1.0.0q and 1.0.0r [19 Mar 2015]
* Segmentation fault in ASN1_TYPE_cmp fix * Segmentation fault in ASN1_TYPE_cmp fix
@@ -6954,13 +6960,13 @@ OpenSSL 1.0.0
*Kurt Roeckx* *Kurt Roeckx*
### Changes between 1.0.0p and 1.0.0q [15 Jan 2015] ### ### Changes between 1.0.0p and 1.0.0q [15 Jan 2015]
* Build fixes for the Windows and OpenVMS platforms * Build fixes for the Windows and OpenVMS platforms
*Matt Caswell and Richard Levitte* *Matt Caswell and Richard Levitte*
### Changes between 1.0.0o and 1.0.0p [8 Jan 2015] ### ### Changes between 1.0.0o and 1.0.0p [8 Jan 2015]
* Fix DTLS segmentation fault in dtls1_get_record. A carefully crafted DTLS * Fix DTLS segmentation fault in dtls1_get_record. A carefully crafted DTLS
message can cause a segmentation fault in OpenSSL due to a NULL pointer message can cause a segmentation fault in OpenSSL due to a NULL pointer
@@ -7019,17 +7025,17 @@ OpenSSL 1.0.0
*Steve Henson* *Steve Henson*
*) Correct Bignum squaring. Bignum squaring (BN_sqr) may produce incorrect * Correct Bignum squaring. Bignum squaring (BN_sqr) may produce incorrect
results on some platforms, including x86_64. This bug occurs at random results on some platforms, including x86_64. This bug occurs at random
with a very low probability, and is not known to be exploitable in any with a very low probability, and is not known to be exploitable in any
way, though its exact impact is difficult to determine. Thanks to Pieter way, though its exact impact is difficult to determine. Thanks to Pieter
Wuille (Blockstream) who reported this issue and also suggested an initial Wuille (Blockstream) who reported this issue and also suggested an initial
fix. Further analysis was conducted by the OpenSSL development team and fix. Further analysis was conducted by the OpenSSL development team and
Adam Langley of Google. The final fix was developed by Andy Polyakov of Adam Langley of Google. The final fix was developed by Andy Polyakov of
the OpenSSL core team. the OpenSSL core team.
[CVE-2014-3570][] [CVE-2014-3570][]
*Andy Polyakov* *Andy Polyakov*
* Fix various certificate fingerprint issues. * Fix various certificate fingerprint issues.
@@ -7069,7 +7075,7 @@ OpenSSL 1.0.0
*Steve Henson* *Steve Henson*
### Changes between 1.0.0n and 1.0.0o [15 Oct 2014] ### ### Changes between 1.0.0n and 1.0.0o [15 Oct 2014]
* Session Ticket Memory Leak. * Session Ticket Memory Leak.
@@ -7107,10 +7113,9 @@ OpenSSL 1.0.0
Note: this is a precautionary measure and no attacks are currently known. Note: this is a precautionary measure and no attacks are currently known.
*Steve Henson* *Steve Henson*
### Changes between 1.0.0m and 1.0.0n [6 Aug 2014] ### ### Changes between 1.0.0m and 1.0.0n [6 Aug 2014]
* OpenSSL DTLS clients enabling anonymous (EC)DH ciphersuites are subject * OpenSSL DTLS clients enabling anonymous (EC)DH ciphersuites are subject
to a denial of service attack. A malicious server can crash the client to a denial of service attack. A malicious server can crash the client
@@ -7173,7 +7178,7 @@ OpenSSL 1.0.0
*Bodo Moeller* *Bodo Moeller*
### Changes between 1.0.0l and 1.0.0m [5 Jun 2014] ### ### Changes between 1.0.0l and 1.0.0m [5 Jun 2014]
* Fix for SSL/TLS MITM flaw. An attacker using a carefully crafted * Fix for SSL/TLS MITM flaw. An attacker using a carefully crafted
handshake can force the use of weak keying material in OpenSSL handshake can force the use of weak keying material in OpenSSL
@@ -7227,14 +7232,14 @@ OpenSSL 1.0.0
* Fix for the attack described in the paper "Recovering OpenSSL * Fix for the attack described in the paper "Recovering OpenSSL
ECDSA Nonces Using the FLUSH+RELOAD Cache Side-channel Attack" ECDSA Nonces Using the FLUSH+RELOAD Cache Side-channel Attack"
by Yuval Yarom and Naomi Benger. Details can be obtained from: by Yuval Yarom and Naomi Benger. Details can be obtained from:
http://eprint.iacr.org/2014/140 <http://eprint.iacr.org/2014/140>
Thanks to Yuval Yarom and Naomi Benger for discovering this Thanks to Yuval Yarom and Naomi Benger for discovering this
flaw and to Yuval Yarom for supplying a fix [CVE-2014-0076][] flaw and to Yuval Yarom for supplying a fix [CVE-2014-0076][]
*Yuval Yarom and Naomi Benger* *Yuval Yarom and Naomi Benger*
### Changes between 1.0.0k and 1.0.0l [6 Jan 2014] ### ### Changes between 1.0.0k and 1.0.0l [6 Jan 2014]
* Keep original DTLS digest and encryption contexts in retransmission * Keep original DTLS digest and encryption contexts in retransmission
structures so we can use the previous session parameters if they need structures so we can use the previous session parameters if they need
@@ -7251,13 +7256,13 @@ OpenSSL 1.0.0
*Rob Stradling, Adam Langley* *Rob Stradling, Adam Langley*
### Changes between 1.0.0j and 1.0.0k [5 Feb 2013] ### ### Changes between 1.0.0j and 1.0.0k [5 Feb 2013]
* Make the decoding of SSLv3, TLS and DTLS CBC records constant time. * Make the decoding of SSLv3, TLS and DTLS CBC records constant time.
This addresses the flaw in CBC record processing discovered by This addresses the flaw in CBC record processing discovered by
Nadhem Alfardan and Kenny Paterson. Details of this attack can be found Nadhem Alfardan and Kenny Paterson. Details of this attack can be found
at: http://www.isg.rhul.ac.uk/tls/ at: <http://www.isg.rhul.ac.uk/tls/>
Thanks go to Nadhem Alfardan and Kenny Paterson of the Information Thanks go to Nadhem Alfardan and Kenny Paterson of the Information
Security Group at Royal Holloway, University of London Security Group at Royal Holloway, University of London
@@ -7275,7 +7280,7 @@ OpenSSL 1.0.0
* Call OCSP Stapling callback after ciphersuite has been chosen, so * Call OCSP Stapling callback after ciphersuite has been chosen, so
the right response is stapled. Also change SSL_get_certificate() the right response is stapled. Also change SSL_get_certificate()
so it returns the certificate actually sent. so it returns the certificate actually sent.
See http://rt.openssl.org/Ticket/Display.html?id=2836. See <http://rt.openssl.org/Ticket/Display.html?id=2836>.
(This is a backport) (This is a backport)
*Rob Stradling <rob.stradling@comodo.com>* *Rob Stradling <rob.stradling@comodo.com>*
@@ -7284,7 +7289,7 @@ OpenSSL 1.0.0
*Steve Henson* *Steve Henson*
### Changes between 1.0.0i and 1.0.0j [10 May 2012] ### ### Changes between 1.0.0i and 1.0.0j [10 May 2012]
[NB: OpenSSL 1.0.0i and later 1.0.0 patch levels were released after [NB: OpenSSL 1.0.0i and later 1.0.0 patch levels were released after
OpenSSL 1.0.1.] OpenSSL 1.0.1.]
@@ -7303,7 +7308,7 @@ OpenSSL 1.0.1.]
*Steve Henson* *Steve Henson*
### Changes between 1.0.0h and 1.0.0i [19 Apr 2012] ### ### Changes between 1.0.0h and 1.0.0i [19 Apr 2012]
* Check for potentially exploitable overflows in asn1_d2i_read_bio * Check for potentially exploitable overflows in asn1_d2i_read_bio
BUF_mem_grow and BUF_mem_grow_clean. Refuse attempts to shrink buffer BUF_mem_grow and BUF_mem_grow_clean. Refuse attempts to shrink buffer
@@ -7315,7 +7320,7 @@ OpenSSL 1.0.1.]
*Adam Langley (Google), Tavis Ormandy, Google Security Team* *Adam Langley (Google), Tavis Ormandy, Google Security Team*
### Changes between 1.0.0g and 1.0.0h [12 Mar 2012] ### ### Changes between 1.0.0g and 1.0.0h [12 Mar 2012]
* Fix MMA (Bleichenbacher's attack on PKCS #1 v1.5 RSA padding) weakness * Fix MMA (Bleichenbacher's attack on PKCS #1 v1.5 RSA padding) weakness
in CMS and PKCS7 code. When RSA decryption fails use a random key for in CMS and PKCS7 code. When RSA decryption fails use a random key for
@@ -7335,7 +7340,7 @@ OpenSSL 1.0.1.]
*Steve Henson* *Steve Henson*
### Changes between 1.0.0f and 1.0.0g [18 Jan 2012] ### ### Changes between 1.0.0f and 1.0.0g [18 Jan 2012]
* Fix for DTLS DoS issue introduced by fix for CVE-2011-4109. * Fix for DTLS DoS issue introduced by fix for CVE-2011-4109.
Thanks to Antonio Martin, Enterprise Secure Access Research and Thanks to Antonio Martin, Enterprise Secure Access Research and
@@ -7344,7 +7349,7 @@ OpenSSL 1.0.1.]
*Antonio Martin* *Antonio Martin*
### Changes between 1.0.0e and 1.0.0f [4 Jan 2012] ### ### Changes between 1.0.0e and 1.0.0f [4 Jan 2012]
* Nadhem Alfardan and Kenny Paterson have discovered an extension * Nadhem Alfardan and Kenny Paterson have discovered an extension
of the Vaudenay padding oracle attack on CBC mode encryption of the Vaudenay padding oracle attack on CBC mode encryption
@@ -7352,7 +7357,7 @@ OpenSSL 1.0.1.]
the OpenSSL implementation of DTLS. Their attack exploits timing the OpenSSL implementation of DTLS. Their attack exploits timing
differences arising during decryption processing. A research differences arising during decryption processing. A research
paper describing this attack can be found at: paper describing this attack can be found at:
http://www.isg.rhul.ac.uk/~kp/dtls.pdf <http://www.isg.rhul.ac.uk/~kp/dtls.pdf>
Thanks go to Nadhem Alfardan and Kenny Paterson of the Information Thanks go to Nadhem Alfardan and Kenny Paterson of the Information
Security Group at Royal Holloway, University of London Security Group at Royal Holloway, University of London
(www.isg.rhul.ac.uk) for discovering this flaw and to Robin Seggelmann (www.isg.rhul.ac.uk) for discovering this flaw and to Robin Seggelmann
@@ -7395,7 +7400,7 @@ OpenSSL 1.0.1.]
*Emilia Käsper (Google)* *Emilia Käsper (Google)*
* Fix the BIO_f_buffer() implementation (which was mixing different * Fix the BIO_f_buffer() implementation (which was mixing different
interpretations of the '..._len' fields). interpretations of the `..._len` fields).
*Adam Langley (Google)* *Adam Langley (Google)*
@@ -7414,7 +7419,7 @@ OpenSSL 1.0.1.]
*Bob Buckholz (Google)* *Bob Buckholz (Google)*
### Changes between 1.0.0d and 1.0.0e [6 Sep 2011] ### ### Changes between 1.0.0d and 1.0.0e [6 Sep 2011]
* Fix bug where CRLs with nextUpdate in the past are sometimes accepted * Fix bug where CRLs with nextUpdate in the past are sometimes accepted
by initialising X509_STORE_CTX properly. [CVE-2011-3207][] by initialising X509_STORE_CTX properly. [CVE-2011-3207][]
@@ -7438,13 +7443,11 @@ OpenSSL 1.0.1.]
* Add protection against ECDSA timing attacks as mentioned in the paper * Add protection against ECDSA timing attacks as mentioned in the paper
by Billy Bob Brumley and Nicola Tuveri, see: by Billy Bob Brumley and Nicola Tuveri, see:
<http://eprint.iacr.org/2011/232.pdf>
http://eprint.iacr.org/2011/232.pdf
*Billy Bob Brumley and Nicola Tuveri* *Billy Bob Brumley and Nicola Tuveri*
### Changes between 1.0.0c and 1.0.0d [8 Feb 2011] ### ### Changes between 1.0.0c and 1.0.0d [8 Feb 2011]
* Fix parsing of OCSP stapling ClientHello extension. CVE-2011-0014 * Fix parsing of OCSP stapling ClientHello extension. CVE-2011-0014
@@ -7456,7 +7459,7 @@ OpenSSL 1.0.1.]
*Steve Henson* *Steve Henson*
### Changes between 1.0.0b and 1.0.0c [2 Dec 2010] ### ### Changes between 1.0.0b and 1.0.0c [2 Dec 2010]
* Disable code workaround for ancient and obsolete Netscape browsers * Disable code workaround for ancient and obsolete Netscape browsers
and servers: an attacker can use it in a ciphersuite downgrade attack. and servers: an attacker can use it in a ciphersuite downgrade attack.
@@ -7470,7 +7473,7 @@ OpenSSL 1.0.1.]
*Ben Laurie* *Ben Laurie*
### Changes between 1.0.0a and 1.0.0b [16 Nov 2010] ### ### Changes between 1.0.0a and 1.0.0b [16 Nov 2010]
* Fix extension code to avoid race conditions which can result in a buffer * Fix extension code to avoid race conditions which can result in a buffer
overrun vulnerability: resumed sessions must not be modified as they can overrun vulnerability: resumed sessions must not be modified as they can
@@ -7483,14 +7486,14 @@ OpenSSL 1.0.1.]
*Steve Henson* *Steve Henson*
### Changes between 1.0.0 and 1.0.0a [01 Jun 2010] ### ### Changes between 1.0.0 and 1.0.0a [01 Jun 2010]
* Check return value of int_rsa_verify in pkey_rsa_verifyrecover * Check return value of int_rsa_verify in pkey_rsa_verifyrecover
[CVE-2010-1633][] [CVE-2010-1633][]
*Steve Henson, Peter-Michael Hager <hager@dortmund.net>* *Steve Henson, Peter-Michael Hager <hager@dortmund.net>*
### Changes between 0.9.8n and 1.0.0 [29 Mar 2010] ### ### Changes between 0.9.8n and 1.0.0 [29 Mar 2010]
* Add "missing" function EVP_CIPHER_CTX_copy(). This copies a cipher * Add "missing" function EVP_CIPHER_CTX_copy(). This copies a cipher
context. The operation can be customised via the ctrl mechanism in context. The operation can be customised via the ctrl mechanism in
@@ -7566,7 +7569,7 @@ OpenSSL 1.0.1.]
* Add "missing" function EVP_MD_flags() (without this the only way to * Add "missing" function EVP_MD_flags() (without this the only way to
retrieve a digest flags is by accessing the structure directly. Update retrieve a digest flags is by accessing the structure directly. Update
EVP_MD_do_all*() and EVP_CIPHER_do_all*() to include the name a digest `EVP_MD_do_all*()` and `EVP_CIPHER_do_all*()` to include the name a digest
or cipher is registered as in the "from" argument. Print out all or cipher is registered as in the "from" argument. Print out all
registered digests in the dgst usage message instead of manually registered digests in the dgst usage message instead of manually
attempting to work them out. attempting to work them out.
@@ -7600,7 +7603,6 @@ OpenSSL 1.0.1.]
and this works for ENGINE based algorithms too. and this works for ENGINE based algorithms too.
*Steve Henson* *Steve Henson*
* Update Gost ENGINE to support parameter files. * Update Gost ENGINE to support parameter files.
@@ -7653,7 +7655,7 @@ OpenSSL 1.0.1.]
* New function OPENSSL_gmtime_adj() to add a specific number of days and * New function OPENSSL_gmtime_adj() to add a specific number of days and
seconds to a tm structure directly, instead of going through OS seconds to a tm structure directly, instead of going through OS
specific date routines. This avoids any issues with OS routines such specific date routines. This avoids any issues with OS routines such
as the year 2038 bug. New *_adj() functions for ASN1 time structures as the year 2038 bug. New `*_adj()` functions for ASN1 time structures
and X509_time_adj_ex() to cover the extended range. The existing and X509_time_adj_ex() to cover the extended range. The existing
X509_time_adj() is still usable and will no longer have any date issues. X509_time_adj() is still usable and will no longer have any date issues.
@@ -7871,13 +7873,11 @@ OpenSSL 1.0.1.]
SSL_set_options(ssl, SSL_OP_NO_SSLv2) is especially recommended SSL_set_options(ssl, SSL_OP_NO_SSLv2) is especially recommended
for applications that need to enforce opaque PRF input. for applications that need to enforce opaque PRF input.
*Bodo Moeller* *Bodo Moeller*
* Update ssl code to support digests other than SHA1+MD5 for handshake * Update ssl code to support digests other than SHA1+MD5 for handshake
MAC. MAC.
*Victor B. Wagner <vitus@cryptocom.ru>* *Victor B. Wagner <vitus@cryptocom.ru>*
* Add RFC4507 support to OpenSSL. This includes the corrections in * Add RFC4507 support to OpenSSL. This includes the corrections in
@@ -7921,7 +7921,7 @@ OpenSSL 1.0.1.]
*Steve Henson* *Steve Henson*
* Experimental support for use of HMAC via EVP_PKEY interface. This * Experimental support for use of HMAC via EVP_PKEY interface. This
allows HMAC to be handled via the EVP_DigestSign*() interface. The allows HMAC to be handled via the `EVP_DigestSign*()` interface. The
EVP_PKEY "key" in this case is the HMAC key, potentially allowing EVP_PKEY "key" in this case is the HMAC key, potentially allowing
ENGINE support for HMAC keys which are unextractable. New -mac and ENGINE support for HMAC keys which are unextractable. New -mac and
-macopt options to dgst utility. -macopt options to dgst utility.
@@ -7929,7 +7929,7 @@ OpenSSL 1.0.1.]
*Steve Henson* *Steve Henson*
* New option -sigopt to dgst utility. Update dgst to use * New option -sigopt to dgst utility. Update dgst to use
EVP_Digest{Sign,Verify}*. These two changes make it possible to use `EVP_Digest{Sign,Verify}*`. These two changes make it possible to use
alternative signing parameters such as X9.31 or PSS in the dgst alternative signing parameters such as X9.31 or PSS in the dgst
utility. utility.
@@ -8138,7 +8138,6 @@ OpenSSL 1.0.1.]
AECDH - anonymous ECDH AECDH - anonymous ECDH
EECDH - non-anonymous ephemeral ECDH (equivalent to "kEECDH:-AECDH") EECDH - non-anonymous ephemeral ECDH (equivalent to "kEECDH:-AECDH")
*Bodo Moeller* *Bodo Moeller*
* Add additional S/MIME capabilities for AES and GOST ciphers if supported. * Add additional S/MIME capabilities for AES and GOST ciphers if supported.
@@ -8157,8 +8156,8 @@ OpenSSL 1.0.1.]
*Steve Henson* *Steve Henson*
* New functions EVP_Digest{Sign,Verify)*. These are enhanced versions of * New functions `EVP_Digest{Sign,Verify)*`. These are enhanced versions of
EVP_{Sign,Verify}* which allow an application to customise the signature `EVP_{Sign,Verify}*` which allow an application to customise the signature
process. process.
*Steve Henson* *Steve Henson*
@@ -8266,8 +8265,8 @@ OpenSSL 1.0.1.]
*Steve Henson* *Steve Henson*
* Add functions for main EVP_PKEY_method operations. The undocumented * Add functions for main EVP_PKEY_method operations. The undocumented
functions EVP_PKEY_{encrypt,decrypt} have been renamed to functions `EVP_PKEY_{encrypt,decrypt}` have been renamed to
EVP_PKEY_{encrypt,decrypt}_old. `EVP_PKEY_{encrypt,decrypt}_old`.
*Steve Henson* *Steve Henson*
@@ -8333,7 +8332,6 @@ OpenSSL 1.0.1.]
SSL_get_psk_identity SSL_get_psk_identity
SSL_use_psk_identity_hint SSL_use_psk_identity_hint
*Mika Kousa and Pasi Eronen of Nokia Corporation* *Mika Kousa and Pasi Eronen of Nokia Corporation*
* Add RFC 3161 compliant time stamp request creation, response generation * Add RFC 3161 compliant time stamp request creation, response generation
@@ -8344,7 +8342,7 @@ OpenSSL 1.0.1.]
* Add initial support for TLS extensions, specifically for the server_name * Add initial support for TLS extensions, specifically for the server_name
extension so far. The SSL_SESSION, SSL_CTX, and SSL data structures now extension so far. The SSL_SESSION, SSL_CTX, and SSL data structures now
have new members for a host name. The SSL data structure has an have new members for a host name. The SSL data structure has an
additional member SSL_CTX *initial_ctx so that new sessions can be additional member `SSL_CTX *initial_ctx` so that new sessions can be
stored in that context to allow for session resumption, even after the stored in that context to allow for session resumption, even after the
SSL has been switched to a new SSL_CTX in reaction to a client's SSL has been switched to a new SSL_CTX in reaction to a client's
server_name extension. server_name extension.
@@ -8373,7 +8371,6 @@ OpenSSL 1.0.1.]
default is a warning; it becomes fatal with the '-servername_fatal' default is a warning; it becomes fatal with the '-servername_fatal'
option. option.
*Peter Sylvester, Remy Allais, Christophe Renou* *Peter Sylvester, Remy Allais, Christophe Renou*
* Whirlpool hash implementation is added. * Whirlpool hash implementation is added.
@@ -8458,7 +8455,7 @@ OpenSSL 1.0.1.]
OpenSSL 0.9.x OpenSSL 0.9.x
------------- -------------
### Changes between 0.9.8m and 0.9.8n [24 Mar 2010] ### ### Changes between 0.9.8m and 0.9.8n [24 Mar 2010]
* When rejecting SSL/TLS records due to an incorrect version number, never * When rejecting SSL/TLS records due to an incorrect version number, never
update s->server with a new major version number. As of update s->server with a new major version number. As of
@@ -8475,7 +8472,7 @@ OpenSSL 0.9.x
*Tomas Hoger <thoger@redhat.com>* *Tomas Hoger <thoger@redhat.com>*
### Changes between 0.9.8l and 0.9.8m [25 Feb 2010] ### ### Changes between 0.9.8l and 0.9.8m [25 Feb 2010]
* Always check bn_wexpand() return values for failure. [CVE-2009-3245][] * Always check bn_wexpand() return values for failure. [CVE-2009-3245][]
@@ -8659,11 +8656,11 @@ OpenSSL 0.9.x
*Darryl Miles <darryl-mailinglists@netbauds.net>* *Darryl Miles <darryl-mailinglists@netbauds.net>*
* Add 2.5.4.* OIDs * Add `2.5.4.*` OIDs
*Ilya O. <vrghost@gmail.com>* *Ilya O. <vrghost@gmail.com>*
### Changes between 0.9.8k and 0.9.8l [5 Nov 2009] ### ### Changes between 0.9.8k and 0.9.8l [5 Nov 2009]
* Disable renegotiation completely - this fixes a severe security * Disable renegotiation completely - this fixes a severe security
problem [CVE-2009-3555][] at the cost of breaking all problem [CVE-2009-3555][] at the cost of breaking all
@@ -8674,10 +8671,10 @@ OpenSSL 0.9.x
*Ben Laurie* *Ben Laurie*
### Changes between 0.9.8j and 0.9.8k [25 Mar 2009] ### ### Changes between 0.9.8j and 0.9.8k [25 Mar 2009]
* Don't set val to NULL when freeing up structures, it is freed up by * Don't set val to NULL when freeing up structures, it is freed up by
underlying code. If sizeof(void *) > sizeof(long) this can result in underlying code. If `sizeof(void *) > sizeof(long)` this can result in
zeroing past the valid field. [CVE-2009-0789][] zeroing past the valid field. [CVE-2009-0789][]
*Paolo Ganci <Paolo.Ganci@AdNovum.CH>* *Paolo Ganci <Paolo.Ganci@AdNovum.CH>*
@@ -8728,7 +8725,7 @@ OpenSSL 0.9.x
*Ben Laurie* *Ben Laurie*
### Changes between 0.9.8i and 0.9.8j [07 Jan 2009] ### ### Changes between 0.9.8i and 0.9.8j [07 Jan 2009]
* Properly check EVP_VerifyFinal() and similar return values * Properly check EVP_VerifyFinal() and similar return values
[CVE-2008-5077][]. [CVE-2008-5077][].
@@ -8775,7 +8772,7 @@ OpenSSL 0.9.x
*Bodo Moeller* *Bodo Moeller*
### Changes between 0.9.8h and 0.9.8i [15 Sep 2008] ### ### Changes between 0.9.8h and 0.9.8i [15 Sep 2008]
* Fix NULL pointer dereference if a DTLS server received * Fix NULL pointer dereference if a DTLS server received
ChangeCipherSpec as first record [CVE-2009-1386][]. ChangeCipherSpec as first record [CVE-2009-1386][].
@@ -8783,7 +8780,7 @@ OpenSSL 0.9.x
*PR #1679* *PR #1679*
* Fix a state transition in s3_srvr.c and d1_srvr.c * Fix a state transition in s3_srvr.c and d1_srvr.c
(was using SSL3_ST_CW_CLNT_HELLO_B, should be ..._ST_SW_SRVR_...). (was using SSL3_ST_CW_CLNT_HELLO_B, should be `..._ST_SW_SRVR_...`).
*Nagendra Modadugu* *Nagendra Modadugu*
@@ -8795,7 +8792,6 @@ OpenSSL 0.9.x
So now fix this for real by retiring the MONT_HELPER macro So now fix this for real by retiring the MONT_HELPER macro
in crypto/rsa/rsa_eay.c. in crypto/rsa/rsa_eay.c.
*Bodo Moeller; problem pointed out by Marius Schilder* *Bodo Moeller; problem pointed out by Marius Schilder*
* Various precautionary measures: * Various precautionary measures:
@@ -8812,7 +8808,6 @@ OpenSSL 0.9.x
- Enforce the 'num' check in BN_div() (bn_div.c) for non-BN_DEBUG - Enforce the 'num' check in BN_div() (bn_div.c) for non-BN_DEBUG
builds. builds.
*Neel Mehta, Bodo Moeller* *Neel Mehta, Bodo Moeller*
* Allow engines to be "soft loaded" - i.e. optionally don't die if * Allow engines to be "soft loaded" - i.e. optionally don't die if
@@ -8849,7 +8844,7 @@ OpenSSL 0.9.x
*Steve Henson* *Steve Henson*
### Changes between 0.9.8g and 0.9.8h [28 May 2008] ### ### Changes between 0.9.8g and 0.9.8h [28 May 2008]
* Fix flaw if 'Server Key exchange message' is omitted from a TLS * Fix flaw if 'Server Key exchange message' is omitted from a TLS
handshake which could lead to a client crash as found using the handshake which could lead to a client crash as found using the
@@ -8904,7 +8899,6 @@ OpenSSL 0.9.x
namely BN_from_montgomery_word. (To enable this otherwise, namely BN_from_montgomery_word. (To enable this otherwise,
e.g. x86_64, try `-DMONT_FROM_WORD___NON_DEFAULT_0_9_8_BUILD`.) e.g. x86_64, try `-DMONT_FROM_WORD___NON_DEFAULT_0_9_8_BUILD`.)
*Andy Polyakov (backport partially by Bodo Moeller)* *Andy Polyakov (backport partially by Bodo Moeller)*
* Add TLS session ticket callback. This allows an application to set * Add TLS session ticket callback. This allows an application to set
@@ -9001,7 +8995,7 @@ OpenSSL 0.9.x
*Steve Henson* *Steve Henson*
### Changes between 0.9.8f and 0.9.8g [19 Oct 2007] ### ### Changes between 0.9.8f and 0.9.8g [19 Oct 2007]
* Fix various bugs: * Fix various bugs:
+ Binary incompatibility of ssl_ctx_st structure + Binary incompatibility of ssl_ctx_st structure
@@ -9011,7 +9005,7 @@ OpenSSL 0.9.x
*Andy Polyakov, Steve Henson* *Andy Polyakov, Steve Henson*
### Changes between 0.9.8e and 0.9.8f [11 Oct 2007] ### ### Changes between 0.9.8e and 0.9.8f [11 Oct 2007]
* DTLS Handshake overhaul. There were longstanding issues with * DTLS Handshake overhaul. There were longstanding issues with
OpenSSL DTLS implementation, which were making it impossible for OpenSSL DTLS implementation, which were making it impossible for
@@ -9055,7 +9049,7 @@ OpenSSL 0.9.x
* Add initial support for TLS extensions, specifically for the server_name * Add initial support for TLS extensions, specifically for the server_name
extension so far. The SSL_SESSION, SSL_CTX, and SSL data structures now extension so far. The SSL_SESSION, SSL_CTX, and SSL data structures now
have new members for a host name. The SSL data structure has an have new members for a host name. The SSL data structure has an
additional member SSL_CTX *initial_ctx so that new sessions can be additional member `SSL_CTX *initial_ctx` so that new sessions can be
stored in that context to allow for session resumption, even after the stored in that context to allow for session resumption, even after the
SSL has been switched to a new SSL_CTX in reaction to a client's SSL has been switched to a new SSL_CTX in reaction to a client's
server_name extension. server_name extension.
@@ -9084,7 +9078,6 @@ OpenSSL 0.9.x
default is a warning; it becomes fatal with the '-servername_fatal' default is a warning; it becomes fatal with the '-servername_fatal'
option. option.
*Peter Sylvester, Remy Allais, Christophe Renou, Steve Henson* *Peter Sylvester, Remy Allais, Christophe Renou, Steve Henson*
* Add AES and SSE2 assembly language support to VC++ build. * Add AES and SSE2 assembly language support to VC++ build.
@@ -9109,7 +9102,7 @@ OpenSSL 0.9.x
*Dean Gaudet (Google)* *Dean Gaudet (Google)*
* Add the Korean symmetric 128-bit cipher SEED (see * Add the Korean symmetric 128-bit cipher SEED (see
http://www.kisa.or.kr/kisa/seed/jsp/seed_eng.jsp) and <http://www.kisa.or.kr/kisa/seed/jsp/seed_eng.jsp>) and
add SEED ciphersuites from RFC 4162: add SEED ciphersuites from RFC 4162:
TLS_RSA_WITH_SEED_CBC_SHA = "SEED-SHA" TLS_RSA_WITH_SEED_CBC_SHA = "SEED-SHA"
@@ -9126,7 +9119,7 @@ OpenSSL 0.9.x
* Mitigate branch prediction attacks, which can be practical if a * Mitigate branch prediction attacks, which can be practical if a
single processor is shared, allowing a spy process to extract single processor is shared, allowing a spy process to extract
information. For detailed background information, see information. For detailed background information, see
http://eprint.iacr.org/2007/039 (O. Aciicmez, S. Gueron, <http://eprint.iacr.org/2007/039> (O. Aciicmez, S. Gueron,
J.-P. Seifert, "New Branch Prediction Vulnerabilities in OpenSSL J.-P. Seifert, "New Branch Prediction Vulnerabilities in OpenSSL
and Necessary Software Countermeasures"). The core of the change and Necessary Software Countermeasures"). The core of the change
are new versions BN_div_no_branch() and are new versions BN_div_no_branch() and
@@ -9151,14 +9144,13 @@ OpenSSL 0.9.x
BN_BLINDING_new() will now use BN_dup() for the modulus so that BN_BLINDING_new() will now use BN_dup() for the modulus so that
the BN_BLINDING structure gets an independent copy of the the BN_BLINDING structure gets an independent copy of the
modulus. This means that the previous "BIGNUM *m" argument to modulus. This means that the previous `BIGNUM *m` argument to
BN_BLINDING_new() and to BN_BLINDING_create_param() now BN_BLINDING_new() and to BN_BLINDING_create_param() now
essentially becomes "const BIGNUM *m", although we can't actually essentially becomes `const BIGNUM *m`, although we can't actually
change this in the header file before 0.9.9. It allows change this in the header file before 0.9.9. It allows
RSA_setup_blinding() to use BN_with_flags() on the modulus to RSA_setup_blinding() to use BN_with_flags() on the modulus to
enable BN_FLG_CONSTTIME. enable BN_FLG_CONSTTIME.
*Matthew D Wood (Intel Corp)* *Matthew D Wood (Intel Corp)*
* In the SSL/TLS server implementation, be strict about session ID * In the SSL/TLS server implementation, be strict about session ID
@@ -9183,7 +9175,7 @@ OpenSSL 0.9.x
not complete and could lead to a possible single byte overflow not complete and could lead to a possible single byte overflow
[CVE-2007-5135][] [Ben Laurie] [CVE-2007-5135][] [Ben Laurie]
### Changes between 0.9.8d and 0.9.8e [23 Feb 2007] ### ### Changes between 0.9.8d and 0.9.8e [23 Feb 2007]
* Since AES128 and AES256 (and similarly Camellia128 and * Since AES128 and AES256 (and similarly Camellia128 and
Camellia256) share a single mask bit in the logic of Camellia256) share a single mask bit in the logic of
@@ -9225,7 +9217,7 @@ OpenSSL 0.9.x
*Goetz Babin-Ebell* *Goetz Babin-Ebell*
### Changes between 0.9.8c and 0.9.8d [28 Sep 2006] ### ### Changes between 0.9.8c and 0.9.8d [28 Sep 2006]
* Introduce limits to prevent malicious keys being able to * Introduce limits to prevent malicious keys being able to
cause a denial of service. [CVE-2006-2940][] cause a denial of service. [CVE-2006-2940][]
@@ -9268,10 +9260,9 @@ OpenSSL 0.9.x
definition to split the single 'unsigned long mask' bitmap into definition to split the single 'unsigned long mask' bitmap into
multiple values to extend the available space. multiple values to extend the available space.
*Bodo Moeller* *Bodo Moeller*
### Changes between 0.9.8b and 0.9.8c [05 Sep 2006] ### ### Changes between 0.9.8b and 0.9.8c [05 Sep 2006]
* Avoid PKCS #1 v1.5 signature attack discovered by Daniel Bleichenbacher * Avoid PKCS #1 v1.5 signature attack discovered by Daniel Bleichenbacher
[CVE-2006-4339][] [Ben Laurie and Google Security Team] [CVE-2006-4339][] [Ben Laurie and Google Security Team]
@@ -9298,9 +9289,9 @@ OpenSSL 0.9.x
* Disable rogue ciphersuites: * Disable rogue ciphersuites:
- SSLv2 0x08 0x00 0x80 ("RC4-64-MD5") - SSLv2 0x08 0x00 0x80 ("RC4-64-MD5")
- SSLv3/TLSv1 0x00 0x61 ("EXP1024-RC2-CBC-MD5") - SSLv3/TLSv1 0x00 0x61 ("EXP1024-RC2-CBC-MD5")
- SSLv3/TLSv1 0x00 0x60 ("EXP1024-RC4-MD5") - SSLv3/TLSv1 0x00 0x60 ("EXP1024-RC4-MD5")
The latter two were purportedly from The latter two were purportedly from
draft-ietf-tls-56-bit-ciphersuites-0[01].txt, but do not really draft-ietf-tls-56-bit-ciphersuites-0[01].txt, but do not really
@@ -9319,7 +9310,7 @@ OpenSSL 0.9.x
* Add the symmetric cipher Camellia (128-bit, 192-bit, 256-bit key * Add the symmetric cipher Camellia (128-bit, 192-bit, 256-bit key
versions), which is now available for royalty-free use versions), which is now available for royalty-free use
(see http://info.isl.ntt.co.jp/crypt/eng/info/chiteki.html). (see <http://info.isl.ntt.co.jp/crypt/eng/info/chiteki.html>).
Also, add Camellia TLS ciphersuites from RFC 4132. Also, add Camellia TLS ciphersuites from RFC 4132.
To minimize changes between patchlevels in the OpenSSL 0.9.8 To minimize changes between patchlevels in the OpenSSL 0.9.8
@@ -9337,7 +9328,7 @@ OpenSSL 0.9.x
*Steve Henson* *Steve Henson*
### Changes between 0.9.8a and 0.9.8b [04 May 2006] ### ### Changes between 0.9.8a and 0.9.8b [04 May 2006]
* When applying a cipher rule check to see if string match is an explicit * When applying a cipher rule check to see if string match is an explicit
cipher suite and only match that one cipher suite if it is. cipher suite and only match that one cipher suite if it is.
@@ -9363,7 +9354,7 @@ OpenSSL 0.9.x
* Fixes and enhancements to zlib compression code. We now only use * Fixes and enhancements to zlib compression code. We now only use
"zlib1.dll" and use the default `__cdecl` calling convention on Win32 "zlib1.dll" and use the default `__cdecl` calling convention on Win32
to conform with the standards mentioned here: to conform with the standards mentioned here:
http://www.zlib.net/DLL_FAQ.txt <http://www.zlib.net/DLL_FAQ.txt>
Static zlib linking now works on Windows and the new --with-zlib-include Static zlib linking now works on Windows and the new --with-zlib-include
--with-zlib-lib options to Configure can be used to supply the location --with-zlib-lib options to Configure can be used to supply the location
of the headers and library. Gracefully handle case where zlib library of the headers and library. Gracefully handle case where zlib library
@@ -9388,7 +9379,7 @@ OpenSSL 0.9.x
*Richard Levitte* *Richard Levitte*
### Changes between 0.9.8 and 0.9.8a [11 Oct 2005] ### ### Changes between 0.9.8 and 0.9.8a [11 Oct 2005]
* Remove the functionality of SSL_OP_MSIE_SSLV2_RSA_PADDING * Remove the functionality of SSL_OP_MSIE_SSLV2_RSA_PADDING
(part of SSL_OP_ALL). This option used to disable the (part of SSL_OP_ALL). This option used to disable the
@@ -9398,7 +9389,7 @@ OpenSSL 0.9.x
*Bodo Moeller; problem pointed out by Yutaka Oiwa (Research Center *Bodo Moeller; problem pointed out by Yutaka Oiwa (Research Center
for Information Security, National Institute of Advanced Industrial for Information Security, National Institute of Advanced Industrial
Science and Technology [AIST*, Japan)] Science and Technology [AIST], Japan)*
* Add two function to clear and return the verify parameter flags. * Add two function to clear and return the verify parameter flags.
@@ -9432,7 +9423,7 @@ OpenSSL 0.9.x
*Steve Henson* *Steve Henson*
### Changes between 0.9.7h and 0.9.8 [05 Jul 2005] ### ### Changes between 0.9.7h and 0.9.8 [05 Jul 2005]
[NB: OpenSSL 0.9.7i and later 0.9.7 patch levels were released after [NB: OpenSSL 0.9.7i and later 0.9.7 patch levels were released after
OpenSSL 0.9.8.] OpenSSL 0.9.8.]
@@ -9522,7 +9513,6 @@ OpenSSL 0.9.8.]
fee for non-commercial use. As before, "no-idea" can be used to fee for non-commercial use. As before, "no-idea" can be used to
avoid this algorithm.) avoid this algorithm.)
*Bodo Moeller* *Bodo Moeller*
* Add processing of proxy certificates (see RFC 3820). This work was * Add processing of proxy certificates (see RFC 3820). This work was
@@ -9545,7 +9535,6 @@ OpenSSL 0.9.8.]
The blank line is mandatory. The blank line is mandatory.
*Steve Henson* *Steve Henson*
* New arguments -certform, -keyform and -pass for s_client and s_server * New arguments -certform, -keyform and -pass for s_client and s_server
@@ -9569,7 +9558,7 @@ OpenSSL 0.9.8.]
*Michal Ludvig <michal@logix.cz>, with help from Andy Polyakov* *Michal Ludvig <michal@logix.cz>, with help from Andy Polyakov*
* Deprecate BN_[get|set]_params() functions (they were ignored internally). * Deprecate `BN_[get|set]_params()` functions (they were ignored internally).
*Geoff Thorpe* *Geoff Thorpe*
@@ -9718,7 +9707,7 @@ OpenSSL 0.9.8.]
to clean up those corresponding objects before destroying the hash table to clean up those corresponding objects before destroying the hash table
(and losing the object pointers). So some over-zealous constifications in (and losing the object pointers). So some over-zealous constifications in
LHASH have been relaxed so that lh_insert() does not take (nor store) the LHASH have been relaxed so that lh_insert() does not take (nor store) the
objects as "const" and the lh_doall[_arg] callback wrappers are not objects as "const" and the `lh_doall[_arg]` callback wrappers are not
prototyped to have "const" restrictions on the object pointers they are prototyped to have "const" restrictions on the object pointers they are
given (and so aren't required to cast them away any more). given (and so aren't required to cast them away any more).
@@ -9727,8 +9716,9 @@ OpenSSL 0.9.8.]
* The tmdiff.h API was so ugly and minimal that our own timing utility * The tmdiff.h API was so ugly and minimal that our own timing utility
(speed) prefers to use its own implementation. The two implementations (speed) prefers to use its own implementation. The two implementations
haven't been consolidated as yet (volunteers?) but the tmdiff API has had haven't been consolidated as yet (volunteers?) but the tmdiff API has had
its object type properly exposed (MS_TM) instead of casting to/from "char its object type properly exposed (MS_TM) instead of casting to/from
*". This may still change yet if someone realises MS_TM and "ms_time_***" `char *`. This may still change yet if someone realises MS_TM and
`ms_time_***`
aren't necessarily the greatest nomenclatures - but this is what was used aren't necessarily the greatest nomenclatures - but this is what was used
internally to the implementation so I've used that for now. internally to the implementation so I've used that for now.
@@ -9961,7 +9951,7 @@ OpenSSL 0.9.8.]
* Change the "progress" mechanism used in key-generation and * Change the "progress" mechanism used in key-generation and
primality testing to functions that take a new BN_GENCB pointer in primality testing to functions that take a new BN_GENCB pointer in
place of callback/argument pairs. The new API functions have "_ex" place of callback/argument pairs. The new API functions have `_ex`
postfixes and the older functions are reimplemented as wrappers for postfixes and the older functions are reimplemented as wrappers for
the new ones. The OPENSSL_NO_DEPRECATED symbol can be used to hide the new ones. The OPENSSL_NO_DEPRECATED symbol can be used to hide
declarations of the old functions to help (graceful) attempts to declarations of the old functions to help (graceful) attempts to
@@ -10122,8 +10112,7 @@ OpenSSL 0.9.8.]
* Add named elliptic curves over binary fields from X9.62, SECG, * Add named elliptic curves over binary fields from X9.62, SECG,
and WAP/WTLS; add OIDs that were still missing. and WAP/WTLS; add OIDs that were still missing.
*Sheueling Chang Shantz and Douglas Stebila *Sheueling Chang Shantz and Douglas Stebila (Sun Microsystems Laboratories)*
(Sun Microsystems Laboratories)*
* Extend the EC library for elliptic curves over binary fields * Extend the EC library for elliptic curves over binary fields
(new files ec2_smpl.c, ec2_smpt.c, ec2_mult.c in crypto/ec/). (new files ec2_smpl.c, ec2_smpt.c, ec2_mult.c in crypto/ec/).
@@ -10147,16 +10136,15 @@ OpenSSL 0.9.8.]
As binary polynomials are represented as BIGNUMs, various members As binary polynomials are represented as BIGNUMs, various members
of the EC_GROUP and EC_POINT data structures can be shared of the EC_GROUP and EC_POINT data structures can be shared
between the implementations for prime fields and binary fields; between the implementations for prime fields and binary fields;
the above ..._GF2m functions (except for EX_GROUP_new_curve_GF2m) the above `..._GF2m functions` (except for EX_GROUP_new_curve_GF2m)
are essentially identical to their ..._GFp counterparts. are essentially identical to their `..._GFp` counterparts.
(For simplicity, the '..._GFp' prefix has been dropped from (For simplicity, the `..._GFp` prefix has been dropped from
various internal method names.) various internal method names.)
An internal 'field_div' method (similar to 'field_mul' and An internal 'field_div' method (similar to 'field_mul' and
'field_sqr') has been added; this is used only for binary fields. 'field_sqr') has been added; this is used only for binary fields.
*Sheueling Chang Shantz and Douglas Stebila *Sheueling Chang Shantz and Douglas Stebila (Sun Microsystems Laboratories)*
(Sun Microsystems Laboratories)*
* Optionally dispatch EC_POINT_mul(), EC_POINT_precompute_mult() * Optionally dispatch EC_POINT_mul(), EC_POINT_precompute_mult()
through methods ('mul', 'precompute_mult'). through methods ('mul', 'precompute_mult').
@@ -10165,21 +10153,18 @@ OpenSSL 0.9.8.]
and 'ec_wNAF_precomputed_mult') remain the default if these and 'ec_wNAF_precomputed_mult') remain the default if these
methods are undefined. methods are undefined.
*Sheueling Chang Shantz and Douglas Stebila *Sheueling Chang Shantz and Douglas Stebila (Sun Microsystems Laboratories)*
(Sun Microsystems Laboratories)*
* New function EC_GROUP_get_degree, which is defined through * New function EC_GROUP_get_degree, which is defined through
EC_METHOD. For curves over prime fields, this returns the bit EC_METHOD. For curves over prime fields, this returns the bit
length of the modulus. length of the modulus.
*Sheueling Chang Shantz and Douglas Stebila *Sheueling Chang Shantz and Douglas Stebila (Sun Microsystems Laboratories)*
(Sun Microsystems Laboratories)*
* New functions EC_GROUP_dup, EC_POINT_dup. * New functions EC_GROUP_dup, EC_POINT_dup.
(These simply call ..._new and ..._copy). (These simply call ..._new and ..._copy).
*Sheueling Chang Shantz and Douglas Stebila *Sheueling Chang Shantz and Douglas Stebila (Sun Microsystems Laboratories)*
(Sun Microsystems Laboratories)*
* Add binary polynomial arithmetic software in crypto/bn/bn_gf2m.c. * Add binary polynomial arithmetic software in crypto/bn/bn_gf2m.c.
Polynomials are represented as BIGNUMs (where the sign bit is not Polynomials are represented as BIGNUMs (where the sign bit is not
@@ -10232,8 +10217,7 @@ OpenSSL 0.9.8.]
if OPENSSL_SUN_GF2M_DIV is defined (patent pending; read the if OPENSSL_SUN_GF2M_DIV is defined (patent pending; read the
copyright notice in crypto/bn/bn_gf2m.c before enabling it). copyright notice in crypto/bn/bn_gf2m.c before enabling it).
*Sheueling Chang Shantz and Douglas Stebila *Sheueling Chang Shantz and Douglas Stebila (Sun Microsystems Laboratories)*
(Sun Microsystems Laboratories)*
* Add new error code 'ERR_R_DISABLED' that can be used when some * Add new error code 'ERR_R_DISABLED' that can be used when some
functionality is disabled at compile-time. functionality is disabled at compile-time.
@@ -10356,7 +10340,7 @@ OpenSSL 0.9.8.]
*Richard Levitte* *Richard Levitte*
### Changes between 0.9.7l and 0.9.7m [23 Feb 2007] ### ### Changes between 0.9.7l and 0.9.7m [23 Feb 2007]
* Cleanse PEM buffers before freeing them since they may contain * Cleanse PEM buffers before freeing them since they may contain
sensitive data. sensitive data.
@@ -10406,7 +10390,7 @@ OpenSSL 0.9.8.]
*Steve Henson* *Steve Henson*
### Changes between 0.9.7k and 0.9.7l [28 Sep 2006] ### ### Changes between 0.9.7k and 0.9.7l [28 Sep 2006]
* Introduce limits to prevent malicious keys being able to * Introduce limits to prevent malicious keys being able to
cause a denial of service. [CVE-2006-2940][] cause a denial of service. [CVE-2006-2940][]
@@ -10434,7 +10418,7 @@ OpenSSL 0.9.8.]
*Bodo Moeller* *Bodo Moeller*
### Changes between 0.9.7j and 0.9.7k [05 Sep 2006] ### ### Changes between 0.9.7j and 0.9.7k [05 Sep 2006]
* Avoid PKCS #1 v1.5 signature attack discovered by Daniel Bleichenbacher * Avoid PKCS #1 v1.5 signature attack discovered by Daniel Bleichenbacher
[CVE-2006-4339][] [Ben Laurie and Google Security Team] [CVE-2006-4339][] [Ben Laurie and Google Security Team]
@@ -10447,9 +10431,9 @@ OpenSSL 0.9.8.]
* Disable rogue ciphersuites: * Disable rogue ciphersuites:
- SSLv2 0x08 0x00 0x80 ("RC4-64-MD5") - SSLv2 0x08 0x00 0x80 ("RC4-64-MD5")
- SSLv3/TLSv1 0x00 0x61 ("EXP1024-RC2-CBC-MD5") - SSLv3/TLSv1 0x00 0x61 ("EXP1024-RC2-CBC-MD5")
- SSLv3/TLSv1 0x00 0x60 ("EXP1024-RC4-MD5") - SSLv3/TLSv1 0x00 0x60 ("EXP1024-RC4-MD5")
The latter two were purportedly from The latter two were purportedly from
draft-ietf-tls-56-bit-ciphersuites-0[01].txt, but do not really draft-ietf-tls-56-bit-ciphersuites-0[01].txt, but do not really
@@ -10466,7 +10450,7 @@ OpenSSL 0.9.8.]
*Bodo Moeller* *Bodo Moeller*
### Changes between 0.9.7i and 0.9.7j [04 May 2006] ### ### Changes between 0.9.7i and 0.9.7j [04 May 2006]
* Adapt fipsld and the build system to link against the validated FIPS * Adapt fipsld and the build system to link against the validated FIPS
module in FIPS mode. module in FIPS mode.
@@ -10484,7 +10468,7 @@ OpenSSL 0.9.8.]
*Steve Henson* *Steve Henson*
### Changes between 0.9.7h and 0.9.7i [14 Oct 2005] ### ### Changes between 0.9.7h and 0.9.7i [14 Oct 2005]
* Wrapped the definition of EVP_MAX_MD_SIZE in a #ifdef OPENSSL_FIPS. * Wrapped the definition of EVP_MAX_MD_SIZE in a #ifdef OPENSSL_FIPS.
The value now differs depending on if you build for FIPS or not. The value now differs depending on if you build for FIPS or not.
@@ -10494,7 +10478,7 @@ OpenSSL 0.9.8.]
*Andy Polyakov* *Andy Polyakov*
### Changes between 0.9.7g and 0.9.7h [11 Oct 2005] ### ### Changes between 0.9.7g and 0.9.7h [11 Oct 2005]
* Remove the functionality of SSL_OP_MSIE_SSLV2_RSA_PADDING * Remove the functionality of SSL_OP_MSIE_SSLV2_RSA_PADDING
(part of SSL_OP_ALL). This option used to disable the (part of SSL_OP_ALL). This option used to disable the
@@ -10504,7 +10488,7 @@ OpenSSL 0.9.8.]
*Bodo Moeller; problem pointed out by Yutaka Oiwa (Research Center *Bodo Moeller; problem pointed out by Yutaka Oiwa (Research Center
for Information Security, National Institute of Advanced Industrial for Information Security, National Institute of Advanced Industrial
Science and Technology [AIST*, Japan)] Science and Technology [AIST, Japan)]*
* Minimal support for X9.31 signatures and PSS padding modes. This is * Minimal support for X9.31 signatures and PSS padding modes. This is
mainly for FIPS compliance and not fully integrated at this stage. mainly for FIPS compliance and not fully integrated at this stage.
@@ -10532,7 +10516,6 @@ OpenSSL 0.9.8.]
RSA_FLAG_NO_EXP_CONSTTIME, DSA_FLAG_NO_EXP_CONSTTIME, or RSA_FLAG_NO_EXP_CONSTTIME, DSA_FLAG_NO_EXP_CONSTTIME, or
DH_FLAG_NO_EXP_CONSTTIME, respectively, is set. DH_FLAG_NO_EXP_CONSTTIME, respectively, is set.
*Matthew D Wood (Intel Corp), with some changes by Bodo Moeller* *Matthew D Wood (Intel Corp), with some changes by Bodo Moeller*
* Change the client implementation for SSLv23_method() and * Change the client implementation for SSLv23_method() and
@@ -10560,7 +10543,7 @@ OpenSSL 0.9.8.]
*Steve Henson* *Steve Henson*
### Changes between 0.9.7f and 0.9.7g [11 Apr 2005] ### ### Changes between 0.9.7f and 0.9.7g [11 Apr 2005]
[NB: OpenSSL 0.9.7h and later 0.9.7 patch levels were released after [NB: OpenSSL 0.9.7h and later 0.9.7 patch levels were released after
OpenSSL 0.9.8.] OpenSSL 0.9.8.]
@@ -10585,7 +10568,7 @@ OpenSSL 0.9.8.]
*Richard Levitte* *Richard Levitte*
### Changes between 0.9.7e and 0.9.7f [22 Mar 2005] ### ### Changes between 0.9.7e and 0.9.7f [22 Mar 2005]
* Use (SSL_RANDOM_VALUE - 4) bytes of pseudo random data when generating * Use (SSL_RANDOM_VALUE - 4) bytes of pseudo random data when generating
server and client random values. Previously server and client random values. Previously
@@ -10648,15 +10631,15 @@ OpenSSL 0.9.8.]
side effect always do the following basic checks on extensions, side effect always do the following basic checks on extensions,
not just when there's an associated purpose to the check: not just when there's an associated purpose to the check:
- if there is an unhandled critical extension (unless the user - if there is an unhandled critical extension (unless the user
has chosen to ignore this fault) has chosen to ignore this fault)
- if the path length has been exceeded (if one is set at all) - if the path length has been exceeded (if one is set at all)
- that certain extensions fit the associated purpose (if one has - that certain extensions fit the associated purpose (if one has
been given) been given)
*Richard Levitte* *Richard Levitte*
### Changes between 0.9.7d and 0.9.7e [25 Oct 2004] ### ### Changes between 0.9.7d and 0.9.7e [25 Oct 2004]
* Avoid a race condition when CRLs are checked in a multi threaded * Avoid a race condition when CRLs are checked in a multi threaded
environment. This would happen due to the reordering of the revoked environment. This would happen due to the reordering of the revoked
@@ -10684,7 +10667,7 @@ OpenSSL 0.9.8.]
*Steve Henson* *Steve Henson*
### Changes between 0.9.7c and 0.9.7d [17 Mar 2004] ### ### Changes between 0.9.7c and 0.9.7d [17 Mar 2004]
* Fix null-pointer assignment in do_change_cipher_spec() revealed * Fix null-pointer assignment in do_change_cipher_spec() revealed
by using the Codenomicon TLS Test Tool [CVE-2004-0079][] by using the Codenomicon TLS Test Tool [CVE-2004-0079][]
@@ -10737,7 +10720,7 @@ OpenSSL 0.9.8.]
*Steve Henson* *Steve Henson*
### Changes between 0.9.7b and 0.9.7c [30 Sep 2003] ### ### Changes between 0.9.7b and 0.9.7c [30 Sep 2003]
* Fix various bugs revealed by running the NISCC test suite: * Fix various bugs revealed by running the NISCC test suite:
@@ -10749,7 +10732,6 @@ OpenSSL 0.9.8.]
If verify callback ignores invalid public key errors don't try to check If verify callback ignores invalid public key errors don't try to check
certificate signature with the NULL public key. certificate signature with the NULL public key.
*Steve Henson* *Steve Henson*
* New -ignore_err option in ocsp application to stop the server * New -ignore_err option in ocsp application to stop the server
@@ -10796,7 +10778,7 @@ OpenSSL 0.9.8.]
*Steve Henson* *Steve Henson*
### Changes between 0.9.7a and 0.9.7b [10 Apr 2003] ### ### Changes between 0.9.7a and 0.9.7b [10 Apr 2003]
* Countermeasure against the Klima-Pokorny-Rosa extension of * Countermeasure against the Klima-Pokorny-Rosa extension of
Bleichbacher's attack on PKCS #1 v1.5 padding: treat Bleichbacher's attack on PKCS #1 v1.5 padding: treat
@@ -10836,7 +10818,7 @@ OpenSSL 0.9.8.]
*Ulf Moeller* *Ulf Moeller*
### Changes between 0.9.7 and 0.9.7a [19 Feb 2003] ### ### Changes between 0.9.7 and 0.9.7a [19 Feb 2003]
* In ssl3_get_record (ssl/s3_pkt.c), minimize information leaked * In ssl3_get_record (ssl/s3_pkt.c), minimize information leaked
via timing by performing a MAC computation even if incorrect via timing by performing a MAC computation even if incorrect
@@ -10927,7 +10909,7 @@ OpenSSL 0.9.8.]
*Richard Levitte & Kris Kennaway <kris@obsecurity.org>* *Richard Levitte & Kris Kennaway <kris@obsecurity.org>*
### Changes between 0.9.6h and 0.9.7 [31 Dec 2002] ### ### Changes between 0.9.6h and 0.9.7 [31 Dec 2002]
[NB: OpenSSL 0.9.6i and later 0.9.6 patch levels were released after [NB: OpenSSL 0.9.6i and later 0.9.6 patch levels were released after
OpenSSL 0.9.7.] OpenSSL 0.9.7.]
@@ -11171,7 +11153,7 @@ OpenSSL 0.9.7.]
* Remove most calls to EVP_CIPHER_CTX_cleanup() in evp_enc.c, this * Remove most calls to EVP_CIPHER_CTX_cleanup() in evp_enc.c, this
allows existing EVP_CIPHER_CTX structures to be reused after allows existing EVP_CIPHER_CTX structures to be reused after
calling EVP_*Final(). This behaviour is used by encryption calling `EVP_*Final()`. This behaviour is used by encryption
BIOs and some applications. This has the side effect that BIOs and some applications. This has the side effect that
applications must explicitly clean up cipher contexts with applications must explicitly clean up cipher contexts with
EVP_CIPHER_CTX_cleanup() or they will leak memory. EVP_CIPHER_CTX_cleanup() or they will leak memory.
@@ -11426,12 +11408,12 @@ OpenSSL 0.9.7.]
*Massimiliano Pala madwolf@openca.org* *Massimiliano Pala madwolf@openca.org*
* Change all functions with names starting with des_ to be starting * Change all functions with names starting with `des_` to be starting
with DES_ instead. Add wrappers that are compatible with libdes, with `DES_` instead. Add wrappers that are compatible with libdes,
but are named _ossl_old_des_*. Finally, add macros that map the but are named `_ossl_old_des_*`. Finally, add macros that map the
des_* symbols to the corresponding _ossl_old_des_* if libdes `des_*` symbols to the corresponding `_ossl_old_des_*` if libdes
compatibility is desired. If OpenSSL 0.9.6c compatibility is compatibility is desired. If OpenSSL 0.9.6c compatibility is
desired, the des_* symbols will be mapped to DES_*, with one desired, the `des_*` symbols will be mapped to `DES_*`, with one
exception. exception.
Since we provide two compatibility mappings, the user needs to Since we provide two compatibility mappings, the user needs to
@@ -11449,7 +11431,7 @@ OpenSSL 0.9.7.]
won't work. won't work.
NOTE: This is a major break of an old API into a new one. Software NOTE: This is a major break of an old API into a new one. Software
authors are encouraged to switch to the DES_ style functions. Some authors are encouraged to switch to the `DES_` style functions. Some
time in the future, des_old.h and the libdes compatibility functions time in the future, des_old.h and the libdes compatibility functions
will be disable (i.e. OPENSSL_DISABLE_OLD_DES_SUPPORT will be the will be disable (i.e. OPENSSL_DISABLE_OLD_DES_SUPPORT will be the
default), and then completely removed. default), and then completely removed.
@@ -11509,7 +11491,7 @@ OpenSSL 0.9.7.]
deal more passive and at run-time, operations deal directly with deal more passive and at run-time, operations deal directly with
RSA_METHODs, DSA_METHODs (etc) as they did before, rather than RSA_METHODs, DSA_METHODs (etc) as they did before, rather than
dereferencing through an ENGINE pointer any more. Also, the ENGINE dereferencing through an ENGINE pointer any more. Also, the ENGINE
functions dealing with BN_MOD_EXP[_CRT] handlers have been removed - functions dealing with `BN_MOD_EXP[_CRT]` handlers have been removed -
they were not being used by the framework as there is no concept of a they were not being used by the framework as there is no concept of a
BIGNUM_METHOD and they could not be generalised to the new BIGNUM_METHOD and they could not be generalised to the new
'ENGINE_TABLE' mechanism that underlies the new code. Similarly, 'ENGINE_TABLE' mechanism that underlies the new code. Similarly,
@@ -11523,7 +11505,7 @@ OpenSSL 0.9.7.]
*Steve Henson* *Steve Henson*
* Change mkdef.pl to sort symbols that get the same entry number, * Change mkdef.pl to sort symbols that get the same entry number,
and make sure the automatically generated functions ERR_load_* and make sure the automatically generated functions `ERR_load_*`
become part of libeay.num as well. become part of libeay.num as well.
*Richard Levitte* *Richard Levitte*
@@ -11555,7 +11537,7 @@ OpenSSL 0.9.7.]
*Steve Henson* *Steve Henson*
* Make maximum certificate chain size accepted from the peer application * Make maximum certificate chain size accepted from the peer application
settable (SSL*_get/set_max_cert_list()), as proposed by settable (`SSL*_get/set_max_cert_list()`), as proposed by
"Douglas E. Engert" <deengert@anl.gov>. "Douglas E. Engert" <deengert@anl.gov>.
*Lutz Jaenicke* *Lutz Jaenicke*
@@ -11649,7 +11631,7 @@ OpenSSL 0.9.7.]
*Geoff Thorpe* *Geoff Thorpe*
* Give DH, DSA, and RSA types their own "**_up_ref()" function to increment * Give DH, DSA, and RSA types their own `*_up_ref()` function to increment
reference counts. This performs normal REF_PRINT/REF_CHECK macros on reference counts. This performs normal REF_PRINT/REF_CHECK macros on
the operation, and provides a more encapsulated way for external code the operation, and provides a more encapsulated way for external code
(crypto/evp/ and ssl/) to do this. Also changed the evp and ssl code (crypto/evp/ and ssl/) to do this. Also changed the evp and ssl code
@@ -11697,7 +11679,6 @@ OpenSSL 0.9.7.]
EVP_DigestFinal(&md, out, NULL); EVP_DigestFinal(&md, out, NULL);
EVP_MD_CTX_cleanup(&md); /* new function call */ EVP_MD_CTX_cleanup(&md); /* new function call */
*Ben Laurie* *Ben Laurie*
* Make DES key schedule conform to the usual scheme, as well as * Make DES key schedule conform to the usual scheme, as well as
@@ -11728,8 +11709,8 @@ OpenSSL 0.9.7.]
*Ben Laurie* *Ben Laurie*
* Change historical references to {NID,SN,LN}_des_ede and ede3 to add the * Change historical references to `{NID,SN,LN}_des_ede` and ede3 to add the
correct _ecb suffix. correct `_ecb suffix`.
*Ben Laurie* *Ben Laurie*
@@ -11746,17 +11727,16 @@ OpenSSL 0.9.7.]
*Richard Levitte* *Richard Levitte*
* Changes to Kerberos SSL for RFC 2712 compliance: * Changes to Kerberos SSL for RFC 2712 compliance:
1. Implemented real KerberosWrapper, instead of just using 1. Implemented real KerberosWrapper, instead of just using
KRB5 AP_REQ message. [Thanks to Simon Wilkinson <sxw@sxw.org.uk>] KRB5 AP_REQ message. [Thanks to Simon Wilkinson <sxw@sxw.org.uk>]
2. Implemented optional authenticator field of KerberosWrapper. 2. Implemented optional authenticator field of KerberosWrapper.
Added openssl-style ASN.1 macros for Kerberos ticket, ap_req, Added openssl-style ASN.1 macros for Kerberos ticket, ap_req,
and authenticator structs; see crypto/krb5/. and authenticator structs; see crypto/krb5/.
Generalized Kerberos calls to support multiple Kerberos libraries. Generalized Kerberos calls to support multiple Kerberos libraries.
*Vern Staats <staatsvr@asc.hpc.mil>, *Vern Staats <staatsvr@asc.hpc.mil>, Jeffrey Altman <jaltman@columbia.edu>
Jeffrey Altman <jaltman@columbia.edu> via Richard Levitte*
via Richard Levitte*
* Cause 'openssl speed' to use fully hard-coded DSA keys as it * Cause 'openssl speed' to use fully hard-coded DSA keys as it
already does with RSA. testdsa.h now has 'priv_key/pub_key' already does with RSA. testdsa.h now has 'priv_key/pub_key'
@@ -12098,7 +12078,7 @@ s-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k
*Bodo Moeller* *Bodo Moeller*
* Modify EVP_Digest*() routines so they now return values. Although the * Modify `EVP_Digest*()` routines so they now return values. Although the
internal software routines can never fail additional hardware versions internal software routines can never fail additional hardware versions
might. might.
@@ -12244,14 +12224,14 @@ s-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k
* Make all configuration macros available for application by making * Make all configuration macros available for application by making
sure they are available in opensslconf.h, by giving them names starting sure they are available in opensslconf.h, by giving them names starting
with "OPENSSL_" to avoid conflicts with other packages and by making with `OPENSSL_` to avoid conflicts with other packages and by making
sure e_os2.h will cover all platform-specific cases together with sure e_os2.h will cover all platform-specific cases together with
opensslconf.h. opensslconf.h.
Additionally, it is now possible to define configuration/platform- Additionally, it is now possible to define configuration/platform-
specific names (called "system identities"). In the C code, these specific names (called "system identities"). In the C code, these
are prefixed with "OPENSSL_SYSNAME_". e_os2.h will create another are prefixed with `OPENSSL_SYSNAME_`. e_os2.h will create another
macro with the name beginning with "OPENSSL_SYS_", which is determined macro with the name beginning with `OPENSSL_SYS_`, which is determined
from "OPENSSL_SYSNAME_*" or compiler-specific macros depending on from `OPENSSL_SYSNAME_*` or compiler-specific macros depending on
what is available. what is available.
*Richard Levitte* *Richard Levitte*
@@ -12300,7 +12280,7 @@ s-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k
* Disable stdin buffering in load_cert (apps/apps.c) so that no certs are * Disable stdin buffering in load_cert (apps/apps.c) so that no certs are
skipped when using openssl x509 multiple times on a single input file, skipped when using openssl x509 multiple times on a single input file,
e.g. "(openssl x509 -out cert1; openssl x509 -out cert2) <certs". e.g. `(openssl x509 -out cert1; openssl x509 -out cert2) <certs`.
*Bodo Moeller* *Bodo Moeller*
@@ -12463,9 +12443,9 @@ s-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k
*Steve Henson* *Steve Henson*
* New subcommands for 'openssl ca': * New subcommands for 'openssl ca':
'openssl ca -status <serial>' prints the status of the cert with `openssl ca -status <serial>` prints the status of the cert with
the given serial number (according to the index file). the given serial number (according to the index file).
'openssl ca -updatedb' updates the expiry status of certificates `openssl ca -updatedb` updates the expiry status of certificates
in the index file. in the index file.
*Massimiliano Pala <madwolf@comune.modena.it>* *Massimiliano Pala <madwolf@comune.modena.it>*
@@ -12494,7 +12474,7 @@ s-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k
* Allowing defining memory allocation callbacks that will be given * Allowing defining memory allocation callbacks that will be given
file name and line number information in additional arguments file name and line number information in additional arguments
(a const char* and an int). The basic functionality remains, as (a `const char*` and an int). The basic functionality remains, as
well as the original possibility to just replace malloc(), well as the original possibility to just replace malloc(),
realloc() and free() by functions that do not know about these realloc() and free() by functions that do not know about these
additional arguments. To register and find out the current additional arguments. To register and find out the current
@@ -12507,9 +12487,9 @@ s-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k
CRYPTO_get_locked_mem_ex_functions CRYPTO_get_locked_mem_ex_functions
These work the same way as CRYPTO_set_mem_functions and friends. These work the same way as CRYPTO_set_mem_functions and friends.
CRYPTO_get_[locked_]mem_functions now writes 0 where such an `CRYPTO_get_[locked_]mem_functions` now writes 0 where such an
extended allocation function is enabled. extended allocation function is enabled.
Similarly, CRYPTO_get_[locked_]mem_ex_functions writes 0 where Similarly, `CRYPTO_get_[locked_]mem_ex_functions` writes 0 where
a conventional allocation function is enabled. a conventional allocation function is enabled.
*Richard Levitte, Bodo Moeller* *Richard Levitte, Bodo Moeller*
@@ -12617,7 +12597,7 @@ s-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k
* New functions or ASN1_item_d2i_fp() and ASN1_item_d2i_bio(). These * New functions or ASN1_item_d2i_fp() and ASN1_item_d2i_bio(). These
replace the old function pointer based I/O routines. Change most of replace the old function pointer based I/O routines. Change most of
the *_d2i_bio() and *_d2i_fp() functions to use these. the `*_d2i_bio()` and `*_d2i_fp()` functions to use these.
*Steve Henson* *Steve Henson*
@@ -12744,7 +12724,7 @@ s-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k
* Added Kerberos Cipher Suites to be used with TLS, as written in * Added Kerberos Cipher Suites to be used with TLS, as written in
RFC 2712. RFC 2712.
*Veers Staats <staatsvr@asc.hpc.mil>, *Veers Staats <staatsvr@asc.hpc.mil>,
Jeffrey Altman <jaltman@columbia.edu>, via Richard Levitte* Jeffrey Altman <jaltman@columbia.edu>, via Richard Levitte*
* Reformat the FAQ so the different questions and answers can be divided * Reformat the FAQ so the different questions and answers can be divided
in sections depending on the subject. in sections depending on the subject.
@@ -12810,7 +12790,7 @@ s-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k
*Bodo Moeller* *Bodo Moeller*
* Move BN_mod_... functions into new file crypto/bn/bn_mod.c * Move `BN_mod_...` functions into new file crypto/bn/bn_mod.c
(except for exponentiation, which stays in crypto/bn/bn_exp.c, (except for exponentiation, which stays in crypto/bn/bn_exp.c,
and BN_mod_mul_reciprocal, which stays in crypto/bn/bn_recp.c) and BN_mod_mul_reciprocal, which stays in crypto/bn/bn_recp.c)
and add new functions: and add new functions:
@@ -12974,7 +12954,7 @@ ndif
* NCONF changes. * NCONF changes.
NCONF_get_number() has no error checking at all. As a replacement, NCONF_get_number() has no error checking at all. As a replacement,
NCONF_get_number_e() is defined (_e for "error checking") and is NCONF_get_number_e() is defined (`_e` for "error checking") and is
promoted strongly. The old NCONF_get_number is kept around for promoted strongly. The old NCONF_get_number is kept around for
binary backward compatibility. binary backward compatibility.
Make it possible for methods to load from something other than a BIO, Make it possible for methods to load from something other than a BIO,
@@ -13008,14 +12988,14 @@ ndif
*Richard Levitte* *Richard Levitte*
### Changes between 0.9.6l and 0.9.6m [17 Mar 2004] ### ### Changes between 0.9.6l and 0.9.6m [17 Mar 2004]
* Fix null-pointer assignment in do_change_cipher_spec() revealed * Fix null-pointer assignment in do_change_cipher_spec() revealed
by using the Codenomicon TLS Test Tool [CVE-2004-0079][] by using the Codenomicon TLS Test Tool [CVE-2004-0079][]
*Joe Orton, Steve Henson* *Joe Orton, Steve Henson*
### Changes between 0.9.6k and 0.9.6l [04 Nov 2003] ### ### Changes between 0.9.6k and 0.9.6l [04 Nov 2003]
* Fix additional bug revealed by the NISCC test suite: * Fix additional bug revealed by the NISCC test suite:
@@ -13024,7 +13004,7 @@ ndif
*Steve Henson* *Steve Henson*
### Changes between 0.9.6j and 0.9.6k [30 Sep 2003] ### ### Changes between 0.9.6j and 0.9.6k [30 Sep 2003]
* Fix various bugs revealed by running the NISCC test suite: * Fix various bugs revealed by running the NISCC test suite:
@@ -13034,7 +13014,6 @@ ndif
If verify callback ignores invalid public key errors don't try to check If verify callback ignores invalid public key errors don't try to check
certificate signature with the NULL public key. certificate signature with the NULL public key.
*Steve Henson* *Steve Henson*
* In ssl3_accept() (ssl/s3_srvr.c) only accept a client certificate * In ssl3_accept() (ssl/s3_srvr.c) only accept a client certificate
@@ -13054,7 +13033,7 @@ ndif
*Richard Levitte* *Richard Levitte*
### Changes between 0.9.6i and 0.9.6j [10 Apr 2003] ### ### Changes between 0.9.6i and 0.9.6j [10 Apr 2003]
* Countermeasure against the Klima-Pokorny-Rosa extension of * Countermeasure against the Klima-Pokorny-Rosa extension of
Bleichbacher's attack on PKCS #1 v1.5 padding: treat Bleichbacher's attack on PKCS #1 v1.5 padding: treat
@@ -13082,7 +13061,7 @@ ndif
*Bodo Moeller* *Bodo Moeller*
### Changes between 0.9.6h and 0.9.6i [19 Feb 2003] ### ### Changes between 0.9.6h and 0.9.6i [19 Feb 2003]
* In ssl3_get_record (ssl/s3_pkt.c), minimize information leaked * In ssl3_get_record (ssl/s3_pkt.c), minimize information leaked
via timing by performing a MAC computation even if incorrect via timing by performing a MAC computation even if incorrect
@@ -13094,7 +13073,7 @@ ndif
Alain Hiltgen (UBS), Serge Vaudenay (EPFL), and Alain Hiltgen (UBS), Serge Vaudenay (EPFL), and
Martin Vuagnoux (EPFL, Ilion)* Martin Vuagnoux (EPFL, Ilion)*
### Changes between 0.9.6g and 0.9.6h [5 Dec 2002] ### ### Changes between 0.9.6g and 0.9.6h [5 Dec 2002]
* New function OPENSSL_cleanse(), which is used to cleanse a section of * New function OPENSSL_cleanse(), which is used to cleanse a section of
memory from its contents. This is done with a counter that will memory from its contents. This is done with a counter that will
@@ -13174,20 +13153,19 @@ ndif
*Steve Henson* *Steve Henson*
### Changes between 0.9.6f and 0.9.6g [9 Aug 2002] ### ### Changes between 0.9.6f and 0.9.6g [9 Aug 2002]
* [In 0.9.6g-engine release:] * [In 0.9.6g-engine release:]
Fix crypto/engine/vendor_defns/cswift.h for WIN32 (use '_stdcall'). Fix crypto/engine/vendor_defns/cswift.h for WIN32 (use `_stdcall`).
*Lynn Gazis <lgazis@rainbow.com>* *Lynn Gazis <lgazis@rainbow.com>*
### Changes between 0.9.6e and 0.9.6f [8 Aug 2002] ### ### Changes between 0.9.6e and 0.9.6f [8 Aug 2002]
* Fix ASN1 checks. Check for overflow by comparing with LONG_MAX * Fix ASN1 checks. Check for overflow by comparing with LONG_MAX
and get fix the header length calculation. and get fix the header length calculation.
*Florian Weimer <Weimer@CERT.Uni-Stuttgart.DE>, *Florian Weimer <Weimer@CERT.Uni-Stuttgart.DE>,
Alon Kantor <alonk@checkpoint.com> (and others), Alon Kantor <alonk@checkpoint.com> (and others), Steve Henson*
Steve Henson*
* Use proper error handling instead of 'assertions' in buffer * Use proper error handling instead of 'assertions' in buffer
overflow checks added in 0.9.6e. This prevents DoS (the overflow checks added in 0.9.6e. This prevents DoS (the
@@ -13195,7 +13173,7 @@ ndif
*Arne Ansper <arne@ats.cyber.ee>, Bodo Moeller* *Arne Ansper <arne@ats.cyber.ee>, Bodo Moeller*
### Changes between 0.9.6d and 0.9.6e [30 Jul 2002] ### ### Changes between 0.9.6d and 0.9.6e [30 Jul 2002]
* Add various sanity checks to asn1_get_length() to reject * Add various sanity checks to asn1_get_length() to reject
the ASN1 length bytes if they exceed sizeof(long), will appear the ASN1 length bytes if they exceed sizeof(long), will appear
@@ -13249,7 +13227,7 @@ ndif
* Various temporary buffers to hold ASCII versions of integers were * Various temporary buffers to hold ASCII versions of integers were
too small for 64 bit platforms. [CVE-2002-0655][] too small for 64 bit platforms. [CVE-2002-0655][]
*Matthew Byng-Maddick <mbm@aldigital.co.uk> and Ben Laurie (CHATS)> *Matthew Byng-Maddick <mbm@aldigital.co.uk> and Ben Laurie (CHATS)>*
* Remote buffer overflow in SSL3 protocol - an attacker could * Remote buffer overflow in SSL3 protocol - an attacker could
supply an oversized session ID to a client. [CVE-2002-0656][] supply an oversized session ID to a client. [CVE-2002-0656][]
@@ -13261,14 +13239,14 @@ ndif
*Ben Laurie (CHATS)* *Ben Laurie (CHATS)*
### Changes between 0.9.6c and 0.9.6d [9 May 2002] ### ### Changes between 0.9.6c and 0.9.6d [9 May 2002]
* Fix crypto/asn1/a_sign.c so that 'parameters' is omitted (not * Fix crypto/asn1/a_sign.c so that 'parameters' is omitted (not
encoded as NULL) with id-dsa-with-sha1. encoded as NULL) with id-dsa-with-sha1.
*Nils Larsch <nla@trustcenter.de>; problem pointed out by Bodo Moeller* *Nils Larsch <nla@trustcenter.de>; problem pointed out by Bodo Moeller*
* Check various X509_...() return values in apps/req.c. * Check various `X509_...()` return values in apps/req.c.
*Nils Larsch <nla@trustcenter.de>* *Nils Larsch <nla@trustcenter.de>*
@@ -13404,12 +13382,12 @@ ndif
*D P Chang <dpc@qualys.com>* *D P Chang <dpc@qualys.com>*
### Changes between 0.9.6b and 0.9.6c [21 dec 2001] ### ### Changes between 0.9.6b and 0.9.6c [21 dec 2001]
* Fix BN_rand_range bug pointed out by Dominikus Scherkl * Fix BN_rand_range bug pointed out by Dominikus Scherkl
<Dominikus.Scherkl@biodata.com>. (The previous implementation <Dominikus.Scherkl@biodata.com>. (The previous implementation
worked incorrectly for those cases where range = 10..._2 and worked incorrectly for those cases where range = `10..._2` and
3*range is two bits longer than range.) `3*range` is two bits longer than range.)
*Bodo Moeller* *Bodo Moeller*
@@ -13480,7 +13458,7 @@ ndif
instead. BIO_gethostbyname() does not know what timeouts are instead. BIO_gethostbyname() does not know what timeouts are
appropriate, so entries would stay in cache even when they have appropriate, so entries would stay in cache even when they have
become invalid. become invalid.
*Bodo Moeller; problem pointed out by Rich Salz <rsalz@zolera.com> *Bodo Moeller; problem pointed out by Rich Salz <rsalz@zolera.com>*
* Change ssl23_get_client_hello (ssl/s23_srvr.c) behaviour when * Change ssl23_get_client_hello (ssl/s23_srvr.c) behaviour when
faced with a pathologically small ClientHello fragment that does faced with a pathologically small ClientHello fragment that does
@@ -13577,7 +13555,7 @@ ndif
*Lutz Jaenicke* *Lutz Jaenicke*
* Add alert descriptions for TLSv1 to SSL_alert_desc_string[_long](). * Add alert descriptions for TLSv1 to `SSL_alert_desc_string[_long]()`.
*Lutz Jaenicke* *Lutz Jaenicke*
@@ -13683,7 +13661,7 @@ ndif
*Richard Levitte* *Richard Levitte*
### Changes between 0.9.6a and 0.9.6b [9 Jul 2001] ### ### Changes between 0.9.6a and 0.9.6b [9 Jul 2001]
* Change ssleay_rand_bytes (crypto/rand/md_rand.c) * Change ssleay_rand_bytes (crypto/rand/md_rand.c)
to avoid a SSLeay/OpenSSL PRNG weakness pointed out by to avoid a SSLeay/OpenSSL PRNG weakness pointed out by
@@ -13729,7 +13707,7 @@ ndif
*Bodo Moeller* *Bodo Moeller*
* Don't change *pointer in CRYPTO_add_lock() is add_lock_callback is * Don't change `*pointer` in CRYPTO_add_lock() is add_lock_callback is
used: it isn't thread safe and the add_lock_callback should handle used: it isn't thread safe and the add_lock_callback should handle
that itself. that itself.
@@ -13811,7 +13789,7 @@ ndif
*Bodo Moeller* *Bodo Moeller*
### Changes between 0.9.6 and 0.9.6a [5 Apr 2001] ### ### Changes between 0.9.6 and 0.9.6a [5 Apr 2001]
* Fix a couple of memory leaks in PKCS7_dataDecode() * Fix a couple of memory leaks in PKCS7_dataDecode()
@@ -13849,7 +13827,7 @@ ndif
* Check the result of RSA-CRT (see D. Boneh, R. DeMillo, R. Lipton: * Check the result of RSA-CRT (see D. Boneh, R. DeMillo, R. Lipton:
On the Importance of Eliminating Errors in Cryptographic On the Importance of Eliminating Errors in Cryptographic
Computations, J. Cryptology 14 (2001) 2, 101-119, Computations, J. Cryptology 14 (2001) 2, 101-119,
http://theory.stanford.edu/~dabo/papers/faults.ps.gz). <http://theory.stanford.edu/~dabo/papers/faults.ps.gz>).
*Ulf Moeller* *Ulf Moeller*
@@ -13890,7 +13868,7 @@ ndif
*Bodo Moeller* *Bodo Moeller*
* Replace rdtsc with _emit statements for VC++ version 5. * Replace rdtsc with `_emit` statements for VC++ version 5.
*Jeremy Cooper <jeremy@baymoo.org>* *Jeremy Cooper <jeremy@baymoo.org>*
@@ -13934,7 +13912,7 @@ ndif
* Fix CPU detection on Irix 6.x. * Fix CPU detection on Irix 6.x.
*Kurt Hockenbury <khockenb@stevens-tech.edu> and *Kurt Hockenbury <khockenb@stevens-tech.edu> and
"Bruce W. Forsberg" <bruce.forsberg@baesystems.com>* "Bruce W. Forsberg" <bruce.forsberg@baesystems.com>*
* Fix X509_NAME bug which produced incorrect encoding if X509_NAME * Fix X509_NAME bug which produced incorrect encoding if X509_NAME
was empty. was empty.
@@ -13957,7 +13935,7 @@ ndif
*Ulf Moeller, Bodo Moeller* *Ulf Moeller, Bodo Moeller*
* In the NCONF_...-based implementations for CONF_... queries * In the `NCONF_...`-based implementations for `CONF_...` queries
(crypto/conf/conf_lib.c), if the input LHASH is NULL, avoid using (crypto/conf/conf_lib.c), if the input LHASH is NULL, avoid using
a temporary CONF structure with the data component set to NULL a temporary CONF structure with the data component set to NULL
(which gives segmentation faults in lh_retrieve). (which gives segmentation faults in lh_retrieve).
@@ -14040,8 +14018,8 @@ ndif
*Bodo Moeller; problem reported by Eric Day <eday@concentric.net>* *Bodo Moeller; problem reported by Eric Day <eday@concentric.net>*
* In RSA_eay_public_{en,ed}crypt and RSA_eay_mod_exp (rsa_eay.c), * In `RSA_eay_public_{en,ed}crypt` and RSA_eay_mod_exp (rsa_eay.c),
obtain lock CRYPTO_LOCK_RSA before setting rsa->_method_mod_{n,p,q}. obtain lock CRYPTO_LOCK_RSA before setting `rsa->_method_mod_{n,p,q}`.
(RSA objects have a reference count access to which is protected (RSA objects have a reference count access to which is protected
by CRYPTO_LOCK_RSA [see rsa_lib.c, s3_srvr.c, ssl_cert.c, ssl_rsa.c], by CRYPTO_LOCK_RSA [see rsa_lib.c, s3_srvr.c, ssl_cert.c, ssl_rsa.c],
@@ -14153,7 +14131,7 @@ ndif
*Lutz Jaenicke* *Lutz Jaenicke*
### Changes between 0.9.5a and 0.9.6 [24 Sep 2000] ### ### Changes between 0.9.5a and 0.9.6 [24 Sep 2000]
* In ssl23_get_client_hello, generate an error message when faced * In ssl23_get_client_hello, generate an error message when faced
with an initial SSL 3.0/TLS record that is too small to contain the with an initial SSL 3.0/TLS record that is too small to contain the
@@ -14273,7 +14251,7 @@ ndif
*Ben Laurie* *Ben Laurie*
* Add a few more EBCDIC conditionals that make `req' and `x509' * Add a few more EBCDIC conditionals that make `req` and `x509`
work better on such systems. work better on such systems.
*Martin Kraemer <Martin.Kraemer@MchP.Siemens.De>* *Martin Kraemer <Martin.Kraemer@MchP.Siemens.De>*
@@ -14397,7 +14375,7 @@ ndif
*Andreas Schneider <andreas@ds3.etech.fh-hamburg.de>* *Andreas Schneider <andreas@ds3.etech.fh-hamburg.de>*
* A demo state-machine implementation was sponsored by * A demo state-machine implementation was sponsored by
Nuron (http://www.nuron.com/) and is now available in Nuron (<http://www.nuron.com/>) and is now available in
demos/state_machine. demos/state_machine.
*Ben Laurie* *Ben Laurie*
@@ -14453,13 +14431,12 @@ ndif
and as before, if none of those prefixes are present at the and as before, if none of those prefixes are present at the
beginning of the string, LOG_ERR is chosen. beginning of the string, LOG_ERR is chosen.
On Win32, the LOG_* levels are mapped according to this: On Win32, the `LOG_*` levels are mapped according to this:
LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR => EVENTLOG_ERROR_TYPE LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR => EVENTLOG_ERROR_TYPE
LOG_WARNING => EVENTLOG_WARNING_TYPE LOG_WARNING => EVENTLOG_WARNING_TYPE
LOG_NOTICE, LOG_INFO, LOG_DEBUG => EVENTLOG_INFORMATION_TYPE LOG_NOTICE, LOG_INFO, LOG_DEBUG => EVENTLOG_INFORMATION_TYPE
*Richard Levitte* *Richard Levitte*
* Made it possible to reconfigure with just the configuration * Made it possible to reconfigure with just the configuration
@@ -14541,8 +14518,8 @@ ndif
*Steve Henson* *Steve Henson*
* crypto/err.c locking bugfix: Use write locks (CRYPTO_w_[un]lock), * crypto/err.c locking bugfix: Use write locks (`CRYPTO_w_[un]lock`),
not read locks (CRYPTO_r_[un]lock). not read locks (`CRYPTO_r_[un]lock`).
*Bodo Moeller* *Bodo Moeller*
@@ -14578,7 +14555,7 @@ ndif
*Steve Henson* *Steve Henson*
* New ASN1 functions, i2c_* and c2i_* for INTEGER and BIT * New ASN1 functions, `i2c_*` and `c2i_*` for INTEGER and BIT
STRING types. These convert content octets to and from the STRING types. These convert content octets to and from the
underlying type. The actual tag and length octets are underlying type. The actual tag and length octets are
already assumed to have been read in and checked. These already assumed to have been read in and checked. These
@@ -14636,7 +14613,7 @@ ndif
* Reorganisation of the stack code. The macros are now all * Reorganisation of the stack code. The macros are now all
collected in safestack.h . Each macro is defined in terms of collected in safestack.h . Each macro is defined in terms of
a "stack macro" of the form SKM_<name>(type, a, b). The a "stack macro" of the form `SKM_<name>(type, a, b)`. The
DEBUG_SAFESTACK is now handled in terms of function casts, DEBUG_SAFESTACK is now handled in terms of function casts,
this has the advantage of retaining type safety without the this has the advantage of retaining type safety without the
use of additional functions. If DEBUG_SAFESTACK is not defined use of additional functions. If DEBUG_SAFESTACK is not defined
@@ -14679,7 +14656,7 @@ ndif
*Bodo Moeller* *Bodo Moeller*
* Increase maximum window size in BN_mod_exp_... to 6 bits instead of 5 * Increase maximum window size in `BN_mod_exp_...` to 6 bits instead of 5
(meaning that now 2^5 values will be precomputed, which is only 4 KB (meaning that now 2^5 values will be precomputed, which is only 4 KB
plus overhead for 1024 bit moduli). plus overhead for 1024 bit moduli).
This makes exponentiations about 0.5 % faster for 1024 bit This makes exponentiations about 0.5 % faster for 1024 bit
@@ -14719,7 +14696,7 @@ ndif
also involved a cleanup of sorts in safestack.h to more correctly also involved a cleanup of sorts in safestack.h to more correctly
map type-safe stack functions onto their plain stack counterparts. map type-safe stack functions onto their plain stack counterparts.
This work has also resulted in a variety of "const"ifications of This work has also resulted in a variety of "const"ifications of
lots of the code, especially "_cmp" operations which should normally lots of the code, especially `_cmp` operations which should normally
be prototyped with "const" parameters anyway. be prototyped with "const" parameters anyway.
*Geoff Thorpe* *Geoff Thorpe*
@@ -14782,7 +14759,7 @@ ndif
*Bodo Moeller* *Bodo Moeller*
* Call dh_tmp_cb (set by ..._TMP_DH_CB) with correct 'is_export' flag; * Call dh_tmp_cb (set by `..._TMP_DH_CB`) with correct 'is_export' flag;
i.e. non-zero for export ciphersuites, zero otherwise. i.e. non-zero for export ciphersuites, zero otherwise.
Previous versions had this flag inverted, inconsistent with Previous versions had this flag inverted, inconsistent with
rsa_tmp_cb (..._TMP_RSA_CB). rsa_tmp_cb (..._TMP_RSA_CB).
@@ -14872,13 +14849,13 @@ ndif
* CONF library reworked to become more general. A new CONF * CONF library reworked to become more general. A new CONF
configuration file reader "class" is implemented as well as a configuration file reader "class" is implemented as well as a
new functions (NCONF_*, for "New CONF") to handle it. The now new functions (`NCONF_*`, for "New CONF") to handle it. The now
old CONF_* functions are still there, but are reimplemented to old `CONF_*` functions are still there, but are reimplemented to
work in terms of the new functions. Also, a set of functions work in terms of the new functions. Also, a set of functions
to handle the internal storage of the configuration data is to handle the internal storage of the configuration data is
provided to make it easier to write new configuration file provided to make it easier to write new configuration file
reader "classes" (I can definitely see something reading a reader "classes" (I can definitely see something reading a
configuration file in XML format, for example), called _CONF_*, configuration file in XML format, for example), called `_CONF_*`,
or "the configuration storage API"... or "the configuration storage API"...
The new configuration file reading functions are: The new configuration file reading functions are:
@@ -14893,12 +14870,12 @@ ndif
NCONF_default and NCONF_WIN32 are method (or "class") choosers, NCONF_default and NCONF_WIN32 are method (or "class") choosers,
NCONF_new creates a new CONF object. This works in the same way NCONF_new creates a new CONF object. This works in the same way
as other interfaces in OpenSSL, like the BIO interface. as other interfaces in OpenSSL, like the BIO interface.
NCONF_dump_* dump the internal storage of the configuration file, `NCONF_dump_*` dump the internal storage of the configuration file,
which is useful for debugging. All other functions take the same which is useful for debugging. All other functions take the same
arguments as the old CONF_* functions with the exception of the arguments as the old `CONF_*` functions with the exception of the
first that must be a `CONF *' instead of a `LHASH *'. first that must be a `CONF *` instead of a `LHASH *`.
To make it easier to use the new classes with the old CONF_* functions, To make it easier to use the new classes with the old `CONF_*` functions,
the function CONF_set_default_method is provided. the function CONF_set_default_method is provided.
*Richard Levitte* *Richard Levitte*
@@ -14916,7 +14893,7 @@ ndif
*Geoff Thorpe, with contributions from Richard Levitte* *Geoff Thorpe, with contributions from Richard Levitte*
### Changes between 0.9.5 and 0.9.5a [1 Apr 2000] ### ### Changes between 0.9.5 and 0.9.5a [1 Apr 2000]
* Make sure _lrotl and _lrotr are only used with MSVC. * Make sure _lrotl and _lrotr are only used with MSVC.
@@ -14943,7 +14920,7 @@ ndif
* des_quad_cksum() byte order bug fix. * des_quad_cksum() byte order bug fix.
*Ulf Möller, using the problem description in krb4-0.9.7, where *Ulf Möller, using the problem description in krb4-0.9.7, where
the solution is attributed to Derrick J Brashear <shadow@DEMENTIA.ORG>* the solution is attributed to Derrick J Brashear <shadow@DEMENTIA.ORG>*
* Fix so V_ASN1_APP_CHOOSE works again: however its use is strongly * Fix so V_ASN1_APP_CHOOSE works again: however its use is strongly
discouraged. discouraged.
@@ -15071,7 +15048,7 @@ ndif
*Lutz Behnke <behnke@trustcenter.de>* *Lutz Behnke <behnke@trustcenter.de>*
### Changes between 0.9.4 and 0.9.5 [28 Feb 2000] ### ### Changes between 0.9.4 and 0.9.5 [28 Feb 2000]
* PKCS7_encrypt() was adding text MIME headers twice because they * PKCS7_encrypt() was adding text MIME headers twice because they
were added manually and by SMIME_crlf_copy(). were added manually and by SMIME_crlf_copy().
@@ -15104,7 +15081,7 @@ ndif
* Change names of new functions to the new get1/get0 naming * Change names of new functions to the new get1/get0 naming
convention: After 'get1', the caller owns a reference count convention: After 'get1', the caller owns a reference count
and has to call ..._free; 'get0' returns a pointer to some and has to call `..._free`; 'get0' returns a pointer to some
data structure without incrementing reference counters. data structure without incrementing reference counters.
(Some of the existing 'get' functions increment a reference (Some of the existing 'get' functions increment a reference
counter, some don't.) counter, some don't.)
@@ -15120,7 +15097,7 @@ ndif
* Fix potential buffer overrun problem in BIO_printf(). * Fix potential buffer overrun problem in BIO_printf().
*Ulf Möller, using public domain code by Patrick Powell; problem *Ulf Möller, using public domain code by Patrick Powell; problem
pointed out by David Sacerdote <das33@cornell.edu>* pointed out by David Sacerdote <das33@cornell.edu>*
* Support EGD <http://www.lothar.com/tech/crypto/>. New functions * Support EGD <http://www.lothar.com/tech/crypto/>. New functions
RAND_egd() and RAND_status(). In the command line application, RAND_egd() and RAND_status(). In the command line application,
@@ -15147,23 +15124,23 @@ ndif
*Steve Henson* *Steve Henson*
* ..._ctrl functions now have corresponding ..._callback_ctrl functions * `..._ctrl` functions now have corresponding `..._callback_ctrl` functions
where the 'void *' argument is replaced by a function pointer argument. where the `void *` argument is replaced by a function pointer argument.
Previously 'void *' was abused to point to functions, which works on Previously `void *` was abused to point to functions, which works on
many platforms, but is not correct. As these functions are usually many platforms, but is not correct. As these functions are usually
called by macros defined in OpenSSL header files, most source code called by macros defined in OpenSSL header files, most source code
should work without changes. should work without changes.
*Richard Levitte* *Richard Levitte*
* <openssl/opensslconf.h> (which is created by Configure) now contains * `<openssl/opensslconf.h>` (which is created by Configure) now contains
sections with information on -D... compiler switches used for sections with information on -D... compiler switches used for
compiling the library so that applications can see them. To enable compiling the library so that applications can see them. To enable
one of these sections, a pre-processor symbol OPENSSL_..._DEFINES one of these sections, a pre-processor symbol `OPENSSL_..._DEFINES`
must be defined. E.g., must be defined. E.g.,
#define OPENSSL_ALGORITHM_DEFINES #define OPENSSL_ALGORITHM_DEFINES
#include <openssl/opensslconf.h> #include <openssl/opensslconf.h>
defines all pertinent NO_<algo> symbols, such as NO_IDEA, NO_RSA, etc. defines all pertinent `NO_<algo>` symbols, such as NO_IDEA, NO_RSA, etc.
*Richard Levitte, Ulf and Bodo Möller* *Richard Levitte, Ulf and Bodo Möller*
@@ -15238,7 +15215,7 @@ ndif
*Andy Polyakov* *Andy Polyakov*
* Bug fix for BN_div() when the first words of num and divisor are * Bug fix for BN_div() when the first words of num and divisor are
equal (it gave wrong results if (rem=(n1-q*d0)&BN_MASK2) < d0). equal (it gave wrong results if `(rem=(n1-q*d0)&BN_MASK2) < d0)`.
*Ulf Möller* *Ulf Möller*
@@ -15257,7 +15234,7 @@ ndif
*Ulf Möller* *Ulf Möller*
* Change the SSLeay_add_all_*() functions to OpenSSL_add_all_*() and * Change the `SSLeay_add_all_*()` functions to `OpenSSL_add_all_*()` and
include a #define from the old name to the new. The original intent include a #define from the old name to the new. The original intent
was that statically linked binaries could for example just call was that statically linked binaries could for example just call
SSLeay_add_all_ciphers() to just add ciphers to the table and not SSLeay_add_all_ciphers() to just add ciphers to the table and not
@@ -15282,7 +15259,7 @@ ndif
*Martin Kraemer <Martin.Kraemer@Mch.SNI.De>* *Martin Kraemer <Martin.Kraemer@Mch.SNI.De>*
* Source code cleanups: use const where appropriate, eliminate casts, * Source code cleanups: use const where appropriate, eliminate casts,
use void * instead of char * in lhash. use `void *` instead of `char *` in lhash.
*Ulf Möller* *Ulf Möller*
@@ -15357,7 +15334,7 @@ ndif
*Ulf Möller, Bodo Möller* *Ulf Möller, Bodo Möller*
* Clean up CRYPTO_EX_DATA functions, some of these didn't have prototypes * Clean up CRYPTO_EX_DATA functions, some of these didn't have prototypes
used (char *) instead of (void *) and had casts all over the place. used `char *` instead of `void *` and had casts all over the place.
*Steve Henson* *Steve Henson*
@@ -15422,7 +15399,7 @@ ndif
*Steve Henson* *Steve Henson*
* Changes to X509_ATTRIBUTE utilities. These have been renamed from * Changes to X509_ATTRIBUTE utilities. These have been renamed from
X509_*() to X509at_*() on the grounds that they don't handle X509 `X509_*()` to `X509at_*()` on the grounds that they don't handle X509
structures and behave in an analogous way to the X509v3 functions: structures and behave in an analogous way to the X509v3 functions:
they shouldn't be called directly but wrapper functions should be used they shouldn't be called directly but wrapper functions should be used
instead. instead.
@@ -15437,7 +15414,7 @@ ndif
* Add missing #ifndefs that caused missing symbols when building libssl * Add missing #ifndefs that caused missing symbols when building libssl
as a shared library without RSA. Use #ifndef NO_SSL2 instead of as a shared library without RSA. Use #ifndef NO_SSL2 instead of
NO_RSA in ssl/s2*.c. NO_RSA in `ssl/s2*.c`.
*Kris Kennaway <kris@hub.freebsd.org>, modified by Ulf Möller* *Kris Kennaway <kris@hub.freebsd.org>, modified by Ulf Möller*
@@ -15750,8 +15727,8 @@ ndif
There are two big advantages in doing things this way. The extensions There are two big advantages in doing things this way. The extensions
can be looked up immediately and no longer need to be "added" using can be looked up immediately and no longer need to be "added" using
X509V3_add_standard_extensions(): this function now does nothing. X509V3_add_standard_extensions(): this function now does nothing.
*Side note: I get *lots* of email saying the extension code doesn't Side note: I get *lots* of email saying the extension code doesn't
work because people forget to call this function* work because people forget to call this function.
Also no dynamic allocation is done unless new extensions are added: Also no dynamic allocation is done unless new extensions are added:
so if we don't add custom extensions there is no need to call so if we don't add custom extensions there is no need to call
X509V3_EXT_cleanup(). X509V3_EXT_cleanup().
@@ -15831,10 +15808,10 @@ ndif
it clearly returns an error if you try to read the wrong kind of key. it clearly returns an error if you try to read the wrong kind of key.
Added a -pubkey option to the 'x509' utility to output the public key. Added a -pubkey option to the 'x509' utility to output the public key.
Also rename the EVP_PKEY_get_*() to EVP_PKEY_rget_*() Also rename the `EVP_PKEY_get_*()` to `EVP_PKEY_rget_*()`
(renamed to EVP_PKEY_get1_*() in the OpenSSL 0.9.5 release) and add (renamed to `EVP_PKEY_get1_*()` in the OpenSSL 0.9.5 release) and add
EVP_PKEY_rset_*() functions (renamed to EVP_PKEY_set1_*()) `EVP_PKEY_rset_*()` functions (renamed to `EVP_PKEY_set1_*()`)
that do the same as the EVP_PKEY_assign_*() except they up the that do the same as the `EVP_PKEY_assign_*()` except they up the
reference count of the added key (they don't "swallow" the reference count of the added key (they don't "swallow" the
supplied key). supplied key).
@@ -15969,7 +15946,7 @@ ndif
*Steve Henson* *Steve Henson*
* Fix assembler for Alpha (tested only on DEC OSF not Linux or *BSD). * Fix assembler for Alpha (tested only on DEC OSF not Linux or `*BSD`).
The problem was that one of the replacement routines had not been working The problem was that one of the replacement routines had not been working
since SSLeay releases. For now the offending routine has been replaced since SSLeay releases. For now the offending routine has been replaced
with non-optimised assembler. Even so, this now gives around 95% with non-optimised assembler. Even so, this now gives around 95%
@@ -16060,8 +16037,8 @@ ndif
*Steve Henson* *Steve Henson*
* Add function equivalents to the various macros in asn1.h. The old * Add function equivalents to the various macros in asn1.h. The old
macros are retained with an M_ prefix. Code inside the library can macros are retained with an `M_` prefix. Code inside the library can
use the M_ macros. External code (including the openssl utility) use the `M_` macros. External code (including the openssl utility)
should *NOT* in order to be "shared library friendly". should *NOT* in order to be "shared library friendly".
*Steve Henson* *Steve Henson*
@@ -16080,7 +16057,7 @@ ndif
*Steve Henson* *Steve Henson*
* New X509V3_{X509,CRL,REVOKED}_get_d2i() functions. These will search * New `X509V3_{X509,CRL,REVOKED}_get_d2i()` functions. These will search
for, obtain and decode and extension and obtain its critical flag. for, obtain and decode and extension and obtain its critical flag.
This allows all the necessary extension code to be handled in a This allows all the necessary extension code to be handled in a
single function call. single function call.
@@ -16142,7 +16119,7 @@ ndif
usual with these problems it takes *ages* to find and the fix is usual with these problems it takes *ages* to find and the fix is
trivial: move one line. trivial: move one line.
*Steve Henson, reported by ian@uns.ns.ac.yu (Ivan Nejgebauer) * *Steve Henson, reported by ian@uns.ns.ac.yu (Ivan Nejgebauer)*
* Ugly workaround to get s_client and s_server working under Windows. The * Ugly workaround to get s_client and s_server working under Windows. The
old code wouldn't work because it needed to select() on sockets and the old code wouldn't work because it needed to select() on sockets and the
@@ -16319,13 +16296,13 @@ ndif
*Bodo Moeller* *Bodo Moeller*
### Changes between 0.9.3a and 0.9.4 [09 Aug 1999] ### ### Changes between 0.9.3a and 0.9.4 [09 Aug 1999]
* Install libRSAglue.a when OpenSSL is built with RSAref. * Install libRSAglue.a when OpenSSL is built with RSAref.
*Ralf S. Engelschall* *Ralf S. Engelschall*
* A few more ``#ifndef NO_FP_API / #endif'' pairs for consistency. * A few more `#ifndef NO_FP_API / #endif` pairs for consistency.
*Andrija Antonijevic <TheAntony2@bigfoot.com>* *Andrija Antonijevic <TheAntony2@bigfoot.com>*
@@ -16340,7 +16317,7 @@ ndif
For 1024-bit p, DSA_generate_parameters followed by DSA_dup_DH is For 1024-bit p, DSA_generate_parameters followed by DSA_dup_DH is
much faster than DH_generate_parameters (which creates parameters much faster than DH_generate_parameters (which creates parameters
where p = 2*q + 1), and also the smaller q makes DH computations where `p = 2*q + 1`), and also the smaller q makes DH computations
much more efficient (160-bit exponentiation instead of 1024-bit much more efficient (160-bit exponentiation instead of 1024-bit
exponentiation); so this provides a convenient way to support DHE exponentiation); so this provides a convenient way to support DHE
ciphersuites in SSL/TLS servers (see ssl/ssltest.c). It is of ciphersuites in SSL/TLS servers (see ssl/ssltest.c). It is of
@@ -16388,7 +16365,7 @@ ndif
to to
....(char *buf, int size, int rwflag, void *userdata); ....(char *buf, int size, int rwflag, void *userdata);
so that applications can pass data to their callbacks: so that applications can pass data to their callbacks:
The PEM[_ASN1]_{read,write}... functions and macros now take an The `PEM[_ASN1]_{read,write}...` functions and macros now take an
additional void * argument, which is just handed through whenever additional void * argument, which is just handed through whenever
the password callback is called. the password callback is called.
@@ -16445,7 +16422,7 @@ ndif
1. Casts to avoid "loss of data" warnings in p5_crpt2.c 1. Casts to avoid "loss of data" warnings in p5_crpt2.c
2. Change unsigned int to int in b_dump.c to avoid "signed/unsigned 2. Change unsigned int to int in b_dump.c to avoid "signed/unsigned
comparison" warnings. comparison" warnings.
3. Add sk_<TYPE>_sort to DEF file generator and do make update. 3. Add `sk_<TYPE>_sort` to DEF file generator and do make update.
*Steve Henson* *Steve Henson*
@@ -16538,8 +16515,7 @@ ndif
store the length when it is first determined and use it later, rather store the length when it is first determined and use it later, rather
than trying to keep track of where data is copied and updating it to than trying to keep track of where data is copied and updating it to
point to the end. point to the end.
*Steve Henson, reported by Brien Wheeler *Steve Henson, reported by Brien Wheeler <bwheeler@authentica-security.com>*
<bwheeler@authentica-security.com>*
* Add a new function PKCS7_signatureVerify. This allows the verification * Add a new function PKCS7_signatureVerify. This allows the verification
of a PKCS#7 signature but with the signing certificate passed to the of a PKCS#7 signature but with the signing certificate passed to the
@@ -16550,7 +16526,7 @@ ndif
*Steve Henson* *Steve Henson*
* Complete the PEM_* macros with DECLARE_PEM versions to replace the * Complete the `PEM_*` macros with DECLARE_PEM versions to replace the
function prototypes in pem.h, also change util/mkdef.pl to add the function prototypes in pem.h, also change util/mkdef.pl to add the
necessary function names. necessary function names.
@@ -16608,7 +16584,7 @@ ndif
*Steve Henson* *Steve Henson*
* Fix determination of Perl interpreter: A perl or perl5 * Fix determination of Perl interpreter: A perl or perl5
_directory_ in $PATH was also accepted as the interpreter. *directory* in $PATH was also accepted as the interpreter.
*Ralf S. Engelschall* *Ralf S. Engelschall*
@@ -16637,7 +16613,6 @@ ndif
*Bodo Moeller* *Bodo Moeller*
f 0
* DES CBC did not update the IV. Weird. * DES CBC did not update the IV. Weird.
*Ben Laurie* *Ben Laurie*
@@ -16718,7 +16693,7 @@ ndif
*Martin Kraemer <Martin.Kraemer@MchP.Siemens.De>* *Martin Kraemer <Martin.Kraemer@MchP.Siemens.De>*
* Make callbacks for key generation use void * instead of char *. * Make callbacks for key generation use `void *` instead of `char *`.
*Ben Laurie* *Ben Laurie*
@@ -16734,8 +16709,7 @@ ndif
*Bodo Moeller* *Bodo Moeller*
### Changes between 0.9.3 and 0.9.3a [29 May 1999]
### Changes between 0.9.3 and 0.9.3a [29 May 1999] ###
* New configuration variant "sco5-gcc". * New configuration variant "sco5-gcc".
@@ -16768,8 +16742,7 @@ ndif
*Richard Levitte* *Richard Levitte*
### Changes between 0.9.2b and 0.9.3 [24 May 1999]
### Changes between 0.9.2b and 0.9.3 [24 May 1999] ###
* Bignum library bug fix. IRIX 6 passes "make test" now! * Bignum library bug fix. IRIX 6 passes "make test" now!
This also avoids the problems with SC4.2 and unpatched SC5. This also avoids the problems with SC4.2 and unpatched SC5.
@@ -16836,8 +16809,8 @@ ndif
*Steve Henson* *Steve Henson*
* Make SSL library a little more fool-proof by not requiring any longer * Make SSL library a little more fool-proof by not requiring any longer
that SSL_set_{accept,connect}_state be called before that `SSL_set_{accept,connect}_state` be called before
SSL_{accept,connect} may be used (SSL_set_..._state is omitted `SSL_{accept,connect}` may be used (`SSL_set_..._state` is omitted
in many applications because usually everything *appeared* to work as in many applications because usually everything *appeared* to work as
intended anyway -- now it really works as intended). intended anyway -- now it really works as intended).
@@ -16847,9 +16820,9 @@ ndif
*Ulf Möller* *Ulf Möller*
* Fix various things to let OpenSSL even pass ``egcc -pipe -O2 -Wall * Fix various things to let OpenSSL even pass "egcc -pipe -O2 -Wall
-Wshadow -Wpointer-arith -Wcast-align -Wmissing-prototypes -Wshadow -Wpointer-arith -Wcast-align -Wmissing-prototypes
-Wmissing-declarations -Wnested-externs -Winline'' with EGCS 1.1.2+ -Wmissing-declarations -Wnested-externs -Winline" with EGCS 1.1.2+
*Ralf S. Engelschall* *Ralf S. Engelschall*
@@ -16861,7 +16834,7 @@ ndif
* Create a duplicate of the SSL_CTX's CERT in SSL_new instead of * Create a duplicate of the SSL_CTX's CERT in SSL_new instead of
copying pointers. The cert_st handling is changed by this in copying pointers. The cert_st handling is changed by this in
various ways (and thus what used to be known as ctx->default_cert various ways (and thus what used to be known as ctx->default_cert
is now called ctx->cert, since we don't resort to s->ctx->[default_]cert is now called ctx->cert, since we don't resort to `s->ctx->[default_]cert`
any longer when s->cert does not give us what we need). any longer when s->cert does not give us what we need).
ssl_cert_instantiate becomes obsolete by this change. ssl_cert_instantiate becomes obsolete by this change.
As soon as we've got the new code right (possibly it already is?), As soon as we've got the new code right (possibly it already is?),
@@ -16870,7 +16843,7 @@ ndif
Note that using the SSL API in certain dirty ways now will result Note that using the SSL API in certain dirty ways now will result
in different behaviour than observed with earlier library versions: in different behaviour than observed with earlier library versions:
Changing settings for an SSL_CTX *ctx after having done s = SSL_new(ctx) Changing settings for an `SSL_CTX *ctx` after having done s = SSL_new(ctx)
does not influence s as it used to. does not influence s as it used to.
In order to clean up things more thoroughly, inside SSL_SESSION In order to clean up things more thoroughly, inside SSL_SESSION
@@ -16932,7 +16905,7 @@ ndif
*Anonymous* *Anonymous*
* Add missing sk_<type>_unshift() function to safestack.h * Add missing `sk_<type>_unshift()` function to safestack.h
*Ralf S. Engelschall* *Ralf S. Engelschall*
@@ -16992,7 +16965,7 @@ ndif
*Niels Poppe <niels@netbox.org>* *Niels Poppe <niels@netbox.org>*
* New Configure option no-<cipher> (rsa, idea, rc5, ...). * New Configure option `no-<cipher>` (rsa, idea, rc5, ...).
*Ulf Möller* *Ulf Möller*
@@ -17027,7 +17000,7 @@ ndif
*Steve Henson* *Steve Henson*
* Change #include filenames from <foo.h> to <openssl/foo.h>. * Change #include filenames from `<foo.h>` to `<openssl/foo.h>`.
*Bodo Moeller* *Bodo Moeller*
@@ -17147,16 +17120,16 @@ ndif
*Ben Laurie* *Ben Laurie*
* Add `openssl ca -revoke <certfile>' facility which revokes a certificate * Add `openssl ca -revoke <certfile>` facility which revokes a certificate
specified in <certfile> by updating the entry in the index.txt file. specified in `<certfile>` by updating the entry in the index.txt file.
This way one no longer has to edit the index.txt file manually for This way one no longer has to edit the index.txt file manually for
revoking a certificate. The -revoke option does the gory details now. revoking a certificate. The -revoke option does the gory details now.
*Massimiliano Pala <madwolf@openca.org>, Ralf S. Engelschall* *Massimiliano Pala <madwolf@openca.org>, Ralf S. Engelschall*
* Fix `openssl crl -noout -text' combination where `-noout' killed the * Fix `openssl crl -noout -text` combination where `-noout` killed the
`-text' option at all and this way the `-noout -text' combination was `-text` option at all and this way the `-noout -text` combination was
inconsistent in `openssl crl' with the friends in `openssl x509|rsa|dsa'. inconsistent in `openssl crl` with the friends in `openssl x509|rsa|dsa`.
*Ralf S. Engelschall* *Ralf S. Engelschall*
@@ -17166,12 +17139,12 @@ ndif
*Ralf S. Engelschall* *Ralf S. Engelschall*
* Bugfix: In test/testenc, don't test "openssl <cipher>" for * Bugfix: In test/testenc, don't test `openssl <cipher>` for
ciphers that were excluded, e.g. by -DNO_IDEA. Also, test ciphers that were excluded, e.g. by -DNO_IDEA. Also, test
all available ciphers including rc5, which was forgotten until now. all available ciphers including rc5, which was forgotten until now.
In order to let the testing shell script know which algorithms In order to let the testing shell script know which algorithms
are available, a new (up to now undocumented) command are available, a new (up to now undocumented) command
"openssl list-cipher-commands" is used. `openssl list-cipher-commands` is used.
*Bodo Moeller* *Bodo Moeller*
@@ -17260,8 +17233,7 @@ ndif
*Soren S. Jorvang <soren@t.dk>* *Soren S. Jorvang <soren@t.dk>*
### Changes between 0.9.1c and 0.9.2b [22 Mar 1999]
### Changes between 0.9.1c and 0.9.2b [22 Mar 1999] ###
* Make SSL_get_peer_cert_chain() work in servers. Unfortunately, it still * Make SSL_get_peer_cert_chain() work in servers. Unfortunately, it still
doesn't work when the session is reused. Coming soon! doesn't work when the session is reused. Coming soon!
@@ -17391,13 +17363,14 @@ ndif
* Add a useful kludge to allow package maintainers to specify compiler and * Add a useful kludge to allow package maintainers to specify compiler and
other platforms details on the command line without having to patch the other platforms details on the command line without having to patch the
Configure script every time: One now can use ``perl Configure Configure script every time: One now can use
<id>:<details>'', i.e. platform ids are allowed to have details appended `perl Configure <id>:<details>`,
i.e. platform ids are allowed to have details appended
to them (separated by colons). This is treated as there would be a static to them (separated by colons). This is treated as there would be a static
pre-configured entry in Configure's %table under key <id> with value pre-configured entry in Configure's %table under key `<id>` with value
<details> and ``perl Configure <id>'' is called. So, when you want to `<details>` and `perl Configure <id>` is called. So, when you want to
perform a quick test-compile under FreeBSD 3.1 with pgcc and without perform a quick test-compile under FreeBSD 3.1 with pgcc and without
assembler stuff you can use ``perl Configure "FreeBSD-elf:pgcc:-O6:::"'' assembler stuff you can use `perl Configure "FreeBSD-elf:pgcc:-O6:::"`
now, which overrides the FreeBSD-elf entry on-the-fly. now, which overrides the FreeBSD-elf entry on-the-fly.
*Ralf S. Engelschall* *Ralf S. Engelschall*
@@ -17458,7 +17431,7 @@ ndif
*Steve Henson* *Steve Henson*
* Added the new `Includes OpenSSL Cryptography Software' button as * Added the new 'Includes OpenSSL Cryptography Software' button as
doc/openssl_button.{gif,html} which is similar in style to the old SSLeay doc/openssl_button.{gif,html} which is similar in style to the old SSLeay
button and can be used by applications based on OpenSSL to show the button and can be used by applications based on OpenSSL to show the
relationship to the OpenSSL project. relationship to the OpenSSL project.
@@ -17494,7 +17467,7 @@ ndif
* Experiment with doxygen documentation. Currently only partially applied to * Experiment with doxygen documentation. Currently only partially applied to
ssl/ssl_lib.c. ssl/ssl_lib.c.
See http://www.stack.nl/~dimitri/doxygen/index.html, and run doxygen with See <http://www.stack.nl/~dimitri/doxygen/index.html>, and run doxygen with
openssl.doxy as the configuration file. openssl.doxy as the configuration file.
*Ben Laurie* *Ben Laurie*
@@ -17540,13 +17513,13 @@ ndif
*Richard Levitte <levitte@stacken.kth.se>* *Richard Levitte <levitte@stacken.kth.se>*
* Fix 'port' variable from `int' to `unsigned int' in crypto/bio/b_sock.c * Fix `port` variable from `int` to `unsigned int` in crypto/bio/b_sock.c
*Richard Levitte <levitte@stacken.kth.se>* *Richard Levitte <levitte@stacken.kth.se>*
* Change type of another md_len variable in pk7_doit.c:PKCS7_dataFinal() * Change type of another md_len variable in pk7_doit.c:PKCS7_dataFinal()
from `int' to `unsigned int' because it's a length and initialized by from `int` to `unsigned int` because it is a length and initialized by
EVP_DigestFinal() which expects an `unsigned int *'. EVP_DigestFinal() which expects an `unsigned int *`.
*Richard Levitte <levitte@stacken.kth.se>* *Richard Levitte <levitte@stacken.kth.se>*
@@ -17618,7 +17591,7 @@ ndif
foundations than the ad-hoc padding used in PKCS #1 v1.5. It is secure foundations than the ad-hoc padding used in PKCS #1 v1.5. It is secure
against Bleichbacher's attack on RSA. against Bleichbacher's attack on RSA.
*Ulf Moeller <ulf@fitug.de>, reformatted, corrected and integrated by *Ulf Moeller <ulf@fitug.de>, reformatted, corrected and integrated by
Ben Laurie* Ben Laurie*
* Updates to the new SSL compression code * Updates to the new SSL compression code
@@ -17698,7 +17671,7 @@ ndif
*Steve Henson* *Steve Henson*
* Overhauled the Perl interface (perl/*): * Overhauled the Perl interface:
- ported BN stuff to OpenSSL's different BN library - ported BN stuff to OpenSSL's different BN library
- made the perl/ source tree CVS-aware - made the perl/ source tree CVS-aware
- renamed the package from SSLeay to OpenSSL (the files still contain - renamed the package from SSLeay to OpenSSL (the files still contain
@@ -17737,7 +17710,7 @@ ndif
*Eric A. Young, (from changes to C2Net SSLeay, integrated by Mark Cox)* *Eric A. Young, (from changes to C2Net SSLeay, integrated by Mark Cox)*
* Make sure `make rehash' target really finds the `openssl' program. * Make sure `make rehash` target really finds the `openssl` program.
*Ralf S. Engelschall, Matthias Loepfe <Matthias.Loepfe@adnovum.ch>* *Ralf S. Engelschall, Matthias Loepfe <Matthias.Loepfe@adnovum.ch>*
@@ -17750,7 +17723,7 @@ ndif
*Alan Batie <batie@aahz.jf.intel.com>* *Alan Batie <batie@aahz.jf.intel.com>*
* Fixed ms/32all.bat script: `no_asm' -> `no-asm' * Fixed ms/32all.bat script: `no_asm` -> `no-asm`
*Rainer W. Gerling <gerling@mpg-gv.mpg.de>* *Rainer W. Gerling <gerling@mpg-gv.mpg.de>*
@@ -17903,7 +17876,7 @@ ndif
*Steve Henson* *Steve Henson*
* Make _all_ *_free functions accept a NULL pointer. * Make *all* `*_free` functions accept a NULL pointer.
*Frans Heymans <fheymans@isaserver.be>* *Frans Heymans <fheymans@isaserver.be>*
@@ -17966,10 +17939,10 @@ ndif
*Steve Henson and Ben Laurie* *Steve Henson and Ben Laurie*
* First cut of a cleanup for apps/. First the `ssleay' program is now named * First cut of a cleanup for apps/. First the `ssleay` program is now named
`openssl' and second, the shortcut symlinks for the `openssl <command>' `openssl` and second, the shortcut symlinks for the `openssl <command>`
are no longer created. This way we have a single and consistent command are no longer created. This way we have a single and consistent command
line interface `openssl <command>', similar to `cvs <command>'. line interface `openssl <command>`, similar to `cvs <command>`.
*Ralf S. Engelschall, Paul Sutton and Ben Laurie* *Ralf S. Engelschall, Paul Sutton and Ben Laurie*
@@ -18062,8 +18035,7 @@ ndif
*Ben Laurie* *Ben Laurie*
### Changes between 0.9.1b and 0.9.1c [23-Dec-1998]
### Changes between 0.9.1b and 0.9.1c [23-Dec-1998] ###
* Added OPENSSL_VERSION_NUMBER to crypto/crypto.h and * Added OPENSSL_VERSION_NUMBER to crypto/crypto.h and
changed SSLeay to OpenSSL in version strings. changed SSLeay to OpenSSL in version strings.
@@ -18084,7 +18056,7 @@ ndif
*Andrew Cooke / Interrader Ldt., Ralf S. Engelschall* *Andrew Cooke / Interrader Ldt., Ralf S. Engelschall*
* Fixed nasty rehash problem under `make -f Makefile.ssl links' * Fixed nasty rehash problem under `make -f Makefile.ssl links`
when "ssleay" is still not found. when "ssleay" is still not found.
*Ralf S. Engelschall* *Ralf S. Engelschall*
@@ -18136,8 +18108,7 @@ ndif
*The OpenSSL Project* *The OpenSSL Project*
### Changes between 0.9.0b and 0.9.1b [not released]
### Changes between 0.9.0b and 0.9.1b [not released] ###
* Updated a few CA certificates under certs/ * Updated a few CA certificates under certs/
@@ -18268,7 +18239,6 @@ ndif
*Edward Bishop <ebishop@spyglass.com>* *Edward Bishop <ebishop@spyglass.com>*
<!-- Links --> <!-- Links -->
[CVE-2019-1563]: https://www.openssl.org/news/vulnerabilities.html#CVE-2019-1563 [CVE-2019-1563]: https://www.openssl.org/news/vulnerabilities.html#CVE-2019-1563
+11 -7
View File
@@ -5,7 +5,6 @@ Please visit our [Getting Started][gs] page for other ideas about how to contrib
[gs]: https://www.openssl.org/community/getting-started.html [gs]: https://www.openssl.org/community/getting-started.html
Development is done on GitHub in the [openssl/openssl][gh] repository. Development is done on GitHub in the [openssl/openssl][gh] repository.
[gh]: https://github.com/openssl/openssl [gh]: https://github.com/openssl/openssl
@@ -30,14 +29,17 @@ guidelines:
[CLA]: https://www.openssl.org/policies/cla.html [CLA]: https://www.openssl.org/policies/cla.html
To amend a missing "`CLA: trivial`" line after submission, do the following: To amend a missing "`CLA: trivial`" line after submission, do the following:
``` ```
git commit --amend git commit --amend
[add the line, save and quit the editor] [add the line, save and quit the editor]
git push -f git push -f
``` ```
2. All source files should start with the following text (with 2. All source files should start with the following text (with
appropriate comment characters at the start of each line and the appropriate comment characters at the start of each line and the
year(s) updated): year(s) updated):
``` ```
Copyright 20xx-20yy The OpenSSL Project Authors. All Rights Reserved. Copyright 20xx-20yy The OpenSSL Project Authors. All Rights Reserved.
@@ -70,18 +72,20 @@ guidelines:
documentation changes are clean. documentation changes are clean.
7. For user visible changes (API changes, behaviour changes, ...), 7. For user visible changes (API changes, behaviour changes, ...),
consider adding a note in [CHANGES](CHANGES). This could be a summarising consider adding a note in [CHANGES.md](CHANGES.md).
description of the change, and could explain the grander details. This could be a summarising description of the change, and could
explain the grander details.
Have a look through existing entries for inspiration. Have a look through existing entries for inspiration.
Please note that this is NOT simply a copy of git-log one-liners. Please note that this is NOT simply a copy of git-log one-liners.
Also note that security fixes get an entry in CHANGES. Also note that security fixes get an entry in CHANGES.md.
This file helps users get more in depth information of what comes This file helps users get more in depth information of what comes
with a specific release without having to sift through the higher with a specific release without having to sift through the higher
noise ratio in git-log. noise ratio in git-log.
8. For larger or more important user visible changes, as well as 8. For larger or more important user visible changes, as well as
security fixes, please add a line in [NEWS](NEWS). On exception, it might be security fixes, please add a line in [NEWS.md](NEWS.md).
worth adding a multi-line entry (such as the entry that announces all On exception, it might be worth adding a multi-line entry (such as
the types that became opaque with OpenSSL 1.1.0). the entry that announces all the types that became opaque with
OpenSSL 1.1.0).
This file helps users get a very quick summary of what comes with a This file helps users get a very quick summary of what comes with a
specific release, to see if an upgrade is worth the effort. specific release, to see if an upgrade is worth the effort.
+2 -2
View File
@@ -10,7 +10,7 @@ my %targets=(
includes => [], includes => [],
lib_cflags => "", lib_cflags => "",
lib_cppflags => "", lib_cppflags => "",
lib_defines => [ 'OPENSSL_BUILDING_OPENSSL' ], lib_defines => [],
thread_scheme => "(unknown)", # Assume we don't know thread_scheme => "(unknown)", # Assume we don't know
thread_defines => [], thread_defines => [],
@@ -47,7 +47,7 @@ my %targets=(
defines => defines =>
sub { sub {
my @defs = (); my @defs = ( 'OPENSSL_BUILDING_OPENSSL' );
push @defs, "ZLIB" unless $disabled{zlib}; push @defs, "ZLIB" unless $disabled{zlib};
push @defs, "ZLIB_SHARED" unless $disabled{"zlib-dynamic"}; push @defs, "ZLIB_SHARED" unless $disabled{"zlib-dynamic"};
return [ @defs ]; return [ @defs ];
+1 -1
View File
@@ -790,7 +790,7 @@ my %targets = (
inherit_from => [ "linux-generic32" ], inherit_from => [ "linux-generic32" ],
cflags => add("-mabi=n32"), cflags => add("-mabi=n32"),
cxxflags => add("-mabi=n32"), cxxflags => add("-mabi=n32"),
bn_ops => "SIXTY_FOUR_BIT RC4_CHAR", bn_ops => "RC4_CHAR",
asm_arch => 'mips64', asm_arch => 'mips64',
perlasm_scheme => "n32", perlasm_scheme => "n32",
multilib => "32", multilib => "32",
+2 -2
View File
@@ -1,6 +1,6 @@
#! /usr/bin/env perl #! /usr/bin/env perl
# -*- mode: perl; -*- # -*- mode: perl; -*-
# Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. # Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.
# #
# Licensed under the Apache License 2.0 (the "License"). You may not use # Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy # this file except in compliance with the License. You can obtain a copy
@@ -36,7 +36,7 @@ my %shared_info;
(grep /(?:^|\s)-fsanitize/, (grep /(?:^|\s)-fsanitize/,
@{$config{CFLAGS}}, @{$config{cflags}}) @{$config{CFLAGS}}, @{$config{cflags}})
? '' ? ''
: '-z defs', : '-Wl,-z,defs',
}; };
}, },
'bsd-gcc-shared' => sub { return $shared_info{'linux-shared'}; }, 'bsd-gcc-shared' => sub { return $shared_info{'linux-shared'}; },
+32 -23
View File
@@ -519,7 +519,7 @@ clean: libclean
-$(RM) `find . -name '*{- platform->depext() -}' \! -name '.*' \! -type d -print` -$(RM) `find . -name '*{- platform->depext() -}' \! -name '.*' \! -type d -print`
-$(RM) `find . -name '*{- platform->objext() -}' \! -name '.*' \! -type d -print` -$(RM) `find . -name '*{- platform->objext() -}' \! -name '.*' \! -type d -print`
$(RM) core $(RM) core
$(RM) tags TAGS doc-nits cmd-nits $(RM) tags TAGS doc-nits cmd-nits md-nits
$(RM) -r test/test-runs $(RM) -r test/test-runs
$(RM) openssl.pc libcrypto.pc libssl.pc $(RM) openssl.pc libcrypto.pc libssl.pc
-$(RM) `find . -type l \! -name '.*' -print` -$(RM) `find . -type l \! -name '.*' -print`
@@ -859,30 +859,30 @@ install_man_docs: build_man_docs
@set -e; for x in dummy $(MANDOCS1); do \ @set -e; for x in dummy $(MANDOCS1); do \
if [ "$$x" = "dummy" ]; then continue; fi; \ if [ "$$x" = "dummy" ]; then continue; fi; \
fn=`basename $$x`; \ fn=`basename $$x`; \
$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man1/$$fn"; \ $(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX)"; \
cp $$x $(DESTDIR)$(MANDIR)/man1/$$fn$(MANSUFFIX); \ cp $$x $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX); \
chmod 755 $(DESTDIR)$(MANDIR)/man1/$$fn$(MANSUFFIX); \ chmod 755 $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX); \
done done
@set -e; for x in dummy $(MANDOCS3); do \ @set -e; for x in dummy $(MANDOCS3); do \
if [ "$$x" = "dummy" ]; then continue; fi; \ if [ "$$x" = "dummy" ]; then continue; fi; \
fn=`basename $$x`; \ fn=`basename $$x`; \
$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man3/$$fn"; \ $(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX)"; \
cp $$x $(DESTDIR)$(MANDIR)/man3/$$fn$(MANSUFFIX); \ cp $$x $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX); \
chmod 755 $(DESTDIR)$(MANDIR)/man3/$$fn$(MANSUFFIX); \ chmod 755 $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX); \
done done
@set -e; for x in dummy $(MANDOCS5); do \ @set -e; for x in dummy $(MANDOCS5); do \
if [ "$$x" = "dummy" ]; then continue; fi; \ if [ "$$x" = "dummy" ]; then continue; fi; \
fn=`basename $$x`; \ fn=`basename $$x`; \
$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man5/$$fn"; \ $(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX)"; \
cp $$x $(DESTDIR)$(MANDIR)/man5/$$fn$(MANSUFFIX); \ cp $$x $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX); \
chmod 755 $(DESTDIR)$(MANDIR)/man5/$$fn$(MANSUFFIX); \ chmod 755 $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX); \
done done
@set -e; for x in dummy $(MANDOCS7); do \ @set -e; for x in dummy $(MANDOCS7); do \
if [ "$$x" = "dummy" ]; then continue; fi; \ if [ "$$x" = "dummy" ]; then continue; fi; \
fn=`basename $$x`; \ fn=`basename $$x`; \
$(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man7/$$fn"; \ $(ECHO) "install $$x -> $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX)"; \
cp $$x $(DESTDIR)$(MANDIR)/man7/$$fn$(MANSUFFIX); \ cp $$x $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX); \
chmod 755 $(DESTDIR)$(MANDIR)/man7/$$fn$(MANSUFFIX); \ chmod 755 $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX); \
done done
uninstall_man_docs: uninstall_man_docs:
@@ -890,26 +890,26 @@ uninstall_man_docs:
@set -e; for x in dummy $(MANDOCS1); do \ @set -e; for x in dummy $(MANDOCS1); do \
if [ "$$x" = "dummy" ]; then continue; fi; \ if [ "$$x" = "dummy" ]; then continue; fi; \
fn=`basename $$x`; \ fn=`basename $$x`; \
$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man1/$$fn"; \ $(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX)"; \
$(RM) $(DESTDIR)$(MANDIR)/man1/$$fn$(MANSUFFIX); \ $(RM) $(DESTDIR)$(MANDIR)/man1/$${fn}$(MANSUFFIX); \
done done
@set -e; for x in dummy $(MANDOCS3); do \ @set -e; for x in dummy $(MANDOCS3); do \
if [ "$$x" = "dummy" ]; then continue; fi; \ if [ "$$x" = "dummy" ]; then continue; fi; \
fn=`basename $$x`; \ fn=`basename $$x`; \
$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man3/$$fn"; \ $(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX)"; \
$(RM) $(DESTDIR)$(MANDIR)/man3/$$fn$(MANSUFFIX); \ $(RM) $(DESTDIR)$(MANDIR)/man3/$${fn}$(MANSUFFIX); \
done done
@set -e; for x in dummy $(MANDOCS5); do \ @set -e; for x in dummy $(MANDOCS5); do \
if [ "$$x" = "dummy" ]; then continue; fi; \ if [ "$$x" = "dummy" ]; then continue; fi; \
fn=`basename $$x`; \ fn=`basename $$x`; \
$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man5/$$fn"; \ $(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX)"; \
$(RM) $(DESTDIR)$(MANDIR)/man5/$$fn$(MANSUFFIX); \ $(RM) $(DESTDIR)$(MANDIR)/man5/$${fn}$(MANSUFFIX); \
done done
@set -e; for x in dummy $(MANDOCS7); do \ @set -e; for x in dummy $(MANDOCS7); do \
if [ "$$x" = "dummy" ]; then continue; fi; \ if [ "$$x" = "dummy" ]; then continue; fi; \
fn=`basename $$x`; \ fn=`basename $$x`; \
$(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man7/$$fn"; \ $(ECHO) "$(RM) $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX)"; \
$(RM) $(DESTDIR)$(MANDIR)/man7/$$fn$(MANSUFFIX); \ $(RM) $(DESTDIR)$(MANDIR)/man7/$${fn}$(MANSUFFIX); \
done done
install_html_docs: build_html_docs install_html_docs: build_html_docs
@@ -982,13 +982,22 @@ update: generate errors ordinals
generate: generate_apps generate_crypto_bn generate_crypto_objects \ generate: generate_apps generate_crypto_bn generate_crypto_objects \
generate_crypto_conf generate_crypto_asn1 generate_fuzz_oids generate_crypto_conf generate_crypto_asn1 generate_fuzz_oids
.PHONY: doc-nits cmd-nits .PHONY: doc-nits cmd-nits md-nits
doc-nits: build_generated doc-nits: build_generated
$(PERL) $(SRCDIR)/util/find-doc-nits -n -l -e $(PERL) $(SRCDIR)/util/find-doc-nits -n -l -e
cmd-nits: build_generated apps/openssl cmd-nits: build_generated apps/openssl
$(PERL) $(SRCDIR)/util/find-doc-nits -c $(PERL) $(SRCDIR)/util/find-doc-nits -c
# This uses "mdl", the markdownlint application, which is written in ruby.
# The source is at https://github.com/markdownlint/markdownlint
# If you have ruby installed, "gem install mdl" should work.
# Another option is at https://snapcraft.io/install/mdl/debian
# Finally, there's a Node.js version, which we haven't tried, that
# can be found at https://github.com/DavidAnson/markdownlint
md-nits:
mdl -s util/markdownlint.rb .
# Test coverage is a good idea for the future # Test coverage is a good idea for the future
#coverage: $(PROGRAMS) $(TESTPROGRAMS) #coverage: $(PROGRAMS) $(TESTPROGRAMS)
# ... # ...
@@ -1268,7 +1277,7 @@ EOF
if ($args{generator}->[0] =~ /\.pl$/) { if ($args{generator}->[0] =~ /\.pl$/) {
$generator = 'CC="$(CC)" $(PERL)'.$generator_incs.' '.$generator $generator = 'CC="$(CC)" $(PERL)'.$generator_incs.' '.$generator
.' "$(PERLASM_SCHEME)"'.$incs.' '.$cppflags.$defs.' $(PROCESSSOR)'; .' "$(PERLASM_SCHEME)"'.$incs.' '.$cppflags.$defs.' $(PROCESSOR)';
} elsif ($args{generator}->[0] =~ /\.m4$/) { } elsif ($args{generator}->[0] =~ /\.m4$/) {
$generator = 'm4 -B 8192'.$generator_incs.' '.$generator.' >' $generator = 'm4 -B 8192'.$generator_incs.' '.$generator.' >'
} elsif ($args{generator}->[0] =~ /\.S$/) { } elsif ($args{generator}->[0] =~ /\.S$/) {
+4 -6
View File
@@ -95,12 +95,10 @@ INSTALL_ENGINEPDBS={-
@{$unified_info{modules}}) @{$unified_info{modules}})
-} -}
INSTALL_MODULES={- INSTALL_MODULES={-
join(" \\\n" . ' ' x 16, join(" ", map { platform->dso($_) }
fill_lines(" ", $COLUMNS - 16, grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
map { platform->dso($_) } && !$unified_info{attributes}->{modules}->{$_}->{engine} }
grep { !$unified_info{attributes}->{modules}->{$_}->{noinst} @{$unified_info{modules}})
&& !$unified_info{attributes}->{modules}->{$_}->{engine} }
@{$unified_info{modules}}))
-} -}
INSTALL_MODULEPDBS={- INSTALL_MODULEPDBS={-
join(" ", map { quotify1(platform->dsopdb($_)) } join(" ", map { quotify1(platform->dsopdb($_)) }
+31 -36
View File
@@ -21,7 +21,7 @@ use OpenSSL::fallback "$FindBin::Bin/external/perl/MODULES.txt";
use OpenSSL::Glob; use OpenSSL::Glob;
use OpenSSL::Template; use OpenSSL::Template;
# see INSTALL for instructions. # see INSTALL.md for instructions.
my $orig_death_handler = $SIG{__DIE__}; my $orig_death_handler = $SIG{__DIE__};
$SIG{__DIE__} = \&death_handler; $SIG{__DIE__} = \&death_handler;
@@ -1136,7 +1136,8 @@ will not work unless the random generator is seeded manually by the
application. application.
Please read the 'Note on random number generation' section in the Please read the 'Note on random number generation' section in the
INSTALL instructions and the RAND_DRBG(7) manual page for more details. INSTALL.md instructions and the RAND_DRBG(7) manual page for more
details.
============================== WARNING =============================== ============================== WARNING ===============================
_____ _____
@@ -1830,23 +1831,13 @@ if ($builder eq "unified") {
my $variable_name_re = qr/(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/; my $variable_name_re = qr/(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/;
# Value modifier syntaxes # Value modifier syntaxes
my $variable_subst_re = qr/\/(?P<RE>(?:\\\/|.)*?)\/(?P<SUBST>.*?)/; my $variable_subst_re = qr/\/(?P<RE>(?:\\\/|.)*?)\/(?P<SUBST>.*?)/;
# Put it all together # Variable reference
my $variable_re = qr/\$ my $variable_simple_re = qr/(?<!\\)\$${variable_name_re}/;
(?| my $variable_w_mod_re =
# Simple case, just the name qr/(?<!\\)\$\{${variable_name_re}(?P<MOD>(?:\\\/|.)*?)\}/;
${variable_name_re} # Tie it all together
| my $variable_re = qr/${variable_simple_re}|${variable_w_mod_re}/;
# Expressive case, with braces and possible
# modifier expressions
\{
${variable_name_re}
(?:
# Pile on modifier expressions,
# separated by |
${variable_subst_re}
)
\}
)/x;
my $expand_variables = sub { my $expand_variables = sub {
my $value = ''; my $value = '';
my $value_rest = shift; my $value_rest = shift;
@@ -1855,25 +1846,29 @@ if ($builder eq "unified") {
print STDERR print STDERR
"DEBUG[\$expand_variables] Parsed '$value_rest' ...\n" "DEBUG[\$expand_variables] Parsed '$value_rest' ...\n"
} }
while ($value_rest =~ /(?<!\\)${variable_re}/) {
while ($value_rest =~ /${variable_re}/) {
# We must save important regexp values, because the next
# regexp clears them
my $mod = $+{MOD};
my $variable_value = $variables{$+{VARIABLE}};
$value_rest = $'; $value_rest = $';
$value .= $`; $value .= $`;
my $variable_value = $variables{$+{VARIABLE}};
# Process modifier expressions, if present # Process modifier expressions, if present
if (defined $+{RE}) { if (defined $mod) {
# We must save important %+ values, because the s/// if ($mod =~ /^${variable_subst_re}$/) {
# below clears them my $re = $+{RE};
my $re = $+{RE}; my $subst = $+{SUBST};
my $subst = $+{SUBST};
$variable_value =~ s/\Q$re\E/$subst/g; $variable_value =~ s/\Q$re\E/$subst/g;
if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) { if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
print STDERR print STDERR
"DEBUG[\$expand_variables] ... and substituted ", "DEBUG[\$expand_variables] ... and substituted ",
"'$re' with '$subst'\n"; "'$re' with '$subst'\n";
}
} }
} }
@@ -2616,7 +2611,7 @@ print <<"EOF" if ($disabled{threads} eq "unavailable");
The library could not be configured for supporting multi-threaded The library could not be configured for supporting multi-threaded
applications as the compiler options required on this system are not known. applications as the compiler options required on this system are not known.
See file INSTALL for details if you need multi-threading. See file INSTALL.md for details if you need multi-threading.
EOF EOF
print <<"EOF" if ($no_shared_warn); print <<"EOF" if ($no_shared_warn);
@@ -2641,7 +2636,7 @@ print <<"EOF";
*** perl configdata.pm --dump *** *** perl configdata.pm --dump ***
*** *** *** ***
*** (If you are new to OpenSSL, you might want to consult the *** *** (If you are new to OpenSSL, you might want to consult the ***
*** 'Troubleshooting' section in the INSTALL file first) *** *** 'Troubleshooting' section in the INSTALL.md file first) ***
*** *** *** ***
********************************************************************** **********************************************************************
EOF EOF
@@ -2661,8 +2656,8 @@ sub death_handler {
my @message = ( <<"_____", @_ ); my @message = ( <<"_____", @_ );
Failure! $build_file wasn't produced. Failure! $build_file wasn't produced.
Please read INSTALL and associated NOTES files. You may also have to look over Please read INSTALL.md and associated NOTES files. You may also have to
your available compiler tool chain or change your configuration. look over your available compiler tool chain or change your configuration.
_____ _____
+146 -173
View File
@@ -1,4 +1,3 @@
Build and Install Build and Install
================= =================
@@ -12,36 +11,35 @@ Table of Contents
- [Prerequisites](#prerequisites) - [Prerequisites](#prerequisites)
- [Notational Conventions](#notational-conventions) - [Notational Conventions](#notational-conventions)
- [Quick Installation Guide](#quick-installation-guide) - [Quick Installation Guide](#quick-installation-guide)
- [Building OpenSSL](#building-openssl) - [Building OpenSSL](#building-openssl)
- [Installing OpenSSL](#installing-openssl) - [Installing OpenSSL](#installing-openssl)
- [Configuration Options](#configuration-options) - [Configuration Options](#configuration-options)
- [API Level](#api-level) - [API Level](#api-level)
- [Cross Compile Prefix](#cross-compile-prefix) - [Cross Compile Prefix](#cross-compile-prefix)
- [Build Type](#build-type) - [Build Type](#build-type)
- [Directories](#directories) - [Directories](#directories)
- [Compiler Warnings](#compiler-warnings) - [Compiler Warnings](#compiler-warnings)
- [ZLib Flags](#zlib-flags) - [ZLib Flags](#zlib-flags)
- [Seeding the Random Generator](#seeding-the-random-generator) - [Seeding the Random Generator](#seeding-the-random-generator)
- [Enable and Disable Features](#enable-and-disable-features) - [Enable and Disable Features](#enable-and-disable-features)
- [Displaying configuration data](#displaying-configuration-data) - [Displaying configuration data](#displaying-configuration-data)
- [Installation Steps in Detail](#installation-steps-in-detail) - [Installation Steps in Detail](#installation-steps-in-detail)
- [Configure](#configure-openssl) - [Configure](#configure-openssl)
- [Build](#build-openssl) - [Build](#build-openssl)
- [Test](#test-openssl) - [Test](#test-openssl)
- [Install](#install-openssl) - [Install](#install-openssl)
- [Advanced Build Options](#advanced-build-options) - [Advanced Build Options](#advanced-build-options)
- [Environment Variables](#environment-variables) - [Environment Variables](#environment-variables)
- [Makefile Targets](#makefile-targets) - [Makefile Targets](#makefile-targets)
- [Running Selected Tests](#running-selected-tests) - [Running Selected Tests](#running-selected-tests)
- [Troubleshooting](#troubleshooting) - [Troubleshooting](#troubleshooting)
- [Configuration Problems](#configuration-problems) - [Configuration Problems](#configuration-problems)
- [Build Failures](#build-failures) - [Build Failures](#build-failures)
- [Test Failures](#test-failures) - [Test Failures](#test-failures)
- [Notes](#notes) - [Notes](#notes)
- [Notes on multi-threading](#notes-on-multi-threading) - [Notes on multi-threading](#notes-on-multi-threading)
- [Notes on shared libraries](#notes-on-shared-libraries) - [Notes on shared libraries](#notes-on-shared-libraries)
- [Notes on random number generation](#notes-on-random-number-generation) - [Notes on random number generation](#notes-on-random-number-generation)
Prerequisites Prerequisites
============= =============
@@ -67,7 +65,6 @@ issues and other details, please read one of these:
* [NOTES.VALGRIND](NOTES.VALGRIND) - testing with Valgrind * [NOTES.VALGRIND](NOTES.VALGRIND) - testing with Valgrind
* [NOTES.PERL](NOTES.PERL) - some notes on Perl * [NOTES.PERL](NOTES.PERL) - some notes on Perl
Notational conventions Notational conventions
====================== ======================
@@ -129,7 +126,6 @@ A simple example would be
which is to be understood to use the command `type` on some file name which is to be understood to use the command `type` on some file name
determined by the user. determined by the user.
**Optional Arguments** are enclosed in double square brackets. **Optional Arguments** are enclosed in double square brackets.
[[ options ]] [[ options ]]
@@ -138,7 +134,6 @@ Note that the notation assumes spaces around {, }, [, ], {{, }} and
[[, ]]. This is to differentiate from OpenVMS directory [[, ]]. This is to differentiate from OpenVMS directory
specifications, which also use [ and ], but without spaces. specifications, which also use [ and ], but without spaces.
Quick Installation Guide Quick Installation Guide
======================== ========================
@@ -154,13 +149,13 @@ Use the following commands to configure, build and test OpenSSL.
The testing is optional, but recommended if you intend to install The testing is optional, but recommended if you intend to install
OpenSSL for production use. OpenSSL for production use.
### Unix / Linux / macOS ### ### Unix / Linux / macOS
$ ./config $ ./config
$ make $ make
$ make test $ make test
### OpenVMS ### ### OpenVMS
Use the following commands to build OpenSSL: Use the following commands to build OpenSSL:
@@ -168,7 +163,7 @@ Use the following commands to build OpenSSL:
$ mms $ mms
$ mms test $ mms test
### Windows ### ### Windows
If you are using Visual Studio, open a Developer Command Prompt and If you are using Visual Studio, open a Developer Command Prompt and
and issue the following commands to build OpenSSL. and issue the following commands to build OpenSSL.
@@ -210,7 +205,7 @@ the global search path for system libraries.
Finally, if you plan on using the FIPS module, you need to read the Finally, if you plan on using the FIPS module, you need to read the
[Post-installation Notes](#post-installation-notes) further down. [Post-installation Notes](#post-installation-notes) further down.
### Unix / Linux / macOS ### ### Unix / Linux / macOS
Depending on your distribution, you need to run the following command as Depending on your distribution, you need to run the following command as
root user or prepend `sudo` to the command: root user or prepend `sudo` to the command:
@@ -230,7 +225,7 @@ More precisely, the files will be installed into the subdirectories
depending on the file type, as it is custom on Unix-like operating systems. depending on the file type, as it is custom on Unix-like operating systems.
### OpenVMS ### ### OpenVMS
Use the following command to install OpenSSL. Use the following command to install OpenSSL.
@@ -243,7 +238,7 @@ By default, OpenSSL will be installed to
where 'version' is the OpenSSL version number with underscores instead where 'version' is the OpenSSL version number with underscores instead
of periods. of periods.
### Windows ### ### Windows
If you are using Visual Studio, open the Developer Command Prompt _elevated_ If you are using Visual Studio, open the Developer Command Prompt _elevated_
and issue the following command. and issue the following command.
@@ -264,26 +259,25 @@ for native binaries, or
for 32bit binaries on 64bit Windows (WOW64). for 32bit binaries on 64bit Windows (WOW64).
#### Installing to a different location
#### Installing to a different location ####
To install OpenSSL to a different location (for example into your home To install OpenSSL to a different location (for example into your home
directory for testing purposes) run config like this: directory for testing purposes) run config as shown in the following
examples.
**On Unix** On Unix:
$ ./config --prefix=/opt/openssl --openssldir=/usr/local/ssl $ ./config --prefix=/opt/openssl --openssldir=/usr/local/ssl
**On OpenVMS** On OpenVMS:
$ @config --prefix=PROGRAM:[INSTALLS] --openssldir=SYS$MANAGER:[OPENSSL] $ @config --prefix=PROGRAM:[INSTALLS] --openssldir=SYS$MANAGER:[OPENSSL]
Note: if you do add options to the configuration command, please make sure Note: if you do add options to the configuration command, please make sure
you've read more than just this Quick Start, such as relevant NOTES.* files, you've read more than just this Quick Start, such as relevant `NOTES.*` files,
the options outline below, as configuration options may change the outcome the options outline below, as configuration options may change the outcome
in otherwise unexpected ways. in otherwise unexpected ways.
Configuration Options Configuration Options
===================== =====================
@@ -310,7 +304,6 @@ If you just intend to remove all deprecated APIs up to the current version
entirely, just specify [no-deprecated](#no-deprecated). entirely, just specify [no-deprecated](#no-deprecated).
If `--api` isn't given, it defaults to the current (minor) OpenSSL version. If `--api` isn't given, it defaults to the current (minor) OpenSSL version.
Cross Compile Prefix Cross Compile Prefix
-------------------- --------------------
@@ -333,7 +326,6 @@ mention that you have to invoke `./Configure`, not `./config`, and pass your tar
name explicitly. Also, note that `--openssldir` refers to target's file system, name explicitly. Also, note that `--openssldir` refers to target's file system,
not one you are building on. not one you are building on.
Build Type Build Type
---------- ----------
@@ -345,11 +337,10 @@ Build OpenSSL with debugging symbols and zero optimization level.
Build OpenSSL without debugging symbols. This is the default. Build OpenSSL without debugging symbols. This is the default.
Directories Directories
----------- -----------
### libdir ### ### libdir
--libdir=DIR --libdir=DIR
@@ -359,7 +350,7 @@ this is "lib". Note that on Windows only static libraries (`*.lib`) will
be stored in this location. Shared libraries (`*.dll`) will always be be stored in this location. Shared libraries (`*.dll`) will always be
installed to the "bin" directory. installed to the "bin" directory.
### openssldir ### ### openssldir
--openssldir=DIR --openssldir=DIR
@@ -373,7 +364,7 @@ and key store. Defaults are:
For 32bit Windows applications on Windows 64bit (WOW64), always replace For 32bit Windows applications on Windows 64bit (WOW64), always replace
`C:\Program Files` by `C:\Program Files (x86)`. `C:\Program Files` by `C:\Program Files (x86)`.
### prefix ### ### prefix
--prefix=DIR --prefix=DIR
@@ -383,7 +374,6 @@ The top of the installation directory tree. Defaults are:
Windows: C:\Program Files\OpenSSL Windows: C:\Program Files\OpenSSL
OpenVMS: SYS$COMMON:[OPENSSL-'version'] OpenVMS: SYS$COMMON:[OPENSSL-'version']
Compiler Warnings Compiler Warnings
----------------- -----------------
@@ -397,7 +387,7 @@ this option where possible.
ZLib Flags ZLib Flags
---------- ----------
### with-zlib-include ### ### with-zlib-include
--with-zlib-include=DIR --with-zlib-include=DIR
@@ -405,7 +395,7 @@ The directory for the location of the zlib include file. This option is only
necessary if [enable-zlib](#enable-zlib) is used and the include file is not necessary if [enable-zlib](#enable-zlib) is used and the include file is not
already on the system include path. already on the system include path.
### with-zlib-lib ### ### with-zlib-lib
--with-zlib-lib=LIB --with-zlib-lib=LIB
@@ -421,7 +411,6 @@ then this flag is optional and defaults to "ZLIB1" if not provided.
This flag is optional and if not provided then "GNV$LIBZSHR", "GNV$LIBZSHR32" This flag is optional and if not provided then "GNV$LIBZSHR", "GNV$LIBZSHR32"
or "GNV$LIBZSHR64" is used by default depending on the pointer size chosen. or "GNV$LIBZSHR64" is used by default depending on the pointer size chosen.
Seeding the Random Generator Seeding the Random Generator
---------------------------- ----------------------------
@@ -432,18 +421,18 @@ in order to obtain random input (a.k.a "entropy") for seeding its
cryptographically secure random number generator (CSPRNG). cryptographically secure random number generator (CSPRNG).
The current seeding methods are: The current seeding methods are:
### os ### ### os
Use a trusted operating system entropy source. Use a trusted operating system entropy source.
This is the default method if such an entropy source exists. This is the default method if such an entropy source exists.
### getrandom ### ### getrandom
Use the [getrandom(2)][man-getrandom] or equivalent system call. Use the [getrandom(2)][man-getrandom] or equivalent system call.
[man-getrandom]: http://man7.org/linux/man-pages/man2/getrandom.2.html [man-getrandom]: http://man7.org/linux/man-pages/man2/getrandom.2.html
### devrandom ### ### devrandom
Use the first device from the DEVRANDOM list which can be opened to read Use the first device from the DEVRANDOM list which can be opened to read
random bytes. The DEVRANDOM preprocessor constant expands to random bytes. The DEVRANDOM preprocessor constant expands to
@@ -452,19 +441,19 @@ random bytes. The DEVRANDOM preprocessor constant expands to
on most unix-ish operating systems. on most unix-ish operating systems.
### egd ### ### egd
Check for an entropy generating daemon. Check for an entropy generating daemon.
### rdcpu ### ### rdcpu
Use the RDSEED or RDRAND command if provided by the CPU. Use the RDSEED or RDRAND command if provided by the CPU.
### librandom ### ### librandom
Use librandom (not implemented yet). Use librandom (not implemented yet).
### none ### ### none
Disable automatic seeding. This is the default on some operating systems where Disable automatic seeding. This is the default on some operating systems where
no suitable entropy source exists, or no support for it is implemented yet. no suitable entropy source exists, or no support for it is implemented yet.
@@ -474,7 +463,6 @@ at the end of this document.
[rng]: #notes-on-random-number-generation [rng]: #notes-on-random-number-generation
Enable and Disable Features Enable and Disable Features
--------------------------- ---------------------------
@@ -488,14 +476,13 @@ In the following list, always the non-default variant is documented: if
feature xxxx is disabled by default then enable-xxxx is documented and feature xxxx is disabled by default then enable-xxxx is documented and
if feature xxxx is enabled by default then no-xxxx is documented. if feature xxxx is enabled by default then no-xxxx is documented.
### no-afalgeng
### no-afalgeng ###
Don't build the AFALG engine. Don't build the AFALG engine.
This option will be forced on a platform that does not support AFALG. This option will be forced on a platform that does not support AFALG.
### enable-ktls ### ### enable-ktls
Build with Kernel TLS support. Build with Kernel TLS support.
@@ -505,7 +492,7 @@ TLS sockets. The Kernel may use TLS accelerators if any are available on the
system. This option will be forced off on systems that do not support the system. This option will be forced off on systems that do not support the
Kernel TLS data-path. Kernel TLS data-path.
### enable-asan ### ### enable-asan
Build with the Address sanitiser. Build with the Address sanitiser.
@@ -514,7 +501,7 @@ never be used in production environments. It will only work when used with
gcc or clang and should be used in conjunction with the [no-shared](#no-shared) gcc or clang and should be used in conjunction with the [no-shared](#no-shared)
option. option.
### no-asm ### ### no-asm
Do not use assembler code. Do not use assembler code.
@@ -522,11 +509,11 @@ This should be viewed as debugging/troubleshooting option rather than for
production use. On some platforms a small amount of assembler code may still production use. On some platforms a small amount of assembler code may still
be used even with this option. be used even with this option.
### no-async ### ### no-async
Do not build support for async operations. Do not build support for async operations.
### no-autoalginit ### ### no-autoalginit
Don't automatically load all supported ciphers and digests. Don't automatically load all supported ciphers and digests.
@@ -536,7 +523,7 @@ size is an objective. This only affects libcrypto. Ciphers and digests will
have to be loaded manually using EVP_add_cipher() and EVP_add_digest() if this have to be loaded manually using EVP_add_cipher() and EVP_add_digest() if this
option is used. This option will force a non-shared build. option is used. This option will force a non-shared build.
### no-autoerrinit ### ### no-autoerrinit
Don't automatically load all libcrypto/libssl error strings. Don't automatically load all libcrypto/libssl error strings.
@@ -544,14 +531,14 @@ Typically OpenSSL will automatically load human readable error strings. For a
statically linked application this may be undesirable if small executable size statically linked application this may be undesirable if small executable size
is an objective. is an objective.
### no-autoload-config ### ### no-autoload-config
Don't automatically load the default openssl.cnf file. Don't automatically load the default openssl.cnf file.
Typically OpenSSL will automatically load a system config file which configures Typically OpenSSL will automatically load a system config file which configures
default SSL options. default SSL options.
### enable-buildtest-c++ ### ### enable-buildtest-c++
While testing, generate C++ buildtest files that simply check that the public While testing, generate C++ buildtest files that simply check that the public
OpenSSL header files are usable standalone with C++. OpenSSL header files are usable standalone with C++.
@@ -561,76 +548,76 @@ as configuration option, you must ensure that it's valid for both the C and
the C++ compiler. If not, the C++ build test will most likely break. As an the C++ compiler. If not, the C++ build test will most likely break. As an
alternative, you can use the language specific variables, CFLAGS and CXXFLAGS. alternative, you can use the language specific variables, CFLAGS and CXXFLAGS.
### no-capieng ### ### no-capieng
Don't build the CAPI engine. Don't build the CAPI engine.
This option will be forced if on a platform that does not support CAPI. This option will be forced if on a platform that does not support CAPI.
### no-cmp ### ### no-cmp
Don't build support for Certificate Management Protocol (CMP). Don't build support for Certificate Management Protocol (CMP).
### no-cms ### ### no-cms
Don't build support for Cryptographic Message Syntax (CMS). Don't build support for Cryptographic Message Syntax (CMS).
### no-comp ### ### no-comp
Don't build support for SSL/TLS compression. Don't build support for SSL/TLS compression.
If this option is enabled (the default), then compression will only work if If this option is enabled (the default), then compression will only work if
the zlib or zlib-dynamic options are also chosen. the zlib or zlib-dynamic options are also chosen.
### enable-crypto-mdebug ### ### enable-crypto-mdebug
This now only enables the failed-malloc feature. This now only enables the failed-malloc feature.
### enable-crypto-mdebug-backtrace ### ### enable-crypto-mdebug-backtrace
This is a no-op; the project uses the compiler's address/leak sanitizer instead. This is a no-op; the project uses the compiler's address/leak sanitizer instead.
### no-ct ### ### no-ct
Don't build support for Certificate Transparency (CT). Don't build support for Certificate Transparency (CT).
### no-deprecated ### ### no-deprecated
Don't build with support for deprecated APIs up until and including the version Don't build with support for deprecated APIs up until and including the version
given with `--api` (or the current version, if `--api` wasn't specified). given with `--api` (or the current version, if `--api` wasn't specified).
### no-dgram ### ### no-dgram
Don't build support for datagram based BIOs. Don't build support for datagram based BIOs.
Selecting this option will also force the disabling of DTLS. Selecting this option will also force the disabling of DTLS.
### no-dso ### ### no-dso
Don't build support for loading Dynamic Shared Objects (DSO) Don't build support for loading Dynamic Shared Objects (DSO)
### enable-devcryptoeng ### ### enable-devcryptoeng
Build the `/dev/crypto` engine. Build the `/dev/crypto` engine.
This option is automatically selected on the BSD platform, in which case it can This option is automatically selected on the BSD platform, in which case it can
be disabled with no-devcryptoeng. be disabled with no-devcryptoeng.
### no-dynamic-engine ### ### no-dynamic-engine
Don't build the dynamically loaded engines. Don't build the dynamically loaded engines.
This only has an effect in a shared build. This only has an effect in a shared build.
### no-ec ### ### no-ec
Don't build support for Elliptic Curves. Don't build support for Elliptic Curves.
### no-ec2m ### ### no-ec2m
Don't build support for binary Elliptic Curves Don't build support for binary Elliptic Curves
### enable-ec_nistp_64_gcc_128 ### ### enable-ec_nistp_64_gcc_128
Enable support for optimised implementations of some commonly used NIST Enable support for optimised implementations of some commonly used NIST
elliptic curves. elliptic curves.
@@ -643,19 +630,19 @@ This option is only supported on platforms:
- supports the non-standard type `__uint128_t` - supports the non-standard type `__uint128_t`
- defines the built-in macro `__SIZEOF_INT128__` - defines the built-in macro `__SIZEOF_INT128__`
### enable-egd ### ### enable-egd
Build support for gathering entropy from the Entropy Gathering Daemon (EGD). Build support for gathering entropy from the Entropy Gathering Daemon (EGD).
### no-engine ### ### no-engine
Don't build support for loading engines. Don't build support for loading engines.
### no-err ### ### no-err
Don't compile in any error strings. Don't compile in any error strings.
### enable-external-tests ### ### enable-external-tests
Enable building of integration with external test suites. Enable building of integration with external test suites.
@@ -668,16 +655,16 @@ external test suites are currently supported:
See the file [test/README.external]/(test/README.external) for further details. See the file [test/README.external]/(test/README.external) for further details.
### no-filenames ### ### no-filenames
Don't compile in filename and line number information (e.g. for errors and Don't compile in filename and line number information (e.g. for errors and
memory allocation). memory allocation).
### no-fips ### ### no-fips
Don't compile the FIPS provider Don't compile the FIPS provider
### enable-fuzz-libfuzzer, enable-fuzz-afl ### ### enable-fuzz-libfuzzer, enable-fuzz-afl
Build with support for fuzzing using either libfuzzer or AFL. Build with support for fuzzing using either libfuzzer or AFL.
@@ -686,7 +673,7 @@ should never be used in production environments.
See the file [fuzz/README.md](fuzz/README.md) for further details. See the file [fuzz/README.md](fuzz/README.md) for further details.
### no-gost ### ### no-gost
Don't build support for GOST based ciphersuites. Don't build support for GOST based ciphersuites.
@@ -694,51 +681,49 @@ Note that if this feature is enabled then GOST ciphersuites are only available
if the GOST algorithms are also available through loading an externally supplied if the GOST algorithms are also available through loading an externally supplied
engine. engine.
### no-legacy ### ### no-legacy
Don't build the legacy provider. Don't build the legacy provider.
Disabling this also disables the legacy algorithms: MD2 (already disabled by default). Disabling this also disables the legacy algorithms: MD2 (already disabled by default).
### no-makedepend
### no-makedepend ###
Don't generate dependencies. Don't generate dependencies.
### no-module ### ### no-module
Don't build any dynamically loadable engines. Don't build any dynamically loadable engines.
This also implies 'no-dynamic-engine'. This also implies 'no-dynamic-engine'.
### no-multiblock ### ### no-multiblock
Don't build support for writing multiple records in one go in libssl Don't build support for writing multiple records in one go in libssl
Note: this is a different capability to the pipelining functionality. Note: this is a different capability to the pipelining functionality.
### no-nextprotoneg ### ### no-nextprotoneg
Don't build support for the Next Protocol Negotiation (NPN) TLS extension. Don't build support for the Next Protocol Negotiation (NPN) TLS extension.
### no-ocsp ### ### no-ocsp
Don't build support for Online Certificate Status Protocol (OCSP). Don't build support for Online Certificate Status Protocol (OCSP).
### no-padlockeng
### no-padlockeng ###
Don't build the padlock engine. Don't build the padlock engine.
### no-hw-padlock ### ### no-hw-padlock
As synonyme for no-padlockeng. Deprecated and should not be used. As synonyme for no-padlockeng. Deprecated and should not be used.
### no-pic ### ### no-pic
Don't build with support for Position Independent Code. Don't build with support for Position Independent Code.
### no-pinshared ### ### no-pinshared
Don't pin the shared libraries. Don't pin the shared libraries.
@@ -755,48 +740,47 @@ before libcrypto then a crash is likely to happen. Applications can suppress
running of the atexit() handler at run time by using the OPENSSL_INIT_NO_ATEXIT running of the atexit() handler at run time by using the OPENSSL_INIT_NO_ATEXIT
option to OPENSSL_init_crypto(). See the man page for it for further details. option to OPENSSL_init_crypto(). See the man page for it for further details.
### no-posix-io ### ### no-posix-io
Don't use POSIX IO capabilities. Don't use POSIX IO capabilities.
### no-psk ### ### no-psk
Don't build support for Pre-Shared Key based ciphersuites. Don't build support for Pre-Shared Key based ciphersuites.
### no-rdrand ### ### no-rdrand
Don't use hardware RDRAND capabilities. Don't use hardware RDRAND capabilities.
### no-rfc3779 ### ### no-rfc3779
Don't build support for RFC3779, "X.509 Extensions for IP Addresses and Don't build support for RFC3779, "X.509 Extensions for IP Addresses and
AS Identifiers". AS Identifiers".
### sctp ### ### sctp
Build support for Stream Control Transmission Protocol (SCTP). Build support for Stream Control Transmission Protocol (SCTP).
### no-shared ### ### no-shared
Do not create shared libraries, only static ones. Do not create shared libraries, only static ones.
See [Notes on shared libraries](#notes-on-shared-libraries) below. See [Notes on shared libraries](#notes-on-shared-libraries) below.
### no-sock ### ### no-sock
Don't build support for socket BIOs. Don't build support for socket BIOs.
### no-srp ### ### no-srp
Don't build support for Secure Remote Password (SRP) protocol or Don't build support for Secure Remote Password (SRP) protocol or
SRP based ciphersuites. SRP based ciphersuites.
### no-srtp ### ### no-srtp
Don't build Secure Real-Time Transport Protocol (SRTP) support. Don't build Secure Real-Time Transport Protocol (SRTP) support.
### no-sse2 ### ### no-sse2
Exclude SSE2 code paths from 32-bit x86 assembly modules. Exclude SSE2 code paths from 32-bit x86 assembly modules.
@@ -810,34 +794,34 @@ disengage SSE2 code paths upon application start-up, but if you aim for wider
"audience" running such kernel, consider no-sse2. Both the 386 and no-asm "audience" running such kernel, consider no-sse2. Both the 386 and no-asm
options imply no-sse2. options imply no-sse2.
### enable-ssl-trace ### ### enable-ssl-trace
Build with the SSL Trace capabilities. Build with the SSL Trace capabilities.
This adds the "-trace" option to s_client and s_server. This adds the "-trace" option to s_client and s_server.
### no-static-engine ### ### no-static-engine
Don't build the statically linked engines. Don't build the statically linked engines.
This only has an impact when not built "shared". This only has an impact when not built "shared".
### no-stdio ### ### no-stdio
Don't use anything from the C header file "stdio.h" that makes use of the "FILE" Don't use anything from the C header file "stdio.h" that makes use of the "FILE"
type. Only libcrypto and libssl can be built in this way. Using this option will type. Only libcrypto and libssl can be built in this way. Using this option will
suppress building the command line applications. Additionally, since the OpenSSL suppress building the command line applications. Additionally, since the OpenSSL
tests also use the command line applications, the tests will also be skipped. tests also use the command line applications, the tests will also be skipped.
### no-tests ### ### no-tests
Don't build test programs or run any tests. Don't build test programs or run any tests.
### no-threads ### ### no-threads
Don't build with support for multi-threaded applications. Don't build with support for multi-threaded applications.
### threads ### ### threads
Build with support for multi-threaded applications. Most platforms will enable Build with support for multi-threaded applications. Most platforms will enable
this by default. However if on a platform where this is not the case then this this by default. However if on a platform where this is not the case then this
@@ -845,17 +829,17 @@ will usually require additional system-dependent options!
See [Notes on multi-threading](#notes-on-multi-threading) below. See [Notes on multi-threading](#notes-on-multi-threading) below.
### enable-trace ### ### enable-trace
Build with support for the integrated tracing api. Build with support for the integrated tracing api.
See manual pages OSSL_trace_set_channel(3) and OSSL_trace_enabled(3) for details. See manual pages OSSL_trace_set_channel(3) and OSSL_trace_enabled(3) for details.
### no-ts ### ### no-ts
Don't build Time Stamping (TS) Authority support. Don't build Time Stamping (TS) Authority support.
### enable-ubsan ### ### enable-ubsan
Build with the Undefined Behaviour sanitiser (UBSAN). Build with the Undefined Behaviour sanitiser (UBSAN).
@@ -864,40 +848,40 @@ never be used in production environments. It will only work when used with gcc
or clang and should be used in conjunction with the `-DPEDANTIC` option or clang and should be used in conjunction with the `-DPEDANTIC` option
(or the `--strict-warnings` option). (or the `--strict-warnings` option).
### no-ui-console ### ### no-ui-console
Don't build with the User Interface (UI) console method Don't build with the User Interface (UI) console method
The User Interface console method enables text based console prompts. The User Interface console method enables text based console prompts.
### enable-unit-test ### ### enable-unit-test
Enable additional unit test APIs. Enable additional unit test APIs.
This should not typically be used in production deployments. This should not typically be used in production deployments.
### no-uplink ### ### no-uplink
Don't build support for UPLINK interface. Don't build support for UPLINK interface.
### enable-weak-ssl-ciphers ### ### enable-weak-ssl-ciphers
Build support for SSL/TLS ciphers that are considered "weak" Build support for SSL/TLS ciphers that are considered "weak"
Enabling this includes for example the RC4 based ciphersuites. Enabling this includes for example the RC4 based ciphersuites.
### zlib ### ### zlib
Build with support for zlib compression/decompression. Build with support for zlib compression/decompression.
### zlib-dynamic ### ### zlib-dynamic
Like the zlib option, but has OpenSSL load the zlib library dynamically Like the zlib option, but has OpenSSL load the zlib library dynamically
when needed. when needed.
This is only supported on systems where loading of shared libraries is supported. This is only supported on systems where loading of shared libraries is supported.
### 386 ### ### 386
In 32-bit x86 builds, use the 80386 instruction set only in assembly modules In 32-bit x86 builds, use the 80386 instruction set only in assembly modules
@@ -905,7 +889,7 @@ The default x86 code is more efficient, but requires at least an 486 processor.
Note: This doesn't affect compiler generated code, so this option needs to be Note: This doesn't affect compiler generated code, so this option needs to be
accompanied by a corresponding compiler-specific option. accompanied by a corresponding compiler-specific option.
### no-{protocol} ### ### no-{protocol}
no-{ssl|ssl3|tls|tls1|tls1_1|tls1_2|tls1_3|dtls|dtls1|dtls1_2} no-{ssl|ssl3|tls|tls1|tls1_1|tls1_2|tls1_3|dtls|dtls1|dtls1_2}
@@ -917,7 +901,7 @@ synonymous with "no-ssl3". Note this only affects version negotiation.
OpenSSL will still provide the methods for applications to explicitly select OpenSSL will still provide the methods for applications to explicitly select
the individual protocol versions. the individual protocol versions.
### no-{protocol}-method ### ### no-{protocol}-method
no-{ssl|ssl3|tls|tls1|tls1_1|tls1_2|tls1_3|dtls|dtls1|dtls1_2}-method no-{ssl|ssl3|tls|tls1|tls1_1|tls1_2|tls1_3|dtls|dtls1|dtls1_2}-method
@@ -929,13 +913,13 @@ TLSv1.3.
Using individual protocol methods directly is deprecated. Applications should Using individual protocol methods directly is deprecated. Applications should
use TLS_method() instead. use TLS_method() instead.
### enable-{algorithm} ### ### enable-{algorithm}
enable-{md2|rc5} enable-{md2|rc5}
Build with support for the specified algorithm. Build with support for the specified algorithm.
### no-{algorithm} ### ### no-{algorithm}
no-{aria|bf|blake2|camellia|cast|chacha|cmac| no-{aria|bf|blake2|camellia|cast|chacha|cmac|
des|dh|dsa|ecdh|ecdsa|idea|md4|mdc2|ocb| des|dh|dsa|ecdh|ecdsa|idea|md4|mdc2|ocb|
@@ -946,7 +930,7 @@ Build without support for the specified algorithm.
The "ripemd" algorithm is deprecated and if used is synonymous with rmd160. The "ripemd" algorithm is deprecated and if used is synonymous with rmd160.
### Compiler-specific options ### ### Compiler-specific options
-Dxxx, -Ixxx, -Wp, -lxxx, -Lxxx, -Wl, -rpath, -R, -framework, -static -Dxxx, -Ixxx, -Wp, -lxxx, -Lxxx, -Wl, -rpath, -R, -framework, -static
@@ -977,7 +961,7 @@ encoding.
Take note of the [Environment Variables](#environment-variables) documentation Take note of the [Environment Variables](#environment-variables) documentation
below and how these flags interact with those variables. below and how these flags interact with those variables.
### Environment Variables ### ### Environment Variables
VAR=value VAR=value
@@ -1054,7 +1038,7 @@ If CC is set, it is advisable to also set CXX to ensure both the C and C++
compiler are in the same "family". This becomes relevant with compiler are in the same "family". This becomes relevant with
'enable-external-tests' and 'enable-buildtest-c++'. 'enable-external-tests' and 'enable-buildtest-c++'.
### Reconfigure ### ### Reconfigure
reconf reconf
reconfigure reconfigure
@@ -1093,7 +1077,7 @@ Installation Steps in Detail
Configure OpenSSL Configure OpenSSL
----------------- -----------------
### Automatic Configuration ### ### Automatic Configuration
On some platform a `config` script is available which attempts to guess On some platform a `config` script is available which attempts to guess
your operating system (and compiler, if necessary) and calls the `Configure` your operating system (and compiler, if necessary) and calls the `Configure`
@@ -1101,15 +1085,15 @@ Perl script with appropriate target based on its guess. Further options can
be supplied to the `config` script, which will be passed on to the `Configure` be supplied to the `config` script, which will be passed on to the `Configure`
script. script.
#### Unix / Linux / macOS #### #### Unix / Linux / macOS
$ ./config [[ options ]] $ ./config [[ options ]]
#### OpenVMS #### #### OpenVMS
$ @config [[ options ]] $ @config [[ options ]]
#### Windows #### #### Windows
Automatic configuration is not available on Windows. Automatic configuration is not available on Windows.
@@ -1129,7 +1113,7 @@ On some systems, you can include debugging information as follows:
$ ./config -d [[ options ]] $ ./config -d [[ options ]]
### Manual Configuration ### ### Manual Configuration
OpenSSL knows about a range of different operating system, hardware and OpenSSL knows about a range of different operating system, hardware and
compiler combinations. To see the ones it knows about, run compiler combinations. To see the ones it knows about, run
@@ -1151,8 +1135,7 @@ run:
$ ./Configure linux-elf [[ options ]] $ ./Configure linux-elf [[ options ]]
### Creating your own Configuration
### Creating your own Configuration ###
If your system isn't listed, you will have to create a configuration If your system isn't listed, you will have to create a configuration
file named Configurations/{{ something }}.conf and add the correct file named Configurations/{{ something }}.conf and add the correct
@@ -1168,13 +1151,13 @@ and "descrip.mms" on OpenVMS) from a suitable template in Configurations,
and defines various macros in include/openssl/configuration.h (generated and defines various macros in include/openssl/configuration.h (generated
from include/openssl/configuration.h.in). from include/openssl/configuration.h.in).
### Out of Tree Builds ### ### Out of Tree Builds
OpenSSL can be configured to build in a build directory separate from the OpenSSL can be configured to build in a build directory separate from the
source code directory. It's done by placing yourself in some other source code directory. It's done by placing yourself in some other
directory and invoking the configuration commands from there. directory and invoking the configuration commands from there.
#### Unix example #### #### Unix example
$ mkdir /var/tmp/openssl-build $ mkdir /var/tmp/openssl-build
$ cd /var/tmp/openssl-build $ cd /var/tmp/openssl-build
@@ -1184,7 +1167,7 @@ or
$ /PATH/TO/OPENSSL/SOURCE/Configure {{ target }} [[ options ]] $ /PATH/TO/OPENSSL/SOURCE/Configure {{ target }} [[ options ]]
#### OpenVMS example #### #### OpenVMS example
$ set default sys$login: $ set default sys$login:
$ create/dir [.tmp.openssl-build] $ create/dir [.tmp.openssl-build]
@@ -1195,7 +1178,7 @@ or
$ @[PATH.TO.OPENSSL.SOURCE]Configure {{ target }} [[ options ]] $ @[PATH.TO.OPENSSL.SOURCE]Configure {{ target }} [[ options ]]
#### Windows example #### #### Windows example
$ C: $ C:
$ mkdir \temp-openssl $ mkdir \temp-openssl
@@ -1205,7 +1188,6 @@ or
Paths can be relative just as well as absolute. Configure will do its best Paths can be relative just as well as absolute. Configure will do its best
to translate them to relative paths whenever possible. to translate them to relative paths whenever possible.
Build OpenSSL Build OpenSSL
------------- -------------
@@ -1239,7 +1221,6 @@ your privileges temporarily if your platform allows it).
If some tests fail, take a look at the [Test Failures](#test-failures) If some tests fail, take a look at the [Test Failures](#test-failures)
subsection of the [Troubleshooting](#troubleshooting) section. subsection of the [Troubleshooting](#troubleshooting) section.
Install OpenSSL Install OpenSSL
--------------- ---------------
@@ -1256,7 +1237,7 @@ The above commands will install all the software components in this
directory tree under PREFIX (the directory given with `--prefix` or directory tree under PREFIX (the directory given with `--prefix` or
its default): its default):
#### Unix / Linux / macOS #### ### Unix / Linux / macOS
bin/ Contains the openssl binary and a few other bin/ Contains the openssl binary and a few other
utility scripts. utility scripts.
@@ -1278,7 +1259,7 @@ its default):
share/doc/openssl/html/man7 share/doc/openssl/html/man7
Contains the HTML rendition of the man-pages. Contains the HTML rendition of the man-pages.
#### OpenVMS #### ### OpenVMS
'arch' is replaced with the architecture name, "Alpha" or "ia64", 'arch' is replaced with the architecture name, "Alpha" or "ia64",
'sover' is replaced with the shared library version (0101 for 1.1), and 'sover' is replaced with the shared library version (0101 for 1.1), and
@@ -1299,8 +1280,7 @@ its default):
[.SYSTEST] Contains the installation verification procedure. [.SYSTEST] Contains the installation verification procedure.
[.HTML] Contains the HTML rendition of the manual pages. [.HTML] Contains the HTML rendition of the manual pages.
### Additional Directories
#### Additional Directories ####
Additionally, install will add the following directories under Additionally, install will add the following directories under
OPENSSLDIR (the directory given with `--openssldir` or its default) OPENSSLDIR (the directory given with `--openssldir` or its default)
@@ -1328,9 +1308,10 @@ packaged, can use
The specified destination directory will be prepended to all installation The specified destination directory will be prepended to all installation
target paths. target paths.
### Compatibility issues with previous OpenSSL versions ### Compatibility issues with previous OpenSSL versions
---------------------------------------------------
#### COMPILING existing applications #### ### COMPILING existing applications
Starting with version 1.1.0, OpenSSL hides a number of structures that were Starting with version 1.1.0, OpenSSL hides a number of structures that were
previously open. This includes all internal libssl structures and a number previously open. This includes all internal libssl structures and a number
@@ -1346,7 +1327,6 @@ access a structure's field directly.
Some APIs have changed as well. However, older APIs have been preserved when Some APIs have changed as well. However, older APIs have been preserved when
possible. possible.
Post-installation Notes Post-installation Notes
----------------------- -----------------------
@@ -1358,11 +1338,9 @@ This involves using the following command:
See the openssl-fipsinstall(1) manual for details and examples. See the openssl-fipsinstall(1) manual for details and examples.
Advanced Build Options Advanced Build Options
====================== ======================
Environment Variables Environment Variables
--------------------- ---------------------
@@ -1437,7 +1415,6 @@ platforms.
WINDRES WINDRES
See RC. See RC.
Makefile Targets Makefile Targets
---------------- ----------------
@@ -1530,7 +1507,7 @@ Also, all tokens except for "alltests" may have wildcards, such as *.
(on Unix and Windows, BSD style wildcards are supported, while on VMS, (on Unix and Windows, BSD style wildcards are supported, while on VMS,
it's VMS style wildcards) it's VMS style wildcards)
### Examples ### ### Examples
Run all tests except for the fuzz tests: Run all tests except for the fuzz tests:
@@ -1568,7 +1545,7 @@ Troubleshooting
Configuration Problems Configuration Problems
---------------------- ----------------------
### Selecting the correct target ### ### Selecting the correct target
The `./config` script tries hard to guess your operating system, but in some The `./config` script tries hard to guess your operating system, but in some
cases it does not succeed. You will see a message like the following: cases it does not succeed. You will see a message like the following:
@@ -1616,7 +1593,7 @@ you can [raise an issue][] to ask a question yourself.
More about our support resources can be found in the [SUPPORT][] file. More about our support resources can be found in the [SUPPORT][] file.
### Configuration Errors ### ### Configuration Errors
If the `./config` or `./Configure` command fails with an error message, If the `./config` or `./Configure` command fails with an error message,
read the error message carefully and try to figure out whether you made read the error message carefully and try to figure out whether you made
@@ -1637,7 +1614,6 @@ Note: To make the output readable, pleace add a 'code fence' (three backquotes
``` ```
Build Failures Build Failures
-------------- --------------
@@ -1668,7 +1644,6 @@ encountered an OpenSSL bug, please [raise an issue][] to file a bug report.
Please take the time to review the existing issues first; maybe the bug was Please take the time to review the existing issues first; maybe the bug was
already reported or has already been fixed. already reported or has already been fixed.
Test Failures Test Failures
------------- -------------
@@ -1713,12 +1688,11 @@ compiler optimization flags from the CFLAGS line in Makefile and
run "make clean; make" or corresponding. run "make clean; make" or corresponding.
To report a bug please open an issue on GitHub, at To report a bug please open an issue on GitHub, at
https://github.com/openssl/openssl/issues. <https://github.com/openssl/openssl/issues>.
For more details on how the make variables TESTS can be used, For more details on how the make variables TESTS can be used,
see section [Running Selected Tests](#running-selected-tests) below. see section [Running Selected Tests](#running-selected-tests) below.
Notes Notes
===== =====
@@ -1803,20 +1777,19 @@ to install additional support software to obtain a random seed and reseed
the CSPRNG manually. Please check out the manual pages for RAND_add(), the CSPRNG manually. Please check out the manual pages for RAND_add(),
RAND_bytes(), RAND_egd(), and the FAQ for more information. RAND_bytes(), RAND_egd(), and the FAQ for more information.
<!-- Links --> <!-- Links -->
[openssl-users]: [openssl-users]:
https://mta.openssl.org/mailman/listinfo/openssl-users <https://mta.openssl.org/mailman/listinfo/openssl-users>
[SUPPORT]: [SUPPORT]:
./SUPPORT.md ./SUPPORT.md
[GitHub Issues]: [GitHub Issues]:
https://github.com/openssl/openssl/issues <https://github.com/openssl/openssl/issues>
[raise an issue]: [raise an issue]:
https://github.com/openssl/openssl/issues/new/choose <https://github.com/openssl/openssl/issues/new/choose>
[10-main.conf]: [10-main.conf]:
Configurations/10-main.conf Configurations/10-main.conf
+145 -153
View File
@@ -1,4 +1,3 @@
NEWS NEWS
==== ====
@@ -19,7 +18,7 @@ OpenSSL Releases
OpenSSL 3.0 OpenSSL 3.0
----------- -----------
### Major changes between OpenSSL 1.1.1 and OpenSSL 3.0 [under development] ### ### Major changes between OpenSSL 1.1.1 and OpenSSL 3.0 [under development]
* The X25519, X448, Ed25519, Ed448 and SHAKE256 algorithms are included in * The X25519, X448, Ed25519, Ed448 and SHAKE256 algorithms are included in
the FIPS provider. None have the "fips=yes" property set and, as such, the FIPS provider. None have the "fips=yes" property set and, as such,
@@ -35,7 +34,7 @@ OpenSSL 3.0
disabled; the project uses address sanitize/leak-detect instead. disabled; the project uses address sanitize/leak-detect instead.
* Added a Certificate Management Protocol (CMP, RFC 4210) implementation * Added a Certificate Management Protocol (CMP, RFC 4210) implementation
also covering CRMF (RFC 4211) and HTTP transfer (RFC 6712). also covering CRMF (RFC 4211) and HTTP transfer (RFC 6712).
It is part of the crypto lib, while a 'cmp' app using it is in preparation. It is part of the crypto lib and adds a 'cmp' app with a demo configuration.
All widely used CMP features are supported for both clients and servers. All widely used CMP features are supported for both clients and servers.
* Added a proper HTTP(S) client to libcrypto supporting GET and POST, * Added a proper HTTP(S) client to libcrypto supporting GET and POST,
redirection, plain and ASN.1-encoded contents, proxies, and timeouts. redirection, plain and ASN.1-encoded contents, proxies, and timeouts.
@@ -67,16 +66,16 @@ OpenSSL 3.0
OpenSSL 1.1.1 OpenSSL 1.1.1
------------- -------------
### Major changes between OpenSSL 1.1.1e and OpenSSL 1.1.1f [under development] ### ### Major changes between OpenSSL 1.1.1e and OpenSSL 1.1.1f [under development]
* *
### Major changes between OpenSSL 1.1.1d and OpenSSL 1.1.1e [17 Mar 2020] ### ### Major changes between OpenSSL 1.1.1d and OpenSSL 1.1.1e [17 Mar 2020]
* Fixed an overflow bug in the x64_64 Montgomery squaring procedure * Fixed an overflow bug in the x64_64 Montgomery squaring procedure
used in exponentiation with 512-bit moduli ([CVE-2019-1551][]) used in exponentiation with 512-bit moduli ([CVE-2019-1551][])
### Major changes between OpenSSL 1.1.1c and OpenSSL 1.1.1d [10 Sep 2019] ### ### Major changes between OpenSSL 1.1.1c and OpenSSL 1.1.1d [10 Sep 2019]
* Fixed a fork protection issue ([CVE-2019-1549][]) * Fixed a fork protection issue ([CVE-2019-1549][])
* Fixed a padding oracle in PKCS7_dataDecode and CMS_decrypt_set1_pkey * Fixed a padding oracle in PKCS7_dataDecode and CMS_decrypt_set1_pkey
@@ -93,36 +92,36 @@ OpenSSL 1.1.1
* Significantly reduce secure memory usage by the randomness pools * Significantly reduce secure memory usage by the randomness pools
* Revert the DEVRANDOM_WAIT feature for Linux systems * Revert the DEVRANDOM_WAIT feature for Linux systems
### Major changes between OpenSSL 1.1.1b and OpenSSL 1.1.1c [28 May 2019] ### ### Major changes between OpenSSL 1.1.1b and OpenSSL 1.1.1c [28 May 2019]
* Prevent over long nonces in ChaCha20-Poly1305 ([CVE-2019-1543][]) * Prevent over long nonces in ChaCha20-Poly1305 ([CVE-2019-1543][])
### Major changes between OpenSSL 1.1.1a and OpenSSL 1.1.1b [26 Feb 2019] ### ### Major changes between OpenSSL 1.1.1a and OpenSSL 1.1.1b [26 Feb 2019]
* Change the info callback signals for the start and end of a post-handshake * Change the info callback signals for the start and end of a post-handshake
message exchange in TLSv1.3. message exchange in TLSv1.3.
* Fix a bug in DTLS over SCTP. This breaks interoperability with older * Fix a bug in DTLS over SCTP. This breaks interoperability with older
versions of OpenSSL like OpenSSL 1.1.0 and OpenSSL 1.0.2. versions of OpenSSL like OpenSSL 1.1.0 and OpenSSL 1.0.2.
### Major changes between OpenSSL 1.1.1 and OpenSSL 1.1.1a [20 Nov 2018] ### ### Major changes between OpenSSL 1.1.1 and OpenSSL 1.1.1a [20 Nov 2018]
* Timing vulnerability in DSA signature generation ([CVE-2018-0734][]) * Timing vulnerability in DSA signature generation ([CVE-2018-0734][])
* Timing vulnerability in ECDSA signature generation ([CVE-2018-0735][]) * Timing vulnerability in ECDSA signature generation ([CVE-2018-0735][])
### Major changes between OpenSSL 1.1.0i and OpenSSL 1.1.1 [11 Sep 2018] ### ### Major changes between OpenSSL 1.1.0i and OpenSSL 1.1.1 [11 Sep 2018]
* Support for TLSv1.3 added. The TLSv1.3 implementation includes: * Support for TLSv1.3 added. The TLSv1.3 implementation includes:
* Fully compliant implementation of RFC8446 (TLSv1.3) on by default * Fully compliant implementation of RFC8446 (TLSv1.3) on by default
* Early data (0-RTT) * Early data (0-RTT)
* Post-handshake authentication and key update * Post-handshake authentication and key update
* Middlebox Compatibility Mode * Middlebox Compatibility Mode
* TLSv1.3 PSKs * TLSv1.3 PSKs
* Support for all five RFC8446 ciphersuites * Support for all five RFC8446 ciphersuites
* RSA-PSS signature algorithms (backported to TLSv1.2) * RSA-PSS signature algorithms (backported to TLSv1.2)
* Configurable session ticket support * Configurable session ticket support
* Stateless server support * Stateless server support
* Rewrite of the packet construction code for "safer" packet handling * Rewrite of the packet construction code for "safer" packet handling
* Rewrite of the extension handling code * Rewrite of the extension handling code
For further important information, see the [TLS1.3 page]( For further important information, see the [TLS1.3 page](
https://wiki.openssl.org/index.php/TLS1.3) in the OpenSSL Wiki. https://wiki.openssl.org/index.php/TLS1.3) in the OpenSSL Wiki.
@@ -159,11 +158,10 @@ OpenSSL 1.1.1
* Claim the namespaces OSSL and OPENSSL, represented as symbol prefixes * Claim the namespaces OSSL and OPENSSL, represented as symbol prefixes
* Rewrite of devcrypto engine * Rewrite of devcrypto engine
OpenSSL 1.1.0 OpenSSL 1.1.0
------------- -------------
### Major changes between OpenSSL 1.1.0k and OpenSSL 1.1.0l [10 Sep 2019] ### ### Major changes between OpenSSL 1.1.0k and OpenSSL 1.1.0l [10 Sep 2019]
* Fixed a padding oracle in PKCS7_dataDecode and CMS_decrypt_set1_pkey * Fixed a padding oracle in PKCS7_dataDecode and CMS_decrypt_set1_pkey
([CVE-2019-1563][]) ([CVE-2019-1563][])
@@ -173,57 +171,57 @@ OpenSSL 1.1.0
([CVE-2019-1547][]) ([CVE-2019-1547][])
* Use Windows installation paths in the mingw builds ([CVE-2019-1552][]) * Use Windows installation paths in the mingw builds ([CVE-2019-1552][])
### Major changes between OpenSSL 1.1.0j and OpenSSL 1.1.0k [28 May 2019] ### ### Major changes between OpenSSL 1.1.0j and OpenSSL 1.1.0k [28 May 2019]
* Prevent over long nonces in ChaCha20-Poly1305 ([CVE-2019-1543][]) * Prevent over long nonces in ChaCha20-Poly1305 ([CVE-2019-1543][])
### Major changes between OpenSSL 1.1.0i and OpenSSL 1.1.0j [20 Nov 2018] ### ### Major changes between OpenSSL 1.1.0i and OpenSSL 1.1.0j [20 Nov 2018]
* Timing vulnerability in DSA signature generation ([CVE-2018-0734][]) * Timing vulnerability in DSA signature generation ([CVE-2018-0734][])
* Timing vulnerability in ECDSA signature generation ([CVE-2018-0735][]) * Timing vulnerability in ECDSA signature generation ([CVE-2018-0735][])
### Major changes between OpenSSL 1.1.0h and OpenSSL 1.1.0i [14 Aug 2018] ### ### Major changes between OpenSSL 1.1.0h and OpenSSL 1.1.0i [14 Aug 2018]
* Client DoS due to large DH parameter ([CVE-2018-0732][]) * Client DoS due to large DH parameter ([CVE-2018-0732][])
* Cache timing vulnerability in RSA Key Generation ([CVE-2018-0737][]) * Cache timing vulnerability in RSA Key Generation ([CVE-2018-0737][])
### Major changes between OpenSSL 1.1.0g and OpenSSL 1.1.0h [27 Mar 2018] ### ### Major changes between OpenSSL 1.1.0g and OpenSSL 1.1.0h [27 Mar 2018]
* Constructed ASN.1 types with a recursive definition could exceed the * Constructed ASN.1 types with a recursive definition could exceed the
stack ([CVE-2018-0739][]) stack ([CVE-2018-0739][])
* Incorrect CRYPTO_memcmp on HP-UX PA-RISC ([CVE-2018-0733][]) * Incorrect CRYPTO_memcmp on HP-UX PA-RISC ([CVE-2018-0733][])
* rsaz_1024_mul_avx2 overflow bug on x86_64 ([CVE-2017-3738][]) * rsaz_1024_mul_avx2 overflow bug on x86_64 ([CVE-2017-3738][])
### Major changes between OpenSSL 1.1.0f and OpenSSL 1.1.0g [2 Nov 2017] ### ### Major changes between OpenSSL 1.1.0f and OpenSSL 1.1.0g [2 Nov 2017]
* bn_sqrx8x_internal carry bug on x86_64 ([CVE-2017-3736][]) * bn_sqrx8x_internal carry bug on x86_64 ([CVE-2017-3736][])
* Malformed X.509 IPAddressFamily could cause OOB read ([CVE-2017-3735][]) * Malformed X.509 IPAddressFamily could cause OOB read ([CVE-2017-3735][])
### Major changes between OpenSSL 1.1.0e and OpenSSL 1.1.0f [25 May 2017] ### ### Major changes between OpenSSL 1.1.0e and OpenSSL 1.1.0f [25 May 2017]
* config now recognises 64-bit mingw and chooses mingw64 instead of mingw * config now recognises 64-bit mingw and chooses mingw64 instead of mingw
### Major changes between OpenSSL 1.1.0d and OpenSSL 1.1.0e [16 Feb 2017] ### ### Major changes between OpenSSL 1.1.0d and OpenSSL 1.1.0e [16 Feb 2017]
* Encrypt-Then-Mac renegotiation crash ([CVE-2017-3733][]) * Encrypt-Then-Mac renegotiation crash ([CVE-2017-3733][])
### Major changes between OpenSSL 1.1.0c and OpenSSL 1.1.0d [26 Jan 2017] ### ### Major changes between OpenSSL 1.1.0c and OpenSSL 1.1.0d [26 Jan 2017]
* Truncated packet could crash via OOB read ([CVE-2017-3731][]) * Truncated packet could crash via OOB read ([CVE-2017-3731][])
* Bad (EC)DHE parameters cause a client crash ([CVE-2017-3730][]) * Bad (EC)DHE parameters cause a client crash ([CVE-2017-3730][])
* BN_mod_exp may produce incorrect results on x86_64 ([CVE-2017-3732][]) * BN_mod_exp may produce incorrect results on x86_64 ([CVE-2017-3732][])
### Major changes between OpenSSL 1.1.0b and OpenSSL 1.1.0c [10 Nov 2016] ### ### Major changes between OpenSSL 1.1.0b and OpenSSL 1.1.0c [10 Nov 2016]
* ChaCha20/Poly1305 heap-buffer-overflow ([CVE-2016-7054][]) * ChaCha20/Poly1305 heap-buffer-overflow ([CVE-2016-7054][])
* CMS Null dereference ([CVE-2016-7053][]) * CMS Null dereference ([CVE-2016-7053][])
* Montgomery multiplication may produce incorrect results ([CVE-2016-7055][]) * Montgomery multiplication may produce incorrect results ([CVE-2016-7055][])
### Major changes between OpenSSL 1.1.0a and OpenSSL 1.1.0b [26 Sep 2016] ### ### Major changes between OpenSSL 1.1.0a and OpenSSL 1.1.0b [26 Sep 2016]
* Fix Use After Free for large message sizes ([CVE-2016-6309][]) * Fix Use After Free for large message sizes ([CVE-2016-6309][])
### Major changes between OpenSSL 1.1.0 and OpenSSL 1.1.0a [22 Sep 2016] ### ### Major changes between OpenSSL 1.1.0 and OpenSSL 1.1.0a [22 Sep 2016]
* OCSP Status Request extension unbounded memory growth ([CVE-2016-6304][]) * OCSP Status Request extension unbounded memory growth ([CVE-2016-6304][])
* SSL_peek() hang on empty record ([CVE-2016-6305][]) * SSL_peek() hang on empty record ([CVE-2016-6305][])
@@ -232,7 +230,7 @@ OpenSSL 1.1.0
* Excessive allocation of memory in dtls1_preprocess_fragment() * Excessive allocation of memory in dtls1_preprocess_fragment()
([CVE-2016-6308][]) ([CVE-2016-6308][])
### Major changes between OpenSSL 1.0.2h and OpenSSL 1.1.0 [25 Aug 2016] ### ### Major changes between OpenSSL 1.0.2h and OpenSSL 1.1.0 [25 Aug 2016]
* Copyright text was shrunk to a boilerplate that points to the license * Copyright text was shrunk to a boilerplate that points to the license
* "shared" builds are now the default when possible * "shared" builds are now the default when possible
@@ -280,11 +278,10 @@ OpenSSL 1.1.0
* Support for Certificate Transparency * Support for Certificate Transparency
* HKDF support. * HKDF support.
OpenSSL 1.0.2 OpenSSL 1.0.2
------------- -------------
### Major changes between OpenSSL 1.0.2s and OpenSSL 1.0.2t [10 Sep 2019] ### ### Major changes between OpenSSL 1.0.2s and OpenSSL 1.0.2t [10 Sep 2019]
* Fixed a padding oracle in PKCS7_dataDecode and CMS_decrypt_set1_pkey * Fixed a padding oracle in PKCS7_dataDecode and CMS_decrypt_set1_pkey
([CVE-2019-1563][]) ([CVE-2019-1563][])
@@ -295,54 +292,54 @@ OpenSSL 1.0.2
* Document issue with installation paths in diverse Windows builds * Document issue with installation paths in diverse Windows builds
([CVE-2019-1552][]) ([CVE-2019-1552][])
### Major changes between OpenSSL 1.0.2r and OpenSSL 1.0.2s [28 May 2019] ### ### Major changes between OpenSSL 1.0.2r and OpenSSL 1.0.2s [28 May 2019]
* None * None
### Major changes between OpenSSL 1.0.2q and OpenSSL 1.0.2r [26 Feb 2019] ### ### Major changes between OpenSSL 1.0.2q and OpenSSL 1.0.2r [26 Feb 2019]
* 0-byte record padding oracle ([CVE-2019-1559][]) * 0-byte record padding oracle ([CVE-2019-1559][])
### Major changes between OpenSSL 1.0.2p and OpenSSL 1.0.2q [20 Nov 2018] ### ### Major changes between OpenSSL 1.0.2p and OpenSSL 1.0.2q [20 Nov 2018]
* Microarchitecture timing vulnerability in ECC scalar multiplication ([CVE-2018-5407][]) * Microarchitecture timing vulnerability in ECC scalar multiplication ([CVE-2018-5407][])
* Timing vulnerability in DSA signature generation ([CVE-2018-0734][]) * Timing vulnerability in DSA signature generation ([CVE-2018-0734][])
### Major changes between OpenSSL 1.0.2o and OpenSSL 1.0.2p [14 Aug 2018] ### ### Major changes between OpenSSL 1.0.2o and OpenSSL 1.0.2p [14 Aug 2018]
* Client DoS due to large DH parameter ([CVE-2018-0732][]) * Client DoS due to large DH parameter ([CVE-2018-0732][])
* Cache timing vulnerability in RSA Key Generation ([CVE-2018-0737][]) * Cache timing vulnerability in RSA Key Generation ([CVE-2018-0737][])
### Major changes between OpenSSL 1.0.2n and OpenSSL 1.0.2o [27 Mar 2018] ### ### Major changes between OpenSSL 1.0.2n and OpenSSL 1.0.2o [27 Mar 2018]
* Constructed ASN.1 types with a recursive definition could exceed the * Constructed ASN.1 types with a recursive definition could exceed the
stack ([CVE-2018-0739][]) stack ([CVE-2018-0739][])
### Major changes between OpenSSL 1.0.2m and OpenSSL 1.0.2n [7 Dec 2017] ### ### Major changes between OpenSSL 1.0.2m and OpenSSL 1.0.2n [7 Dec 2017]
* Read/write after SSL object in error state ([CVE-2017-3737][]) * Read/write after SSL object in error state ([CVE-2017-3737][])
* rsaz_1024_mul_avx2 overflow bug on x86_64 ([CVE-2017-3738][]) * rsaz_1024_mul_avx2 overflow bug on x86_64 ([CVE-2017-3738][])
### Major changes between OpenSSL 1.0.2l and OpenSSL 1.0.2m [2 Nov 2017] ### ### Major changes between OpenSSL 1.0.2l and OpenSSL 1.0.2m [2 Nov 2017]
* bn_sqrx8x_internal carry bug on x86_64 ([CVE-2017-3736][]) * bn_sqrx8x_internal carry bug on x86_64 ([CVE-2017-3736][])
* Malformed X.509 IPAddressFamily could cause OOB read ([CVE-2017-3735][]) * Malformed X.509 IPAddressFamily could cause OOB read ([CVE-2017-3735][])
### Major changes between OpenSSL 1.0.2k and OpenSSL 1.0.2l [25 May 2017] ### ### Major changes between OpenSSL 1.0.2k and OpenSSL 1.0.2l [25 May 2017]
* config now recognises 64-bit mingw and chooses mingw64 instead of mingw * config now recognises 64-bit mingw and chooses mingw64 instead of mingw
### Major changes between OpenSSL 1.0.2j and OpenSSL 1.0.2k [26 Jan 2017] ### ### Major changes between OpenSSL 1.0.2j and OpenSSL 1.0.2k [26 Jan 2017]
* Truncated packet could crash via OOB read ([CVE-2017-3731][]) * Truncated packet could crash via OOB read ([CVE-2017-3731][])
* BN_mod_exp may produce incorrect results on x86_64 ([CVE-2017-3732][]) * BN_mod_exp may produce incorrect results on x86_64 ([CVE-2017-3732][])
* Montgomery multiplication may produce incorrect results ([CVE-2016-7055][]) * Montgomery multiplication may produce incorrect results ([CVE-2016-7055][])
### Major changes between OpenSSL 1.0.2i and OpenSSL 1.0.2j [26 Sep 2016] ### ### Major changes between OpenSSL 1.0.2i and OpenSSL 1.0.2j [26 Sep 2016]
* Missing CRL sanity check ([CVE-2016-7052][]) * Missing CRL sanity check ([CVE-2016-7052][])
### Major changes between OpenSSL 1.0.2h and OpenSSL 1.0.2i [22 Sep 2016] ### ### Major changes between OpenSSL 1.0.2h and OpenSSL 1.0.2i [22 Sep 2016]
* OCSP Status Request extension unbounded memory growth ([CVE-2016-6304][]) * OCSP Status Request extension unbounded memory growth ([CVE-2016-6304][])
* SWEET32 Mitigation ([CVE-2016-2183][]) * SWEET32 Mitigation ([CVE-2016-2183][])
@@ -356,7 +353,7 @@ OpenSSL 1.0.2
* DTLS replay protection DoS ([CVE-2016-2181][]) * DTLS replay protection DoS ([CVE-2016-2181][])
* Certificate message OOB reads ([CVE-2016-6306][]) * Certificate message OOB reads ([CVE-2016-6306][])
### Major changes between OpenSSL 1.0.2g and OpenSSL 1.0.2h [3 May 2016] ### ### Major changes between OpenSSL 1.0.2g and OpenSSL 1.0.2h [3 May 2016]
* Prevent padding oracle in AES-NI CBC MAC check ([CVE-2016-2107][]) * Prevent padding oracle in AES-NI CBC MAC check ([CVE-2016-2107][])
* Fix EVP_EncodeUpdate overflow ([CVE-2016-2105][]) * Fix EVP_EncodeUpdate overflow ([CVE-2016-2105][])
@@ -369,7 +366,7 @@ OpenSSL 1.0.2
the default. the default.
* Only remove the SSLv2 methods with the no-ssl2-method option. * Only remove the SSLv2 methods with the no-ssl2-method option.
### Major changes between OpenSSL 1.0.2f and OpenSSL 1.0.2g [1 Mar 2016] ### ### Major changes between OpenSSL 1.0.2f and OpenSSL 1.0.2g [1 Mar 2016]
* Disable weak ciphers in SSLv3 and up in default builds of OpenSSL. * Disable weak ciphers in SSLv3 and up in default builds of OpenSSL.
* Disable SSLv2 default build, default negotiation and weak ciphers * Disable SSLv2 default build, default negotiation and weak ciphers
@@ -382,12 +379,12 @@ OpenSSL 1.0.2
* Fix memory issues in BIO_*printf functions ([CVE-2016-0799][]) * Fix memory issues in BIO_*printf functions ([CVE-2016-0799][])
* Fix side channel attack on modular exponentiation ([CVE-2016-0702][]) * Fix side channel attack on modular exponentiation ([CVE-2016-0702][])
### Major changes between OpenSSL 1.0.2e and OpenSSL 1.0.2f [28 Jan 2016] ### ### Major changes between OpenSSL 1.0.2e and OpenSSL 1.0.2f [28 Jan 2016]
* DH small subgroups ([CVE-2016-0701][]) * DH small subgroups ([CVE-2016-0701][])
* SSLv2 doesn't block disabled ciphers ([CVE-2015-3197][]) * SSLv2 doesn't block disabled ciphers ([CVE-2015-3197][])
### Major changes between OpenSSL 1.0.2d and OpenSSL 1.0.2e [3 Dec 2015] ### ### Major changes between OpenSSL 1.0.2d and OpenSSL 1.0.2e [3 Dec 2015]
* BN_mod_exp may produce incorrect results on x86_64 ([CVE-2015-3193][]) * BN_mod_exp may produce incorrect results on x86_64 ([CVE-2015-3193][])
* Certificate verify crash with missing PSS parameter ([CVE-2015-3194][]) * Certificate verify crash with missing PSS parameter ([CVE-2015-3194][])
@@ -396,16 +393,16 @@ OpenSSL 1.0.2
* In DSA_generate_parameters_ex, if the provided seed is too short, * In DSA_generate_parameters_ex, if the provided seed is too short,
return an error return an error
### Major changes between OpenSSL 1.0.2c and OpenSSL 1.0.2d [9 Jul 2015] ### ### Major changes between OpenSSL 1.0.2c and OpenSSL 1.0.2d [9 Jul 2015]
* Alternate chains certificate forgery ([CVE-2015-1793][]) * Alternate chains certificate forgery ([CVE-2015-1793][])
* Race condition handling PSK identify hint ([CVE-2015-3196][]) * Race condition handling PSK identify hint ([CVE-2015-3196][])
### Major changes between OpenSSL 1.0.2b and OpenSSL 1.0.2c [12 Jun 2015] ### ### Major changes between OpenSSL 1.0.2b and OpenSSL 1.0.2c [12 Jun 2015]
* Fix HMAC ABI incompatibility * Fix HMAC ABI incompatibility
### Major changes between OpenSSL 1.0.2a and OpenSSL 1.0.2b [11 Jun 2015] ### ### Major changes between OpenSSL 1.0.2a and OpenSSL 1.0.2b [11 Jun 2015]
* Malformed ECParameters causes infinite loop ([CVE-2015-1788][]) * Malformed ECParameters causes infinite loop ([CVE-2015-1788][])
* Exploitable out-of-bounds read in X509_cmp_time ([CVE-2015-1789][]) * Exploitable out-of-bounds read in X509_cmp_time ([CVE-2015-1789][])
@@ -413,7 +410,7 @@ OpenSSL 1.0.2
* CMS verify infinite loop with unknown hash function ([CVE-2015-1792][]) * CMS verify infinite loop with unknown hash function ([CVE-2015-1792][])
* Race condition handling NewSessionTicket ([CVE-2015-1791][]) * Race condition handling NewSessionTicket ([CVE-2015-1791][])
### Major changes between OpenSSL 1.0.2 and OpenSSL 1.0.2a [19 Mar 2015] ### ### Major changes between OpenSSL 1.0.2 and OpenSSL 1.0.2a [19 Mar 2015]
* OpenSSL 1.0.2 ClientHello sigalgs DoS fix ([CVE-2015-0291][]) * OpenSSL 1.0.2 ClientHello sigalgs DoS fix ([CVE-2015-0291][])
* Multiblock corrupted pointer fix ([CVE-2015-0290][]) * Multiblock corrupted pointer fix ([CVE-2015-0290][])
@@ -429,7 +426,7 @@ OpenSSL 1.0.2
* X509_to_X509_REQ NULL pointer deref fix ([CVE-2015-0288][]) * X509_to_X509_REQ NULL pointer deref fix ([CVE-2015-0288][])
* Removed the export ciphers from the DEFAULT ciphers * Removed the export ciphers from the DEFAULT ciphers
### Major changes between OpenSSL 1.0.1l and OpenSSL 1.0.2 [22 Jan 2015] ### ### Major changes between OpenSSL 1.0.1l and OpenSSL 1.0.2 [22 Jan 2015]
* Suite B support for TLS 1.2 and DTLS 1.2 * Suite B support for TLS 1.2 and DTLS 1.2
* Support for DTLS 1.2 * Support for DTLS 1.2
@@ -440,11 +437,10 @@ OpenSSL 1.0.2
* ALPN support. * ALPN support.
* CMS support for RSA-PSS, RSA-OAEP, ECDH and X9.42 DH. * CMS support for RSA-PSS, RSA-OAEP, ECDH and X9.42 DH.
OpenSSL 1.0.1 OpenSSL 1.0.1
------------- -------------
### Major changes between OpenSSL 1.0.1t and OpenSSL 1.0.1u [22 Sep 2016] ### ### Major changes between OpenSSL 1.0.1t and OpenSSL 1.0.1u [22 Sep 2016]
* OCSP Status Request extension unbounded memory growth ([CVE-2016-6304][]) * OCSP Status Request extension unbounded memory growth ([CVE-2016-6304][])
* SWEET32 Mitigation ([CVE-2016-2183][]) * SWEET32 Mitigation ([CVE-2016-2183][])
@@ -458,7 +454,7 @@ OpenSSL 1.0.1
* DTLS replay protection DoS ([CVE-2016-2181][]) * DTLS replay protection DoS ([CVE-2016-2181][])
* Certificate message OOB reads ([CVE-2016-6306][]) * Certificate message OOB reads ([CVE-2016-6306][])
### Major changes between OpenSSL 1.0.1s and OpenSSL 1.0.1t [3 May 2016] ### ### Major changes between OpenSSL 1.0.1s and OpenSSL 1.0.1t [3 May 2016]
* Prevent padding oracle in AES-NI CBC MAC check ([CVE-2016-2107][]) * Prevent padding oracle in AES-NI CBC MAC check ([CVE-2016-2107][])
* Fix EVP_EncodeUpdate overflow ([CVE-2016-2105][]) * Fix EVP_EncodeUpdate overflow ([CVE-2016-2105][])
@@ -471,7 +467,7 @@ OpenSSL 1.0.1
the default. the default.
* Only remove the SSLv2 methods with the no-ssl2-method option. * Only remove the SSLv2 methods with the no-ssl2-method option.
### Major changes between OpenSSL 1.0.1r and OpenSSL 1.0.1s [1 Mar 2016] ### ### Major changes between OpenSSL 1.0.1r and OpenSSL 1.0.1s [1 Mar 2016]
* Disable weak ciphers in SSLv3 and up in default builds of OpenSSL. * Disable weak ciphers in SSLv3 and up in default builds of OpenSSL.
* Disable SSLv2 default build, default negotiation and weak ciphers * Disable SSLv2 default build, default negotiation and weak ciphers
@@ -484,12 +480,12 @@ OpenSSL 1.0.1
* Fix memory issues in BIO_*printf functions ([CVE-2016-0799][]) * Fix memory issues in BIO_*printf functions ([CVE-2016-0799][])
* Fix side channel attack on modular exponentiation ([CVE-2016-0702][]) * Fix side channel attack on modular exponentiation ([CVE-2016-0702][])
### Major changes between OpenSSL 1.0.1q and OpenSSL 1.0.1r [28 Jan 2016] ### ### Major changes between OpenSSL 1.0.1q and OpenSSL 1.0.1r [28 Jan 2016]
* Protection for DH small subgroup attacks * Protection for DH small subgroup attacks
* SSLv2 doesn't block disabled ciphers ([CVE-2015-3197][]) * SSLv2 doesn't block disabled ciphers ([CVE-2015-3197][])
### Major changes between OpenSSL 1.0.1p and OpenSSL 1.0.1q [3 Dec 2015] ### ### Major changes between OpenSSL 1.0.1p and OpenSSL 1.0.1q [3 Dec 2015]
* Certificate verify crash with missing PSS parameter ([CVE-2015-3194][]) * Certificate verify crash with missing PSS parameter ([CVE-2015-3194][])
* X509_ATTRIBUTE memory leak ([CVE-2015-3195][]) * X509_ATTRIBUTE memory leak ([CVE-2015-3195][])
@@ -497,16 +493,16 @@ OpenSSL 1.0.1
* In DSA_generate_parameters_ex, if the provided seed is too short, * In DSA_generate_parameters_ex, if the provided seed is too short,
return an error return an error
### Major changes between OpenSSL 1.0.1o and OpenSSL 1.0.1p [9 Jul 2015] ### ### Major changes between OpenSSL 1.0.1o and OpenSSL 1.0.1p [9 Jul 2015]
* Alternate chains certificate forgery ([CVE-2015-1793][]) * Alternate chains certificate forgery ([CVE-2015-1793][])
* Race condition handling PSK identify hint ([CVE-2015-3196][]) * Race condition handling PSK identify hint ([CVE-2015-3196][])
### Major changes between OpenSSL 1.0.1n and OpenSSL 1.0.1o [12 Jun 2015] ### ### Major changes between OpenSSL 1.0.1n and OpenSSL 1.0.1o [12 Jun 2015]
* Fix HMAC ABI incompatibility * Fix HMAC ABI incompatibility
### Major changes between OpenSSL 1.0.1m and OpenSSL 1.0.1n [11 Jun 2015] ### ### Major changes between OpenSSL 1.0.1m and OpenSSL 1.0.1n [11 Jun 2015]
* Malformed ECParameters causes infinite loop ([CVE-2015-1788][]) * Malformed ECParameters causes infinite loop ([CVE-2015-1788][])
* Exploitable out-of-bounds read in X509_cmp_time ([CVE-2015-1789][]) * Exploitable out-of-bounds read in X509_cmp_time ([CVE-2015-1789][])
@@ -514,7 +510,7 @@ OpenSSL 1.0.1
* CMS verify infinite loop with unknown hash function ([CVE-2015-1792][]) * CMS verify infinite loop with unknown hash function ([CVE-2015-1792][])
* Race condition handling NewSessionTicket ([CVE-2015-1791][]) * Race condition handling NewSessionTicket ([CVE-2015-1791][])
### Major changes between OpenSSL 1.0.1l and OpenSSL 1.0.1m [19 Mar 2015] ### ### Major changes between OpenSSL 1.0.1l and OpenSSL 1.0.1m [19 Mar 2015]
* Segmentation fault in ASN1_TYPE_cmp fix ([CVE-2015-0286][]) * Segmentation fault in ASN1_TYPE_cmp fix ([CVE-2015-0286][])
* ASN.1 structure reuse memory corruption fix ([CVE-2015-0287][]) * ASN.1 structure reuse memory corruption fix ([CVE-2015-0287][])
@@ -524,11 +520,11 @@ OpenSSL 1.0.1
* X509_to_X509_REQ NULL pointer deref fix ([CVE-2015-0288][]) * X509_to_X509_REQ NULL pointer deref fix ([CVE-2015-0288][])
* Removed the export ciphers from the DEFAULT ciphers * Removed the export ciphers from the DEFAULT ciphers
### Major changes between OpenSSL 1.0.1k and OpenSSL 1.0.1l [15 Jan 2015] ### ### Major changes between OpenSSL 1.0.1k and OpenSSL 1.0.1l [15 Jan 2015]
* Build fixes for the Windows and OpenVMS platforms * Build fixes for the Windows and OpenVMS platforms
### Major changes between OpenSSL 1.0.1j and OpenSSL 1.0.1k [8 Jan 2015] ### ### Major changes between OpenSSL 1.0.1j and OpenSSL 1.0.1k [8 Jan 2015]
* Fix for [CVE-2014-3571][] * Fix for [CVE-2014-3571][]
* Fix for [CVE-2015-0206][] * Fix for [CVE-2015-0206][]
@@ -539,14 +535,14 @@ OpenSSL 1.0.1
* Fix for [CVE-2014-8275][] * Fix for [CVE-2014-8275][]
* Fix for [CVE-2014-3570][] * Fix for [CVE-2014-3570][]
### Major changes between OpenSSL 1.0.1i and OpenSSL 1.0.1j [15 Oct 2014] ### ### Major changes between OpenSSL 1.0.1i and OpenSSL 1.0.1j [15 Oct 2014]
* Fix for [CVE-2014-3513][] * Fix for [CVE-2014-3513][]
* Fix for [CVE-2014-3567][] * Fix for [CVE-2014-3567][]
* Mitigation for [CVE-2014-3566][] (SSL protocol vulnerability) * Mitigation for [CVE-2014-3566][] (SSL protocol vulnerability)
* Fix for [CVE-2014-3568][] * Fix for [CVE-2014-3568][]
### Major changes between OpenSSL 1.0.1h and OpenSSL 1.0.1i [6 Aug 2014] ### ### Major changes between OpenSSL 1.0.1h and OpenSSL 1.0.1i [6 Aug 2014]
* Fix for [CVE-2014-3512][] * Fix for [CVE-2014-3512][]
* Fix for [CVE-2014-3511][] * Fix for [CVE-2014-3511][]
@@ -558,7 +554,7 @@ OpenSSL 1.0.1
* Fix for [CVE-2014-5139][] * Fix for [CVE-2014-5139][]
* Fix for [CVE-2014-3508][] * Fix for [CVE-2014-3508][]
### Major changes between OpenSSL 1.0.1g and OpenSSL 1.0.1h [5 Jun 2014] ### ### Major changes between OpenSSL 1.0.1g and OpenSSL 1.0.1h [5 Jun 2014]
* Fix for [CVE-2014-0224][] * Fix for [CVE-2014-0224][]
* Fix for [CVE-2014-0221][] * Fix for [CVE-2014-0221][]
@@ -567,24 +563,24 @@ OpenSSL 1.0.1
* Fix for [CVE-2014-3470][] * Fix for [CVE-2014-3470][]
* Fix for [CVE-2010-5298][] * Fix for [CVE-2010-5298][]
### Major changes between OpenSSL 1.0.1f and OpenSSL 1.0.1g [7 Apr 2014] ### ### Major changes between OpenSSL 1.0.1f and OpenSSL 1.0.1g [7 Apr 2014]
* Fix for [CVE-2014-0160][] * Fix for [CVE-2014-0160][]
* Add TLS padding extension workaround for broken servers. * Add TLS padding extension workaround for broken servers.
* Fix for [CVE-2014-0076][] * Fix for [CVE-2014-0076][]
### Major changes between OpenSSL 1.0.1e and OpenSSL 1.0.1f [6 Jan 2014] ### ### Major changes between OpenSSL 1.0.1e and OpenSSL 1.0.1f [6 Jan 2014]
* Don't include gmt_unix_time in TLS server and client random values * Don't include gmt_unix_time in TLS server and client random values
* Fix for TLS record tampering bug [CVE-2013-4353][] * Fix for TLS record tampering bug [CVE-2013-4353][]
* Fix for TLS version checking bug [CVE-2013-6449][] * Fix for TLS version checking bug [CVE-2013-6449][]
* Fix for DTLS retransmission bug [CVE-2013-6450][] * Fix for DTLS retransmission bug [CVE-2013-6450][]
### Major changes between OpenSSL 1.0.1d and OpenSSL 1.0.1e [11 Feb 2013] ### ### Major changes between OpenSSL 1.0.1d and OpenSSL 1.0.1e [11 Feb 2013]
* Corrected fix for [CVE-2013-0169][] * Corrected fix for [CVE-2013-0169][]
### Major changes between OpenSSL 1.0.1c and OpenSSL 1.0.1d [4 Feb 2013] ### ### Major changes between OpenSSL 1.0.1c and OpenSSL 1.0.1d [4 Feb 2013]
* Fix renegotiation in TLS 1.1, 1.2 by using the correct TLS version. * Fix renegotiation in TLS 1.1, 1.2 by using the correct TLS version.
* Include the fips configuration module. * Include the fips configuration module.
@@ -592,24 +588,24 @@ OpenSSL 1.0.1
* Fix for SSL/TLS/DTLS CBC plaintext recovery attack [CVE-2013-0169][] * Fix for SSL/TLS/DTLS CBC plaintext recovery attack [CVE-2013-0169][]
* Fix for TLS AESNI record handling flaw [CVE-2012-2686][] * Fix for TLS AESNI record handling flaw [CVE-2012-2686][]
### Major changes between OpenSSL 1.0.1b and OpenSSL 1.0.1c [10 May 2012] ### ### Major changes between OpenSSL 1.0.1b and OpenSSL 1.0.1c [10 May 2012]
* Fix TLS/DTLS record length checking bug [CVE-2012-2333][] * Fix TLS/DTLS record length checking bug [CVE-2012-2333][]
* Don't attempt to use non-FIPS composite ciphers in FIPS mode. * Don't attempt to use non-FIPS composite ciphers in FIPS mode.
### Major changes between OpenSSL 1.0.1a and OpenSSL 1.0.1b [26 Apr 2012] ### ### Major changes between OpenSSL 1.0.1a and OpenSSL 1.0.1b [26 Apr 2012]
* Fix compilation error on non-x86 platforms. * Fix compilation error on non-x86 platforms.
* Make FIPS capable OpenSSL ciphers work in non-FIPS mode. * Make FIPS capable OpenSSL ciphers work in non-FIPS mode.
* Fix SSL_OP_NO_TLSv1_1 clash with SSL_OP_ALL in OpenSSL 1.0.0 * Fix SSL_OP_NO_TLSv1_1 clash with SSL_OP_ALL in OpenSSL 1.0.0
### Major changes between OpenSSL 1.0.1 and OpenSSL 1.0.1a [19 Apr 2012] ### ### Major changes between OpenSSL 1.0.1 and OpenSSL 1.0.1a [19 Apr 2012]
* Fix for ASN1 overflow bug [CVE-2012-2110][] * Fix for ASN1 overflow bug [CVE-2012-2110][]
* Workarounds for some servers that hang on long client hellos. * Workarounds for some servers that hang on long client hellos.
* Fix SEGV in AES code. * Fix SEGV in AES code.
### Major changes between OpenSSL 1.0.0h and OpenSSL 1.0.1 [14 Mar 2012] ### ### Major changes between OpenSSL 1.0.0h and OpenSSL 1.0.1 [14 Mar 2012]
* TLS/DTLS heartbeat support. * TLS/DTLS heartbeat support.
* SCTP support. * SCTP support.
@@ -622,16 +618,15 @@ OpenSSL 1.0.1
* Preliminary FIPS capability for unvalidated 2.0 FIPS module. * Preliminary FIPS capability for unvalidated 2.0 FIPS module.
* SRP support. * SRP support.
OpenSSL 1.0.0 OpenSSL 1.0.0
------------- -------------
### Major changes between OpenSSL 1.0.0s and OpenSSL 1.0.0t [3 Dec 2015] ### ### Major changes between OpenSSL 1.0.0s and OpenSSL 1.0.0t [3 Dec 2015]
* X509_ATTRIBUTE memory leak ([CVE-2015-3195][]) * X509_ATTRIBUTE memory leak ([CVE-2015-3195][])
* Race condition handling PSK identify hint ([CVE-2015-3196][]) * Race condition handling PSK identify hint ([CVE-2015-3196][])
### Major changes between OpenSSL 1.0.0r and OpenSSL 1.0.0s [11 Jun 2015] ### ### Major changes between OpenSSL 1.0.0r and OpenSSL 1.0.0s [11 Jun 2015]
* Malformed ECParameters causes infinite loop ([CVE-2015-1788][]) * Malformed ECParameters causes infinite loop ([CVE-2015-1788][])
* Exploitable out-of-bounds read in X509_cmp_time ([CVE-2015-1789][]) * Exploitable out-of-bounds read in X509_cmp_time ([CVE-2015-1789][])
@@ -639,7 +634,7 @@ OpenSSL 1.0.0
* CMS verify infinite loop with unknown hash function ([CVE-2015-1792][]) * CMS verify infinite loop with unknown hash function ([CVE-2015-1792][])
* Race condition handling NewSessionTicket ([CVE-2015-1791][]) * Race condition handling NewSessionTicket ([CVE-2015-1791][])
### Major changes between OpenSSL 1.0.0q and OpenSSL 1.0.0r [19 Mar 2015] ### ### Major changes between OpenSSL 1.0.0q and OpenSSL 1.0.0r [19 Mar 2015]
* Segmentation fault in ASN1_TYPE_cmp fix ([CVE-2015-0286][]) * Segmentation fault in ASN1_TYPE_cmp fix ([CVE-2015-0286][])
* ASN.1 structure reuse memory corruption fix ([CVE-2015-0287][]) * ASN.1 structure reuse memory corruption fix ([CVE-2015-0287][])
@@ -649,11 +644,11 @@ OpenSSL 1.0.0
* X509_to_X509_REQ NULL pointer deref fix ([CVE-2015-0288][]) * X509_to_X509_REQ NULL pointer deref fix ([CVE-2015-0288][])
* Removed the export ciphers from the DEFAULT ciphers * Removed the export ciphers from the DEFAULT ciphers
### Major changes between OpenSSL 1.0.0p and OpenSSL 1.0.0q [15 Jan 2015] ### ### Major changes between OpenSSL 1.0.0p and OpenSSL 1.0.0q [15 Jan 2015]
* Build fixes for the Windows and OpenVMS platforms * Build fixes for the Windows and OpenVMS platforms
### Major changes between OpenSSL 1.0.0o and OpenSSL 1.0.0p [8 Jan 2015] ### ### Major changes between OpenSSL 1.0.0o and OpenSSL 1.0.0p [8 Jan 2015]
* Fix for [CVE-2014-3571][] * Fix for [CVE-2014-3571][]
* Fix for [CVE-2015-0206][] * Fix for [CVE-2015-0206][]
@@ -664,14 +659,14 @@ OpenSSL 1.0.0
* Fix for [CVE-2014-8275][] * Fix for [CVE-2014-8275][]
* Fix for [CVE-2014-3570][] * Fix for [CVE-2014-3570][]
### Major changes between OpenSSL 1.0.0n and OpenSSL 1.0.0o [15 Oct 2014] ### ### Major changes between OpenSSL 1.0.0n and OpenSSL 1.0.0o [15 Oct 2014]
* Fix for [CVE-2014-3513][] * Fix for [CVE-2014-3513][]
* Fix for [CVE-2014-3567][] * Fix for [CVE-2014-3567][]
* Mitigation for [CVE-2014-3566][] (SSL protocol vulnerability) * Mitigation for [CVE-2014-3566][] (SSL protocol vulnerability)
* Fix for [CVE-2014-3568][] * Fix for [CVE-2014-3568][]
### Major changes between OpenSSL 1.0.0m and OpenSSL 1.0.0n [6 Aug 2014] ### ### Major changes between OpenSSL 1.0.0m and OpenSSL 1.0.0n [6 Aug 2014]
* Fix for [CVE-2014-3510][] * Fix for [CVE-2014-3510][]
* Fix for [CVE-2014-3507][] * Fix for [CVE-2014-3507][]
@@ -685,9 +680,9 @@ OpenSSL 1.0.0
* EAP-FAST and other applications using tls_session_secret_cb * EAP-FAST and other applications using tls_session_secret_cb
wont resume sessions. Fixed in 1.0.0n-dev wont resume sessions. Fixed in 1.0.0n-dev
* Compilation failure of s3_pkt.c on some platforms due to missing * Compilation failure of s3_pkt.c on some platforms due to missing
<limits.h> include. Fixed in 1.0.0n-dev `<limits.h>` include. Fixed in 1.0.0n-dev
### Major changes between OpenSSL 1.0.0l and OpenSSL 1.0.0m [5 Jun 2014] ### ### Major changes between OpenSSL 1.0.0l and OpenSSL 1.0.0m [5 Jun 2014]
* Fix for [CVE-2014-0224][] * Fix for [CVE-2014-0224][]
* Fix for [CVE-2014-0221][] * Fix for [CVE-2014-0221][]
@@ -697,35 +692,34 @@ OpenSSL 1.0.0
* Fix for [CVE-2014-0076][] * Fix for [CVE-2014-0076][]
* Fix for [CVE-2010-5298][] * Fix for [CVE-2010-5298][]
### Major changes between OpenSSL 1.0.0k and OpenSSL 1.0.0l [6 Jan 2014] ### ### Major changes between OpenSSL 1.0.0k and OpenSSL 1.0.0l [6 Jan 2014]
* Fix for DTLS retransmission bug [CVE-2013-6450][] * Fix for DTLS retransmission bug [CVE-2013-6450][]
### Major changes between OpenSSL 1.0.0j and OpenSSL 1.0.0k [5 Feb 2013] ### ### Major changes between OpenSSL 1.0.0j and OpenSSL 1.0.0k [5 Feb 2013]
* Fix for SSL/TLS/DTLS CBC plaintext recovery attack [CVE-2013-0169][] * Fix for SSL/TLS/DTLS CBC plaintext recovery attack [CVE-2013-0169][]
* Fix OCSP bad key DoS attack [CVE-2013-0166][] * Fix OCSP bad key DoS attack [CVE-2013-0166][]
### Major changes between OpenSSL 1.0.0i and OpenSSL 1.0.0j [10 May 2012] ### ### Major changes between OpenSSL 1.0.0i and OpenSSL 1.0.0j [10 May 2012]
* Fix DTLS record length checking bug [CVE-2012-2333][] * Fix DTLS record length checking bug [CVE-2012-2333][]
### Major changes between OpenSSL 1.0.0h and OpenSSL 1.0.0i [19 Apr 2012] ### ### Major changes between OpenSSL 1.0.0h and OpenSSL 1.0.0i [19 Apr 2012]
* Fix for ASN1 overflow bug [CVE-2012-2110][] * Fix for ASN1 overflow bug [CVE-2012-2110][]
### Major changes between OpenSSL 1.0.0g and OpenSSL 1.0.0h [12 Mar 2012]
### Major changes between OpenSSL 1.0.0g and OpenSSL 1.0.0h [12 Mar 2012] ###
* Fix for CMS/PKCS#7 MMA [CVE-2012-0884][] * Fix for CMS/PKCS#7 MMA [CVE-2012-0884][]
* Corrected fix for [CVE-2011-4619][] * Corrected fix for [CVE-2011-4619][]
* Various DTLS fixes. * Various DTLS fixes.
### Major changes between OpenSSL 1.0.0f and OpenSSL 1.0.0g [18 Jan 2012] ### ### Major changes between OpenSSL 1.0.0f and OpenSSL 1.0.0g [18 Jan 2012]
* Fix for DTLS DoS issue [CVE-2012-0050][] * Fix for DTLS DoS issue [CVE-2012-0050][]
### Major changes between OpenSSL 1.0.0e and OpenSSL 1.0.0f [4 Jan 2012] ### ### Major changes between OpenSSL 1.0.0e and OpenSSL 1.0.0f [4 Jan 2012]
* Fix for DTLS plaintext recovery attack [CVE-2011-4108][] * Fix for DTLS plaintext recovery attack [CVE-2011-4108][]
* Clear block padding bytes of SSL 3.0 records [CVE-2011-4576][] * Clear block padding bytes of SSL 3.0 records [CVE-2011-4576][]
@@ -733,7 +727,7 @@ OpenSSL 1.0.0
* Check parameters are not NULL in GOST ENGINE [CVE-2012-0027][] * Check parameters are not NULL in GOST ENGINE [CVE-2012-0027][]
* Check for malformed RFC3779 data [CVE-2011-4577][] * Check for malformed RFC3779 data [CVE-2011-4577][]
### Major changes between OpenSSL 1.0.0d and OpenSSL 1.0.0e [6 Sep 2011] ### ### Major changes between OpenSSL 1.0.0d and OpenSSL 1.0.0e [6 Sep 2011]
* Fix for CRL vulnerability issue [CVE-2011-3207][] * Fix for CRL vulnerability issue [CVE-2011-3207][]
* Fix for ECDH crashes [CVE-2011-3210][] * Fix for ECDH crashes [CVE-2011-3210][]
@@ -741,11 +735,11 @@ OpenSSL 1.0.0
* Support ECDH ciphersuites for certificates using SHA2 algorithms. * Support ECDH ciphersuites for certificates using SHA2 algorithms.
* Various DTLS fixes. * Various DTLS fixes.
### Major changes between OpenSSL 1.0.0c and OpenSSL 1.0.0d [8 Feb 2011] ### ### Major changes between OpenSSL 1.0.0c and OpenSSL 1.0.0d [8 Feb 2011]
* Fix for security issue [CVE-2011-0014][] * Fix for security issue [CVE-2011-0014][]
### Major changes between OpenSSL 1.0.0b and OpenSSL 1.0.0c [2 Dec 2010] ### ### Major changes between OpenSSL 1.0.0b and OpenSSL 1.0.0c [2 Dec 2010]
* Fix for security issue [CVE-2010-4180][] * Fix for security issue [CVE-2010-4180][]
* Fix for [CVE-2010-4252][] * Fix for [CVE-2010-4252][]
@@ -753,18 +747,18 @@ OpenSSL 1.0.0
* Fix various platform compilation issues. * Fix various platform compilation issues.
* Corrected fix for security issue [CVE-2010-3864][]. * Corrected fix for security issue [CVE-2010-3864][].
### Major changes between OpenSSL 1.0.0a and OpenSSL 1.0.0b [16 Nov 2010] ### ### Major changes between OpenSSL 1.0.0a and OpenSSL 1.0.0b [16 Nov 2010]
* Fix for security issue [CVE-2010-3864][]. * Fix for security issue [CVE-2010-3864][].
* Fix for [CVE-2010-2939][] * Fix for [CVE-2010-2939][]
* Fix WIN32 build system for GOST ENGINE. * Fix WIN32 build system for GOST ENGINE.
### Major changes between OpenSSL 1.0.0 and OpenSSL 1.0.0a [1 Jun 2010] ### ### Major changes between OpenSSL 1.0.0 and OpenSSL 1.0.0a [1 Jun 2010]
* Fix for security issue [CVE-2010-1633][]. * Fix for security issue [CVE-2010-1633][].
* GOST MAC and CFB fixes. * GOST MAC and CFB fixes.
### Major changes between OpenSSL 0.9.8n and OpenSSL 1.0.0 [29 Mar 2010] ### ### Major changes between OpenSSL 0.9.8n and OpenSSL 1.0.0 [29 Mar 2010]
* RFC3280 path validation: sufficient to process PKITS tests. * RFC3280 path validation: sufficient to process PKITS tests.
* Integrated support for PVK files and keyblobs. * Integrated support for PVK files and keyblobs.
@@ -790,12 +784,12 @@ OpenSSL 1.0.0
OpenSSL 0.9.x OpenSSL 0.9.x
------------- -------------
### Major changes between OpenSSL 0.9.8m and OpenSSL 0.9.8n [24 Mar 2010] ### ### Major changes between OpenSSL 0.9.8m and OpenSSL 0.9.8n [24 Mar 2010]
* CFB cipher definition fixes. * CFB cipher definition fixes.
* Fix security issues [CVE-2010-0740][] and [CVE-2010-0433][]. * Fix security issues [CVE-2010-0740][] and [CVE-2010-0433][].
### Major changes between OpenSSL 0.9.8l and OpenSSL 0.9.8m [25 Feb 2010] ### ### Major changes between OpenSSL 0.9.8l and OpenSSL 0.9.8m [25 Feb 2010]
* Cipher definition fixes. * Cipher definition fixes.
* Workaround for slow RAND_poll() on some WIN32 versions. * Workaround for slow RAND_poll() on some WIN32 versions.
@@ -807,33 +801,33 @@ OpenSSL 0.9.x
* Ticket and SNI coexistence fixes. * Ticket and SNI coexistence fixes.
* Many fixes to DTLS handling. * Many fixes to DTLS handling.
### Major changes between OpenSSL 0.9.8k and OpenSSL 0.9.8l [5 Nov 2009] ### ### Major changes between OpenSSL 0.9.8k and OpenSSL 0.9.8l [5 Nov 2009]
* Temporary work around for [CVE-2009-3555][]: disable renegotiation. * Temporary work around for [CVE-2009-3555][]: disable renegotiation.
### Major changes between OpenSSL 0.9.8j and OpenSSL 0.9.8k [25 Mar 2009] ### ### Major changes between OpenSSL 0.9.8j and OpenSSL 0.9.8k [25 Mar 2009]
* Fix various build issues. * Fix various build issues.
* Fix security issues ([CVE-2009-0590][], [CVE-2009-0591][], [CVE-2009-0789][]) * Fix security issues ([CVE-2009-0590][], [CVE-2009-0591][], [CVE-2009-0789][])
### Major changes between OpenSSL 0.9.8i and OpenSSL 0.9.8j [7 Jan 2009] ### ### Major changes between OpenSSL 0.9.8i and OpenSSL 0.9.8j [7 Jan 2009]
* Fix security issue ([CVE-2008-5077][]) * Fix security issue ([CVE-2008-5077][])
* Merge FIPS 140-2 branch code. * Merge FIPS 140-2 branch code.
### Major changes between OpenSSL 0.9.8g and OpenSSL 0.9.8h [28 May 2008] ### ### Major changes between OpenSSL 0.9.8g and OpenSSL 0.9.8h [28 May 2008]
* CryptoAPI ENGINE support. * CryptoAPI ENGINE support.
* Various precautionary measures. * Various precautionary measures.
* Fix for bugs affecting certificate request creation. * Fix for bugs affecting certificate request creation.
* Support for local machine keyset attribute in PKCS#12 files. * Support for local machine keyset attribute in PKCS#12 files.
### Major changes between OpenSSL 0.9.8f and OpenSSL 0.9.8g [19 Oct 2007] ### ### Major changes between OpenSSL 0.9.8f and OpenSSL 0.9.8g [19 Oct 2007]
* Backport of CMS functionality to 0.9.8. * Backport of CMS functionality to 0.9.8.
* Fixes for bugs introduced with 0.9.8f. * Fixes for bugs introduced with 0.9.8f.
### Major changes between OpenSSL 0.9.8e and OpenSSL 0.9.8f [11 Oct 2007] ### ### Major changes between OpenSSL 0.9.8e and OpenSSL 0.9.8f [11 Oct 2007]
* Add gcc 4.2 support. * Add gcc 4.2 support.
* Add support for AES and SSE2 assembly language optimization * Add support for AES and SSE2 assembly language optimization
@@ -844,23 +838,23 @@ OpenSSL 0.9.x
* RFC4507bis support. * RFC4507bis support.
* TLS Extensions support. * TLS Extensions support.
### Major changes between OpenSSL 0.9.8d and OpenSSL 0.9.8e [23 Feb 2007] ### ### Major changes between OpenSSL 0.9.8d and OpenSSL 0.9.8e [23 Feb 2007]
* Various ciphersuite selection fixes. * Various ciphersuite selection fixes.
* RFC3779 support. * RFC3779 support.
### Major changes between OpenSSL 0.9.8c and OpenSSL 0.9.8d [28 Sep 2006] ### ### Major changes between OpenSSL 0.9.8c and OpenSSL 0.9.8d [28 Sep 2006]
* Introduce limits to prevent malicious key DoS ([CVE-2006-2940][]) * Introduce limits to prevent malicious key DoS ([CVE-2006-2940][])
* Fix security issues ([CVE-2006-2937][], [CVE-2006-3737][], [CVE-2006-4343][]) * Fix security issues ([CVE-2006-2937][], [CVE-2006-3737][], [CVE-2006-4343][])
* Changes to ciphersuite selection algorithm * Changes to ciphersuite selection algorithm
### Major changes between OpenSSL 0.9.8b and OpenSSL 0.9.8c [5 Sep 2006] ### ### Major changes between OpenSSL 0.9.8b and OpenSSL 0.9.8c [5 Sep 2006]
* Fix Daniel Bleichenbacher forged signature attack, [CVE-2006-4339][] * Fix Daniel Bleichenbacher forged signature attack, [CVE-2006-4339][]
* New cipher Camellia * New cipher Camellia
### Major changes between OpenSSL 0.9.8a and OpenSSL 0.9.8b [4 May 2006] ### ### Major changes between OpenSSL 0.9.8a and OpenSSL 0.9.8b [4 May 2006]
* Cipher string fixes. * Cipher string fixes.
* Fixes for VC++ 2005. * Fixes for VC++ 2005.
@@ -870,12 +864,12 @@ OpenSSL 0.9.x
* Built in dynamic engine compilation support on Win32. * Built in dynamic engine compilation support on Win32.
* Fixes auto dynamic engine loading in Win32. * Fixes auto dynamic engine loading in Win32.
### Major changes between OpenSSL 0.9.8 and OpenSSL 0.9.8a [11 Oct 2005] ### ### Major changes between OpenSSL 0.9.8 and OpenSSL 0.9.8a [11 Oct 2005]
* Fix potential SSL 2.0 rollback, [CVE-2005-2969][] * Fix potential SSL 2.0 rollback, [CVE-2005-2969][]
* Extended Windows CE support * Extended Windows CE support
### Major changes between OpenSSL 0.9.7g and OpenSSL 0.9.8 [5 Jul 2005] ### ### Major changes between OpenSSL 0.9.7g and OpenSSL 0.9.8 [5 Jul 2005]
* Major work on the BIGNUM library for higher efficiency and to * Major work on the BIGNUM library for higher efficiency and to
make operations more streamlined and less contradictory. This make operations more streamlined and less contradictory. This
@@ -949,36 +943,36 @@ OpenSSL 0.9.x
* Added initial support for Win64. * Added initial support for Win64.
* Added alternate pkg-config files. * Added alternate pkg-config files.
### Major changes between OpenSSL 0.9.7l and OpenSSL 0.9.7m [23 Feb 2007] ### ### Major changes between OpenSSL 0.9.7l and OpenSSL 0.9.7m [23 Feb 2007]
* FIPS 1.1.1 module linking. * FIPS 1.1.1 module linking.
* Various ciphersuite selection fixes. * Various ciphersuite selection fixes.
### Major changes between OpenSSL 0.9.7k and OpenSSL 0.9.7l [28 Sep 2006] ### ### Major changes between OpenSSL 0.9.7k and OpenSSL 0.9.7l [28 Sep 2006]
* Introduce limits to prevent malicious key DoS ([CVE-2006-2940][]) * Introduce limits to prevent malicious key DoS ([CVE-2006-2940][])
* Fix security issues ([CVE-2006-2937][], [CVE-2006-3737][], [CVE-2006-4343][]) * Fix security issues ([CVE-2006-2937][], [CVE-2006-3737][], [CVE-2006-4343][])
### Major changes between OpenSSL 0.9.7j and OpenSSL 0.9.7k [5 Sep 2006] ### ### Major changes between OpenSSL 0.9.7j and OpenSSL 0.9.7k [5 Sep 2006]
* Fix Daniel Bleichenbacher forged signature attack, [CVE-2006-4339][] * Fix Daniel Bleichenbacher forged signature attack, [CVE-2006-4339][]
### Major changes between OpenSSL 0.9.7i and OpenSSL 0.9.7j [4 May 2006] ### ### Major changes between OpenSSL 0.9.7i and OpenSSL 0.9.7j [4 May 2006]
* Visual C++ 2005 fixes. * Visual C++ 2005 fixes.
* Update Windows build system for FIPS. * Update Windows build system for FIPS.
### Major changes between OpenSSL 0.9.7h and OpenSSL 0.9.7i [14 Oct 2005] ### ### Major changes between OpenSSL 0.9.7h and OpenSSL 0.9.7i [14 Oct 2005]
* Give EVP_MAX_MD_SIZE its old value, except for a FIPS build. * Give EVP_MAX_MD_SIZE its old value, except for a FIPS build.
### Major changes between OpenSSL 0.9.7g and OpenSSL 0.9.7h [11 Oct 2005] ### ### Major changes between OpenSSL 0.9.7g and OpenSSL 0.9.7h [11 Oct 2005]
* Fix SSL 2.0 Rollback, [CVE-2005-2969][] * Fix SSL 2.0 Rollback, [CVE-2005-2969][]
* Allow use of fixed-length exponent on DSA signing * Allow use of fixed-length exponent on DSA signing
* Default fixed-window RSA, DSA, DH private-key operations * Default fixed-window RSA, DSA, DH private-key operations
### Major changes between OpenSSL 0.9.7f and OpenSSL 0.9.7g [11 Apr 2005] ### ### Major changes between OpenSSL 0.9.7f and OpenSSL 0.9.7g [11 Apr 2005]
* More compilation issues fixed. * More compilation issues fixed.
* Adaptation to more modern Kerberos API. * Adaptation to more modern Kerberos API.
@@ -987,7 +981,7 @@ OpenSSL 0.9.x
* More constification. * More constification.
* Added processing of proxy certificates (RFC 3820). * Added processing of proxy certificates (RFC 3820).
### Major changes between OpenSSL 0.9.7e and OpenSSL 0.9.7f [22 Mar 2005] ### ### Major changes between OpenSSL 0.9.7e and OpenSSL 0.9.7f [22 Mar 2005]
* Several compilation issues fixed. * Several compilation issues fixed.
* Many memory allocation failure checks added. * Many memory allocation failure checks added.
@@ -995,12 +989,12 @@ OpenSSL 0.9.x
* Mandatory basic checks on certificates. * Mandatory basic checks on certificates.
* Performance improvements. * Performance improvements.
### Major changes between OpenSSL 0.9.7d and OpenSSL 0.9.7e [25 Oct 2004] ### ### Major changes between OpenSSL 0.9.7d and OpenSSL 0.9.7e [25 Oct 2004]
* Fix race condition in CRL checking code. * Fix race condition in CRL checking code.
* Fixes to PKCS#7 (S/MIME) code. * Fixes to PKCS#7 (S/MIME) code.
### Major changes between OpenSSL 0.9.7c and OpenSSL 0.9.7d [17 Mar 2004] ### ### Major changes between OpenSSL 0.9.7c and OpenSSL 0.9.7d [17 Mar 2004]
* Security: Fix Kerberos ciphersuite SSL/TLS handshaking bug * Security: Fix Kerberos ciphersuite SSL/TLS handshaking bug
* Security: Fix null-pointer assignment in do_change_cipher_spec() * Security: Fix null-pointer assignment in do_change_cipher_spec()
@@ -1008,14 +1002,14 @@ OpenSSL 0.9.x
* Multiple X509 verification fixes * Multiple X509 verification fixes
* Speed up HMAC and other operations * Speed up HMAC and other operations
### Major changes between OpenSSL 0.9.7b and OpenSSL 0.9.7c [30 Sep 2003] ### ### Major changes between OpenSSL 0.9.7b and OpenSSL 0.9.7c [30 Sep 2003]
* Security: fix various ASN1 parsing bugs. * Security: fix various ASN1 parsing bugs.
* New -ignore_err option to OCSP utility. * New -ignore_err option to OCSP utility.
* Various interop and bug fixes in S/MIME code. * Various interop and bug fixes in S/MIME code.
* SSL/TLS protocol fix for unrequested client certificates. * SSL/TLS protocol fix for unrequested client certificates.
### Major changes between OpenSSL 0.9.7a and OpenSSL 0.9.7b [10 Apr 2003] ### ### Major changes between OpenSSL 0.9.7a and OpenSSL 0.9.7b [10 Apr 2003]
* Security: counter the Klima-Pokorny-Rosa extension of * Security: counter the Klima-Pokorny-Rosa extension of
Bleichbacher's attack Bleichbacher's attack
@@ -1026,7 +1020,7 @@ OpenSSL 0.9.x
* ASN.1: treat domainComponent correctly. * ASN.1: treat domainComponent correctly.
* Documentation: fixes and additions. * Documentation: fixes and additions.
### Major changes between OpenSSL 0.9.7 and OpenSSL 0.9.7a [19 Feb 2003] ### ### Major changes between OpenSSL 0.9.7 and OpenSSL 0.9.7a [19 Feb 2003]
* Security: Important security related bugfixes. * Security: Important security related bugfixes.
* Enhanced compatibility with MIT Kerberos. * Enhanced compatibility with MIT Kerberos.
@@ -1037,7 +1031,7 @@ OpenSSL 0.9.x
* SSL/TLS: now handles manual certificate chain building. * SSL/TLS: now handles manual certificate chain building.
* SSL/TLS: certain session ID malfunctions corrected. * SSL/TLS: certain session ID malfunctions corrected.
### Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.7 [30 Dec 2002] ### ### Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.7 [30 Dec 2002]
* New library section OCSP. * New library section OCSP.
* Complete rewrite of ASN1 code. * Complete rewrite of ASN1 code.
@@ -1083,23 +1077,23 @@ OpenSSL 0.9.x
* SSL/TLS: add callback to retrieve SSL/TLS messages. * SSL/TLS: add callback to retrieve SSL/TLS messages.
* SSL/TLS: support AES cipher suites (RFC3268). * SSL/TLS: support AES cipher suites (RFC3268).
### Major changes between OpenSSL 0.9.6j and OpenSSL 0.9.6k [30 Sep 2003] ### ### Major changes between OpenSSL 0.9.6j and OpenSSL 0.9.6k [30 Sep 2003]
* Security: fix various ASN1 parsing bugs. * Security: fix various ASN1 parsing bugs.
* SSL/TLS protocol fix for unrequested client certificates. * SSL/TLS protocol fix for unrequested client certificates.
### Major changes between OpenSSL 0.9.6i and OpenSSL 0.9.6j [10 Apr 2003] ### ### Major changes between OpenSSL 0.9.6i and OpenSSL 0.9.6j [10 Apr 2003]
* Security: counter the Klima-Pokorny-Rosa extension of * Security: counter the Klima-Pokorny-Rosa extension of
Bleichbacher's attack Bleichbacher's attack
* Security: make RSA blinding default. * Security: make RSA blinding default.
* Build: shared library support fixes. * Build: shared library support fixes.
### Major changes between OpenSSL 0.9.6h and OpenSSL 0.9.6i [19 Feb 2003] ### ### Major changes between OpenSSL 0.9.6h and OpenSSL 0.9.6i [19 Feb 2003]
* Important security related bugfixes. * Important security related bugfixes.
### Major changes between OpenSSL 0.9.6g and OpenSSL 0.9.6h [5 Dec 2002] ### ### Major changes between OpenSSL 0.9.6g and OpenSSL 0.9.6h [5 Dec 2002]
* New configuration targets for Tandem OSS and A/UX. * New configuration targets for Tandem OSS and A/UX.
* New OIDs for Microsoft attributes. * New OIDs for Microsoft attributes.
@@ -1113,25 +1107,25 @@ OpenSSL 0.9.x
* Fixes for smaller building problems. * Fixes for smaller building problems.
* Updates of manuals, FAQ and other instructive documents. * Updates of manuals, FAQ and other instructive documents.
### Major changes between OpenSSL 0.9.6f and OpenSSL 0.9.6g [9 Aug 2002] ### ### Major changes between OpenSSL 0.9.6f and OpenSSL 0.9.6g [9 Aug 2002]
* Important building fixes on Unix. * Important building fixes on Unix.
### Major changes between OpenSSL 0.9.6e and OpenSSL 0.9.6f [8 Aug 2002] ### ### Major changes between OpenSSL 0.9.6e and OpenSSL 0.9.6f [8 Aug 2002]
* Various important bugfixes. * Various important bugfixes.
### Major changes between OpenSSL 0.9.6d and OpenSSL 0.9.6e [30 Jul 2002] ### ### Major changes between OpenSSL 0.9.6d and OpenSSL 0.9.6e [30 Jul 2002]
* Important security related bugfixes. * Important security related bugfixes.
* Various SSL/TLS library bugfixes. * Various SSL/TLS library bugfixes.
### Major changes between OpenSSL 0.9.6c and OpenSSL 0.9.6d [9 May 2002] ### ### Major changes between OpenSSL 0.9.6c and OpenSSL 0.9.6d [9 May 2002]
* Various SSL/TLS library bugfixes. * Various SSL/TLS library bugfixes.
* Fix DH parameter generation for 'non-standard' generators. * Fix DH parameter generation for 'non-standard' generators.
### Major changes between OpenSSL 0.9.6b and OpenSSL 0.9.6c [21 Dec 2001] ### ### Major changes between OpenSSL 0.9.6b and OpenSSL 0.9.6c [21 Dec 2001]
* Various SSL/TLS library bugfixes. * Various SSL/TLS library bugfixes.
* BIGNUM library fixes. * BIGNUM library fixes.
@@ -1144,7 +1138,7 @@ OpenSSL 0.9.x
Broadcom and Cryptographic Appliance's keyserver Broadcom and Cryptographic Appliance's keyserver
[in 0.9.6c-engine release]. [in 0.9.6c-engine release].
### Major changes between OpenSSL 0.9.6a and OpenSSL 0.9.6b [9 Jul 2001] ### ### Major changes between OpenSSL 0.9.6a and OpenSSL 0.9.6b [9 Jul 2001]
* Security fix: PRNG improvements. * Security fix: PRNG improvements.
* Security fix: RSA OAEP check. * Security fix: RSA OAEP check.
@@ -1161,7 +1155,7 @@ OpenSSL 0.9.x
* Increase default size for BIO buffering filter. * Increase default size for BIO buffering filter.
* Compatibility fixes in some scripts. * Compatibility fixes in some scripts.
### Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.6a [5 Apr 2001] ### ### Major changes between OpenSSL 0.9.6 and OpenSSL 0.9.6a [5 Apr 2001]
* Security fix: change behavior of OpenSSL to avoid using * Security fix: change behavior of OpenSSL to avoid using
environment variables when running as root. environment variables when running as root.
@@ -1186,7 +1180,7 @@ OpenSSL 0.9.x
* New function BN_rand_range(). * New function BN_rand_range().
* Add "-rand" option to openssl s_client and s_server. * Add "-rand" option to openssl s_client and s_server.
### Major changes between OpenSSL 0.9.5a and OpenSSL 0.9.6 [10 Oct 2000] ### ### Major changes between OpenSSL 0.9.5a and OpenSSL 0.9.6 [10 Oct 2000]
* Some documentation for BIO and SSL libraries. * Some documentation for BIO and SSL libraries.
* Enhanced chain verification using key identifiers. * Enhanced chain verification using key identifiers.
@@ -1201,7 +1195,7 @@ OpenSSL 0.9.x
[1] The support for external crypto devices is currently a separate [1] The support for external crypto devices is currently a separate
distribution. See the file README.ENGINE. distribution. See the file README.ENGINE.
### Major changes between OpenSSL 0.9.5 and OpenSSL 0.9.5a [1 Apr 2000] ### ### Major changes between OpenSSL 0.9.5 and OpenSSL 0.9.5a [1 Apr 2000]
* Bug fixes for Win32, SuSE Linux, NeXTSTEP and FreeBSD 2.2.8 * Bug fixes for Win32, SuSE Linux, NeXTSTEP and FreeBSD 2.2.8
* Shared library support for HPUX and Solaris-gcc * Shared library support for HPUX and Solaris-gcc
@@ -1210,7 +1204,7 @@ OpenSSL 0.9.x
* New 'rand' application * New 'rand' application
* New way to check for existence of algorithms from scripts * New way to check for existence of algorithms from scripts
### Major changes between OpenSSL 0.9.4 and OpenSSL 0.9.5 [25 May 2000] ### ### Major changes between OpenSSL 0.9.4 and OpenSSL 0.9.5 [25 May 2000]
* S/MIME support in new 'smime' command * S/MIME support in new 'smime' command
* Documentation for the OpenSSL command line application * Documentation for the OpenSSL command line application
@@ -1246,7 +1240,7 @@ OpenSSL 0.9.x
* Enhanced support for Alpha Linux * Enhanced support for Alpha Linux
* Experimental MacOS support * Experimental MacOS support
### Major changes between OpenSSL 0.9.3 and OpenSSL 0.9.4 [9 Aug 1999] ### ### Major changes between OpenSSL 0.9.3 and OpenSSL 0.9.4 [9 Aug 1999]
* Transparent support for PKCS#8 format private keys: these are used * Transparent support for PKCS#8 format private keys: these are used
by several software packages and are more secure than the standard by several software packages and are more secure than the standard
@@ -1257,7 +1251,7 @@ OpenSSL 0.9.x
* New pipe-like BIO that allows using the SSL library when actual I/O * New pipe-like BIO that allows using the SSL library when actual I/O
must be handled by the application (BIO pair) must be handled by the application (BIO pair)
### Major changes between OpenSSL 0.9.2b and OpenSSL 0.9.3 [24 May 1999] ### ### Major changes between OpenSSL 0.9.2b and OpenSSL 0.9.3 [24 May 1999]
* Lots of enhancements and cleanups to the Configuration mechanism * Lots of enhancements and cleanups to the Configuration mechanism
* RSA OEAP related fixes * RSA OEAP related fixes
@@ -1272,7 +1266,7 @@ OpenSSL 0.9.x
* Sparc assembler bignum implementation, optimized hash functions * Sparc assembler bignum implementation, optimized hash functions
* Option to disable selected ciphers * Option to disable selected ciphers
### Major changes between OpenSSL 0.9.1c and OpenSSL 0.9.2b [22 Mar 1999] ### ### Major changes between OpenSSL 0.9.1c and OpenSSL 0.9.2b [22 Mar 1999]
* Fixed a security hole related to session resumption * Fixed a security hole related to session resumption
* Fixed RSA encryption routines for the p < q case * Fixed RSA encryption routines for the p < q case
@@ -1295,7 +1289,7 @@ OpenSSL 0.9.x
* Lots of memory leak fixes. * Lots of memory leak fixes.
* Lots of bug fixes. * Lots of bug fixes.
### Major changes between SSLeay 0.9.0b and OpenSSL 0.9.1c [23 Dec 1998] ### ### Major changes between SSLeay 0.9.0b and OpenSSL 0.9.1c [23 Dec 1998]
* Integration of the popular NO_RSA/NO_DSA patches * Integration of the popular NO_RSA/NO_DSA patches
* Initial support for compression inside the SSL record layer * Initial support for compression inside the SSL record layer
@@ -1307,8 +1301,6 @@ OpenSSL 0.9.x
* Adjustments of the source tree for CVS * Adjustments of the source tree for CVS
* Support for various new platforms * Support for various new platforms
<!-- Links --> <!-- Links -->
[CVE-2019-1563]: https://www.openssl.org/news/vulnerabilities.html#CVE-2019-1563 [CVE-2019-1563]: https://www.openssl.org/news/vulnerabilities.html#CVE-2019-1563
+24 -34
View File
@@ -1,13 +1,11 @@
Welcome to the OpenSSL Project
==============================
[![openssl logo][]][www.openssl.org] [![openssl logo][]][www.openssl.org]
[![travis badge][]][travis jobs] [![travis badge][]][travis jobs]
[![appveyor badge][]][appveyor jobs] [![appveyor badge][]][appveyor jobs]
Welcome to the OpenSSL Project
==============================
OpenSSL is a robust, commercial-grade, full-featured Open Source Toolkit OpenSSL is a robust, commercial-grade, full-featured Open Source Toolkit
for the Transport Layer Security (TLS) protocol formerly known as the for the Transport Layer Security (TLS) protocol formerly known as the
Secure Sockets Layer (SSL) protocol. The protocol implementation is based Secure Sockets Layer (SSL) protocol. The protocol implementation is based
@@ -19,7 +17,6 @@ and Tim J. Hudson.
The official Home Page of the OpenSSL Project is [www.openssl.org][]. The official Home Page of the OpenSSL Project is [www.openssl.org][].
Table of Contents Table of Contents
================= =================
@@ -47,13 +44,13 @@ The OpenSSL toolkit includes:
- **openssl** - **openssl**
the OpenSSL command line tool, a swiss army knife for cryptographic tasks, the OpenSSL command line tool, a swiss army knife for cryptographic tasks,
testing and analyzing. It can be used for testing and analyzing. It can be used for
- creation of key parameters - creation of key parameters
- creation of X.509 certificates, CSRs and CRLs - creation of X.509 certificates, CSRs and CRLs
- calculation of message digests - calculation of message digests
- encryption and decryption - encryption and decryption
- SSL/TLS client and server tests - SSL/TLS client and server tests
- handling of S/MIME signed or encrypted mail - handling of S/MIME signed or encrypted mail
- and more... - and more...
Download Download
======== ========
@@ -70,7 +67,6 @@ of the OpenSSL toolkit are available. In particular on Linux and other
Unix operating systems it is normally recommended to link against the Unix operating systems it is normally recommended to link against the
precompiled shared libraries provided by the distributor or vendor. precompiled shared libraries provided by the distributor or vendor.
For Testing and Development For Testing and Development
--------------------------- ---------------------------
@@ -86,22 +82,21 @@ which is updated automatically from the former on every commit.
A local copy of the Git Repository can be obtained by cloning it from A local copy of the Git Repository can be obtained by cloning it from
the original OpenSSL repository using the original OpenSSL repository using
git clone git://git.openssl.org/openssl.git git clone git://git.openssl.org/openssl.git
or from the GitHub mirror using or from the GitHub mirror using
git clone https://github.com/openssl/openssl.git git clone https://github.com/openssl/openssl.git
If you intend to contribute to OpenSSL, either to fix bugs or contribute If you intend to contribute to OpenSSL, either to fix bugs or contribute
new features, you need to fork the OpenSSL repository openssl/openssl on new features, you need to fork the OpenSSL repository openssl/openssl on
GitHub and clone your public fork instead. GitHub and clone your public fork instead.
git clone https://github.com/yourname/openssl.git git clone https://github.com/yourname/openssl.git
This is necessary, because all development of OpenSSL nowadays is done via This is necessary, because all development of OpenSSL nowadays is done via
GitHub pull requests. For more details, see [Contributing](#contributing). GitHub pull requests. For more details, see [Contributing](#contributing).
Build and Install Build and Install
================= =================
@@ -166,7 +161,6 @@ platform. The OpenSSL Project Pages at [openssl.github.io][] are a
valuable source of information if you want to get familiar with our valuable source of information if you want to get familiar with our
development process on GitHub. development process on GitHub.
Legalities Legalities
========== ==========
@@ -174,7 +168,6 @@ A number of nations restrict the use or export of cryptography. If you are
potentially subject to such restrictions you should seek legal advice before potentially subject to such restrictions you should seek legal advice before
attempting to develop or distribute cryptographic code. attempting to develop or distribute cryptographic code.
Copyright Copyright
========= =========
@@ -184,37 +177,34 @@ Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson
All rights reserved. All rights reserved.
<!-- Links --> <!-- Links -->
[www.openssl.org]: [www.openssl.org]:
https://www.openssl.org <https://www.openssl.org>
"OpenSSL Homepage" "OpenSSL Homepage"
[git.openssl.org]: [git.openssl.org]:
https://git.openssl.org <https://git.openssl.org>
"OpenSSL Git Repository" "OpenSSL Git Repository"
[git.openssl.org]: [git.openssl.org]:
https://git.openssl.org <https://git.openssl.org>
"OpenSSL Git Repository" "OpenSSL Git Repository"
[github.com/openssl/openssl]: [github.com/openssl/openssl]:
https://github.com/openssl/openssl <https://github.com/openssl/openssl>
"OpenSSL GitHub Mirror" "OpenSSL GitHub Mirror"
[openssl.github.io]: [openssl.github.io]:
https://mspncp.github.io <https://mspncp.github.io>
"OpenSSL Project Pages" "OpenSSL Project Pages"
[wiki.openssl.org]: [wiki.openssl.org]:
https://wiki.openssl.org <https://wiki.openssl.org>
"OpenSSL Wiki" "OpenSSL Wiki"
[RFC 8446]: [RFC 8446]:
https://tools.ietf.org/html/rfc8446 <https://tools.ietf.org/html/rfc8446>
<!-- Logos and Badges --> <!-- Logos and Badges -->
<!-- <!--
@@ -230,17 +220,17 @@ All rights reserved.
"OpenSSL Logo" "OpenSSL Logo"
[travis badge]: [travis badge]:
https://travis-ci.org/openssl/openssl.svg?branch=master <https://travis-ci.org/openssl/openssl.svg?branch=master>
"Travis Build Status" "Travis Build Status"
[travis jobs]: [travis jobs]:
https://travis-ci.org/openssl/openssl <https://travis-ci.org/openssl/openssl>
"Travis Jobs" "Travis Jobs"
[appveyor badge]: [appveyor badge]:
https://ci.appveyor.com/api/projects/status/ikn2l4u1xsume63u/branch/master?svg=true <https://ci.appveyor.com/api/projects/status/ikn2l4u1xsume63u/branch/master?svg=true>
"AppVeyor Build Status" "AppVeyor Build Status"
[appveyor jobs]: [appveyor jobs]:
https://ci.appveyor.com/project/openssl/openssl/branch/master <https://ci.appveyor.com/project/openssl/openssl/branch/master>
"AppVeyor Jobs" "AppVeyor Jobs"
+2 -13
View File
@@ -1,4 +1,3 @@
OpenSSL User Support resources OpenSSL User Support resources
============================== ==============================
@@ -7,7 +6,7 @@ _Under Construction; not more than a collection of text fragments yet._
See the OpenSSL website www.openssl.org for details on how to obtain See the OpenSSL website www.openssl.org for details on how to obtain
commercial technical support. Free community support is available through the commercial technical support. Free community support is available through the
openssl-users email list (see openssl-users email list (see
https://www.openssl.org/community/mailinglists.html for further details). <https://www.openssl.org/community/mailinglists.html for> further details).
If you have any problems with OpenSSL then please take the following steps If you have any problems with OpenSSL then please take the following steps
first: first:
@@ -32,8 +31,6 @@ Just because something doesn't work the way you expect does not mean it
is necessarily a bug in OpenSSL. Use the openssl-users email list for this type is necessarily a bug in OpenSSL. Use the openssl-users email list for this type
of query. of query.
For *questions* on how to use OpenSSL or what went wrong when you For *questions* on how to use OpenSSL or what went wrong when you
tried something, our primary resource is the mailing list tried something, our primary resource is the mailing list
openssl-users@openssl.org, where you can get help from others in the openssl-users@openssl.org, where you can get help from others in the
@@ -41,10 +38,7 @@ OpenSSL community (which includes the developers as time permits).
Only subscribers can post to openssl-users@openssl.org (although the Only subscribers can post to openssl-users@openssl.org (although the
archives are public). archives are public).
For more information, see https://www.openssl.org/community/mailinglists.html For more information, see <https://www.openssl.org/community/mailinglists.html>
You have general questions about using OpenSSL You have general questions about using OpenSSL
---------------------------------------------- ----------------------------------------------
@@ -97,10 +91,6 @@ pull request. The details are covered in the [Contributing](#contributing) secti
Don't hesitate to open a pull request, even if it's only a small change Don't hesitate to open a pull request, even if it's only a small change
like a grammatical or typographical error in the documentation. like a grammatical or typographical error in the documentation.
Mailing Lists Mailing Lists
============= =============
@@ -121,7 +111,6 @@ The openssl-dev list has been discontinued since development is now taking
place in form of GitHub pull requests. Although not active anymore, the place in form of GitHub pull requests. Although not active anymore, the
searchable archive may still contain useful information. searchable archive may still contain useful information.
<!-- Links --> <!-- Links -->
[mailing lists]: https://www.openssl.org/community/mailinglists.html [mailing lists]: https://www.openssl.org/community/mailinglists.html
+1 -1
View File
@@ -1,7 +1,7 @@
MAJOR=3 MAJOR=3
MINOR=0 MINOR=0
PATCH=0 PATCH=0
PRE_RELEASE_TAG=alpha2-dev PRE_RELEASE_TAG=alpha3-dev
BUILD_METADATA= BUILD_METADATA=
RELEASE_DATE="" RELEASE_DATE=""
SHLIB_VERSION=3 SHLIB_VERSION=3
+4 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -18,6 +18,9 @@
#include <openssl/pem.h> #include <openssl/pem.h>
#include <openssl/asn1t.h> #include <openssl/asn1t.h>
DEFINE_STACK_OF(ASN1_OBJECT)
DEFINE_STACK_OF_STRING()
typedef enum OPTION_choice { typedef enum OPTION_choice {
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
OPT_INFORM, OPT_IN, OPT_OUT, OPT_INDENT, OPT_NOOUT, OPT_INFORM, OPT_IN, OPT_OUT, OPT_INDENT, OPT_NOOUT,
+4 -1
View File
@@ -44,7 +44,7 @@ IF[{- !$disabled{'engine'} -}]
$OPENSSLSRC=$OPENSSLSRC engine.c $OPENSSLSRC=$OPENSSLSRC engine.c
ENDIF ENDIF
IF[{- !$disabled{'cmp'} -}] IF[{- !$disabled{'cmp'} -}]
$OPENSSLSRC=$OPENSSLSRC cmp_mock_srv.c $OPENSSLSRC=$OPENSSLSRC cmp.c cmp_mock_srv.c
ENDIF ENDIF
IF[{- !$disabled{apps} -}] IF[{- !$disabled{apps} -}]
@@ -59,6 +59,9 @@ IF[{- !$disabled{apps} -}]
# progs.pl tries to read all 'openssl' sources, including progs.c, so we make # progs.pl tries to read all 'openssl' sources, including progs.c, so we make
# sure things are generated in the correct order. # sure things are generated in the correct order.
DEPEND[progs.h]=progs.c DEPEND[progs.h]=progs.c
# Because the files to look through may change (depends on $OPENSSLSRC),
# always depend on a changed configuration.
DEPEND[progs.c]=../configdata.pm
IF[{- $config{target} =~ /^(?:Cygwin|mingw|VC-)/ -}] IF[{- $config{target} =~ /^(?:Cygwin|mingw|VC-)/ -}]
GENERATE[openssl.rc]=../util/mkrc.pl openssl GENERATE[openssl.rc]=../util/mkrc.pl openssl
+9 -5
View File
@@ -34,6 +34,11 @@
#include "apps.h" #include "apps.h"
#include "progs.h" #include "progs.h"
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_EXTENSION)
DEFINE_STACK_OF(CONF_VALUE)
DEFINE_STACK_OF_STRING()
#ifndef W_OK #ifndef W_OK
# define F_OK 0 # define F_OK 0
# define W_OK 2 # define W_OK 2
@@ -210,12 +215,12 @@ const OPTIONS ca_options[] = {
OPT_SECTION("Signing"), OPT_SECTION("Signing"),
{"md", OPT_MD, 's', "md to use; one of md2, md5, sha or sha1"}, {"md", OPT_MD, 's', "md to use; one of md2, md5, sha or sha1"},
{"keyfile", OPT_KEYFILE, 's', "Private key"}, {"keyfile", OPT_KEYFILE, 's', "Private key"},
{"keyform", OPT_KEYFORM, 'f', "Private key file format (PEM or ENGINE)"}, {"keyform", OPT_KEYFORM, 'f', "Private key file format (ENGINE, other values ignored)"},
{"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, {"passin", OPT_PASSIN, 's', "Input file pass phrase source"},
{"key", OPT_KEY, 's', "Key to decode the private key if it is encrypted"}, {"key", OPT_KEY, 's', "Key to decode the private key if it is encrypted"},
{"cert", OPT_CERT, '<', "The CA cert"}, {"cert", OPT_CERT, '<', "The CA cert"},
{"certform", OPT_CERTFORM, 'F', {"certform", OPT_CERTFORM, 'F',
"certificate input format (DER or PEM); default PEM"}, "certificate input format (DER/PEM/P12); has no effect"},
{"selfsign", OPT_SELFSIGN, '-', {"selfsign", OPT_SELFSIGN, '-',
"Sign a cert with the key associated with it"}, "Sign a cert with the key associated with it"},
{"sigopt", OPT_SIGOPT, 's', "Signature parameter in n:v form"}, {"sigopt", OPT_SIGOPT, 's', "Signature parameter in n:v form"},
@@ -380,7 +385,7 @@ opthelp:
certfile = opt_arg(); certfile = opt_arg();
break; break;
case OPT_CERTFORM: case OPT_CERTFORM:
if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &certformat)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &certformat))
goto opthelp; goto opthelp;
break; break;
case OPT_SELFSIGN: case OPT_SELFSIGN:
@@ -568,8 +573,7 @@ end_of_options:
} }
} }
pkey = load_key(keyfile, keyformat, 0, key, e, "CA private key"); pkey = load_key(keyfile, keyformat, 0, key, e, "CA private key");
if (key != NULL) cleanse(key);
OPENSSL_cleanse(key, strlen(key));
if (pkey == NULL) if (pkey == NULL)
/* load_key() has already printed an appropriate message */ /* load_key() has already printed an appropriate message */
goto end; goto end;
+2
View File
@@ -15,6 +15,8 @@
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/ssl.h> #include <openssl/ssl.h>
DEFINE_STACK_OF_CONST(SSL_CIPHER)
typedef enum OPTION_choice { typedef enum OPTION_choice {
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
OPT_STDNAME, OPT_STDNAME,
+3174
View File
@@ -0,0 +1,3174 @@
/*
* Copyright 2007-2020 The OpenSSL Project Authors. All Rights Reserved.
* Copyright Nokia 2007-2019
* Copyright Siemens AG 2015-2019
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#include <string.h>
#include <ctype.h>
#include "apps.h"
#include "http_server.h"
#include "s_apps.h"
#include "progs.h"
#include "cmp_mock_srv.h"
/* tweaks needed due to missing unistd.h on Windows */
#ifdef _WIN32
# define access _access
#endif
#ifndef F_OK
# define F_OK 0
#endif
#include <openssl/ui.h>
#include <openssl/pkcs12.h>
#include <openssl/ssl.h>
/* explicit #includes not strictly needed since implied by the above: */
#include <stdlib.h>
#include <openssl/cmp.h>
#include <openssl/cmp_util.h>
#include <openssl/crmf.h>
#include <openssl/crypto.h>
#include <openssl/err.h>
#include <openssl/store.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_EXTENSION)
DEFINE_STACK_OF(OSSL_CMP_ITAV)
static char *opt_config = NULL;
#define CMP_SECTION "cmp"
#define SECTION_NAME_MAX 40 /* max length of section name */
#define DEFAULT_SECTION "default"
static char *opt_section = CMP_SECTION;
#undef PROG
#define PROG cmp_main
static char *prog = "cmp";
static int read_config(void);
static CONF *conf = NULL; /* OpenSSL config file context structure */
static OSSL_CMP_CTX *cmp_ctx = NULL; /* the client-side CMP context */
/* the type of cmp command we want to send */
typedef enum {
CMP_IR,
CMP_KUR,
CMP_CR,
CMP_P10CR,
CMP_RR,
CMP_GENM
} cmp_cmd_t;
/* message transfer */
static char *opt_server = NULL;
static char server_port_s[32] = { '\0' };
static int server_port = 0;
static char *opt_proxy = NULL;
static char *opt_no_proxy = NULL;
static char *opt_path = "/";
static int opt_msg_timeout = -1;
static int opt_total_timeout = -1;
/* server authentication */
static char *opt_trusted = NULL;
static char *opt_untrusted = NULL;
static char *opt_srvcert = NULL;
static char *opt_recipient = NULL;
static char *opt_expect_sender = NULL;
static int opt_ignore_keyusage = 0;
static int opt_unprotected_errors = 0;
static char *opt_extracertsout = NULL;
static char *opt_cacertsout = NULL;
/* client authentication */
static char *opt_ref = NULL;
static char *opt_secret = NULL;
static char *opt_cert = NULL;
static char *opt_key = NULL;
static char *opt_keypass = NULL;
static char *opt_digest = NULL;
static char *opt_mac = NULL;
static char *opt_extracerts = NULL;
static int opt_unprotected_requests = 0;
/* generic message */
static char *opt_cmd_s = NULL;
static int opt_cmd = -1;
static char *opt_geninfo = NULL;
static char *opt_infotype_s = NULL;
static int opt_infotype = NID_undef;
/* certificate enrollment */
static char *opt_newkey = NULL;
static char *opt_newkeypass = NULL;
static char *opt_subject = NULL;
static char *opt_issuer = NULL;
static int opt_days = 0;
static char *opt_reqexts = NULL;
static char *opt_sans = NULL;
static int opt_san_nodefault = 0;
static char *opt_policies = NULL;
static char *opt_policy_oids = NULL;
static int opt_policy_oids_critical = 0;
static int opt_popo = OSSL_CRMF_POPO_NONE - 1;
static char *opt_csr = NULL;
static char *opt_out_trusted = NULL;
static int opt_implicit_confirm = 0;
static int opt_disable_confirm = 0;
static char *opt_certout = NULL;
/* certificate enrollment and revocation */
static char *opt_oldcert = NULL;
static int opt_revreason = CRL_REASON_NONE;
/* credentials format */
static char *opt_certform_s = "PEM";
static int opt_certform = FORMAT_PEM;
static char *opt_keyform_s = "PEM";
static int opt_keyform = FORMAT_PEM;
static char *opt_certsform_s = "PEM";
static int opt_certsform = FORMAT_PEM;
static char *opt_otherpass = NULL;
static char *opt_engine = NULL;
/* TLS connection */
static int opt_tls_used = 0;
static char *opt_tls_cert = NULL;
static char *opt_tls_key = NULL;
static char *opt_tls_keypass = NULL;
static char *opt_tls_extra = NULL;
static char *opt_tls_trusted = NULL;
static char *opt_tls_host = NULL;
/* client-side debugging */
static int opt_batch = 0;
static int opt_repeat = 1;
static char *opt_reqin = NULL;
static int opt_reqin_new_tid = 0;
static char *opt_reqout = NULL;
static char *opt_rspin = NULL;
static char *opt_rspout = NULL;
static int opt_use_mock_srv = 0;
/* server-side debugging */
static char *opt_port = NULL;
static int opt_max_msgs = 0;
static char *opt_srv_ref = NULL;
static char *opt_srv_secret = NULL;
static char *opt_srv_cert = NULL;
static char *opt_srv_key = NULL;
static char *opt_srv_keypass = NULL;
static char *opt_srv_trusted = NULL;
static char *opt_srv_untrusted = NULL;
static char *opt_rsp_cert = NULL;
static char *opt_rsp_extracerts = NULL;
static char *opt_rsp_capubs = NULL;
static int opt_poll_count = 0;
static int opt_check_after = 1;
static int opt_grant_implicitconf = 0;
static int opt_pkistatus = OSSL_CMP_PKISTATUS_accepted;
static int opt_failure = INT_MIN;
static int opt_failurebits = 0;
static char *opt_statusstring = NULL;
static int opt_send_error = 0;
static int opt_send_unprotected = 0;
static int opt_send_unprot_err = 0;
static int opt_accept_unprotected = 0;
static int opt_accept_unprot_err = 0;
static int opt_accept_raverified = 0;
static X509_VERIFY_PARAM *vpm = NULL;
typedef enum OPTION_choice {
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
OPT_CONFIG, OPT_SECTION,
OPT_CMD, OPT_INFOTYPE, OPT_GENINFO,
OPT_NEWKEY, OPT_NEWKEYPASS, OPT_SUBJECT, OPT_ISSUER,
OPT_DAYS, OPT_REQEXTS,
OPT_SANS, OPT_SAN_NODEFAULT,
OPT_POLICIES, OPT_POLICY_OIDS, OPT_POLICY_OIDS_CRITICAL,
OPT_POPO, OPT_CSR,
OPT_OUT_TRUSTED, OPT_IMPLICIT_CONFIRM, OPT_DISABLE_CONFIRM,
OPT_CERTOUT,
OPT_OLDCERT, OPT_REVREASON,
OPT_SERVER, OPT_PROXY, OPT_NO_PROXY, OPT_PATH,
OPT_MSG_TIMEOUT, OPT_TOTAL_TIMEOUT,
OPT_TRUSTED, OPT_UNTRUSTED, OPT_SRVCERT,
OPT_RECIPIENT, OPT_EXPECT_SENDER,
OPT_IGNORE_KEYUSAGE, OPT_UNPROTECTED_ERRORS,
OPT_EXTRACERTSOUT, OPT_CACERTSOUT,
OPT_REF, OPT_SECRET, OPT_CERT, OPT_KEY, OPT_KEYPASS,
OPT_DIGEST, OPT_MAC, OPT_EXTRACERTS,
OPT_UNPROTECTED_REQUESTS,
OPT_CERTFORM, OPT_KEYFORM, OPT_CERTSFORM,
OPT_OTHERPASS,
#ifndef OPENSSL_NO_ENGINE
OPT_ENGINE,
#endif
OPT_PROV_ENUM,
OPT_TLS_USED, OPT_TLS_CERT, OPT_TLS_KEY,
OPT_TLS_KEYPASS,
OPT_TLS_EXTRA, OPT_TLS_TRUSTED, OPT_TLS_HOST,
OPT_BATCH, OPT_REPEAT,
OPT_REQIN, OPT_REQIN_NEW_TID, OPT_REQOUT, OPT_RSPIN, OPT_RSPOUT,
OPT_USE_MOCK_SRV, OPT_PORT, OPT_MAX_MSGS,
OPT_SRV_REF, OPT_SRV_SECRET,
OPT_SRV_CERT, OPT_SRV_KEY, OPT_SRV_KEYPASS,
OPT_SRV_TRUSTED, OPT_SRV_UNTRUSTED,
OPT_RSP_CERT, OPT_RSP_EXTRACERTS, OPT_RSP_CAPUBS,
OPT_POLL_COUNT, OPT_CHECK_AFTER,
OPT_GRANT_IMPLICITCONF,
OPT_PKISTATUS, OPT_FAILURE,
OPT_FAILUREBITS, OPT_STATUSSTRING,
OPT_SEND_ERROR, OPT_SEND_UNPROTECTED,
OPT_SEND_UNPROT_ERR, OPT_ACCEPT_UNPROTECTED,
OPT_ACCEPT_UNPROT_ERR, OPT_ACCEPT_RAVERIFIED,
OPT_V_ENUM
} OPTION_CHOICE;
const OPTIONS cmp_options[] = {
/* entries must be in the same order as enumerated above!! */
{"help", OPT_HELP, '-', "Display this summary"},
{"config", OPT_CONFIG, 's',
"Configuration file to use. \"\" = none. Default from env variable OPENSSL_CONF"},
{"section", OPT_SECTION, 's',
"Section(s) in config file to get options from. \"\" = 'default'. Default 'cmp'"},
OPT_SECTION("Generic message"),
{"cmd", OPT_CMD, 's', "CMP request to send: ir/cr/kur/p10cr/rr/genm"},
{"infotype", OPT_INFOTYPE, 's',
"InfoType name for requesting specific info in genm, e.g. 'signKeyPairTypes'"},
{"geninfo", OPT_GENINFO, 's',
"generalInfo integer values to place in request PKIHeader with given OID"},
{OPT_MORE_STR, 0, 0,
"specified in the form <OID>:int:<n>, e.g. \"1.2.3:int:987\""},
OPT_SECTION("Certificate enrollment"),
{"newkey", OPT_NEWKEY, 's',
"Private or public key for the requested cert. Default: CSR key or client key"},
{"newkeypass", OPT_NEWKEYPASS, 's', "New private key pass phrase source"},
{"subject", OPT_SUBJECT, 's',
"Distinguished Name (DN) of subject to use in the requested cert template"},
{OPT_MORE_STR, 0, 0,
"For kur, default is the subject DN of the reference cert (see -oldcert);"},
{OPT_MORE_STR, 0, 0,
"this default is used for ir and cr only if no Subject Alt Names are set"},
{"issuer", OPT_ISSUER, 's',
"DN of the issuer to place in the requested certificate template"},
{OPT_MORE_STR, 0, 0,
"also used as recipient if neither -recipient nor -srvcert are given"},
{"days", OPT_DAYS, 'n',
"Requested validity time of the new certificate in number of days"},
{"reqexts", OPT_REQEXTS, 's',
"Name of config file section defining certificate request extensions"},
{"sans", OPT_SANS, 's',
"Subject Alt Names (IPADDR/DNS/URI) to add as (critical) cert req extension"},
{"san_nodefault", OPT_SAN_NODEFAULT, '-',
"Do not take default SANs from reference certificate (see -oldcert)"},
{"policies", OPT_POLICIES, 's',
"Name of config file section defining policies certificate request extension"},
{"policy_oids", OPT_POLICY_OIDS, 's',
"Policy OID(s) to add as policies certificate request extension"},
{"policy_oids_critical", OPT_POLICY_OIDS_CRITICAL, '-',
"Flag the policy OID(s) given with -policy_oids as critical"},
{"popo", OPT_POPO, 'n',
"Proof-of-Possession (POPO) method to use for ir/cr/kur where"},
{OPT_MORE_STR, 0, 0,
"-1 = NONE, 0 = RAVERIFIED, 1 = SIGNATURE (default), 2 = KEYENC"},
{"csr", OPT_CSR, 's',
"CSR file in PKCS#10 format to use in p10cr for legacy support"},
{"out_trusted", OPT_OUT_TRUSTED, 's',
"Certificates to trust when verifying newly enrolled certificates"},
{"implicit_confirm", OPT_IMPLICIT_CONFIRM, '-',
"Request implicit confirmation of newly enrolled certificates"},
{"disable_confirm", OPT_DISABLE_CONFIRM, '-',
"Do not confirm newly enrolled certificate w/o requesting implicit"},
{OPT_MORE_STR, 0, 0,
"confirmation. WARNING: This leads to behavior violating RFC 4210"},
{"certout", OPT_CERTOUT, 's',
"File to save newly enrolled certificate"},
OPT_SECTION("Certificate enrollment and revocation"),
{"oldcert", OPT_OLDCERT, 's',
"Certificate to be updated (defaulting to -cert) or to be revoked in rr;"},
{OPT_MORE_STR, 0, 0,
"also used as reference (defaulting to -cert) for subject DN and SANs."},
{OPT_MORE_STR, 0, 0,
"Its issuer is used as recipient unless -srvcert, -recipient or -issuer given"},
{"revreason", OPT_REVREASON, 'n',
"Reason code to include in revocation request (rr); possible values:"},
{OPT_MORE_STR, 0, 0,
"0..6, 8..10 (see RFC5280, 5.3.1) or -1. Default -1 = none included"},
OPT_SECTION("Message transfer"),
{"server", OPT_SERVER, 's',
"[http[s]://]address[:port] of CMP server. Default port 80 or 443."},
{OPT_MORE_STR, 0, 0,
"The address may be a DNS name or an IP address"},
{"proxy", OPT_PROXY, 's',
"[http[s]://]address[:port][/path] of HTTP(S) proxy to use; path is ignored"},
{"no_proxy", OPT_NO_PROXY, 's',
"List of addresses of servers not to use HTTP(S) proxy for"},
{OPT_MORE_STR, 0, 0,
"Default from environment variable 'no_proxy', else 'NO_PROXY', else none"},
{"path", OPT_PATH, 's',
"HTTP path (aka CMP alias) at the CMP server. Default \"/\""},
{"msg_timeout", OPT_MSG_TIMEOUT, 'n',
"Timeout per CMP message round trip (or 0 for none). Default 120 seconds"},
{"total_timeout", OPT_TOTAL_TIMEOUT, 'n',
"Overall time an enrollment incl. polling may take. Default 0 = infinite"},
OPT_SECTION("Server authentication"),
{"trusted", OPT_TRUSTED, 's',
"Trusted certs used for CMP server authentication when verifying responses"},
{OPT_MORE_STR, 0, 0, "unless -srvcert is given"},
{"untrusted", OPT_UNTRUSTED, 's',
"Intermediate certs for chain construction verifying CMP/TLS/enrolled certs"},
{"srvcert", OPT_SRVCERT, 's',
"Specific CMP server cert to use and trust directly when verifying responses"},
{"recipient", OPT_RECIPIENT, 's',
"Distinguished Name (DN) of the recipient to use unless -srvcert is given"},
{"expect_sender", OPT_EXPECT_SENDER, 's',
"DN of expected response sender. Defaults to DN of -srvcert, if provided"},
{"ignore_keyusage", OPT_IGNORE_KEYUSAGE, '-',
"Ignore CMP signer cert key usage, else 'digitalSignature' must be allowed"},
{"unprotected_errors", OPT_UNPROTECTED_ERRORS, '-',
"Accept missing or invalid protection of regular error messages and negative"},
{OPT_MORE_STR, 0, 0,
"certificate responses (ip/cp/kup), revocation responses (rp), and PKIConf"},
{OPT_MORE_STR, 0, 0,
"WARNING: This setting leads to behavior allowing violation of RFC 4210"},
{"extracertsout", OPT_EXTRACERTSOUT, 's',
"File to save extra certificates received in the extraCerts field"},
{"cacertsout", OPT_CACERTSOUT, 's',
"File to save CA certificates received in the caPubs field of 'ip' messages"},
OPT_SECTION("Client authentication"),
{"ref", OPT_REF, 's',
"Reference value to use as senderKID in case no -cert is given"},
{"secret", OPT_SECRET, 's',
"Password source for client authentication with a pre-shared key (secret)"},
{"cert", OPT_CERT, 's',
"Client's current certificate (needed unless using -secret for PBM);"},
{OPT_MORE_STR, 0, 0,
"any further certs included are appended in extraCerts field"},
{"key", OPT_KEY, 's', "Private key for the client's current certificate"},
{"keypass", OPT_KEYPASS, 's',
"Client private key (and cert and old cert file) pass phrase source"},
{"digest", OPT_DIGEST, 's',
"Digest to use in message protection and POPO signatures. Default \"sha256\""},
{"mac", OPT_MAC, 's',
"MAC algorithm to use in PBM-based message protection. Default \"hmac-sha1\""},
{"extracerts", OPT_EXTRACERTS, 's',
"Certificates to append in extraCerts field of outgoing messages"},
{"unprotected_requests", OPT_UNPROTECTED_REQUESTS, '-',
"Send messages without CMP-level protection"},
OPT_SECTION("Credentials format"),
{"certform", OPT_CERTFORM, 's',
"Format (PEM or DER) to use when saving a certificate to a file. Default PEM"},
{OPT_MORE_STR, 0, 0,
"This also determines format to use for writing (not supported for P12)"},
{"keyform", OPT_KEYFORM, 's',
"Format to assume when reading key files. Default PEM"},
{"certsform", OPT_CERTSFORM, 's',
"Format (PEM/DER/P12) to try first reading multiple certs. Default PEM"},
{"otherpass", OPT_OTHERPASS, 's',
"Pass phrase source potentially needed for loading certificates of others"},
#ifndef OPENSSL_NO_ENGINE
{"engine", OPT_ENGINE, 's',
"Use crypto engine with given identifier, possibly a hardware device."},
{OPT_MORE_STR, 0, 0,
"Engines may be defined in OpenSSL config file engine section."},
{OPT_MORE_STR, 0, 0,
"Options like -key specifying keys held in the engine can give key IDs"},
{OPT_MORE_STR, 0, 0,
"prefixed by 'engine:', e.g. '-key engine:pkcs11:object=mykey;pin-value=1234'"},
#endif
OPT_PROV_OPTIONS,
OPT_SECTION("TLS connection"),
{"tls_used", OPT_TLS_USED, '-',
"Enable using TLS (also when other TLS options are not set)"},
{"tls_cert", OPT_TLS_CERT, 's',
"Client's TLS certificate. May include chain to be provided to TLS server"},
{"tls_key", OPT_TLS_KEY, 's',
"Private key for the client's TLS certificate"},
{"tls_keypass", OPT_TLS_KEYPASS, 's',
"Pass phrase source for the client's private TLS key (and TLS cert file)"},
{"tls_extra", OPT_TLS_EXTRA, 's',
"Extra certificates to provide to TLS server during TLS handshake"},
{"tls_trusted", OPT_TLS_TRUSTED, 's',
"Trusted certificates to use for verifying the TLS server certificate;"},
{OPT_MORE_STR, 0, 0, "this implies host name validation"},
{"tls_host", OPT_TLS_HOST, 's',
"Address to be checked (rather than -server) during TLS host name validation"},
OPT_SECTION("Client-side debugging"),
{"batch", OPT_BATCH, '-',
"Do not interactively prompt for input when a password is required etc."},
{"repeat", OPT_REPEAT, 'n',
"Invoke the transaction the given number of times. Default 1"},
{"reqin", OPT_REQIN, 's', "Take sequence of CMP requests from file(s)"},
{"reqin_new_tid", OPT_REQIN_NEW_TID, '-',
"Use fresh transactionID for CMP requests read from -reqin"},
{"reqout", OPT_REQOUT, 's', "Save sequence of CMP requests to file(s)"},
{"rspin", OPT_RSPIN, 's',
"Process sequence of CMP responses provided in file(s), skipping server"},
{"rspout", OPT_RSPOUT, 's', "Save sequence of CMP responses to file(s)"},
{"use_mock_srv", OPT_USE_MOCK_SRV, '-', "Use mock server at API level, bypassing HTTP"},
OPT_SECTION("Mock server"),
{"port", OPT_PORT, 's', "Act as HTTP mock server listening on given port"},
{"max_msgs", OPT_MAX_MSGS, 'n',
"max number of messages handled by HTTP mock server. Default: 0 = unlimited"},
{"srv_ref", OPT_SRV_REF, 's',
"Reference value to use as senderKID of server in case no -srv_cert is given"},
{"srv_secret", OPT_SRV_SECRET, 's',
"Password source for server authentication with a pre-shared key (secret)"},
{"srv_cert", OPT_SRV_CERT, 's', "Certificate of the server"},
{"srv_key", OPT_SRV_KEY, 's',
"Private key used by the server for signing messages"},
{"srv_keypass", OPT_SRV_KEYPASS, 's',
"Server private key (and cert) file pass phrase source"},
{"srv_trusted", OPT_SRV_TRUSTED, 's',
"Trusted certificates for client authentication"},
{"srv_untrusted", OPT_SRV_UNTRUSTED, 's',
"Intermediate certs that may be useful for verifying CMP protection"},
{"rsp_cert", OPT_RSP_CERT, 's',
"Certificate to be returned as mock enrollment result"},
{"rsp_extracerts", OPT_RSP_EXTRACERTS, 's',
"Extra certificates to be included in mock certification responses"},
{"rsp_capubs", OPT_RSP_CAPUBS, 's',
"CA certificates to be included in mock ip response"},
{"poll_count", OPT_POLL_COUNT, 'n',
"Number of times the client must poll before receiving a certificate"},
{"check_after", OPT_CHECK_AFTER, 'n',
"The check_after value (time to wait) to include in poll response"},
{"grant_implicitconf", OPT_GRANT_IMPLICITCONF, '-',
"Grant implicit confirmation of newly enrolled certificate"},
{"pkistatus", OPT_PKISTATUS, 'n',
"PKIStatus to be included in server response. Possible values: 0..6"},
{"failure", OPT_FAILURE, 'n',
"A single failure info bit number to include in server response, 0..26"},
{"failurebits", OPT_FAILUREBITS, 'n',
"Number representing failure bits to include in server response, 0..2^27 - 1"},
{"statusstring", OPT_STATUSSTRING, 's',
"Status string to be included in server response"},
{"send_error", OPT_SEND_ERROR, '-',
"Force server to reply with error message"},
{"send_unprotected", OPT_SEND_UNPROTECTED, '-',
"Send response messages without CMP-level protection"},
{"send_unprot_err", OPT_SEND_UNPROT_ERR, '-',
"In case of negative responses, server shall send unprotected error messages,"},
{OPT_MORE_STR, 0, 0,
"certificate responses (ip/cp/kup), and revocation responses (rp)."},
{OPT_MORE_STR, 0, 0,
"WARNING: This setting leads to behavior violating RFC 4210"},
{"accept_unprotected", OPT_ACCEPT_UNPROTECTED, '-',
"Accept missing or invalid protection of requests"},
{"accept_unprot_err", OPT_ACCEPT_UNPROT_ERR, '-',
"Accept unprotected error messages from client"},
{"accept_raverified", OPT_ACCEPT_RAVERIFIED, '-',
"Accept RAVERIFIED as proof-of-possession (POPO)"},
OPT_V_OPTIONS,
{NULL}
};
typedef union {
char **txt;
int *num;
long *num_long;
} varref;
static varref cmp_vars[] = { /* must be in same order as enumerated above! */
{&opt_config}, {&opt_section},
{&opt_cmd_s}, {&opt_infotype_s}, {&opt_geninfo},
{&opt_newkey}, {&opt_newkeypass}, {&opt_subject}, {&opt_issuer},
{(char **)&opt_days}, {&opt_reqexts},
{&opt_sans}, {(char **)&opt_san_nodefault},
{&opt_policies}, {&opt_policy_oids}, {(char **)&opt_policy_oids_critical},
{(char **)&opt_popo}, {&opt_csr},
{&opt_out_trusted},
{(char **)&opt_implicit_confirm}, {(char **)&opt_disable_confirm},
{&opt_certout},
{&opt_oldcert}, {(char **)&opt_revreason},
{&opt_server}, {&opt_proxy}, {&opt_no_proxy}, {&opt_path},
{(char **)&opt_msg_timeout}, {(char **)&opt_total_timeout},
{&opt_trusted}, {&opt_untrusted}, {&opt_srvcert},
{&opt_recipient}, {&opt_expect_sender},
{(char **)&opt_ignore_keyusage}, {(char **)&opt_unprotected_errors},
{&opt_extracertsout}, {&opt_cacertsout},
{&opt_ref}, {&opt_secret}, {&opt_cert}, {&opt_key}, {&opt_keypass},
{&opt_digest}, {&opt_mac}, {&opt_extracerts},
{(char **)&opt_unprotected_requests},
{&opt_certform_s}, {&opt_keyform_s}, {&opt_certsform_s},
{&opt_otherpass},
#ifndef OPENSSL_NO_ENGINE
{&opt_engine},
#endif
{(char **)&opt_tls_used}, {&opt_tls_cert}, {&opt_tls_key},
{&opt_tls_keypass},
{&opt_tls_extra}, {&opt_tls_trusted}, {&opt_tls_host},
{(char **)&opt_batch}, {(char **)&opt_repeat},
{&opt_reqin}, {(char **)&opt_reqin_new_tid},
{&opt_reqout}, {&opt_rspin}, {&opt_rspout},
{(char **)&opt_use_mock_srv}, {&opt_port}, {(char **)&opt_max_msgs},
{&opt_srv_ref}, {&opt_srv_secret},
{&opt_srv_cert}, {&opt_srv_key}, {&opt_srv_keypass},
{&opt_srv_trusted}, {&opt_srv_untrusted},
{&opt_rsp_cert}, {&opt_rsp_extracerts}, {&opt_rsp_capubs},
{(char **)&opt_poll_count}, {(char **)&opt_check_after},
{(char **)&opt_grant_implicitconf},
{(char **)&opt_pkistatus}, {(char **)&opt_failure},
{(char **)&opt_failurebits}, {&opt_statusstring},
{(char **)&opt_send_error}, {(char **)&opt_send_unprotected},
{(char **)&opt_send_unprot_err}, {(char **)&opt_accept_unprotected},
{(char **)&opt_accept_unprot_err}, {(char **)&opt_accept_raverified},
{NULL}
};
#ifndef NDEBUG
# define FUNC (strcmp(OPENSSL_FUNC, "(unknown function)") == 0 \
? "CMP" : "OPENSSL_FUNC")
# define PRINT_LOCATION(bio) BIO_printf(bio, "%s:%s:%d:", \
FUNC, OPENSSL_FILE, OPENSSL_LINE)
#else
# define PRINT_LOCATION(bio) ((void)0)
#endif
#define CMP_print(bio, prefix, msg, a1, a2, a3) \
(PRINT_LOCATION(bio), \
BIO_printf(bio, "CMP %s: " msg "\n", prefix, a1, a2, a3))
#define CMP_INFO(msg, a1, a2, a3) CMP_print(bio_out, "info", msg, a1, a2, a3)
#define CMP_info(msg) CMP_INFO(msg"%s%s%s", "", "", "")
#define CMP_info1(msg, a1) CMP_INFO(msg"%s%s", a1, "", "")
#define CMP_info2(msg, a1, a2) CMP_INFO(msg"%s", a1, a2, "")
#define CMP_info3(msg, a1, a2, a3) CMP_INFO(msg, a1, a2, a3)
#define CMP_WARN(m, a1, a2, a3) CMP_print(bio_out, "warning", m, a1, a2, a3)
#define CMP_warn(msg) CMP_WARN(msg"%s%s%s", "", "", "")
#define CMP_warn1(msg, a1) CMP_WARN(msg"%s%s", a1, "", "")
#define CMP_warn2(msg, a1, a2) CMP_WARN(msg"%s", a1, a2, "")
#define CMP_warn3(msg, a1, a2, a3) CMP_WARN(msg, a1, a2, a3)
#define CMP_ERR(msg, a1, a2, a3) CMP_print(bio_err, "error", msg, a1, a2, a3)
#define CMP_err(msg) CMP_ERR(msg"%s%s%s", "", "", "")
#define CMP_err1(msg, a1) CMP_ERR(msg"%s%s", a1, "", "")
#define CMP_err2(msg, a1, a2) CMP_ERR(msg"%s", a1, a2, "")
#define CMP_err3(msg, a1, a2, a3) CMP_ERR(msg, a1, a2, a3)
static int print_to_bio_out(const char *func, const char *file, int line,
OSSL_CMP_severity level, const char *msg)
{
return OSSL_CMP_print_to_bio(bio_out, func, file, line, level, msg);
}
/* code duplicated from crypto/cmp/cmp_util.c */
static int sk_X509_add1_cert(STACK_OF(X509) *sk, X509 *cert,
int no_dup, int prepend)
{
if (no_dup) {
/*
* not using sk_X509_set_cmp_func() and sk_X509_find()
* because this re-orders the certs on the stack
*/
int i;
for (i = 0; i < sk_X509_num(sk); i++) {
if (X509_cmp(sk_X509_value(sk, i), cert) == 0)
return 1;
}
}
if (!X509_up_ref(cert))
return 0;
if (!sk_X509_insert(sk, cert, prepend ? 0 : -1)) {
X509_free(cert);
return 0;
}
return 1;
}
/* code duplicated from crypto/cmp/cmp_util.c */
static int sk_X509_add1_certs(STACK_OF(X509) *sk, STACK_OF(X509) *certs,
int no_self_signed, int no_dups, int prepend)
/* compiler would allow 'const' for the list of certs, yet they are up-ref'ed */
{
int i;
if (sk == NULL)
return 0;
if (certs == NULL)
return 1;
for (i = 0; i < sk_X509_num(certs); i++) {
X509 *cert = sk_X509_value(certs, i);
if (!no_self_signed || X509_check_issued(cert, cert) != X509_V_OK) {
if (!sk_X509_add1_cert(sk, cert, no_dups, prepend))
return 0;
}
}
return 1;
}
/* TODO potentially move to apps/lib/apps.c */
static char *next_item(char *opt) /* in list separated by comma and/or space */
{
/* advance to separator (comma or whitespace), if any */
while (*opt != ',' && !isspace(*opt) && *opt != '\0') {
if (*opt == '\\' && opt[1] != '\0')
/* skip and unescape '\' escaped char */
memmove(opt, opt + 1, strlen(opt));
opt++;
}
if (*opt != '\0') {
/* terminate current item */
*opt++ = '\0';
/* skip over any whitespace after separator */
while (isspace(*opt))
opt++;
}
return *opt == '\0' ? NULL : opt; /* NULL indicates end of input */
}
static EVP_PKEY *load_key_pwd(const char *uri, int format,
const char *pass, ENGINE *e, const char *desc)
{
char *pass_string = get_passwd(pass, desc);
EVP_PKEY *pkey = load_key(uri, format, 0, pass_string, e, desc);
clear_free(pass_string);
return pkey;
}
static X509 *load_cert_pwd(const char *uri, const char *pass, const char *desc)
{
X509 *cert;
char *pass_string = get_passwd(pass, desc);
cert = load_cert_pass(uri, 0, pass_string, desc);
clear_free(pass_string);
return cert;
}
/* TODO remove when PR #4930 is merged */
static int load_pkcs12(BIO *in, const char *desc,
pem_password_cb *pem_cb, void *cb_data,
EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca)
{
const char *pass;
char tpass[PEM_BUFSIZE];
int len;
int ret = 0;
PKCS12 *p12 = d2i_PKCS12_bio(in, NULL);
if (desc == NULL)
desc = "PKCS12 input";
if (p12 == NULL) {
BIO_printf(bio_err, "error loading PKCS12 file for %s\n", desc);
goto die;
}
/* See if an empty password will do */
if (PKCS12_verify_mac(p12, "", 0) || PKCS12_verify_mac(p12, NULL, 0)) {
pass = "";
} else {
if (pem_cb == NULL)
pem_cb = wrap_password_callback;
len = pem_cb(tpass, PEM_BUFSIZE, 0, cb_data);
if (len < 0) {
BIO_printf(bio_err, "passphrase callback error for %s\n", desc);
goto die;
}
if (len < PEM_BUFSIZE)
tpass[len] = 0;
if (!PKCS12_verify_mac(p12, tpass, len)) {
BIO_printf(bio_err,
"mac verify error (wrong password?) in PKCS12 file for %s\n",
desc);
goto die;
}
pass = tpass;
}
ret = PKCS12_parse(p12, pass, pkey, cert, ca);
die:
PKCS12_free(p12);
return ret;
}
/* TODO potentially move this and related functions to apps/lib/apps.c */
static int adjust_format(const char **infile, int format, int engine_ok)
{
if (!strncasecmp(*infile, "http://", 7)
|| !strncasecmp(*infile, "https://", 8)) {
format = FORMAT_HTTP;
} else if (engine_ok && strncasecmp(*infile, "engine:", 7) == 0) {
*infile += 7;
format = FORMAT_ENGINE;
} else {
if (strncasecmp(*infile, "file:", 5) == 0)
*infile += 5;
/*
* the following is a heuristic whether first to try PEM or DER
* or PKCS12 as the input format for files
*/
if (strlen(*infile) >= 4) {
const char *extension = *infile + strlen(*infile) - 4;
if (strncasecmp(extension, ".crt", 4) == 0
|| strncasecmp(extension, ".pem", 4) == 0)
/* weak recognition of PEM format */
format = FORMAT_PEM;
else if (strncasecmp(extension, ".cer", 4) == 0
|| strncasecmp(extension, ".der", 4) == 0)
/* weak recognition of DER format */
format = FORMAT_ASN1;
else if (strncasecmp(extension, ".p12", 4) == 0)
/* weak recognition of PKCS#12 format */
format = FORMAT_PKCS12;
/* else retain given format */
}
}
return format;
}
/*
* TODO potentially move this and related functions to apps/lib/
* or even better extend OSSL_STORE with type OSSL_STORE_INFO_CRL
*/
static X509_REQ *load_csr_autofmt(const char *infile, const char *desc)
{
X509_REQ *csr;
BIO *bio_bak = bio_err;
int can_retry;
int format = adjust_format(&infile, FORMAT_PEM, 0);
can_retry = format == FORMAT_PEM || format == FORMAT_ASN1;
if (can_retry)
bio_err = NULL; /* do not show errors on more than one try */
csr = load_csr(infile, format, desc);
bio_err = bio_bak;
if (csr == NULL && can_retry) {
ERR_clear_error();
format = (format == FORMAT_PEM ? FORMAT_ASN1 : FORMAT_PEM);
csr = load_csr(infile, format, desc);
}
if (csr == NULL) {
ERR_print_errors(bio_err);
BIO_printf(bio_err, "error: unable to load %s from file '%s'\n", desc,
infile);
}
return csr;
}
/* TODO replace by calling generalized load_certs() when PR #4930 is merged */
static int load_certs_preliminary(const char *file, STACK_OF(X509) **certs,
int format, const char *pass,
const char *desc)
{
X509 *cert = NULL;
int ret = 0;
if (format == FORMAT_PKCS12) {
BIO *bio = bio_open_default(file, 'r', format);
if (bio != NULL) {
EVP_PKEY *pkey = NULL; /* pkey is needed until PR #4930 is merged */
PW_CB_DATA cb_data;
cb_data.password = pass;
cb_data.prompt_info = file;
ret = load_pkcs12(bio, desc, wrap_password_callback,
&cb_data, &pkey, &cert, certs);
EVP_PKEY_free(pkey);
BIO_free(bio);
}
} else if (format == FORMAT_ASN1) { /* load only one cert in this case */
CMP_warn1("can load only one certificate in DER format from %s", file);
cert = load_cert_pass(file, 0, pass, desc);
}
if (format == FORMAT_PKCS12 || format == FORMAT_ASN1) {
if (cert) {
if (*certs == NULL)
*certs = sk_X509_new_null();
if (*certs != NULL)
ret = sk_X509_insert(*certs, cert, 0);
else
X509_free(cert);
}
} else {
ret = load_certs(file, certs, format, pass, desc);
}
return ret;
}
static void warn_certs_expired(const char *file, STACK_OF(X509) **certs)
{
int i, res;
X509 *cert;
char *subj;
for (i = 0; i < sk_X509_num(*certs); i++) {
cert = sk_X509_value(*certs, i);
res = X509_cmp_timeframe(vpm, X509_get0_notBefore(cert),
X509_get0_notAfter(cert));
if (res != 0) {
subj = X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0);
CMP_warn3("certificate from '%s' with subject '%s' %s", file, subj,
res > 0 ? "has expired" : "not yet valid");
OPENSSL_free(subj);
}
}
}
/*
* TODO potentially move this and related functions to apps/lib/
* or even better extend OSSL_STORE with type OSSL_STORE_INFO_CERTS
*/
static int load_certs_autofmt(const char *infile, STACK_OF(X509) **certs,
int exclude_http, const char *pass,
const char *desc)
{
int ret = 0;
char *pass_string;
BIO *bio_bak = bio_err;
int format = adjust_format(&infile, opt_certsform, 0);
if (exclude_http && format == FORMAT_HTTP) {
BIO_printf(bio_err, "error: HTTP retrieval not allowed for %s\n", desc);
return ret;
}
pass_string = get_passwd(pass, desc);
if (format != FORMAT_HTTP)
bio_err = NULL; /* do not show errors on more than one try */
ret = load_certs_preliminary(infile, certs, format, pass_string, desc);
bio_err = bio_bak;
if (!ret && format != FORMAT_HTTP) {
int format2 = format == FORMAT_PEM ? FORMAT_ASN1 : FORMAT_PEM;
ERR_clear_error();
ret = load_certs_preliminary(infile, certs, format2, pass_string, desc);
}
clear_free(pass_string);
if (ret)
warn_certs_expired(infile, certs);
return ret;
}
/* set expected host name/IP addr and clears the email addr in the given ts */
static int truststore_set_host_etc(X509_STORE *ts, char *host)
{
X509_VERIFY_PARAM *ts_vpm = X509_STORE_get0_param(ts);
/* first clear any host names, IP, and email addresses */
if (!X509_VERIFY_PARAM_set1_host(ts_vpm, NULL, 0)
|| !X509_VERIFY_PARAM_set1_ip(ts_vpm, NULL, 0)
|| !X509_VERIFY_PARAM_set1_email(ts_vpm, NULL, 0))
return 0;
X509_VERIFY_PARAM_set_hostflags(ts_vpm,
X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT |
X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
return (host != NULL && X509_VERIFY_PARAM_set1_ip_asc(ts_vpm, host))
|| X509_VERIFY_PARAM_set1_host(ts_vpm, host, 0);
}
static X509_STORE *sk_X509_to_store(X509_STORE *store /* may be NULL */,
const STACK_OF(X509) *certs /* may NULL */)
{
int i;
if (store == NULL)
store = X509_STORE_new();
if (store == NULL)
return NULL;
for (i = 0; i < sk_X509_num(certs); i++) {
if (!X509_STORE_add_cert(store, sk_X509_value(certs, i))) {
X509_STORE_free(store);
return NULL;
}
}
return store;
}
/* write OSSL_CMP_MSG DER-encoded to the specified file name item */
static int write_PKIMESSAGE(const OSSL_CMP_MSG *msg, char **filenames)
{
char *file;
BIO *bio;
if (msg == NULL || filenames == NULL) {
CMP_err("NULL arg to write_PKIMESSAGE");
return 0;
}
if (*filenames == NULL) {
CMP_err("Not enough file names provided for writing PKIMessage");
return 0;
}
file = *filenames;
*filenames = next_item(file);
bio = BIO_new_file(file, "wb");
if (bio == NULL) {
CMP_err1("Cannot open file '%s' for writing", file);
return 0;
}
if (i2d_OSSL_CMP_MSG_bio(bio, msg) < 0) {
CMP_err1("Cannot write PKIMessage to file '%s'", file);
BIO_free(bio);
return 0;
}
BIO_free(bio);
return 1;
}
/* read DER-encoded OSSL_CMP_MSG from the specified file name item */
static OSSL_CMP_MSG *read_PKIMESSAGE(char **filenames)
{
char *file;
BIO *bio;
OSSL_CMP_MSG *ret;
if (filenames == NULL) {
CMP_err("NULL arg to read_PKIMESSAGE");
return NULL;
}
if (*filenames == NULL) {
CMP_err("Not enough file names provided for reading PKIMessage");
return NULL;
}
file = *filenames;
*filenames = next_item(file);
bio = BIO_new_file(file, "rb");
if (bio == NULL) {
CMP_err1("Cannot open file '%s' for reading", file);
return NULL;
}
ret = d2i_OSSL_CMP_MSG_bio(bio, NULL);
if (ret == NULL)
CMP_err1("Cannot read PKIMessage from file '%s'", file);
BIO_free(bio);
return ret;
}
/*-
* Sends the PKIMessage req and on success place the response in *res
* basically like OSSL_CMP_MSG_http_perform(), but in addition allows
* to dump the sequence of requests and responses to files and/or
* to take the sequence of requests and responses from files.
*/
static OSSL_CMP_MSG *read_write_req_resp(OSSL_CMP_CTX *ctx,
const OSSL_CMP_MSG *req)
{
OSSL_CMP_MSG *req_new = NULL;
OSSL_CMP_MSG *res = NULL;
OSSL_CMP_PKIHEADER *hdr;
if (req != NULL && opt_reqout != NULL
&& !write_PKIMESSAGE(req, &opt_reqout))
goto err;
if (opt_reqin != NULL && opt_rspin == NULL) {
if ((req_new = read_PKIMESSAGE(&opt_reqin)) == NULL)
goto err;
/*-
* The transaction ID in req_new read from opt_reqin may not be fresh.
* In this case the server may complain "Transaction id already in use."
* The following workaround unfortunately requires re-protection.
*/
if (opt_reqin_new_tid
&& !OSSL_CMP_MSG_update_transactionID(ctx, req_new))
goto err;
}
if (opt_rspin != NULL) {
res = read_PKIMESSAGE(&opt_rspin);
} else {
const OSSL_CMP_MSG *actual_req = opt_reqin != NULL ? req_new : req;
res = opt_use_mock_srv
? OSSL_CMP_CTX_server_perform(ctx, actual_req)
: OSSL_CMP_MSG_http_perform(ctx, actual_req);
}
if (res == NULL)
goto err;
if (opt_reqin != NULL || opt_rspin != NULL) {
/* need to satisfy nonce and transactionID checks */
ASN1_OCTET_STRING *nonce;
ASN1_OCTET_STRING *tid;
hdr = OSSL_CMP_MSG_get0_header(res);
nonce = OSSL_CMP_HDR_get0_recipNonce(hdr);
tid = OSSL_CMP_HDR_get0_transactionID(hdr);
if (!OSSL_CMP_CTX_set1_senderNonce(ctx, nonce)
|| !OSSL_CMP_CTX_set1_transactionID(ctx, tid)) {
OSSL_CMP_MSG_free(res);
res = NULL;
goto err;
}
}
if (opt_rspout != NULL && !write_PKIMESSAGE(res, &opt_rspout)) {
OSSL_CMP_MSG_free(res);
res = NULL;
}
err:
OSSL_CMP_MSG_free(req_new);
return res;
}
/*
* parse string as integer value, not allowing trailing garbage, see also
* https://www.gnu.org/software/libc/manual/html_node/Parsing-of-Integers.html
*
* returns integer value, or INT_MIN on error
*/
static int atoint(const char *str)
{
char *tailptr;
long res = strtol(str, &tailptr, 10);
if ((*tailptr != '\0') || (res < INT_MIN) || (res > INT_MAX))
return INT_MIN;
else
return (int)res;
}
static int parse_addr(char **opt_string, int port, const char *name)
{
char *port_string;
if (strncasecmp(*opt_string, OSSL_HTTP_PREFIX,
strlen(OSSL_HTTP_PREFIX)) == 0) {
*opt_string += strlen(OSSL_HTTP_PREFIX);
} else if (strncasecmp(*opt_string, OSSL_HTTPS_PREFIX,
strlen(OSSL_HTTPS_PREFIX)) == 0) {
*opt_string += strlen(OSSL_HTTPS_PREFIX);
if (port == 0)
port = 443; /* == integer value of OSSL_HTTPS_PORT */
}
if ((port_string = strrchr(*opt_string, ':')) == NULL)
return port; /* using default */
*(port_string++) = '\0';
port = atoint(port_string);
if ((port <= 0) || (port > 65535)) {
CMP_err2("invalid %s port '%s' given, sane range 1-65535",
name, port_string);
return -1;
}
return port;
}
static int set1_store_parameters(X509_STORE *ts)
{
if (ts == NULL)
return 0;
/* copy vpm to store */
if (!X509_STORE_set1_param(ts, vpm /* may be NULL */)) {
BIO_printf(bio_err, "error setting verification parameters\n");
OSSL_CMP_CTX_print_errors(cmp_ctx);
return 0;
}
X509_STORE_set_verify_cb(ts, X509_STORE_CTX_print_verify_cb);
return 1;
}
static int set_name(const char *str,
int (*set_fn) (OSSL_CMP_CTX *ctx, const X509_NAME *name),
OSSL_CMP_CTX *ctx, const char *desc)
{
if (str != NULL) {
X509_NAME *n = parse_name(str, MBSTRING_ASC, 0);
if (n == NULL) {
CMP_err2("cannot parse %s DN '%s'", desc, str);
return 0;
}
if (!(*set_fn) (ctx, n)) {
X509_NAME_free(n);
CMP_err("out of memory");
return 0;
}
X509_NAME_free(n);
}
return 1;
}
static int set_gennames(OSSL_CMP_CTX *ctx, char *names, const char *desc)
{
char *next;
for (; names != NULL; names = next) {
GENERAL_NAME *n;
next = next_item(names);
if (strcmp(names, "critical") == 0) {
(void)OSSL_CMP_CTX_set_option(ctx,
OSSL_CMP_OPT_SUBJECTALTNAME_CRITICAL,
1);
continue;
}
/* try IP address first, then URI or domain name */
(void)ERR_set_mark();
n = a2i_GENERAL_NAME(NULL, NULL, NULL, GEN_IPADD, names, 0);
if (n == NULL)
n = a2i_GENERAL_NAME(NULL, NULL, NULL,
strchr(names, ':') != NULL ? GEN_URI : GEN_DNS,
names, 0);
(void)ERR_pop_to_mark();
if (n == NULL) {
CMP_err2("bad syntax of %s '%s'", desc, names);
return 0;
}
if (!OSSL_CMP_CTX_push1_subjectAltName(ctx, n)) {
GENERAL_NAME_free(n);
CMP_err("out of memory");
return 0;
}
GENERAL_NAME_free(n);
}
return 1;
}
/* TODO potentially move to apps/lib/apps.c */
/*
* create cert store structure with certificates read from given file(s)
* returns pointer to created X509_STORE on success, NULL on error
*/
static X509_STORE *load_certstore(char *input, const char *desc)
{
X509_STORE *store = NULL;
STACK_OF(X509) *certs = NULL;
if (input == NULL)
goto err;
while (input != NULL) {
char *next = next_item(input); \
if (!load_certs_autofmt(input, &certs, 1, opt_otherpass, desc)
|| !(store = sk_X509_to_store(store, certs))) {
/* CMP_err("out of memory"); */
X509_STORE_free(store);
store = NULL;
goto err;
}
sk_X509_pop_free(certs, X509_free);
certs = NULL;
input = next;
}
err:
sk_X509_pop_free(certs, X509_free);
return store;
}
/* TODO potentially move to apps/lib/apps.c */
static STACK_OF(X509) *load_certs_multifile(char *files,
const char *pass, const char *desc)
{
STACK_OF(X509) *certs = NULL;
STACK_OF(X509) *result = sk_X509_new_null();
if (files == NULL)
goto err;
if (result == NULL)
goto oom;
while (files != NULL) {
char *next = next_item(files);
if (!load_certs_autofmt(files, &certs, 0, pass, desc))
goto err;
if (!sk_X509_add1_certs(result, certs, 0, 1 /* no dups */, 0))
goto oom;
sk_X509_pop_free(certs, X509_free);
certs = NULL;
files = next;
}
return result;
oom:
BIO_printf(bio_err, "out of memory\n");
err:
sk_X509_pop_free(certs, X509_free);
sk_X509_pop_free(result, X509_free);
return NULL;
}
typedef int (*add_X509_stack_fn_t)(void *ctx, const STACK_OF(X509) *certs);
typedef int (*add_X509_fn_t)(void *ctx, const X509 *cert);
static int setup_certs(char *files, const char *desc, void *ctx,
add_X509_stack_fn_t addn_fn, add_X509_fn_t add1_fn)
{
int ret = 1;
if (files != NULL) {
STACK_OF(X509) *certs = load_certs_multifile(files, opt_otherpass,
desc);
if (certs == NULL) {
ret = 0;
} else {
if (addn_fn != NULL) {
ret = (*addn_fn)(ctx, certs);
} else {
int i;
for (i = 0; i < sk_X509_num(certs /* may be NULL */); i++)
ret &= (*add1_fn)(ctx, sk_X509_value(certs, i));
}
sk_X509_pop_free(certs, X509_free);
}
}
return ret;
}
/*
* parse and transform some options, checking their syntax.
* Returns 1 on success, 0 on error
*/
static int transform_opts(void)
{
if (opt_cmd_s != NULL) {
if (!strcmp(opt_cmd_s, "ir")) {
opt_cmd = CMP_IR;
} else if (!strcmp(opt_cmd_s, "kur")) {
opt_cmd = CMP_KUR;
} else if (!strcmp(opt_cmd_s, "cr")) {
opt_cmd = CMP_CR;
} else if (!strcmp(opt_cmd_s, "p10cr")) {
opt_cmd = CMP_P10CR;
} else if (!strcmp(opt_cmd_s, "rr")) {
opt_cmd = CMP_RR;
} else if (!strcmp(opt_cmd_s, "genm")) {
opt_cmd = CMP_GENM;
} else {
CMP_err1("unknown cmp command '%s'", opt_cmd_s);
return 0;
}
} else {
CMP_err("no cmp command to execute");
return 0;
}
#ifdef OPENSSL_NO_ENGINE
# define FORMAT_OPTIONS (OPT_FMT_PEMDER | OPT_FMT_PKCS12 | OPT_FMT_ENGINE)
#else
# define FORMAT_OPTIONS (OPT_FMT_PEMDER | OPT_FMT_PKCS12)
#endif
if (opt_keyform_s != NULL
&& !opt_format(opt_keyform_s, FORMAT_OPTIONS, &opt_keyform)) {
CMP_err("unknown option given for key loading format");
return 0;
}
#undef FORMAT_OPTIONS
if (opt_certform_s != NULL
&& !opt_format(opt_certform_s, OPT_FMT_PEMDER, &opt_certform)) {
CMP_err("unknown option given for certificate storing format");
return 0;
}
if (opt_certsform_s != NULL
&& !opt_format(opt_certsform_s, OPT_FMT_PEMDER | OPT_FMT_PKCS12,
&opt_certsform)) {
CMP_err("unknown option given for certificate list loading format");
return 0;
}
return 1;
}
static OSSL_CMP_SRV_CTX *setup_srv_ctx(ENGINE *e)
{
OSSL_CMP_CTX *ctx; /* extra CMP (client) ctx partly used by server */
OSSL_CMP_SRV_CTX *srv_ctx = ossl_cmp_mock_srv_new();
if (srv_ctx == NULL)
return NULL;
ctx = OSSL_CMP_SRV_CTX_get0_cmp_ctx(srv_ctx);
if (opt_srv_ref == NULL) {
if (opt_srv_cert == NULL) {
/* opt_srv_cert should determine the sender */
CMP_err("must give -srv_ref for server if no -srv_cert given");
goto err;
}
} else {
if (!OSSL_CMP_CTX_set1_referenceValue(ctx, (unsigned char *)opt_srv_ref,
strlen(opt_srv_ref)))
goto err;
}
if (opt_srv_secret != NULL) {
int res;
char *pass_str = get_passwd(opt_srv_secret, "PBMAC secret of server");
if (pass_str != NULL) {
cleanse(opt_srv_secret);
res = OSSL_CMP_CTX_set1_secretValue(ctx, (unsigned char *)pass_str,
strlen(pass_str));
clear_free(pass_str);
if (res == 0)
goto err;
}
} else if (opt_srv_cert == NULL) {
CMP_err("server credentials must be given if -use_mock_srv or -port is used");
goto err;
} else {
CMP_warn("server will not be able to handle PBM-protected requests since -srv_secret is not given");
}
if (opt_srv_secret == NULL
&& ((opt_srv_cert == NULL) != (opt_srv_key == NULL))) {
CMP_err("must give both -srv_cert and -srv_key options or neither");
goto err;
}
if (opt_srv_cert != NULL) {
X509 *srv_cert = load_cert_pwd(opt_srv_cert, opt_srv_keypass,
"certificate of the server");
if (srv_cert == NULL || !OSSL_CMP_CTX_set1_cert(ctx, srv_cert)) {
X509_free(srv_cert);
goto err;
}
X509_free(srv_cert);
}
if (opt_srv_key != NULL) {
EVP_PKEY *pkey = load_key_pwd(opt_srv_key, opt_keyform,
opt_srv_keypass,
e, "private key for server cert");
if (pkey == NULL || !OSSL_CMP_CTX_set1_pkey(ctx, pkey)) {
EVP_PKEY_free(pkey);
goto err;
}
EVP_PKEY_free(pkey);
}
cleanse(opt_srv_keypass);
if (opt_srv_trusted != NULL) {
X509_STORE *ts =
load_certstore(opt_srv_trusted, "certificates trusted by server");
if (ts == NULL)
goto err;
if (!set1_store_parameters(ts)
|| !truststore_set_host_etc(ts, NULL)
|| !OSSL_CMP_CTX_set0_trustedStore(ctx, ts)) {
X509_STORE_free(ts);
goto err;
}
} else {
CMP_warn("server will not be able to handle signature-protected requests since -srv_trusted is not given");
}
if (!setup_certs(opt_srv_untrusted, "untrusted certificates", ctx,
(add_X509_stack_fn_t)OSSL_CMP_CTX_set1_untrusted_certs,
NULL))
goto err;
if (opt_rsp_cert == NULL) {
CMP_err("must give -rsp_cert for mock server");
goto err;
} else {
X509 *cert = load_cert_pwd(opt_rsp_cert, opt_keypass,
"cert to be returned by the mock server");
if (cert == NULL)
goto err;
/* from server perspective the server is the client */
if (!ossl_cmp_mock_srv_set1_certOut(srv_ctx, cert)) {
X509_free(cert);
goto err;
}
X509_free(cert);
}
/* TODO find a cleaner solution not requiring type casts */
if (!setup_certs(opt_rsp_extracerts,
"CMP extra certificates for mock server", srv_ctx,
(add_X509_stack_fn_t)ossl_cmp_mock_srv_set1_chainOut,
NULL))
goto err;
if (!setup_certs(opt_rsp_capubs, "caPubs for mock server", srv_ctx,
(add_X509_stack_fn_t)ossl_cmp_mock_srv_set1_caPubsOut,
NULL))
goto err;
(void)ossl_cmp_mock_srv_set_pollCount(srv_ctx, opt_poll_count);
(void)ossl_cmp_mock_srv_set_checkAfterTime(srv_ctx, opt_check_after);
if (opt_grant_implicitconf)
(void)OSSL_CMP_SRV_CTX_set_grant_implicit_confirm(srv_ctx, 1);
if (opt_failure != INT_MIN) { /* option has been set explicity */
if (opt_failure < 0 || OSSL_CMP_PKIFAILUREINFO_MAX < opt_failure) {
CMP_err1("-failure out of range, should be >= 0 and <= %d",
OSSL_CMP_PKIFAILUREINFO_MAX);
goto err;
}
if (opt_failurebits != 0)
CMP_warn("-failurebits overrides -failure");
else
opt_failurebits = 1 << opt_failure;
}
if ((unsigned)opt_failurebits > OSSL_CMP_PKIFAILUREINFO_MAX_BIT_PATTERN) {
CMP_err("-failurebits out of range");
goto err;
}
if (!ossl_cmp_mock_srv_set_statusInfo(srv_ctx, opt_pkistatus,
opt_failurebits, opt_statusstring))
goto err;
if (opt_send_error)
(void)ossl_cmp_mock_srv_set_send_error(srv_ctx, 1);
if (opt_send_unprotected)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_UNPROTECTED_SEND, 1);
if (opt_send_unprot_err)
(void)OSSL_CMP_SRV_CTX_set_send_unprotected_errors(srv_ctx, 1);
if (opt_accept_unprotected)
(void)OSSL_CMP_SRV_CTX_set_accept_unprotected(srv_ctx, 1);
if (opt_accept_unprot_err)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_UNPROTECTED_ERRORS, 1);
if (opt_accept_raverified)
(void)OSSL_CMP_SRV_CTX_set_accept_raverified(srv_ctx, 1);
return srv_ctx;
err:
ossl_cmp_mock_srv_free(srv_ctx);
return NULL;
}
/*
* set up verification aspects of OSSL_CMP_CTX w.r.t. opts from config file/CLI.
* Returns pointer on success, NULL on error
*/
static int setup_verification_ctx(OSSL_CMP_CTX *ctx)
{
if (!setup_certs(opt_untrusted, "untrusted certificates", ctx,
(add_X509_stack_fn_t)OSSL_CMP_CTX_set1_untrusted_certs,
NULL))
goto err;
if (opt_srvcert != NULL || opt_trusted != NULL) {
X509_STORE *ts = NULL;
if (opt_srvcert != NULL) {
X509 *srvcert;
if (opt_trusted != NULL) {
CMP_warn("-trusted option is ignored since -srvcert option is present");
opt_trusted = NULL;
}
if (opt_recipient != NULL) {
CMP_warn("-recipient option is ignored since -srvcert option is present");
opt_recipient = NULL;
}
srvcert = load_cert_pwd(opt_srvcert, opt_otherpass,
"directly trusted CMP server certificate");
if (srvcert == NULL)
/*
* opt_otherpass is needed in case
* opt_srvcert is an encrypted PKCS#12 file
*/
goto err;
if (!OSSL_CMP_CTX_set1_srvCert(ctx, srvcert)) {
X509_free(srvcert);
goto oom;
}
X509_free(srvcert);
if ((ts = X509_STORE_new()) == NULL)
goto oom;
}
if (opt_trusted != NULL
&& (ts = load_certstore(opt_trusted, "trusted certificates"))
== NULL)
goto err;
if (!set1_store_parameters(ts) /* also copies vpm */
/*
* clear any expected host/ip/email address;
* opt_expect_sender is used instead
*/
|| !truststore_set_host_etc(ts, NULL)
|| !OSSL_CMP_CTX_set0_trustedStore(ctx, ts)) {
X509_STORE_free(ts);
goto oom;
}
}
if (opt_ignore_keyusage)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_IGNORE_KEYUSAGE, 1);
if (opt_unprotected_errors)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_UNPROTECTED_ERRORS, 1);
if (opt_out_trusted != NULL) { /* for use in OSSL_CMP_certConf_cb() */
X509_VERIFY_PARAM *out_vpm = NULL;
X509_STORE *out_trusted =
load_certstore(opt_out_trusted,
"trusted certs for verifying newly enrolled cert");
if (out_trusted == NULL)
goto err;
/* any -verify_hostname, -verify_ip, and -verify_email apply here */
if (!set1_store_parameters(out_trusted))
goto oom;
/* ignore any -attime here, new certs are current anyway */
out_vpm = X509_STORE_get0_param(out_trusted);
X509_VERIFY_PARAM_clear_flags(out_vpm, X509_V_FLAG_USE_CHECK_TIME);
(void)OSSL_CMP_CTX_set_certConf_cb_arg(ctx, out_trusted);
}
if (opt_disable_confirm)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_DISABLE_CONFIRM, 1);
if (opt_implicit_confirm)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_IMPLICIT_CONFIRM, 1);
(void)OSSL_CMP_CTX_set_certConf_cb(ctx, OSSL_CMP_certConf_cb);
return 1;
oom:
CMP_err("out of memory");
err:
return 0;
}
#ifndef OPENSSL_NO_SOCK
/*
* set up ssl_ctx for the OSSL_CMP_CTX based on options from config file/CLI.
* Returns pointer on success, NULL on error
*/
static SSL_CTX *setup_ssl_ctx(OSSL_CMP_CTX *ctx, ENGINE *e)
{
STACK_OF(X509) *untrusted_certs = OSSL_CMP_CTX_get0_untrusted_certs(ctx);
EVP_PKEY *pkey = NULL;
X509_STORE *trust_store = NULL;
SSL_CTX *ssl_ctx;
int i;
ssl_ctx = SSL_CTX_new(TLS_client_method());
if (ssl_ctx == NULL)
return NULL;
SSL_CTX_set_mode(ssl_ctx, SSL_MODE_AUTO_RETRY);
if (opt_tls_trusted != NULL) {
if ((trust_store = load_certstore(opt_tls_trusted,
"trusted TLS certificates")) == NULL)
goto err;
SSL_CTX_set_cert_store(ssl_ctx, trust_store);
/* for improved diagnostics on SSL_CTX_build_cert_chain() errors: */
X509_STORE_set_verify_cb(trust_store, X509_STORE_CTX_print_verify_cb);
}
if (opt_tls_cert != NULL && opt_tls_key != NULL) {
X509 *cert;
STACK_OF(X509) *certs = NULL;
if (!load_certs_autofmt(opt_tls_cert, &certs, 0, opt_tls_keypass,
"TLS client certificate (optionally with chain)"))
/*
* opt_tls_keypass is needed in case opt_tls_cert is an encrypted
* PKCS#12 file
*/
goto err;
cert = sk_X509_delete(certs, 0);
if (cert == NULL || SSL_CTX_use_certificate(ssl_ctx, cert) <= 0) {
CMP_err1("unable to use client TLS certificate file '%s'",
opt_tls_cert);
X509_free(cert);
sk_X509_pop_free(certs, X509_free);
goto err;
}
X509_free(cert); /* we do not need the handle any more */
/*
* Any further certs and any untrusted certs are used for constructing
* the client cert chain to be provided along with the TLS client cert
* to the TLS server.
*/
if (!SSL_CTX_set0_chain(ssl_ctx, certs)) {
CMP_err("could not set TLS client cert chain");
sk_X509_pop_free(certs, X509_free);
goto err;
}
for (i = 0; i < sk_X509_num(untrusted_certs); i++) {
cert = sk_X509_value(untrusted_certs, i);
if (!SSL_CTX_add1_chain_cert(ssl_ctx, cert)) {
CMP_err("could not add untrusted cert to TLS client cert chain");
goto err;
}
}
if (!SSL_CTX_build_cert_chain(ssl_ctx,
SSL_BUILD_CHAIN_FLAG_UNTRUSTED |
SSL_BUILD_CHAIN_FLAG_NO_ROOT)) {
CMP_warn("could not build cert chain for own TLS cert");
OSSL_CMP_CTX_print_errors(ctx);
}
/* If present we append to the list also the certs from opt_tls_extra */
if (opt_tls_extra != NULL) {
STACK_OF(X509) *tls_extra = load_certs_multifile(opt_tls_extra,
opt_otherpass,
"extra certificates for TLS");
int res = 1;
if (tls_extra == NULL)
goto err;
for (i = 0; i < sk_X509_num(tls_extra); i++) {
cert = sk_X509_value(tls_extra, i);
if (res != 0)
res = SSL_CTX_add_extra_chain_cert(ssl_ctx, cert);
if (res == 0)
X509_free(cert);
}
sk_X509_free(tls_extra);
if (res == 0) {
BIO_printf(bio_err, "error: unable to add TLS extra certs\n");
goto err;
}
}
pkey = load_key_pwd(opt_tls_key, opt_keyform, opt_tls_keypass,
e, "TLS client private key");
cleanse(opt_tls_keypass);
if (pkey == NULL)
goto err;
/*
* verify the key matches the cert,
* not using SSL_CTX_check_private_key(ssl_ctx)
* because it gives poor and sometimes misleading diagnostics
*/
if (!X509_check_private_key(SSL_CTX_get0_certificate(ssl_ctx),
pkey)) {
CMP_err2("TLS private key '%s' does not match the TLS certificate '%s'\n",
opt_tls_key, opt_tls_cert);
EVP_PKEY_free(pkey);
pkey = NULL; /* otherwise, for some reason double free! */
goto err;
}
if (SSL_CTX_use_PrivateKey(ssl_ctx, pkey) <= 0) {
CMP_err1("unable to use TLS client private key '%s'", opt_tls_key);
EVP_PKEY_free(pkey);
pkey = NULL; /* otherwise, for some reason double free! */
goto err;
}
EVP_PKEY_free(pkey); /* we do not need the handle any more */
}
if (opt_tls_trusted != NULL) {
/* enable and parameterize server hostname/IP address check */
if (!truststore_set_host_etc(trust_store,
opt_tls_host != NULL ?
opt_tls_host : opt_server))
/* TODO: is the server host name correct for TLS via proxy? */
goto err;
SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, NULL);
}
return ssl_ctx;
err:
SSL_CTX_free(ssl_ctx);
return NULL;
}
#endif
/*
* set up protection aspects of OSSL_CMP_CTX based on options from config
* file/CLI while parsing options and checking their consistency.
* Returns 1 on success, 0 on error
*/
static int setup_protection_ctx(OSSL_CMP_CTX *ctx, ENGINE *e)
{
if (!opt_unprotected_requests && opt_secret == NULL && opt_cert == NULL) {
CMP_err("must give client credentials unless -unprotected_requests is set");
goto err;
}
if (opt_ref == NULL && opt_cert == NULL && opt_subject == NULL) {
/* cert or subject should determine the sender */
CMP_err("must give -ref if no -cert and no -subject given");
goto err;
}
if (!opt_secret && ((opt_cert == NULL) != (opt_key == NULL))) {
CMP_err("must give both -cert and -key options or neither");
goto err;
}
if (opt_secret != NULL) {
char *pass_string = get_passwd(opt_secret, "PBMAC");
int res;
if (pass_string != NULL) {
cleanse(opt_secret);
res = OSSL_CMP_CTX_set1_secretValue(ctx,
(unsigned char *)pass_string,
strlen(pass_string));
clear_free(pass_string);
if (res == 0)
goto err;
}
if (opt_cert != NULL || opt_key != NULL)
CMP_warn("no signature-based protection used since -secret is given");
}
if (opt_ref != NULL
&& !OSSL_CMP_CTX_set1_referenceValue(ctx, (unsigned char *)opt_ref,
strlen(opt_ref)))
goto err;
if (opt_key != NULL) {
EVP_PKEY *pkey = load_key_pwd(opt_key, opt_keyform, opt_keypass, e,
"private key for CMP client certificate");
if (pkey == NULL || !OSSL_CMP_CTX_set1_pkey(ctx, pkey)) {
EVP_PKEY_free(pkey);
goto err;
}
EVP_PKEY_free(pkey);
}
if (opt_secret == NULL && opt_srvcert == NULL && opt_trusted == NULL) {
CMP_err("missing -secret or -srvcert or -trusted");
goto err;
}
if (opt_cert != NULL) {
X509 *cert;
STACK_OF(X509) *certs = NULL;
int ok;
if (!load_certs_autofmt(opt_cert, &certs, 0, opt_keypass,
"CMP client certificate (and optionally extra certs)"))
/* opt_keypass is needed if opt_cert is an encrypted PKCS#12 file */
goto err;
cert = sk_X509_delete(certs, 0);
if (cert == NULL) {
CMP_err("no client certificate found");
sk_X509_pop_free(certs, X509_free);
goto err;
}
ok = OSSL_CMP_CTX_set1_cert(ctx, cert);
X509_free(cert);
if (ok) {
/* add any remaining certs to the list of untrusted certs */
STACK_OF(X509) *untrusted = OSSL_CMP_CTX_get0_untrusted_certs(ctx);
ok = untrusted != NULL ?
sk_X509_add1_certs(untrusted, certs, 0, 1 /* no dups */, 0) :
OSSL_CMP_CTX_set1_untrusted_certs(ctx, certs);
}
sk_X509_pop_free(certs, X509_free);
if (!ok)
goto oom;
}
if (!setup_certs(opt_extracerts, "extra certificates for CMP", ctx,
(add_X509_stack_fn_t)OSSL_CMP_CTX_set1_extraCertsOut,
NULL))
goto err;
cleanse(opt_otherpass);
if (opt_unprotected_requests)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_UNPROTECTED_SEND, 1);
if (opt_digest != NULL) {
int digest = OBJ_ln2nid(opt_digest);
if (digest == NID_undef) {
CMP_err1("digest algorithm name not recognized: '%s'", opt_digest);
goto err;
}
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_DIGEST_ALGNID, digest);
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_OWF_ALGNID, digest);
}
if (opt_mac != NULL) {
int mac = OBJ_ln2nid(opt_mac);
if (mac == NID_undef) {
CMP_err1("MAC algorithm name not recognized: '%s'", opt_mac);
goto err;
}
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_MAC_ALGNID, mac);
}
return 1;
oom:
CMP_err("out of memory");
err:
return 0;
}
/*
* set up IR/CR/KUR/CertConf/RR specific parts of the OSSL_CMP_CTX
* based on options from config file/CLI.
* Returns pointer on success, NULL on error
*/
static int setup_request_ctx(OSSL_CMP_CTX *ctx, ENGINE *e)
{
if (opt_subject == NULL && opt_oldcert == NULL && opt_cert == NULL)
CMP_warn("no -subject given, neither -oldcert nor -cert available as default");
if (!set_name(opt_subject, OSSL_CMP_CTX_set1_subjectName, ctx, "subject")
|| !set_name(opt_issuer, OSSL_CMP_CTX_set1_issuer, ctx, "issuer"))
goto err;
if (opt_newkey != NULL) {
const char *file = opt_newkey;
const int format = opt_keyform;
const char *pass = opt_newkeypass;
const char *desc = "new private or public key for cert to be enrolled";
EVP_PKEY *pkey = load_key_pwd(file, format, pass, e, NULL);
int priv = 1;
if (pkey == NULL) {
ERR_clear_error();
pkey = load_pubkey(file, format, 0, pass, e, desc);
priv = 0;
}
cleanse(opt_newkeypass);
if (pkey == NULL || !OSSL_CMP_CTX_set0_newPkey(ctx, priv, pkey)) {
EVP_PKEY_free(pkey);
goto err;
}
}
if (opt_days > 0)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_VALIDITY_DAYS,
opt_days);
if (opt_policies != NULL && opt_policy_oids != NULL) {
CMP_err("cannot have policies both via -policies and via -policy_oids");
goto err;
}
if (opt_reqexts != NULL || opt_policies != NULL) {
X509V3_CTX ext_ctx;
X509_EXTENSIONS *exts = sk_X509_EXTENSION_new_null();
if (exts == NULL)
goto err;
X509V3_set_ctx(&ext_ctx, NULL, NULL, NULL, NULL, 0);
X509V3_set_nconf(&ext_ctx, conf);
if (opt_reqexts != NULL
&& !X509V3_EXT_add_nconf_sk(conf, &ext_ctx, opt_reqexts, &exts)) {
CMP_err1("cannot load certificate request extension section '%s'",
opt_reqexts);
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
goto err;
}
if (opt_policies != NULL
&& !X509V3_EXT_add_nconf_sk(conf, &ext_ctx, opt_policies, &exts)) {
CMP_err1("cannot load policy cert request extension section '%s'",
opt_policies);
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
goto err;
}
OSSL_CMP_CTX_set0_reqExtensions(ctx, exts);
}
if (OSSL_CMP_CTX_reqExtensions_have_SAN(ctx) && opt_sans != NULL) {
CMP_err("cannot have Subject Alternative Names both via -reqexts and via -sans");
goto err;
}
if (!set_gennames(ctx, opt_sans, "Subject Alternative Name"))
goto err;
if (opt_san_nodefault) {
if (opt_sans != NULL)
CMP_warn("-opt_san_nodefault has no effect when -sans is used");
(void)OSSL_CMP_CTX_set_option(ctx,
OSSL_CMP_OPT_SUBJECTALTNAME_NODEFAULT, 1);
}
if (opt_policy_oids_critical) {
if (opt_policy_oids == NULL)
CMP_warn("-opt_policy_oids_critical has no effect unless -policy_oids is given");
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_POLICIES_CRITICAL, 1);
}
while (opt_policy_oids != NULL) {
ASN1_OBJECT *policy;
POLICYINFO *pinfo;
char *next = next_item(opt_policy_oids);
if ((policy = OBJ_txt2obj(opt_policy_oids, 1)) == 0) {
CMP_err1("unknown policy OID '%s'", opt_policy_oids);
goto err;
}
if ((pinfo = POLICYINFO_new()) == NULL) {
ASN1_OBJECT_free(policy);
goto err;
}
pinfo->policyid = policy;
if (!OSSL_CMP_CTX_push0_policy(ctx, pinfo)) {
CMP_err1("cannot add policy with OID '%s'", opt_policy_oids);
POLICYINFO_free(pinfo);
goto err;
}
opt_policy_oids = next;
}
if (opt_popo >= OSSL_CRMF_POPO_NONE)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_POPO_METHOD, opt_popo);
if (opt_csr != NULL) {
if (opt_cmd != CMP_P10CR) {
CMP_warn("-csr option is ignored for command other than p10cr");
} else {
X509_REQ *csr =
load_csr_autofmt(opt_csr, "PKCS#10 CSR for p10cr");
if (csr == NULL)
goto err;
if (!OSSL_CMP_CTX_set1_p10CSR(ctx, csr)) {
X509_REQ_free(csr);
goto oom;
}
X509_REQ_free(csr);
}
}
if (opt_oldcert != NULL) {
X509 *oldcert = load_cert_pwd(opt_oldcert, opt_keypass,
"certificate to be updated/revoked");
/* opt_keypass is needed if opt_oldcert is an encrypted PKCS#12 file */
if (oldcert == NULL)
goto err;
if (!OSSL_CMP_CTX_set1_oldCert(ctx, oldcert)) {
X509_free(oldcert);
goto oom;
}
X509_free(oldcert);
}
cleanse(opt_keypass);
if (opt_revreason > CRL_REASON_NONE)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_REVOCATION_REASON,
opt_revreason);
return 1;
oom:
CMP_err("out of memory");
err:
return 0;
}
static int handle_opt_geninfo(OSSL_CMP_CTX *ctx)
{
long value;
ASN1_OBJECT *type;
ASN1_INTEGER *aint;
ASN1_TYPE *val;
OSSL_CMP_ITAV *itav;
char *endstr;
char *valptr = strchr(opt_geninfo, ':');
if (valptr == NULL) {
CMP_err("missing ':' in -geninfo option");
return 0;
}
valptr[0] = '\0';
valptr++;
if (strncasecmp(valptr, "int:", 4) != 0) {
CMP_err("missing 'int:' in -geninfo option");
return 0;
}
valptr += 4;
value = strtol(valptr, &endstr, 10);
if (endstr == valptr || *endstr != '\0') {
CMP_err("cannot parse int in -geninfo option");
return 0;
}
type = OBJ_txt2obj(opt_geninfo, 1);
if (type == NULL) {
CMP_err("cannot parse OID in -geninfo option");
return 0;
}
aint = ASN1_INTEGER_new();
if (aint == NULL || !ASN1_INTEGER_set(aint, value))
goto oom;
val = ASN1_TYPE_new();
if (val == NULL) {
ASN1_INTEGER_free(aint);
goto oom;
}
ASN1_TYPE_set(val, V_ASN1_INTEGER, aint);
itav = OSSL_CMP_ITAV_create(type, val);
if (itav == NULL) {
ASN1_TYPE_free(val);
goto oom;
}
if (!OSSL_CMP_CTX_push0_geninfo_ITAV(ctx, itav)) {
OSSL_CMP_ITAV_free(itav);
return 0;
}
return 1;
oom:
CMP_err("out of memory");
return 0;
}
/*
* set up the client-side OSSL_CMP_CTX based on options from config file/CLI
* while parsing options and checking their consistency.
* Prints reason for error to bio_err.
* Returns 1 on success, 0 on error
*/
static int setup_client_ctx(OSSL_CMP_CTX *ctx, ENGINE *e)
{
int ret = 0;
char server_buf[200] = { '\0' };
char proxy_buf[200] = { '\0' };
char *proxy_host = NULL;
char *proxy_port_str = NULL;
if (opt_server == NULL) {
CMP_err("missing server address[:port]");
goto err;
} else if ((server_port =
parse_addr(&opt_server, server_port, "server")) < 0) {
goto err;
}
if (server_port != 0)
BIO_snprintf(server_port_s, sizeof(server_port_s), "%d", server_port);
if (!OSSL_CMP_CTX_set1_server(ctx, opt_server)
|| !OSSL_CMP_CTX_set_serverPort(ctx, server_port)
|| !OSSL_CMP_CTX_set1_serverPath(ctx, opt_path))
goto oom;
if (opt_proxy != NULL && !OSSL_CMP_CTX_set1_proxy(ctx, opt_proxy))
goto oom;
(void)BIO_snprintf(server_buf, sizeof(server_buf), "http%s://%s%s%s/%s",
opt_tls_used ? "s" : "", opt_server,
server_port == 0 ? "" : ":", server_port_s,
opt_path[0] == '/' ? opt_path + 1 : opt_path);
if (opt_proxy != NULL)
(void)BIO_snprintf(proxy_buf, sizeof(proxy_buf), " via %s", opt_proxy);
CMP_info2("will contact %s%s", server_buf, proxy_buf);
if (!transform_opts())
goto err;
if (opt_cmd == CMP_IR || opt_cmd == CMP_CR || opt_cmd == CMP_KUR) {
if (opt_newkey == NULL && opt_key == NULL && opt_csr == NULL) {
CMP_err("missing -newkey (or -key) to be certified");
goto err;
}
if (opt_certout == NULL) {
CMP_err("-certout not given, nowhere to save certificate");
goto err;
}
}
if (opt_cmd == CMP_KUR) {
char *ref_cert = opt_oldcert != NULL ? opt_oldcert : opt_cert;
if (ref_cert == NULL) {
CMP_err("missing -oldcert option for certificate to be updated");
goto err;
}
if (opt_subject != NULL)
CMP_warn2("-subject '%s' given, which overrides the subject of '%s' in KUR",
opt_subject, ref_cert);
}
if (opt_cmd == CMP_RR && opt_oldcert == NULL) {
CMP_err("missing certificate to be revoked");
goto err;
}
if (opt_cmd == CMP_P10CR && opt_csr == NULL) {
CMP_err("missing PKCS#10 CSR for p10cr");
goto err;
}
if (opt_recipient == NULL && opt_srvcert == NULL && opt_issuer == NULL
&& opt_oldcert == NULL && opt_cert == NULL)
CMP_warn("missing -recipient, -srvcert, -issuer, -oldcert or -cert; recipient will be set to \"NULL-DN\"");
if (opt_infotype_s != NULL) {
char id_buf[100] = "id-it-";
strncat(id_buf, opt_infotype_s, sizeof(id_buf) - strlen(id_buf) - 1);
if ((opt_infotype = OBJ_sn2nid(id_buf)) == NID_undef) {
CMP_err("unknown OID name in -infotype option");
goto err;
}
}
if (!setup_verification_ctx(ctx))
goto err;
if (opt_msg_timeout >= 0) /* must do this before setup_ssl_ctx() */
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_MSG_TIMEOUT,
opt_msg_timeout);
if (opt_total_timeout >= 0)
(void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_TOTAL_TIMEOUT,
opt_total_timeout);
if (opt_reqin != NULL && opt_rspin != NULL)
CMP_warn("-reqin is ignored since -rspin is present");
if (opt_reqin_new_tid && opt_reqin == NULL)
CMP_warn("-reqin_new_tid is ignored since -reqin is not present");
if (opt_reqin != NULL || opt_reqout != NULL
|| opt_rspin != NULL || opt_rspout != NULL || opt_use_mock_srv)
(void)OSSL_CMP_CTX_set_transfer_cb(ctx, read_write_req_resp);
if ((opt_tls_cert != NULL || opt_tls_key != NULL
|| opt_tls_keypass != NULL || opt_tls_extra != NULL
|| opt_tls_trusted != NULL || opt_tls_host != NULL)
&& !opt_tls_used)
CMP_warn("TLS options(s) given but not -tls_used");
if (opt_tls_used) {
#ifdef OPENSSL_NO_SOCK
BIO_printf(bio_err, "Cannot use TLS - sockets not supported\n");
goto err;
#else
APP_HTTP_TLS_INFO *info;
if (opt_tls_cert != NULL
|| opt_tls_key != NULL || opt_tls_keypass != NULL) {
if (opt_tls_key == NULL) {
CMP_err("missing -tls_key option");
goto err;
} else if (opt_tls_cert == NULL) {
CMP_err("missing -tls_cert option");
goto err;
}
}
if (opt_use_mock_srv) {
CMP_err("cannot use TLS options together with -use_mock_srv");
goto err;
}
if ((info = OPENSSL_zalloc(sizeof(*info))) == NULL)
goto err;
(void)OSSL_CMP_CTX_set_http_cb_arg(ctx, info);
/* info will be freed along with CMP ctx */
info->server = opt_server;
info->port = server_port_s;
info->use_proxy = opt_proxy != NULL;
info->timeout = OSSL_CMP_CTX_get_option(ctx, OSSL_CMP_OPT_MSG_TIMEOUT);
info->ssl_ctx = setup_ssl_ctx(ctx, e);
if (info->ssl_ctx == NULL)
goto err;
(void)OSSL_CMP_CTX_set_http_cb(ctx, app_http_tls_cb);
#endif
}
if (!setup_protection_ctx(ctx, e))
goto err;
if (!setup_request_ctx(ctx, e))
goto err;
if (!set_name(opt_recipient, OSSL_CMP_CTX_set1_recipient, ctx, "recipient")
|| !set_name(opt_expect_sender, OSSL_CMP_CTX_set1_expected_sender,
ctx, "expected sender"))
goto oom;
if (opt_geninfo != NULL && !handle_opt_geninfo(ctx))
goto err;
ret = 1;
err:
OPENSSL_free(proxy_host);
OPENSSL_free(proxy_port_str);
return ret;
oom:
CMP_err("out of memory");
goto err;
}
/*
* write out the given certificate to the output specified by bio.
* Depending on options use either PEM or DER format.
* Returns 1 on success, 0 on error
*/
static int write_cert(BIO *bio, X509 *cert)
{
if ((opt_certform == FORMAT_PEM && PEM_write_bio_X509(bio, cert))
|| (opt_certform == FORMAT_ASN1 && i2d_X509_bio(bio, cert)))
return 1;
if (opt_certform != FORMAT_PEM && opt_certform != FORMAT_ASN1)
BIO_printf(bio_err,
"error: unsupported type '%s' for writing certificates\n",
opt_certform_s);
return 0;
}
/*
* writes out a stack of certs to the given file.
* Depending on options use either PEM or DER format,
* where DER does not make much sense for writing more than one cert!
* Returns number of written certificates on success, 0 on error.
*/
static int save_certs(OSSL_CMP_CTX *ctx,
STACK_OF(X509) *certs, char *destFile, char *desc)
{
BIO *bio = NULL;
int i;
int n = sk_X509_num(certs);
CMP_info3("received %d %s certificate(s), saving to file '%s'",
n, desc, destFile);
if (n > 1 && opt_certform != FORMAT_PEM)
CMP_warn("saving more than one certificate in non-PEM format");
if (destFile == NULL || (bio = BIO_new(BIO_s_file())) == NULL
|| !BIO_write_filename(bio, (char *)destFile)) {
CMP_err1("could not open file '%s' for writing", destFile);
n = -1;
goto err;
}
for (i = 0; i < n; i++) {
if (!write_cert(bio, sk_X509_value(certs, i))) {
CMP_err1("cannot write certificate to file '%s'", destFile);
n = -1;
goto err;
}
}
err:
BIO_free(bio);
return n;
}
static void print_itavs(STACK_OF(OSSL_CMP_ITAV) *itavs)
{
OSSL_CMP_ITAV *itav = NULL;
char buf[128];
int i;
int n = sk_OSSL_CMP_ITAV_num(itavs); /* itavs == NULL leads to 0 */
if (n == 0) {
CMP_info("genp contains no ITAV");
return;
}
for (i = 0; i < n; i++) {
itav = sk_OSSL_CMP_ITAV_value(itavs, i);
OBJ_obj2txt(buf, 128, OSSL_CMP_ITAV_get0_type(itav), 0);
CMP_info1("genp contains ITAV of type: %s", buf);
}
}
static char opt_item[SECTION_NAME_MAX + 1];
/* get previous name from a comma-separated list of names */
static const char *prev_item(const char *opt, const char *end)
{
const char *beg;
size_t len;
if (end == opt)
return NULL;
beg = end;
while (beg != opt && beg[-1] != ',' && !isspace(beg[-1]))
beg--;
len = end - beg;
if (len > SECTION_NAME_MAX)
len = SECTION_NAME_MAX;
strncpy(opt_item, beg, len);
opt_item[SECTION_NAME_MAX] = '\0'; /* avoid gcc v8 O3 stringop-truncation */
opt_item[len] = '\0';
if (len > SECTION_NAME_MAX)
CMP_warn2("using only first %d characters of section name starting with \"%s\"",
SECTION_NAME_MAX, opt_item);
while (beg != opt && (beg[-1] == ',' || isspace(beg[-1])))
beg--;
return beg;
}
/* get str value for name from a comma-separated hierarchy of config sections */
static char *conf_get_string(const CONF *src_conf, const char *groups,
const char *name)
{
char *res = NULL;
const char *end = groups + strlen(groups);
while ((end = prev_item(groups, end)) != NULL) {
if ((res = NCONF_get_string(src_conf, opt_item, name)) != NULL)
return res;
}
return res;
}
/* get long val for name from a comma-separated hierarchy of config sections */
static int conf_get_number_e(const CONF *conf_, const char *groups,
const char *name, long *result)
{
char *str = conf_get_string(conf_, groups, name);
char *tailptr;
long res;
if (str == NULL || *str == '\0')
return 0;
res = strtol(str, &tailptr, 10);
if (res == LONG_MIN || res == LONG_MAX || *tailptr != '\0')
return 0;
*result = res;
return 1;
}
/*
* use the command line option table to read values from the CMP section
* of openssl.cnf. Defaults are taken from the config file, they can be
* overwritten on the command line.
*/
static int read_config(void)
{
unsigned int i;
long num = 0;
char *txt = NULL;
const OPTIONS *opt;
int provider_option;
int verification_option;
/*
* starting with offset OPT_SECTION because OPT_CONFIG and OPT_SECTION would
* not make sense within the config file. They have already been handled.
*/
for (i = OPT_SECTION - OPT_HELP, opt = &cmp_options[OPT_SECTION];
opt->name; i++, opt++) {
if (!strcmp(opt->name, OPT_SECTION_STR)
|| !strcmp(opt->name, OPT_MORE_STR)) {
i--;
continue;
}
provider_option = (OPT_PROV__FIRST <= opt->retval
&& opt->retval < OPT_PROV__LAST);
verification_option = (OPT_V__FIRST <= opt->retval
&& opt->retval < OPT_V__LAST);
if (provider_option || verification_option)
i--;
if (cmp_vars[i].txt == NULL) {
CMP_err1("internal: cmp_vars array too short, i=%d", i);
return 0;
}
switch (opt->valtype) {
case '-':
case 'n':
case 'l':
if (!conf_get_number_e(conf, opt_section, opt->name, &num)) {
ERR_clear_error();
continue; /* option not provided */
}
break;
/*
* do not use '<' in cmp_options. Incorrect treatment
* somewhere in args_verify() can wrongly set badarg = 1
*/
case '<':
case 's':
case 'M':
txt = conf_get_string(conf, opt_section, opt->name);
if (txt == NULL) {
ERR_clear_error();
continue; /* option not provided */
}
break;
default:
CMP_err2("internal: unsupported type '%c' for option '%s'",
opt->valtype, opt->name);
return 0;
break;
}
if (provider_option || verification_option) {
int conf_argc = 1;
char *conf_argv[3];
char arg1[82];
BIO_snprintf(arg1, 81, "-%s", (char *)opt->name);
conf_argv[0] = prog;
conf_argv[1] = arg1;
if (opt->valtype == '-') {
if (num != 0)
conf_argc = 2;
} else {
conf_argc = 3;
conf_argv[2] = conf_get_string(conf, opt_section, opt->name);
/* not NULL */
}
if (conf_argc > 1) {
(void)opt_init(conf_argc, conf_argv, cmp_options);
if (provider_option
? !opt_provider(opt_next())
: !opt_verify(opt_next(), vpm)) {
CMP_err2("for option '%s' in config file section '%s'",
opt->name, opt_section);
return 0;
}
}
} else {
switch (opt->valtype) {
case '-':
case 'n':
if (num < INT_MIN || INT_MAX < num) {
BIO_printf(bio_err,
"integer value out of range for option '%s'\n",
opt->name);
return 0;
}
*cmp_vars[i].num = (int)num;
break;
case 'l':
*cmp_vars[i].num_long = num;
break;
default:
if (txt != NULL && txt[0] == '\0')
txt = NULL; /* reset option on empty string input */
*cmp_vars[i].txt = txt;
break;
}
}
}
return 1;
}
static char *opt_str(char *opt)
{
char *arg = opt_arg();
if (arg[0] == '\0') {
CMP_warn1("argument of -%s option is empty string, resetting option",
opt);
arg = NULL;
} else if (arg[0] == '-') {
CMP_warn1("argument of -%s option starts with hyphen", opt);
}
return arg;
}
static int opt_nat(void)
{
int result = -1;
if (opt_int(opt_arg(), &result) && result < 0)
BIO_printf(bio_err, "error: argument '%s' must not be negative\n",
opt_arg());
return result;
}
/* returns 1 on success, 0 on error, -1 on -help (i.e., stop with success) */
static int get_opts(int argc, char **argv)
{
OPTION_CHOICE o;
prog = opt_init(argc, argv, cmp_options);
while ((o = opt_next()) != OPT_EOF) {
switch (o) {
case OPT_EOF:
case OPT_ERR:
goto opt_err;
case OPT_HELP:
opt_help(cmp_options);
return -1;
case OPT_CONFIG: /* has already been handled */
break;
case OPT_SECTION: /* has already been handled */
break;
case OPT_SERVER:
opt_server = opt_str("server");
break;
case OPT_PROXY:
opt_proxy = opt_str("proxy");
break;
case OPT_NO_PROXY:
opt_no_proxy = opt_str("no_proxy");
break;
case OPT_PATH:
opt_path = opt_str("path");
break;
case OPT_MSG_TIMEOUT:
if ((opt_msg_timeout = opt_nat()) < 0)
goto opt_err;
break;
case OPT_TOTAL_TIMEOUT:
if ((opt_total_timeout = opt_nat()) < 0)
goto opt_err;
break;
case OPT_TLS_USED:
opt_tls_used = 1;
break;
case OPT_TLS_CERT:
opt_tls_cert = opt_str("tls_cert");
break;
case OPT_TLS_KEY:
opt_tls_key = opt_str("tls_key");
break;
case OPT_TLS_KEYPASS:
opt_tls_keypass = opt_str("tls_keypass");
break;
case OPT_TLS_EXTRA:
opt_tls_extra = opt_str("tls_extra");
break;
case OPT_TLS_TRUSTED:
opt_tls_trusted = opt_str("tls_trusted");
break;
case OPT_TLS_HOST:
opt_tls_host = opt_str("tls_host");
break;
case OPT_REF:
opt_ref = opt_str("ref");
break;
case OPT_SECRET:
opt_secret = opt_str("secret");
break;
case OPT_CERT:
opt_cert = opt_str("cert");
break;
case OPT_KEY:
opt_key = opt_str("key");
break;
case OPT_KEYPASS:
opt_keypass = opt_str("keypass");
break;
case OPT_DIGEST:
opt_digest = opt_str("digest");
break;
case OPT_MAC:
opt_mac = opt_str("mac");
break;
case OPT_EXTRACERTS:
opt_extracerts = opt_str("extracerts");
break;
case OPT_UNPROTECTED_REQUESTS:
opt_unprotected_requests = 1;
break;
case OPT_TRUSTED:
opt_trusted = opt_str("trusted");
break;
case OPT_UNTRUSTED:
opt_untrusted = opt_str("untrusted");
break;
case OPT_SRVCERT:
opt_srvcert = opt_str("srvcert");
break;
case OPT_RECIPIENT:
opt_recipient = opt_str("recipient");
break;
case OPT_EXPECT_SENDER:
opt_expect_sender = opt_str("expect_sender");
break;
case OPT_IGNORE_KEYUSAGE:
opt_ignore_keyusage = 1;
break;
case OPT_UNPROTECTED_ERRORS:
opt_unprotected_errors = 1;
break;
case OPT_EXTRACERTSOUT:
opt_extracertsout = opt_str("extracertsout");
break;
case OPT_CACERTSOUT:
opt_cacertsout = opt_str("cacertsout");
break;
case OPT_V_CASES:
if (!opt_verify(o, vpm))
goto opt_err;
break;
case OPT_CMD:
opt_cmd_s = opt_str("cmd");
break;
case OPT_INFOTYPE:
opt_infotype_s = opt_str("infotype");
break;
case OPT_GENINFO:
opt_geninfo = opt_str("geninfo");
break;
case OPT_NEWKEY:
opt_newkey = opt_str("newkey");
break;
case OPT_NEWKEYPASS:
opt_newkeypass = opt_str("newkeypass");
break;
case OPT_SUBJECT:
opt_subject = opt_str("subject");
break;
case OPT_ISSUER:
opt_issuer = opt_str("issuer");
break;
case OPT_DAYS:
if ((opt_days = opt_nat()) < 0)
goto opt_err;
break;
case OPT_REQEXTS:
opt_reqexts = opt_str("reqexts");
break;
case OPT_SANS:
opt_sans = opt_str("sans");
break;
case OPT_SAN_NODEFAULT:
opt_san_nodefault = 1;
break;
case OPT_POLICIES:
opt_policies = opt_str("policies");
break;
case OPT_POLICY_OIDS:
opt_policy_oids = opt_str("policy_oids");
break;
case OPT_POLICY_OIDS_CRITICAL:
opt_policy_oids_critical = 1;
break;
case OPT_POPO:
if (!opt_int(opt_arg(), &opt_popo)
|| opt_popo < OSSL_CRMF_POPO_NONE
|| opt_popo > OSSL_CRMF_POPO_KEYENC) {
CMP_err("invalid popo spec. Valid values are -1 .. 2");
goto opt_err;
}
break;
case OPT_CSR:
opt_csr = opt_arg();
break;
case OPT_OUT_TRUSTED:
opt_out_trusted = opt_str("out_trusted");
break;
case OPT_IMPLICIT_CONFIRM:
opt_implicit_confirm = 1;
break;
case OPT_DISABLE_CONFIRM:
opt_disable_confirm = 1;
break;
case OPT_CERTOUT:
opt_certout = opt_str("certout");
break;
case OPT_OLDCERT:
opt_oldcert = opt_str("oldcert");
break;
case OPT_REVREASON:
if (!opt_int(opt_arg(), &opt_revreason)
|| opt_revreason < CRL_REASON_NONE
|| opt_revreason > CRL_REASON_AA_COMPROMISE
|| opt_revreason == 7) {
CMP_err("invalid revreason. Valid values are -1 .. 6, 8 .. 10");
goto opt_err;
}
break;
case OPT_CERTFORM:
opt_certform_s = opt_str("certform");
break;
case OPT_KEYFORM:
opt_keyform_s = opt_str("keyform");
break;
case OPT_CERTSFORM:
opt_certsform_s = opt_str("certsform");
break;
case OPT_OTHERPASS:
opt_otherpass = opt_str("otherpass");
break;
#ifndef OPENSSL_NO_ENGINE
case OPT_ENGINE:
opt_engine = opt_str("engine");
break;
#endif
case OPT_PROV_CASES:
if (!opt_provider(o))
goto opt_err;
break;
case OPT_BATCH:
opt_batch = 1;
break;
case OPT_REPEAT:
opt_repeat = opt_nat();
break;
case OPT_REQIN:
opt_reqin = opt_str("reqin");
break;
case OPT_REQIN_NEW_TID:
opt_reqin_new_tid = 1;
break;
case OPT_REQOUT:
opt_reqout = opt_str("reqout");
break;
case OPT_RSPIN:
opt_rspin = opt_str("rspin");
break;
case OPT_RSPOUT:
opt_rspout = opt_str("rspout");
break;
case OPT_USE_MOCK_SRV:
opt_use_mock_srv = 1;
break;
case OPT_PORT:
opt_port = opt_str("port");
break;
case OPT_MAX_MSGS:
if ((opt_max_msgs = opt_nat()) < 0)
goto opt_err;
break;
case OPT_SRV_REF:
opt_srv_ref = opt_str("srv_ref");
break;
case OPT_SRV_SECRET:
opt_srv_secret = opt_str("srv_secret");
break;
case OPT_SRV_CERT:
opt_srv_cert = opt_str("srv_cert");
break;
case OPT_SRV_KEY:
opt_srv_key = opt_str("srv_key");
break;
case OPT_SRV_KEYPASS:
opt_srv_keypass = opt_str("srv_keypass");
break;
case OPT_SRV_TRUSTED:
opt_srv_trusted = opt_str("srv_trusted");
break;
case OPT_SRV_UNTRUSTED:
opt_srv_untrusted = opt_str("srv_untrusted");
break;
case OPT_RSP_CERT:
opt_rsp_cert = opt_str("rsp_cert");
break;
case OPT_RSP_EXTRACERTS:
opt_rsp_extracerts = opt_str("rsp_extracerts");
break;
case OPT_RSP_CAPUBS:
opt_rsp_capubs = opt_str("rsp_capubs");
break;
case OPT_POLL_COUNT:
opt_poll_count = opt_nat();
break;
case OPT_CHECK_AFTER:
opt_check_after = opt_nat();
break;
case OPT_GRANT_IMPLICITCONF:
opt_grant_implicitconf = 1;
break;
case OPT_PKISTATUS:
opt_pkistatus = opt_nat();
break;
case OPT_FAILURE:
opt_failure = opt_nat();
break;
case OPT_FAILUREBITS:
opt_failurebits = opt_nat();
break;
case OPT_STATUSSTRING:
opt_statusstring = opt_str("statusstring");
break;
case OPT_SEND_ERROR:
opt_send_error = 1;
break;
case OPT_SEND_UNPROTECTED:
opt_send_unprotected = 1;
break;
case OPT_SEND_UNPROT_ERR:
opt_send_unprot_err = 1;
break;
case OPT_ACCEPT_UNPROTECTED:
opt_accept_unprotected = 1;
break;
case OPT_ACCEPT_UNPROT_ERR:
opt_accept_unprot_err = 1;
break;
case OPT_ACCEPT_RAVERIFIED:
opt_accept_raverified = 1;
break;
}
}
argc = opt_num_rest();
argv = opt_rest();
if (argc != 0) {
CMP_err1("unknown parameter %s", argv[0]);
goto opt_err;
}
return 1;
opt_err:
CMP_err1("use -help for summary of '%s' options", prog);
return 0;
}
int cmp_main(int argc, char **argv)
{
char *configfile = NULL;
int i;
X509 *newcert = NULL;
ENGINE *e = NULL;
char mock_server[] = "mock server:1";
int ret = 0; /* default: failure */
if (argc <= 1) {
opt_help(cmp_options);
goto err;
}
/*
* handle OPT_CONFIG and OPT_SECTION upfront to take effect for other opts
*/
for (i = 1; i < argc - 1; i++) {
if (*argv[i] == '-') {
if (!strcmp(argv[i] + 1, cmp_options[OPT_CONFIG - OPT_HELP].name))
opt_config = argv[i + 1];
else if (!strcmp(argv[i] + 1,
cmp_options[OPT_SECTION - OPT_HELP].name))
opt_section = argv[i + 1];
}
}
if (opt_section[0] == '\0') /* empty string */
opt_section = DEFAULT_SECTION;
vpm = X509_VERIFY_PARAM_new();
if (vpm == NULL) {
CMP_err("out of memory");
goto err;
}
/* read default values for options from config file */
configfile = opt_config != NULL ? opt_config : default_config_file;
if (configfile && configfile[0] != '\0' /* non-empty string */
&& (configfile != default_config_file
|| access(configfile, F_OK) != -1)) {
CMP_info1("using OpenSSL configuration file '%s'", configfile);
conf = app_load_config(configfile);
if (conf == NULL) {
goto err;
} else {
if (strcmp(opt_section, CMP_SECTION) == 0) { /* default */
if (!NCONF_get_section(conf, opt_section))
CMP_info2("no [%s] section found in config file '%s';"
" will thus use just [default] and unnamed section if present",
opt_section, configfile);
} else {
const char *end = opt_section + strlen(opt_section);
while ((end = prev_item(opt_section, end)) != NULL) {
if (!NCONF_get_section(conf, opt_item)) {
CMP_err2("no [%s] section found in config file '%s'",
opt_item, configfile);
goto err;
}
}
}
if (!read_config())
goto err;
}
}
(void)BIO_flush(bio_err); /* prevent interference with opt_help() */
ret = get_opts(argc, argv);
if (ret <= 0)
goto err;
ret = 0;
if (opt_batch) {
#ifndef OPENSSL_NO_ENGINE
UI_METHOD *ui_fallback_method;
# ifndef OPENSSL_NO_UI_CONSOLE
ui_fallback_method = UI_OpenSSL();
# else
ui_fallback_method = (UI_METHOD *)UI_null();
# endif
UI_method_set_reader(ui_fallback_method, NULL);
#endif
}
if (opt_engine != NULL)
e = setup_engine_methods(opt_engine, 0 /* not: ENGINE_METHOD_ALL */, 0);
if (opt_port != NULL) {
if (opt_use_mock_srv) {
CMP_err("cannot use both -port and -use_mock_srv options");
goto err;
}
if (opt_server != NULL) {
CMP_err("cannot use both -port and -server options");
goto err;
}
}
if ((cmp_ctx = OSSL_CMP_CTX_new()) == NULL) {
CMP_err("out of memory");
goto err;
}
if (!OSSL_CMP_CTX_set_log_cb(cmp_ctx, print_to_bio_out)) {
CMP_err1("cannot set up error reporting and logging for %s", prog);
goto err;
}
if ((opt_use_mock_srv || opt_port != NULL)) {
OSSL_CMP_SRV_CTX *srv_ctx;
if ((srv_ctx = setup_srv_ctx(e)) == NULL)
goto err;
OSSL_CMP_CTX_set_transfer_cb_arg(cmp_ctx, srv_ctx);
if (!OSSL_CMP_CTX_set_log_cb(OSSL_CMP_SRV_CTX_get0_cmp_ctx(srv_ctx),
print_to_bio_out)) {
CMP_err1("cannot set up error reporting and logging for %s", prog);
goto err;
}
}
if (opt_port != NULL) { /* act as very basic CMP HTTP server */
#ifdef OPENSSL_NO_SOCK
BIO_printf(bio_err, "Cannot act as server - sockets not supported\n");
#else
BIO *acbio;
BIO *cbio = NULL;
int msgs = 0;
if ((acbio = http_server_init_bio(prog, opt_port)) == NULL)
goto err;
while (opt_max_msgs <= 0 || msgs < opt_max_msgs) {
OSSL_CMP_MSG *req = NULL;
OSSL_CMP_MSG *resp = NULL;
ret = http_server_get_asn1_req(ASN1_ITEM_rptr(OSSL_CMP_MSG),
(ASN1_VALUE **)&req, &cbio, acbio,
prog, 0, 0);
if (ret == 0)
continue;
if (ret++ == -1)
break; /* fatal error */
ret = 0;
msgs++;
if (req != NULL) {
resp = OSSL_CMP_CTX_server_perform(cmp_ctx, req);
OSSL_CMP_MSG_free(req);
if (resp == NULL)
break; /* treated as fatal error */
ret = http_server_send_asn1_resp(cbio, "application/pkixcmp",
ASN1_ITEM_rptr(OSSL_CMP_MSG),
(const ASN1_VALUE *)resp);
OSSL_CMP_MSG_free(resp);
if (!ret)
break; /* treated as fatal error */
}
BIO_free_all(cbio);
cbio = NULL;
}
BIO_free_all(cbio);
BIO_free_all(acbio);
#endif
goto err;
}
/* else act as CMP client */
if (opt_use_mock_srv) {
if (opt_server != NULL) {
CMP_err("cannot use both -use_mock_srv and -server options");
goto err;
}
if (opt_proxy != NULL) {
CMP_err("cannot use both -use_mock_srv and -proxy options");
goto err;
}
opt_server = mock_server;
opt_proxy = "API";
} else {
if (opt_server == NULL) {
CMP_err("missing -server option");
goto err;
}
}
if (!setup_client_ctx(cmp_ctx, e)) {
CMP_err("cannot set up CMP context");
goto err;
}
for (i = 0; i < opt_repeat; i++) {
/* everything is ready, now connect and perform the command! */
switch (opt_cmd) {
case CMP_IR:
newcert = OSSL_CMP_exec_IR_ses(cmp_ctx);
if (newcert == NULL)
goto err;
break;
case CMP_KUR:
newcert = OSSL_CMP_exec_KUR_ses(cmp_ctx);
if (newcert == NULL)
goto err;
break;
case CMP_CR:
newcert = OSSL_CMP_exec_CR_ses(cmp_ctx);
if (newcert == NULL)
goto err;
break;
case CMP_P10CR:
newcert = OSSL_CMP_exec_P10CR_ses(cmp_ctx);
if (newcert == NULL)
goto err;
break;
case CMP_RR:
if (OSSL_CMP_exec_RR_ses(cmp_ctx) == NULL)
goto err;
break;
case CMP_GENM:
{
STACK_OF(OSSL_CMP_ITAV) *itavs;
if (opt_infotype != NID_undef) {
OSSL_CMP_ITAV *itav =
OSSL_CMP_ITAV_create(OBJ_nid2obj(opt_infotype), NULL);
if (itav == NULL)
goto err;
OSSL_CMP_CTX_push0_genm_ITAV(cmp_ctx, itav);
}
if ((itavs = OSSL_CMP_exec_GENM_ses(cmp_ctx)) == NULL)
goto err;
print_itavs(itavs);
sk_OSSL_CMP_ITAV_pop_free(itavs, OSSL_CMP_ITAV_free);
break;
}
default:
break;
}
{
/* print PKIStatusInfo (this is in case there has been no error) */
int status = OSSL_CMP_CTX_get_status(cmp_ctx);
char *buf = app_malloc(OSSL_CMP_PKISI_BUFLEN, "PKIStatusInfo buf");
const char *string =
OSSL_CMP_CTX_snprint_PKIStatus(cmp_ctx, buf,
OSSL_CMP_PKISI_BUFLEN);
CMP_print(bio_err,
status == OSSL_CMP_PKISTATUS_accepted ? "info" :
status == OSSL_CMP_PKISTATUS_rejection ? "server error" :
status == OSSL_CMP_PKISTATUS_waiting ? "internal error"
: "warning",
"received from %s %s %s", opt_server,
string != NULL ? string : "<unknown PKIStatus>", "");
OPENSSL_free(buf);
}
if (opt_cacertsout != NULL) {
STACK_OF(X509) *certs = OSSL_CMP_CTX_get1_caPubs(cmp_ctx);
if (sk_X509_num(certs) > 0
&& save_certs(cmp_ctx, certs, opt_cacertsout, "CA") < 0) {
sk_X509_pop_free(certs, X509_free);
goto err;
}
sk_X509_pop_free(certs, X509_free);
}
if (opt_extracertsout != NULL) {
STACK_OF(X509) *certs = OSSL_CMP_CTX_get1_extraCertsIn(cmp_ctx);
if (sk_X509_num(certs) > 0
&& save_certs(cmp_ctx, certs, opt_extracertsout,
"extra") < 0) {
sk_X509_pop_free(certs, X509_free);
goto err;
}
sk_X509_pop_free(certs, X509_free);
}
if (opt_certout != NULL && newcert != NULL) {
STACK_OF(X509) *certs = sk_X509_new_null();
if (certs == NULL || !sk_X509_push(certs, newcert)
|| save_certs(cmp_ctx, certs, opt_certout,
"enrolled") < 0) {
sk_X509_free(certs);
goto err;
}
sk_X509_free(certs);
}
if (!OSSL_CMP_CTX_reinit(cmp_ctx))
goto err;
}
ret = 1;
err:
/* in case we ended up here on error without proper cleaning */
cleanse(opt_keypass);
cleanse(opt_newkeypass);
cleanse(opt_otherpass);
cleanse(opt_tls_keypass);
cleanse(opt_secret);
cleanse(opt_srv_keypass);
cleanse(opt_srv_secret);
if (ret != 1)
OSSL_CMP_CTX_print_errors(cmp_ctx);
ossl_cmp_mock_srv_free(OSSL_CMP_CTX_get_transfer_cb_arg(cmp_ctx));
{
APP_HTTP_TLS_INFO *http_tls_info =
OSSL_CMP_CTX_get_http_cb_arg(cmp_ctx);
if (http_tls_info != NULL) {
SSL_CTX_free(http_tls_info->ssl_ctx);
OPENSSL_free(http_tls_info);
}
}
X509_STORE_free(OSSL_CMP_CTX_get_certConf_cb_arg(cmp_ctx));
OSSL_CMP_CTX_free(cmp_ctx);
X509_VERIFY_PARAM_free(vpm);
release_engine(e);
NCONF_free(conf); /* must not do as long as opt_... variables are used */
OSSL_CMP_log_close();
return ret == 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}
+4
View File
@@ -15,6 +15,10 @@
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/cmperr.h> #include <openssl/cmperr.h>
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(OSSL_CMP_ITAV)
DEFINE_STACK_OF(ASN1_UTF8STRING)
/* the context for the CMP mock server */ /* the context for the CMP mock server */
typedef struct typedef struct
{ {
+14 -7
View File
@@ -23,6 +23,12 @@
# include <openssl/x509v3.h> # include <openssl/x509v3.h>
# include <openssl/cms.h> # include <openssl/cms.h>
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(CMS_SignerInfo)
DEFINE_STACK_OF(GENERAL_NAME)
DEFINE_STACK_OF(GENERAL_NAMES)
DEFINE_STACK_OF_STRING()
static int save_certs(char *signerfile, STACK_OF(X509) *signers); static int save_certs(char *signerfile, STACK_OF(X509) *signers);
static int cms_cb(int ok, X509_STORE_CTX *ctx); static int cms_cb(int ok, X509_STORE_CTX *ctx);
static void receipt_request_print(CMS_ContentInfo *cms); static void receipt_request_print(CMS_ContentInfo *cms);
@@ -190,7 +196,7 @@ const OPTIONS cms_options[] = {
{"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, {"passin", OPT_PASSIN, 's', "Input file pass phrase source"},
{"inkey", OPT_INKEY, 's', {"inkey", OPT_INKEY, 's',
"Input private key (if not signer or recipient)"}, "Input private key (if not signer or recipient)"},
{"keyform", OPT_KEYFORM, 'f', "Input private key format (PEM or ENGINE)"}, {"keyform", OPT_KEYFORM, 'f', "Input private key format (ENGINE, other values ignored)"},
{"keyopt", OPT_KEYOPT, 's', "Set public key parameters as n:v pairs"}, {"keyopt", OPT_KEYOPT, 's', "Set public key parameters as n:v pairs"},
OPT_SECTION("Mail header"), OPT_SECTION("Mail header"),
@@ -570,7 +576,7 @@ int cms_main(int argc, char **argv)
if (operation == SMIME_ENCRYPT) { if (operation == SMIME_ENCRYPT) {
if (encerts == NULL && (encerts = sk_X509_new_null()) == NULL) if (encerts == NULL && (encerts = sk_X509_new_null()) == NULL)
goto end; goto end;
cert = load_cert(opt_arg(), FORMAT_PEM, cert = load_cert(opt_arg(), FORMAT_UNDEF,
"recipient certificate file"); "recipient certificate file");
if (cert == NULL) if (cert == NULL)
goto end; goto end;
@@ -750,7 +756,7 @@ int cms_main(int argc, char **argv)
if ((encerts = sk_X509_new_null()) == NULL) if ((encerts = sk_X509_new_null()) == NULL)
goto end; goto end;
while (*argv) { while (*argv) {
if ((cert = load_cert(*argv, FORMAT_PEM, if ((cert = load_cert(*argv, FORMAT_UNDEF,
"recipient certificate file")) == NULL) "recipient certificate file")) == NULL)
goto end; goto end;
sk_X509_push(encerts, cert); sk_X509_push(encerts, cert);
@@ -768,7 +774,7 @@ int cms_main(int argc, char **argv)
} }
if (recipfile != NULL && (operation == SMIME_DECRYPT)) { if (recipfile != NULL && (operation == SMIME_DECRYPT)) {
if ((recip = load_cert(recipfile, FORMAT_PEM, if ((recip = load_cert(recipfile, FORMAT_UNDEF,
"recipient certificate file")) == NULL) { "recipient certificate file")) == NULL) {
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
@@ -776,7 +782,7 @@ int cms_main(int argc, char **argv)
} }
if (originatorfile != NULL) { if (originatorfile != NULL) {
if ((originator = load_cert(originatorfile, FORMAT_PEM, if ((originator = load_cert(originatorfile, FORMAT_UNDEF,
"originator certificate file")) == NULL) { "originator certificate file")) == NULL) {
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
@@ -784,7 +790,7 @@ int cms_main(int argc, char **argv)
} }
if (operation == SMIME_SIGN_RECEIPT) { if (operation == SMIME_SIGN_RECEIPT) {
if ((signer = load_cert(signerfile, FORMAT_PEM, if ((signer = load_cert(signerfile, FORMAT_UNDEF,
"receipt signer certificate file")) == NULL) { "receipt signer certificate file")) == NULL) {
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
@@ -1013,7 +1019,8 @@ int cms_main(int argc, char **argv)
signerfile = sk_OPENSSL_STRING_value(sksigners, i); signerfile = sk_OPENSSL_STRING_value(sksigners, i);
keyfile = sk_OPENSSL_STRING_value(skkeys, i); keyfile = sk_OPENSSL_STRING_value(skkeys, i);
signer = load_cert(signerfile, FORMAT_PEM, "signer certificate"); signer = load_cert(signerfile, FORMAT_UNDEF,
"signer certificate");
if (signer == NULL) { if (signer == NULL) {
ret = 2; ret = 2;
goto end; goto end;
+3 -3
View File
@@ -34,9 +34,9 @@ const OPTIONS crl_options[] = {
OPT_SECTION("Input"), OPT_SECTION("Input"),
{"in", OPT_IN, '<', "Input file - default stdin"}, {"in", OPT_IN, '<', "Input file - default stdin"},
{"inform", OPT_INFORM, 'F', "Input format; default PEM"}, {"inform", OPT_INFORM, 'F', "CRL input format (DER or PEM); has no effect"},
{"key", OPT_KEY, '<', "CRL signing Private key to use"}, {"key", OPT_KEY, '<', "CRL signing Private key to use"},
{"keyform", OPT_KEYFORM, 'F', "Private key file format (PEM or ENGINE)"}, {"keyform", OPT_KEYFORM, 'F', "Private key file format (DER/PEM/P12); has no effect"},
OPT_SECTION("Output"), OPT_SECTION("Output"),
{"out", OPT_OUT, '>', "output file - default stdout"}, {"out", OPT_OUT, '>', "output file - default stdout"},
@@ -122,7 +122,7 @@ int crl_main(int argc, char **argv)
outfile = opt_arg(); outfile = opt_arg();
break; break;
case OPT_KEYFORM: case OPT_KEYFORM:
if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &keyformat)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &keyformat))
goto opthelp; goto opthelp;
break; break;
case OPT_KEY: case OPT_KEY:
+5
View File
@@ -19,6 +19,11 @@
#include <openssl/pem.h> #include <openssl/pem.h>
#include <openssl/objects.h> #include <openssl/objects.h>
DEFINE_STACK_OF(X509_CRL)
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_INFO)
DEFINE_STACK_OF_STRING()
static int add_certs_from_file(STACK_OF(X509) *stack, char *certfile); static int add_certs_from_file(STACK_OF(X509) *stack, char *certfile);
typedef enum OPTION_choice { typedef enum OPTION_choice {
+3 -1
View File
@@ -21,6 +21,8 @@
#include <openssl/hmac.h> #include <openssl/hmac.h>
#include <ctype.h> #include <ctype.h>
DEFINE_STACK_OF_STRING()
#undef BUFSIZE #undef BUFSIZE
#define BUFSIZE 1024*8 #define BUFSIZE 1024*8
@@ -62,7 +64,7 @@ const OPTIONS dgst_options[] = {
{"c", OPT_C, '-', "Print the digest with separating colons"}, {"c", OPT_C, '-', "Print the digest with separating colons"},
{"r", OPT_R, '-', "Print the digest in coreutils format"}, {"r", OPT_R, '-', "Print the digest in coreutils format"},
{"out", OPT_OUT, '>', "Output to filename rather than stdout"}, {"out", OPT_OUT, '>', "Output to filename rather than stdout"},
{"keyform", OPT_KEYFORM, 'f', "Key file format (PEM or ENGINE)"}, {"keyform", OPT_KEYFORM, 'f', "Key file format (ENGINE, other values ignored)"},
{"hex", OPT_HEX, '-', "Print as hex dump"}, {"hex", OPT_HEX, '-', "Print as hex dump"},
{"binary", OPT_BINARY, '-', "Print in binary form"}, {"binary", OPT_BINARY, '-', "Print in binary form"},
{"d", OPT_DEBUG, '-', "Print debug info"}, {"d", OPT_DEBUG, '-', "Print debug info"},
+1 -1
View File
@@ -48,7 +48,7 @@ const OPTIONS dsa_options[] = {
OPT_SECTION("Input"), OPT_SECTION("Input"),
{"in", OPT_IN, 's', "Input key"}, {"in", OPT_IN, 's', "Input key"},
{"inform", OPT_INFORM, 'f', "Input format, DER PEM PVK"}, {"inform", OPT_INFORM, 'f', "Input format (DER/PEM/PVK); has no effect"},
{"pubin", OPT_PUBIN, '-', "Expect a public key in input file"}, {"pubin", OPT_PUBIN, '-', "Expect a public key in input file"},
{"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, {"passin", OPT_PASSIN, 's', "Input file pass phrase source"},
+1 -1
View File
@@ -49,7 +49,7 @@ const OPTIONS ec_options[] = {
OPT_SECTION("Input"), OPT_SECTION("Input"),
{"in", OPT_IN, 's', "Input file"}, {"in", OPT_IN, 's', "Input file"},
{"inform", OPT_INFORM, 'f', "Input format - DER or PEM"}, {"inform", OPT_INFORM, 'f', "Input format (DER/PEM/P12/ENGINE)"},
{"pubin", OPT_PUBIN, '-', "Expect a public key in input file"}, {"pubin", OPT_PUBIN, '-', "Expect a public key in input file"},
{"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, {"passin", OPT_PASSIN, 's', "Input file pass phrase source"},
{"check", OPT_CHECK, '-', "check key consistency"}, {"check", OPT_CHECK, '-', "check key consistency"},
+1 -1
View File
@@ -538,7 +538,7 @@ int enc_main(int argc, char **argv)
goto end; goto end;
} }
/* wiping secret data as we no longer need it */ /* wiping secret data as we no longer need it */
OPENSSL_cleanse(hkey, strlen(hkey)); cleanse(hkey);
} }
if ((benc = BIO_new(BIO_f_cipher())) == NULL) if ((benc = BIO_new(BIO_f_cipher())) == NULL)
+3
View File
@@ -19,6 +19,9 @@
#include <openssl/ssl.h> #include <openssl/ssl.h>
#include <openssl/store.h> #include <openssl/store.h>
DEFINE_STACK_OF_STRING()
DEFINE_STACK_OF_CSTRING()
typedef enum OPTION_choice { typedef enum OPTION_choice {
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
OPT_C, OPT_T, OPT_TT, OPT_PRE, OPT_POST, OPT_C, OPT_T, OPT_TT, OPT_PRE, OPT_POST,
+2
View File
@@ -18,6 +18,8 @@
#include "apps.h" #include "apps.h"
#include "progs.h" #include "progs.h"
DEFINE_STACK_OF_STRING()
#define BUFSIZE 4096 #define BUFSIZE 4096
#define DEFAULT_MAC_NAME "HMAC" #define DEFAULT_MAC_NAME "HMAC"
#define DEFAULT_FIPS_SECTION "fips_check_section" #define DEFAULT_FIPS_SECTION "fips_check_section"
+19 -15
View File
@@ -12,6 +12,7 @@
# include "e_os.h" /* struct timeval for DTLS */ # include "e_os.h" /* struct timeval for DTLS */
# include "internal/nelem.h" # include "internal/nelem.h"
# include "internal/sockets.h" /* for openssl_fdset() */
# include <assert.h> # include <assert.h>
# include <sys/types.h> # include <sys/types.h>
@@ -35,19 +36,12 @@
# include "fmt.h" # include "fmt.h"
# include "platform.h" # include "platform.h"
/* also in include/internal/sockets.h */
# if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINCE)
# define openssl_fdset(a,b) FD_SET((unsigned int)a, b)
# else
# define openssl_fdset(a,b) FD_SET(a, b)
# endif
/* /*
* quick macro when you need to pass an unsigned char instead of a char. * quick macro when you need to pass an unsigned char instead of a char.
* this is true for some implementations of the is*() functions, for * this is true for some implementations of the is*() functions, for
* example. * example.
*/ */
#define _UC(c) ((unsigned char)(c)) # define _UC(c) ((unsigned char)(c))
void app_RAND_load_conf(CONF *c, const char *section); void app_RAND_load_conf(CONF *c, const char *section);
void app_RAND_write(void); void app_RAND_write(void);
@@ -102,19 +96,28 @@ int set_cert_ex(unsigned long *flags, const char *arg);
int set_name_ex(unsigned long *flags, const char *arg); int set_name_ex(unsigned long *flags, const char *arg);
int set_ext_copy(int *copy_type, const char *arg); int set_ext_copy(int *copy_type, const char *arg);
int copy_extensions(X509 *x, X509_REQ *req, int copy_type); int copy_extensions(X509 *x, X509_REQ *req, int copy_type);
char *get_passwd(const char *pass, const char *desc);
int app_passwd(const char *arg1, const char *arg2, char **pass1, char **pass2); int app_passwd(const char *arg1, const char *arg2, char **pass1, char **pass2);
int add_oid_section(CONF *conf); int add_oid_section(CONF *conf);
X509_REQ *load_csr(const char *file, int format, const char *desc); X509_REQ *load_csr(const char *file, int format, const char *desc);
X509 *load_cert(const char *file, int format, const char *desc); X509 *load_cert_pass(const char *uri, int maybe_stdin,
X509_CRL *load_crl(const char *infile, int format, const char *desc); const char *pass, const char *desc);
EVP_PKEY *load_key(const char *file, int format, int maybe_stdin, /* the format parameter is meanwhile not needed anymore and thus ignored */
X509 *load_cert(const char *uri, int format, const char *desc);
X509_CRL *load_crl(const char *uri, int format, const char *desc);
void cleanse(char *str);
void clear_free(char *str);
EVP_PKEY *load_key(const char *uri, int format, int maybe_stdin,
const char *pass, ENGINE *e, const char *desc); const char *pass, ENGINE *e, const char *desc);
EVP_PKEY *load_pubkey(const char *file, int format, int maybe_stdin, EVP_PKEY *load_pubkey(const char *uri, int format, int maybe_stdin,
const char *pass, ENGINE *e, const char *desc); const char *pass, ENGINE *e, const char *desc);
int load_certs(const char *file, STACK_OF(X509) **certs, int format, int load_certs(const char *file, STACK_OF(X509) **certs, int format,
const char *pass, const char *desc); const char *pass, const char *desc);
int load_crls(const char *file, STACK_OF(X509_CRL) **crls, int format, int load_crls(const char *file, STACK_OF(X509_CRL) **crls, int format,
const char *pass, const char *desc); const char *pass, const char *desc);
int load_key_cert_crl(const char *uri, int maybe_stdin,
const char *pass, const char *desc,
EVP_PKEY **ppkey, X509 **pcert, X509_CRL **pcrl);
X509_STORE *setup_verify(const char *CAfile, int noCAfile, X509_STORE *setup_verify(const char *CAfile, int noCAfile,
const char *CApath, int noCApath, const char *CApath, int noCApath,
const char *CAstore, int noCAstore); const char *CAstore, int noCAstore);
@@ -123,7 +126,7 @@ __owur int ctx_set_verify_locations(SSL_CTX *ctx,
const char *CApath, int noCApath, const char *CApath, int noCApath,
const char *CAstore, int noCAstore); const char *CAstore, int noCAstore);
#ifndef OPENSSL_NO_CT # ifndef OPENSSL_NO_CT
/* /*
* Sets the file to load the Certificate Transparency log list from. * Sets the file to load the Certificate Transparency log list from.
@@ -132,9 +135,10 @@ __owur int ctx_set_verify_locations(SSL_CTX *ctx,
*/ */
__owur int ctx_set_ctlog_list_file(SSL_CTX *ctx, const char *path); __owur int ctx_set_ctlog_list_file(SSL_CTX *ctx, const char *path);
#endif # endif
ENGINE *setup_engine(const char *engine, int debug); ENGINE *setup_engine_methods(const char *id, unsigned int methods, int debug);
# define setup_engine(e, debug) setup_engine_methods(e, (unsigned int)-1, debug)
void release_engine(ENGINE *e); void release_engine(ENGINE *e);
# ifndef OPENSSL_NO_OCSP # ifndef OPENSSL_NO_OCSP
+2 -2
View File
@@ -1,7 +1,7 @@
/* /*
* Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2018-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the OpenSSL license (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at * in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html * https://www.openssl.org/source/license.html
+2 -2
View File
@@ -1,7 +1,7 @@
/* /*
* Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2018-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the OpenSSL license (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at * in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html * https://www.openssl.org/source/license.html
+102
View File
@@ -0,0 +1,102 @@
/*
* Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
#ifndef OSSL_HTTP_SERVER_H
# define OSSL_HTTP_SERVER_H
# include "apps.h"
# ifndef HAVE_FORK
# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS)
# define HAVE_FORK 0
# else
# define HAVE_FORK 1
# endif
# endif
# if HAVE_FORK
# undef NO_FORK
# else
# define NO_FORK
# endif
# if !defined(NO_FORK) && !defined(OPENSSL_NO_SOCK) \
&& !defined(OPENSSL_NO_POSIX_IO)
# define HTTP_DAEMON
# include <sys/types.h>
# include <sys/wait.h>
# include <syslog.h>
# include <signal.h>
# define MAXERRLEN 1000 /* limit error text sent to syslog to 1000 bytes */
# else
# undef LOG_INFO
# undef LOG_WARNING
# undef LOG_ERR
# define LOG_INFO 0
# define LOG_WARNING 1
# define LOG_ERR 2
# endif
/*-
* Log a message to syslog if multi-threaded HTTP_DAEMON, else to bio_err
* prog: the name of the current app
* level: the severity of the message, e.g., LOG_ERR
* fmt: message with potential extra parameters like with printf()
* returns nothing
*/
void log_message(const char *prog, int level, const char *fmt, ...);
# ifndef OPENSSL_NO_SOCK
/*-
* Initialize an HTTP server by setting up its listening BIO
* prog: the name of the current app
* port: the port to listen on
* returns a BIO for accepting requests, NULL on error
*/
BIO *http_server_init_bio(const char *prog, const char *port);
/*-
* Accept an ASN.1-formatted HTTP request
* it: the expected request ASN.1 type
* preq: pointer to variable where to place the parsed request
* pcbio: pointer to variable where to place the BIO for sending the response to
* acbio: the listening bio (typically as returned by http_server_init_bio())
* prog: the name of the current app
* accept_get: wheter to accept GET requests (in addition to POST requests)
* timeout: connection timeout (in seconds), or 0 for none/infinite
* returns 0 in case caller should retry, then *preq == *pcbio == NULL
* returns -1 on fatal error; also in this case *preq == *pcbio == NULL
* returns 1 otherwise. In this case it is guaranteed that *pcbio != NULL
* while *preq == NULL if and only if request is invalid
*/
int http_server_get_asn1_req(const ASN1_ITEM *it, ASN1_VALUE **preq,
BIO **pcbio, BIO *acbio,
const char *prog, int accept_get, int timeout);
/*-
* Send an ASN.1-formatted HTTP response
* cbio: destination BIO (typically as returned by http_server_get_asn1_req())
* note: cbio should not do an encoding that changes the output length
* content_type: string identifying the type of the response
* it: the response ASN.1 type
* valit: the response ASN.1 type
* resp: the response to send
* returns 1 on success, 0 on failure
*/
int http_server_send_asn1_resp(BIO *cbio, const char *content_type,
const ASN1_ITEM *it, const ASN1_VALUE *resp);
# endif
# ifdef HTTP_DAEMON
extern int multi;
extern int acfd;
void socket_timeout(int signum);
void spawn_loop(const char *prog);
# endif
#endif
+3 -3
View File
@@ -1,7 +1,7 @@
/* /*
* Copyright 2018-2020 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2018-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the OpenSSL license (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at * in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html * https://www.openssl.org/source/license.html
@@ -132,9 +132,9 @@
{ "xchain_build", OPT_X_CHAIN_BUILD, '-', \ { "xchain_build", OPT_X_CHAIN_BUILD, '-', \
"build certificate chain for the extended certificates"}, \ "build certificate chain for the extended certificates"}, \
{ "xcertform", OPT_X_CERTFORM, 'F', \ { "xcertform", OPT_X_CERTFORM, 'F', \
"format of Extended certificate (PEM or DER) PEM default " }, \ "format of Extended certificate (PEM/DER/P12); has no effect" }, \
{ "xkeyform", OPT_X_KEYFORM, 'F', \ { "xkeyform", OPT_X_KEYFORM, 'F', \
"format of Extended certificate's key (PEM or DER) PEM default"} "format of Extended certificate's key (DER/PEM/P12); has no effect"}
# define OPT_X_CASES \ # define OPT_X_CASES \
OPT_X__FIRST: case OPT_X__LAST: break; \ OPT_X__FIRST: case OPT_X__LAST: break; \
+2 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -32,6 +32,7 @@ int init_client(int *sock, const char *host, const char *port,
const char *bindhost, const char *bindport, const char *bindhost, const char *bindport,
int family, int type, int protocol); int family, int type, int protocol);
int should_retry(int i); int should_retry(int i);
void do_ssl_shutdown(SSL *ssl);
long bio_dump_callback(BIO *bio, int cmd, const char *argp, long bio_dump_callback(BIO *bio, int cmd, const char *argp,
int argi, long argl, long ret); int argi, long argl, long ret);
+3 -1
View File
@@ -1,7 +1,7 @@
/* /*
* Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the OpenSSL license (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at * in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html * https://www.openssl.org/source/license.html
@@ -17,6 +17,8 @@
#include <openssl/kdf.h> #include <openssl/kdf.h>
#include <openssl/params.h> #include <openssl/params.h>
DEFINE_STACK_OF_STRING()
typedef enum OPTION_choice { typedef enum OPTION_choice {
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
OPT_KDFOPT, OPT_BIN, OPT_KEYLEN, OPT_OUT, OPT_KDFOPT, OPT_BIN, OPT_KEYLEN, OPT_OUT,
+8 -5
View File
@@ -106,12 +106,15 @@ static int do_x509_ctrl_string(int (*ctrl)(void *object, int cmd,
cmd = EVP_PKEY_CTRL_SET1_ID; /* ... except we put it in X509 */ cmd = EVP_PKEY_CTRL_SET1_ID; /* ... except we put it in X509 */
#endif #endif
} else if (strcmp(stmp, "hexdistid") == 0) { } else if (strcmp(stmp, "hexdistid") == 0) {
long hexid_len = 0; if (vtmp != NULL) {
void *hexid = OPENSSL_hexstr2buf((const char *)vtmp, &hexid_len); void *hexid;
long hexid_len = 0;
OPENSSL_free(stmp); hexid = OPENSSL_hexstr2buf((const char *)vtmp, &hexid_len);
stmp = vtmp = hexid; OPENSSL_free(stmp);
vtmp_len = (size_t)hexid_len; stmp = vtmp = hexid;
vtmp_len = (size_t)hexid_len;
}
#ifdef EVP_PKEY_CTRL_SET1_ID #ifdef EVP_PKEY_CTRL_SET1_ID
cmd = EVP_PKEY_CTRL_SET1_ID; /* ... except we put it in X509 */ cmd = EVP_PKEY_CTRL_SET1_ID; /* ... except we put it in X509 */
#endif #endif
+220 -242
View File
@@ -29,6 +29,7 @@
#include <openssl/x509.h> #include <openssl/x509.h>
#include <openssl/x509v3.h> #include <openssl/x509v3.h>
#include <openssl/pem.h> #include <openssl/pem.h>
#include <openssl/store.h>
#include <openssl/pkcs12.h> #include <openssl/pkcs12.h>
#include <openssl/ui.h> #include <openssl/ui.h>
#include <openssl/safestack.h> #include <openssl/safestack.h>
@@ -57,6 +58,17 @@ static int WIN32_rename(const char *from, const char *to);
#define PASS_SOURCE_SIZE_MAX 4 #define PASS_SOURCE_SIZE_MAX 4
DEFINE_STACK_OF(CONF)
DEFINE_STACK_OF(CONF_VALUE)
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_CRL)
DEFINE_STACK_OF(X509_INFO)
DEFINE_STACK_OF(X509_EXTENSION)
DEFINE_STACK_OF(X509_POLICY_NODE)
DEFINE_STACK_OF(GENERAL_NAME)
DEFINE_STACK_OF(DIST_POINT)
DEFINE_STACK_OF_STRING()
typedef struct { typedef struct {
const char *name; const char *name;
unsigned long flag; unsigned long flag;
@@ -198,6 +210,24 @@ int wrap_password_callback(char *buf, int bufsiz, int verify, void *userdata)
static char *app_get_pass(const char *arg, int keepbio); static char *app_get_pass(const char *arg, int keepbio);
char *get_passwd(const char *pass, const char *desc)
{
char *result = NULL;
if (desc == NULL)
desc = "<unknown>";
if (!app_passwd(pass, NULL, &result, NULL))
BIO_printf(bio_err, "Error getting password for %s\n", desc);
if (pass != NULL && result == NULL) {
BIO_printf(bio_err,
"Trying plain input string (better precede with 'pass:')\n");
result = OPENSSL_strdup(pass);
if (result == NULL)
BIO_printf(bio_err, "Out of memory getting password for %s\n", desc);
}
return result;
}
int app_passwd(const char *arg1, const char *arg2, char **pass1, char **pass2) int app_passwd(const char *arg1, const char *arg2, char **pass1, char **pass2)
{ {
int same = arg1 != NULL && arg2 != NULL && strcmp(arg1, arg2) == 0; int same = arg1 != NULL && arg2 != NULL && strcmp(arg1, arg2) == 0;
@@ -401,122 +431,44 @@ int add_oid_section(CONF *conf)
return 1; return 1;
} }
static int load_pkcs12(BIO *in, const char *desc, X509 *load_cert_pass(const char *uri, int maybe_stdin,
pem_password_cb *pem_cb, PW_CB_DATA *cb_data, const char *pass, const char *desc)
EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca)
{ {
const char *pass; X509 *cert = NULL;
char tpass[PEM_BUFSIZE];
int len, ret = 0;
PKCS12 *p12;
p12 = d2i_PKCS12_bio(in, NULL);
if (p12 == NULL && desc != NULL) {
BIO_printf(bio_err, "Error loading PKCS12 file for %s\n", desc);
goto die;
}
/* See if an empty password will do */
if (PKCS12_verify_mac(p12, "", 0) || PKCS12_verify_mac(p12, NULL, 0)) {
pass = "";
} else {
if (pem_cb == NULL)
pem_cb = (pem_password_cb *)password_callback;
len = pem_cb(tpass, PEM_BUFSIZE, 0, cb_data);
if (len < 0) {
BIO_printf(bio_err, "Passphrase callback error for %s\n",
desc != NULL ? desc : "PKCS12 input");
goto die;
}
if (len < PEM_BUFSIZE)
tpass[len] = 0;
if (!PKCS12_verify_mac(p12, tpass, len)) {
BIO_printf(bio_err,
"Mac verify error (wrong password?) in PKCS12 file for %s\n",
desc != NULL ? desc : "PKCS12 input");
goto die;
}
pass = tpass;
}
ret = PKCS12_parse(p12, pass, pkey, cert, ca);
die:
PKCS12_free(p12);
return ret;
}
X509 *load_cert(const char *file, int format, const char *desc) if (desc == NULL)
{ desc = "certificate";
X509 *x = NULL; if (uri == NULL) {
BIO *cert;
if (format == FORMAT_HTTP) {
#if !defined(OPENSSL_NO_SOCK)
x = X509_load_http(file, NULL, NULL, 0 /* timeout */);
#endif
return x;
}
if (file == NULL) {
unbuffer(stdin); unbuffer(stdin);
cert = dup_bio_in(format); uri = "";
} else {
cert = bio_open_default(file, 'r', format);
} }
if (cert == NULL) (void)load_key_cert_crl(uri, maybe_stdin, pass, desc, NULL, &cert, NULL);
goto end; if (cert == NULL) {
if (format == FORMAT_ASN1) {
x = d2i_X509_bio(cert, NULL);
} else if (format == FORMAT_PEM) {
x = PEM_read_bio_X509_AUX(cert, NULL,
(pem_password_cb *)password_callback, NULL);
} else if (format == FORMAT_PKCS12) {
if (!load_pkcs12(cert, desc, NULL, NULL, NULL, &x, NULL))
goto end;
} else {
print_format_error(format,
#if !defined(OPENSSL_NO_OCSP) && !defined(OPENSSL_NO_SOCK)
OPT_FMT_HTTP |
#endif
OPT_FMT_PEMDER | OPT_FMT_PKCS12);
}
end:
if (x == NULL && desc != NULL) {
BIO_printf(bio_err, "Unable to load %s\n", desc); BIO_printf(bio_err, "Unable to load %s\n", desc);
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
} }
BIO_free(cert); return cert;
return x;
} }
X509_CRL *load_crl(const char *infile, int format, const char *desc) /* the format parameter is meanwhile not needed anymore and thus ignored */
X509 *load_cert(const char *uri, int format, const char *desc)
{ {
X509_CRL *x = NULL; return load_cert_pass(uri, 0, NULL, desc);
BIO *in = NULL; }
if (format == FORMAT_HTTP) { /* the format parameter is meanwhile not needed anymore and thus ignored */
#if !defined(OPENSSL_NO_SOCK) X509_CRL *load_crl(const char *uri, int format, const char *desc)
x = X509_CRL_load_http(infile, NULL, NULL, 0 /* timeout */); {
#endif X509_CRL *crl = NULL;
return x;
}
in = bio_open_default(infile, 'r', format); if (desc == NULL)
if (in == NULL) desc = "CRL";
goto end; (void)load_key_cert_crl(uri, 0, NULL, desc, NULL, NULL, &crl);
if (format == FORMAT_ASN1) { if (crl == NULL) {
x = d2i_X509_CRL_bio(in, NULL);
} else if (format == FORMAT_PEM) {
x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
} else
print_format_error(format, OPT_FMT_PEMDER);
end:
if (x == NULL && desc != NULL) {
BIO_printf(bio_err, "Unable to load %s\n", desc); BIO_printf(bio_err, "Unable to load %s\n", desc);
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
} }
BIO_free(in); return crl;
return x;
} }
X509_REQ *load_csr(const char *file, int format, const char *desc) X509_REQ *load_csr(const char *file, int format, const char *desc)
@@ -524,6 +476,8 @@ X509_REQ *load_csr(const char *file, int format, const char *desc)
X509_REQ *req = NULL; X509_REQ *req = NULL;
BIO *in; BIO *in;
if (desc == NULL)
desc = "CSR";
in = bio_open_default(file, 'r', format); in = bio_open_default(file, 'r', format);
if (in == NULL) if (in == NULL)
goto end; goto end;
@@ -536,7 +490,7 @@ X509_REQ *load_csr(const char *file, int format, const char *desc)
print_format_error(format, OPT_FMT_PEMDER); print_format_error(format, OPT_FMT_PEMDER);
end: end:
if (req == NULL && desc != NULL) { if (req == NULL) {
BIO_printf(bio_err, "Unable to load %s\n", desc); BIO_printf(bio_err, "Unable to load %s\n", desc);
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
} }
@@ -544,173 +498,92 @@ X509_REQ *load_csr(const char *file, int format, const char *desc)
return req; return req;
} }
EVP_PKEY *load_key(const char *file, int format, int maybe_stdin, void cleanse(char *str)
{
if (str != NULL)
OPENSSL_cleanse(str, strlen(str));
}
void clear_free(char *str)
{
if (str != NULL)
OPENSSL_clear_free(str, strlen(str));
}
EVP_PKEY *load_key(const char *uri, int format, int may_stdin,
const char *pass, ENGINE *e, const char *desc) const char *pass, ENGINE *e, const char *desc)
{ {
BIO *key = NULL;
EVP_PKEY *pkey = NULL; EVP_PKEY *pkey = NULL;
PW_CB_DATA cb_data;
cb_data.password = pass; if (desc == NULL)
cb_data.prompt_info = file; desc = "private key";
if (file == NULL && (!maybe_stdin || format == FORMAT_ENGINE)) {
BIO_printf(bio_err, "No keyfile specified\n");
goto end;
}
if (format == FORMAT_ENGINE) { if (format == FORMAT_ENGINE) {
if (e == NULL) { if (e == NULL) {
BIO_printf(bio_err, "No engine specified\n"); BIO_printf(bio_err, "No engine specified for loading %s\n", desc);
} else { } else {
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
PW_CB_DATA cb_data;
cb_data.password = pass;
cb_data.prompt_info = uri;
if (ENGINE_init(e)) { if (ENGINE_init(e)) {
pkey = ENGINE_load_private_key(e, file, pkey = ENGINE_load_private_key(e, uri,
(UI_METHOD *)get_ui_method(), (UI_METHOD *)get_ui_method(),
&cb_data); &cb_data);
ENGINE_finish(e); ENGINE_finish(e);
} }
if (pkey == NULL && desc != NULL) { if (pkey == NULL) {
BIO_printf(bio_err, "Cannot load %s from engine\n", desc); BIO_printf(bio_err, "Cannot load %s from engine\n", desc);
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
} }
#else #else
BIO_printf(bio_err, "Engines not supported\n"); BIO_printf(bio_err, "Engines not supported for loading %s\n", desc);
#endif #endif
} }
goto end;
}
if (file == NULL && maybe_stdin) {
unbuffer(stdin);
key = dup_bio_in(format);
} else { } else {
key = bio_open_default(file, 'r', format); (void)load_key_cert_crl(uri, may_stdin, pass, desc, &pkey, NULL, NULL);
}
if (key == NULL)
goto end;
if (format == FORMAT_ASN1) {
pkey = d2i_PrivateKey_bio(key, NULL);
} else if (format == FORMAT_PEM) {
pkey = PEM_read_bio_PrivateKey(key, NULL, wrap_password_callback, &cb_data);
} else if (format == FORMAT_PKCS12) {
if (!load_pkcs12(key, desc,
(pem_password_cb *)password_callback, &cb_data,
&pkey, NULL, NULL))
goto end;
#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DSA) && !defined (OPENSSL_NO_RC4)
} else if (format == FORMAT_MSBLOB) {
pkey = b2i_PrivateKey_bio(key);
} else if (format == FORMAT_PVK) {
pkey = b2i_PVK_bio(key, wrap_password_callback, &cb_data);
#endif
} else {
print_format_error(format, OPT_FMT_PEMDER | OPT_FMT_PKCS12
#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DSA) && !defined (OPENSSL_NO_RC4)
| OPT_FMT_MSBLOB | FORMAT_PVK
#endif
#ifndef OPENSSL_NO_ENGINE
| OPT_FMT_ENGINE
#endif
);
} }
end: if (pkey == NULL) {
BIO_free(key);
if (pkey == NULL && desc != NULL) {
BIO_printf(bio_err, "Unable to load %s\n", desc); BIO_printf(bio_err, "Unable to load %s\n", desc);
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
} }
return pkey; return pkey;
} }
EVP_PKEY *load_pubkey(const char *file, int format, int maybe_stdin, EVP_PKEY *load_pubkey(const char *uri, int format, int maybe_stdin,
const char *pass, ENGINE *e, const char *desc) const char *pass, ENGINE *e, const char *desc)
{ {
BIO *key = NULL;
EVP_PKEY *pkey = NULL; EVP_PKEY *pkey = NULL;
PW_CB_DATA cb_data;
cb_data.password = pass; if (desc == NULL)
cb_data.prompt_info = file; desc = "public key";
if (file == NULL && (!maybe_stdin || format == FORMAT_ENGINE)) {
BIO_printf(bio_err, "No keyfile specified\n");
goto end;
}
if (format == FORMAT_ENGINE) { if (format == FORMAT_ENGINE) {
if (e == NULL) { if (e == NULL) {
BIO_printf(bio_err, "No engine specified\n"); BIO_printf(bio_err, "No engine specified for loading %s\n", desc);
} else { } else {
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
pkey = ENGINE_load_public_key(e, file, (UI_METHOD *)get_ui_method(), PW_CB_DATA cb_data;
cb_data.password = pass;
cb_data.prompt_info = uri;
pkey = ENGINE_load_public_key(e, uri, (UI_METHOD *)get_ui_method(),
&cb_data); &cb_data);
if (pkey == NULL && desc != NULL) { if (pkey == NULL) {
BIO_printf(bio_err, "Cannot load %s from engine\n", desc); BIO_printf(bio_err, "Cannot load %s from engine\n", desc);
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
} }
#else #else
BIO_printf(bio_err, "Engines not supported\n"); BIO_printf(bio_err, "Engines not supported for loading %s\n", desc);
#endif #endif
} }
goto end;
}
if (file == NULL && maybe_stdin) {
unbuffer(stdin);
key = dup_bio_in(format);
} else { } else {
key = bio_open_default(file, 'r', format); (void)load_key_cert_crl(uri, maybe_stdin, pass, desc, &pkey,
NULL, NULL);
} }
if (key == NULL) if (pkey == NULL) {
goto end;
if (format == FORMAT_ASN1) {
pkey = d2i_PUBKEY_bio(key, NULL);
} else if (format == FORMAT_ASN1RSA) {
#ifndef OPENSSL_NO_RSA
RSA *rsa;
rsa = d2i_RSAPublicKey_bio(key, NULL);
if (rsa) {
pkey = EVP_PKEY_new();
if (pkey != NULL)
EVP_PKEY_set1_RSA(pkey, rsa);
RSA_free(rsa);
} else
#else
BIO_printf(bio_err, "RSA keys not supported\n");
#endif
pkey = NULL;
} else if (format == FORMAT_PEMRSA) {
#ifndef OPENSSL_NO_RSA
RSA *rsa;
rsa = PEM_read_bio_RSAPublicKey(key, NULL,
(pem_password_cb *)password_callback,
&cb_data);
if (rsa != NULL) {
pkey = EVP_PKEY_new();
if (pkey != NULL)
EVP_PKEY_set1_RSA(pkey, rsa);
RSA_free(rsa);
} else
#else
BIO_printf(bio_err, "RSA keys not supported\n");
#endif
pkey = NULL;
} else if (format == FORMAT_PEM) {
pkey = PEM_read_bio_PUBKEY(key, NULL,
(pem_password_cb *)password_callback,
&cb_data);
#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DSA)
} else if (format == FORMAT_MSBLOB) {
pkey = b2i_PublicKey_bio(key);
#endif
} else {
print_format_error(format, OPT_FMT_PEMDER
#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DSA)
| OPT_FMT_MSBLOB
#endif
);
}
end:
BIO_free(key);
if (pkey == NULL && desc != NULL) {
BIO_printf(bio_err, "Unable to load %s\n", desc); BIO_printf(bio_err, "Unable to load %s\n", desc);
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
} }
@@ -792,11 +665,8 @@ static int load_certs_crls(const char *file, int format,
sk_X509_CRL_pop_free(*pcrls, X509_CRL_free); sk_X509_CRL_pop_free(*pcrls, X509_CRL_free);
*pcrls = NULL; *pcrls = NULL;
} }
if (desc != NULL) { BIO_printf(bio_err, "Unable to load %s\n", desc != NULL ? desc :
BIO_printf(bio_err, "Unable to load %s for %s\n", pcerts != NULL ? "certificates" : "CRLs");
pcerts ? "certificates" : "CRLs", desc);
ERR_print_errors(bio_err);
}
} }
return rv; return rv;
} }
@@ -832,6 +702,102 @@ int load_crls(const char *file, STACK_OF(X509_CRL) **crls, int format,
return load_certs_crls(file, format, pass, desc, NULL, crls); return load_certs_crls(file, format, pass, desc, NULL, crls);
} }
/*
* Load those types of credentials for which the result pointer is not NULL.
* Reads from stdio if uri is NULL and maybe_stdin is nonzero.
* For each type the first credential found in the store is loaded.
* May yield partial result even if rv == 0.
*/
int load_key_cert_crl(const char *uri, int maybe_stdin,
const char *pass, const char *desc,
EVP_PKEY **ppkey, X509 **pcert, X509_CRL **pcrl)
{
PW_CB_DATA uidata;
OSSL_STORE_CTX *ctx = NULL;
int ret = 0;
/* TODO make use of the engine reference 'eng' when loading pkeys */
if (ppkey != NULL)
*ppkey = NULL;
if (pcert != NULL)
*pcert = NULL;
if (pcrl != NULL)
*pcrl = NULL;
if (desc == NULL)
desc = "key/certificate/CRL";
uidata.password = pass;
uidata.prompt_info = uri;
if (uri == NULL) {
BIO *bio;
if (!maybe_stdin) {
BIO_printf(bio_err, "No filename or uri specified for loading %s\n",
desc);
goto end;
}
unbuffer(stdin);
bio = BIO_new_fp(stdin, 0);
if (bio != NULL)
ctx = OSSL_STORE_attach(bio, NULL, "file", NULL,
get_ui_method(), &uidata, NULL, NULL);
uri = "<stdin>";
} else {
ctx = OSSL_STORE_open(uri, get_ui_method(), &uidata, NULL, NULL);
}
if (ctx == NULL) {
BIO_printf(bio_err, "Could not open file or uri %s for loading %s\n",
uri, desc);
goto end;
}
for (;;) {
OSSL_STORE_INFO *info = OSSL_STORE_load(ctx);
int type = info == NULL ? 0 : OSSL_STORE_INFO_get_type(info);
const char *infostr =
info == NULL ? NULL : OSSL_STORE_INFO_type_string(type);
int err = 0;
if (info == NULL) {
if (OSSL_STORE_eof(ctx))
ret = 1;
break;
}
switch (type) {
case OSSL_STORE_INFO_PKEY:
if (ppkey != NULL && *ppkey == NULL)
err = ((*ppkey = OSSL_STORE_INFO_get1_PKEY(info)) == NULL);
break;
case OSSL_STORE_INFO_CERT:
if (pcert != NULL && *pcert == NULL)
err = ((*pcert = OSSL_STORE_INFO_get1_CERT(info)) == NULL);
break;
case OSSL_STORE_INFO_CRL:
if (pcrl != NULL && *pcrl == NULL)
err = ((*pcrl = OSSL_STORE_INFO_get1_CRL(info)) == NULL);
break;
default:
/* skip any other type */
break;
}
OSSL_STORE_INFO_free(info);
if (err) {
BIO_printf(bio_err, "Could not read %s of %s from %s\n",
infostr, desc, uri);
break;
}
}
end:
OSSL_STORE_close(ctx);
if (!ret)
ERR_print_errors(bio_err);
return ret;
}
#define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) #define X509V3_EXT_UNKNOWN_MASK (0xfL << 16)
/* Return error for unknown extensions */ /* Return error for unknown extensions */
#define X509V3_EXT_DEFAULT 0 #define X509V3_EXT_DEFAULT 0
@@ -1149,29 +1115,28 @@ static ENGINE *try_load_engine(const char *engine)
} }
#endif #endif
ENGINE *setup_engine(const char *engine, int debug) ENGINE *setup_engine_methods(const char *id, unsigned int methods, int debug)
{ {
ENGINE *e = NULL; ENGINE *e = NULL;
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
if (engine != NULL) { if (id != NULL) {
if (strcmp(engine, "auto") == 0) { if (strcmp(id, "auto") == 0) {
BIO_printf(bio_err, "Enabling auto ENGINE support\n"); BIO_printf(bio_err, "Enabling auto ENGINE support\n");
ENGINE_register_all_complete(); ENGINE_register_all_complete();
return NULL; return NULL;
} }
if ((e = ENGINE_by_id(engine)) == NULL if ((e = ENGINE_by_id(id)) == NULL
&& (e = try_load_engine(engine)) == NULL) { && (e = try_load_engine(id)) == NULL) {
BIO_printf(bio_err, "Invalid engine \"%s\"\n", engine); BIO_printf(bio_err, "Invalid engine \"%s\"\n", id);
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
return NULL; return NULL;
} }
if (debug) { if (debug)
ENGINE_ctrl(e, ENGINE_CTRL_SET_LOGSTREAM, 0, bio_err, 0); (void)ENGINE_ctrl(e, ENGINE_CTRL_SET_LOGSTREAM, 0, bio_err, 0);
} if (!ENGINE_ctrl_cmd(e, "SET_USER_INTERFACE", 0,
ENGINE_ctrl_cmd(e, "SET_USER_INTERFACE", 0, (void *)get_ui_method(), (void *)get_ui_method(), 0, 1)
0, 1); || !ENGINE_set_default(e, methods)) {
if (!ENGINE_set_default(e, ENGINE_METHOD_ALL)) {
BIO_printf(bio_err, "Cannot use engine \"%s\"\n", ENGINE_get_id(e)); BIO_printf(bio_err, "Cannot use engine \"%s\"\n", ENGINE_get_id(e));
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
ENGINE_free(e); ENGINE_free(e);
@@ -2305,17 +2270,30 @@ double app_tminterval(int stop, int usertime)
double app_tminterval(int stop, int usertime) double app_tminterval(int stop, int usertime)
{ {
double ret = 0; double ret = 0;
struct tms rus; clock_t now;
clock_t now = times(&rus);
static clock_t tmstart; static clock_t tmstart;
long int tck = sysconf(_SC_CLK_TCK);
# ifdef __TMS
struct tms rus;
now = times(&rus);
if (usertime) if (usertime)
now = rus.tms_utime; now = rus.tms_utime;
# else
if (usertime)
now = clock(); /* sum of user and kernel times */
else {
struct timeval tv;
gettimeofday(&tv, NULL);
now = (clock_t)((unsigned long long)tv.tv_sec * tck +
(unsigned long long)tv.tv_usec * (1000000 / tck)
);
}
# endif
if (stop == TM_START) { if (stop == TM_START) {
tmstart = now; tmstart = now;
} else { } else {
long int tck = sysconf(_SC_CLK_TCK);
ret = (now - tmstart) / (double)tck; ret = (now - tmstart) / (double)tck;
} }
+2 -2
View File
@@ -1,7 +1,7 @@
/* /*
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the OpenSSL license (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at * in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html * https://www.openssl.org/source/license.html
+1 -1
View File
@@ -9,7 +9,7 @@ ENDIF
# Source for libapps # Source for libapps
$LIBAPPSSRC=apps.c apps_ui.c opt.c fmt.c s_cb.c s_socket.c app_rand.c \ $LIBAPPSSRC=apps.c apps_ui.c opt.c fmt.c s_cb.c s_socket.c app_rand.c \
columns.c app_params.c names.c app_provider.c app_x509.c columns.c app_params.c names.c app_provider.c app_x509.c http_server.c
IF[{- !$disabled{apps} -}] IF[{- !$disabled{apps} -}]
LIBS{noinst}=../libapps.a LIBS{noinst}=../libapps.a
+2 -2
View File
@@ -1,7 +1,7 @@
/* /*
* Copyright 2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2018-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the OpenSSL license (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at * in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html * https://www.openssl.org/source/license.html
+395
View File
@@ -0,0 +1,395 @@
/*
* Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
/* Very basic HTTP server */
#if !defined(_POSIX_C_SOURCE) && defined(OPENSSL_SYS_VMS)
/*
* On VMS, you need to define this to get the declaration of fileno(). The
* value 2 is to make sure no function defined in POSIX-2 is left undefined.
*/
# define _POSIX_C_SOURCE 2
#endif
#include <string.h>
#include <ctype.h>
#include "http_server.h"
#include "internal/sockets.h"
#include <openssl/err.h>
#include <openssl/rand.h>
int multi = 0; /* run multiple responder processes */
#ifdef HTTP_DAEMON
int acfd = (int) INVALID_SOCKET;
#endif
#ifdef HTTP_DAEMON
static int print_syslog(const char *str, size_t len, void *levPtr)
{
int level = *(int *)levPtr;
int ilen = len > MAXERRLEN ? MAXERRLEN : len;
syslog(level, "%.*s", ilen, str);
return ilen;
}
#endif
void log_message(const char *prog, int level, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
#ifdef HTTP_DAEMON
if (multi) {
char buf[1024];
if (vsnprintf(buf, sizeof(buf), fmt, ap) > 0)
syslog(level, "%s", buf);
if (level >= LOG_ERR)
ERR_print_errors_cb(print_syslog, &level);
}
#endif
if (!multi) {
BIO_printf(bio_err, "%s: ", prog);
BIO_vprintf(bio_err, fmt, ap);
BIO_printf(bio_err, "\n");
}
va_end(ap);
}
#ifdef HTTP_DAEMON
void socket_timeout(int signum)
{
if (acfd != (int)INVALID_SOCKET)
(void)shutdown(acfd, SHUT_RD);
}
static void killall(int ret, pid_t *kidpids)
{
int i;
for (i = 0; i < multi; ++i)
if (kidpids[i] != 0)
(void)kill(kidpids[i], SIGTERM);
OPENSSL_free(kidpids);
sleep(1);
exit(ret);
}
static int termsig = 0;
static void noteterm(int sig)
{
termsig = sig;
}
/*
* Loop spawning up to `multi` child processes, only child processes return
* from this function. The parent process loops until receiving a termination
* signal, kills extant children and exits without returning.
*/
void spawn_loop(const char *prog)
{
pid_t *kidpids = NULL;
int status;
int procs = 0;
int i;
openlog(prog, LOG_PID, LOG_DAEMON);
if (setpgid(0, 0)) {
syslog(LOG_ERR, "fatal: error detaching from parent process group: %s",
strerror(errno));
exit(1);
}
kidpids = app_malloc(multi * sizeof(*kidpids), "child PID array");
for (i = 0; i < multi; ++i)
kidpids[i] = 0;
signal(SIGINT, noteterm);
signal(SIGTERM, noteterm);
while (termsig == 0) {
pid_t fpid;
/*
* Wait for a child to replace when we're at the limit.
* Slow down if a child exited abnormally or waitpid() < 0
*/
while (termsig == 0 && procs >= multi) {
if ((fpid = waitpid(-1, &status, 0)) > 0) {
for (i = 0; i < procs; ++i) {
if (kidpids[i] == fpid) {
kidpids[i] = 0;
--procs;
break;
}
}
if (i >= multi) {
syslog(LOG_ERR, "fatal: internal error: "
"no matching child slot for pid: %ld",
(long) fpid);
killall(1, kidpids);
}
if (status != 0) {
if (WIFEXITED(status))
syslog(LOG_WARNING, "child process: %ld, exit status: %d",
(long)fpid, WEXITSTATUS(status));
else if (WIFSIGNALED(status))
syslog(LOG_WARNING, "child process: %ld, term signal %d%s",
(long)fpid, WTERMSIG(status),
# ifdef WCOREDUMP
WCOREDUMP(status) ? " (core dumped)" :
# endif
"");
sleep(1);
}
break;
} else if (errno != EINTR) {
syslog(LOG_ERR, "fatal: waitpid(): %s", strerror(errno));
killall(1, kidpids);
}
}
if (termsig)
break;
switch (fpid = fork()) {
case -1: /* error */
/* System critically low on memory, pause and try again later */
sleep(30);
break;
case 0: /* child */
OPENSSL_free(kidpids);
signal(SIGINT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
if (termsig)
_exit(0);
if (RAND_poll() <= 0) {
syslog(LOG_ERR, "fatal: RAND_poll() failed");
_exit(1);
}
return;
default: /* parent */
for (i = 0; i < multi; ++i) {
if (kidpids[i] == 0) {
kidpids[i] = fpid;
procs++;
break;
}
}
if (i >= multi) {
syslog(LOG_ERR, "fatal: internal error: no free child slots");
killall(1, kidpids);
}
break;
}
}
/* The loop above can only break on termsig */
syslog(LOG_INFO, "terminating on signal: %d", termsig);
killall(0, kidpids);
}
#endif
#ifndef OPENSSL_NO_SOCK
BIO *http_server_init_bio(const char *prog, const char *port)
{
BIO *acbio = NULL, *bufbio;
bufbio = BIO_new(BIO_f_buffer());
if (bufbio == NULL)
goto err;
acbio = BIO_new(BIO_s_accept());
if (acbio == NULL
|| BIO_set_bind_mode(acbio, BIO_BIND_REUSEADDR) < 0
|| BIO_set_accept_port(acbio, port) < 0) {
log_message(prog, LOG_ERR, "Error setting up accept BIO");
goto err;
}
BIO_set_accept_bios(acbio, bufbio);
bufbio = NULL;
if (BIO_do_accept(acbio) <= 0) {
log_message(prog, LOG_ERR, "Error starting accept");
goto err;
}
return acbio;
err:
BIO_free_all(acbio);
BIO_free(bufbio);
return NULL;
}
/*
* Decode %xx URL-decoding in-place. Ignores malformed sequences.
*/
static int urldecode(char *p)
{
unsigned char *out = (unsigned char *)p;
unsigned char *save = out;
for (; *p; p++) {
if (*p != '%') {
*out++ = *p;
} else if (isxdigit(_UC(p[1])) && isxdigit(_UC(p[2]))) {
/* Don't check, can't fail because of ixdigit() call. */
*out++ = (OPENSSL_hexchar2int(p[1]) << 4)
| OPENSSL_hexchar2int(p[2]);
p += 2;
} else {
return -1;
}
}
*out = '\0';
return (int)(out - save);
}
int http_server_get_asn1_req(const ASN1_ITEM *it, ASN1_VALUE **preq,
BIO **pcbio, BIO *acbio,
const char *prog, int accept_get, int timeout)
{
BIO *cbio = NULL, *getbio = NULL, *b64 = NULL;
int len;
char reqbuf[2048], inbuf[2048];
char *url, *end;
ASN1_VALUE *req;
int ret = 1;
*preq = NULL;
*pcbio = NULL;
/* Connection loss before accept() is routine, ignore silently */
if (BIO_do_accept(acbio) <= 0)
return 0;
cbio = BIO_pop(acbio);
*pcbio = cbio;
if (cbio == NULL) {
ret = -1;
goto out;
}
# ifdef HTTP_DAEMON
if (timeout > 0) {
(void)BIO_get_fd(cbio, &acfd);
alarm(timeout);
}
# endif
/* Read the request line. */
len = BIO_gets(cbio, reqbuf, sizeof(reqbuf));
if (len <= 0)
goto out;
if (accept_get && strncmp(reqbuf, "GET ", 4) == 0) {
/* Expecting GET {sp} /URL {sp} HTTP/1.x */
for (url = reqbuf + 4; *url == ' '; ++url)
continue;
if (*url != '/') {
log_message(prog, LOG_INFO,
"Invalid GET -- URL does not begin with '/': %s", url);
goto out;
}
url++;
/* Splice off the HTTP version identifier. */
for (end = url; *end != '\0'; end++)
if (*end == ' ')
break;
if (strncmp(end, " HTTP/1.", 7) != 0) {
log_message(prog, LOG_INFO,
"Invalid GET -- bad HTTP/version string: %s", end + 1);
goto out;
}
*end = '\0';
/*-
* Skip "GET / HTTP..." requests often used by load-balancers.
* 'url' was incremented above to point to the first byte *after*
* the leading slash, so in case 'GET / ' it is now an empty string.
*/
if (url[0] == '\0')
goto out;
len = urldecode(url);
if (len <= 0) {
log_message(prog, LOG_INFO,
"Invalid GET request -- bad URL encoding: %s", url);
goto out;
}
if ((getbio = BIO_new_mem_buf(url, len)) == NULL
|| (b64 = BIO_new(BIO_f_base64())) == NULL) {
log_message(prog, LOG_ERR,
"Could not allocate base64 bio with size = %d", len);
BIO_free_all(cbio);
*pcbio = NULL;
ret = -1;
goto out;
}
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
getbio = BIO_push(b64, getbio);
} else if (strncmp(reqbuf, "POST ", 5) != 0) {
log_message(prog, LOG_INFO,
"HTTP request does not start with GET/POST: %s", reqbuf);
/* TODO provide better diagnosis in case client tries TLS */
goto out;
}
/* Read and skip past the headers. */
for (;;) {
len = BIO_gets(cbio, inbuf, sizeof(inbuf));
if (len <= 0) {
log_message(prog, LOG_ERR,
"Error skipping remaining HTTP headers");
goto out;
}
if ((inbuf[0] == '\r') || (inbuf[0] == '\n'))
break;
}
# ifdef HTTP_DAEMON
/* Clear alarm before we close the client socket */
alarm(0);
timeout = 0;
# endif
/* Try to read and parse request */
req = ASN1_item_d2i_bio(it, getbio != NULL ? getbio : cbio, NULL);
if (req == NULL)
log_message(prog, LOG_ERR, "Error parsing request");
*preq = req;
out:
BIO_free_all(getbio);
# ifdef HTTP_DAEMON
if (timeout > 0)
alarm(0);
acfd = (int)INVALID_SOCKET;
# endif
return ret;
}
/* assumes that cbio does not do an encoding that changes the output length */
int http_server_send_asn1_resp(BIO *cbio, const char *content_type,
const ASN1_ITEM *it, const ASN1_VALUE *resp)
{
int ret = BIO_printf(cbio, "HTTP/1.0 200 OK\r\nContent-type: %s\r\n"
"Content-Length: %d\r\n\r\n", content_type,
ASN1_item_i2d(resp, NULL, it)) > 0
&& ASN1_item_i2d_bio(it, cbio, resp) > 0;
(void)BIO_flush(cbio);
return ret;
}
#endif
+3 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -12,6 +12,8 @@
#include <openssl/safestack.h> #include <openssl/safestack.h>
#include "names.h" #include "names.h"
DEFINE_STACK_OF_CSTRING()
#ifdef _WIN32 #ifdef _WIN32
# define strcasecmp _stricmp # define strcasecmp _stricmp
#endif #endif
+7 -2
View File
@@ -26,6 +26,11 @@
#define COOKIE_SECRET_LENGTH 16 #define COOKIE_SECRET_LENGTH 16
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_CRL)
DEFINE_STACK_OF(X509_NAME)
DEFINE_STACK_OF_STRING()
VERIFY_CB_ARGS verify_args = { -1, 0, X509_V_OK, 0 }; VERIFY_CB_ARGS verify_args = { -1, 0, X509_V_OK, 0 };
#ifndef OPENSSL_NO_SOCK #ifndef OPENSSL_NO_SOCK
@@ -1089,11 +1094,11 @@ int args_excert(int opt, SSL_EXCERT **pexc)
exc->build_chain = 1; exc->build_chain = 1;
break; break;
case OPT_X_CERTFORM: case OPT_X_CERTFORM:
if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &exc->certform)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &exc->certform))
return 0; return 0;
break; break;
case OPT_X_KEYFORM: case OPT_X_KEYFORM:
if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &exc->keyform)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &exc->keyform))
return 0; return 0;
break; break;
} }
+22 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -392,4 +392,25 @@ int do_server(int *accept_sock, const char *host, const char *port,
return ret; return ret;
} }
void do_ssl_shutdown(SSL *ssl)
{
int ret;
do {
/* We only do unidirectional shutdown */
ret = SSL_shutdown(ssl);
if (ret < 0) {
switch (SSL_get_error(ssl, ret)) {
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
case SSL_ERROR_WANT_ASYNC:
case SSL_ERROR_WANT_ASYNC_JOB:
/* We just do busy waiting. Nothing clever */
continue;
}
ret = 0;
}
} while (ret < 0);
}
#endif /* OPENSSL_NO_SOCK */ #endif /* OPENSSL_NO_SOCK */
+2
View File
@@ -19,6 +19,8 @@
#include "opt.h" #include "opt.h"
#include "names.h" #include "names.h"
DEFINE_STACK_OF_CSTRING()
static int verbose = 0; static int verbose = 0;
static void legacy_cipher_fn(const EVP_CIPHER *c, static void legacy_cipher_fn(const EVP_CIPHER *c,
+3 -1
View File
@@ -1,7 +1,7 @@
/* /*
* Copyright 2018-2020 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2018-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the OpenSSL license (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at * in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html * https://www.openssl.org/source/license.html
@@ -16,6 +16,8 @@
#include <openssl/evp.h> #include <openssl/evp.h>
#include <openssl/params.h> #include <openssl/params.h>
DEFINE_STACK_OF_STRING()
#undef BUFSIZE #undef BUFSIZE
#define BUFSIZE 1024*8 #define BUFSIZE 1024*8
+2
View File
@@ -14,6 +14,8 @@
#include <openssl/pem.h> #include <openssl/pem.h>
#include <openssl/err.h> #include <openssl/err.h>
DEFINE_STACK_OF(X509)
typedef enum OPTION_choice { typedef enum OPTION_choice {
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
OPT_TOSEQ, OPT_IN, OPT_OUT, OPT_TOSEQ, OPT_IN, OPT_OUT,
+49 -411
View File
@@ -22,6 +22,7 @@
/* Needs to be included before the openssl headers */ /* Needs to be included before the openssl headers */
#include "apps.h" #include "apps.h"
#include "http_server.h"
#include "progs.h" #include "progs.h"
#include "internal/sockets.h" #include "internal/sockets.h"
#include <openssl/e_os2.h> #include <openssl/e_os2.h>
@@ -31,38 +32,11 @@
#include <openssl/evp.h> #include <openssl/evp.h>
#include <openssl/bn.h> #include <openssl/bn.h>
#include <openssl/x509v3.h> #include <openssl/x509v3.h>
#include <openssl/rand.h>
#ifndef HAVE_FORK DEFINE_STACK_OF(OCSP_CERTID)
# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) DEFINE_STACK_OF(CONF_VALUE)
# define HAVE_FORK 0 DEFINE_STACK_OF(X509)
# else DEFINE_STACK_OF_STRING()
# define HAVE_FORK 1
# endif
#endif
#if HAVE_FORK
# undef NO_FORK
#else
# define NO_FORK
#endif
#if !defined(NO_FORK) && !defined(OPENSSL_NO_SOCK) \
&& !defined(OPENSSL_NO_POSIX_IO)
# define OCSP_DAEMON
# include <sys/types.h>
# include <sys/wait.h>
# include <syslog.h>
# include <signal.h>
# define MAXERRLEN 1000 /* limit error text sent to syslog to 1000 bytes */
#else
# undef LOG_INFO
# undef LOG_WARNING
# undef LOG_ERR
# define LOG_INFO 0
# define LOG_WARNING 1
# define LOG_ERR 2
#endif
#if defined(OPENSSL_SYS_VXWORKS) #if defined(OPENSSL_SYS_VXWORKS)
/* not supported */ /* not supported */
@@ -100,19 +74,13 @@ static void make_ocsp_response(BIO *err, OCSP_RESPONSE **resp, OCSP_REQUEST *req
const EVP_MD *resp_md); const EVP_MD *resp_md);
static char **lookup_serial(CA_DB *db, ASN1_INTEGER *ser); static char **lookup_serial(CA_DB *db, ASN1_INTEGER *ser);
static BIO *init_responder(const char *port); static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio,
static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio, int timeout); int timeout);
static int send_ocsp_response(BIO *cbio, OCSP_RESPONSE *resp); static int send_ocsp_response(BIO *cbio, const OCSP_RESPONSE *resp);
static void log_message(int level, const char *fmt, ...);
static char *prog; static char *prog;
static int multi = 0;
#ifdef OCSP_DAEMON #ifdef HTTP_DAEMON
static int acfd = (int) INVALID_SOCKET;
static int index_changed(CA_DB *); static int index_changed(CA_DB *);
static void spawn_loop(void);
static int print_syslog(const char *str, size_t len, void *levPtr);
static void socket_timeout(int signum);
#endif #endif
typedef enum OPTION_choice { typedef enum OPTION_choice {
@@ -157,7 +125,7 @@ const OPTIONS ocsp_options[] = {
"Connection timeout (in seconds) to the OCSP responder"}, "Connection timeout (in seconds) to the OCSP responder"},
{"resp_no_certs", OPT_RESP_NO_CERTS, '-', {"resp_no_certs", OPT_RESP_NO_CERTS, '-',
"Don't include any certificates in response"}, "Don't include any certificates in response"},
#ifdef OCSP_DAEMON #ifdef HTTP_DAEMON
{"multi", OPT_MULTI, 'p', "run multiple responder processes"}, {"multi", OPT_MULTI, 'p', "run multiple responder processes"},
#endif #endif
{"no_certs", OPT_NO_CERTS, '-', {"no_certs", OPT_NO_CERTS, '-',
@@ -436,7 +404,8 @@ int ocsp_main(int argc, char **argv)
path = opt_arg(); path = opt_arg();
break; break;
case OPT_ISSUER: case OPT_ISSUER:
issuer = load_cert(opt_arg(), FORMAT_PEM, "issuer certificate"); issuer = load_cert(opt_arg(), FORMAT_UNDEF,
"issuer certificate");
if (issuer == NULL) if (issuer == NULL)
goto end; goto end;
if (issuers == NULL) { if (issuers == NULL) {
@@ -448,7 +417,7 @@ int ocsp_main(int argc, char **argv)
break; break;
case OPT_CERT: case OPT_CERT:
X509_free(cert); X509_free(cert);
cert = load_cert(opt_arg(), FORMAT_PEM, "certificate"); cert = load_cert(opt_arg(), FORMAT_UNDEF, "certificate");
if (cert == NULL) if (cert == NULL)
goto end; goto end;
if (cert_id_md == NULL) if (cert_id_md == NULL)
@@ -535,7 +504,7 @@ int ocsp_main(int argc, char **argv)
trailing_md = 1; trailing_md = 1;
break; break;
case OPT_MULTI: case OPT_MULTI:
#ifdef OCSP_DAEMON #ifdef HTTP_DAEMON
multi = atoi(opt_arg()); multi = atoi(opt_arg());
#endif #endif
break; break;
@@ -579,15 +548,21 @@ int ocsp_main(int argc, char **argv)
} }
if (req == NULL && port != NULL) { if (req == NULL && port != NULL) {
acbio = init_responder(port); #ifndef OPENSSL_NO_SOCK
acbio = http_server_init_bio(prog, port);
if (acbio == NULL) if (acbio == NULL)
goto end; goto end;
#else
BIO_printf(bio_err, "Cannot act as server - sockets not supported\n");
goto end;
#endif
} }
if (rsignfile != NULL) { if (rsignfile != NULL) {
if (rkeyfile == NULL) if (rkeyfile == NULL)
rkeyfile = rsignfile; rkeyfile = rsignfile;
rsigner = load_cert(rsignfile, FORMAT_PEM, "responder certificate"); rsigner = load_cert(rsignfile, FORMAT_UNDEF,
"responder certificate");
if (rsigner == NULL) { if (rsigner == NULL) {
BIO_printf(bio_err, "Error loading responder certificate\n"); BIO_printf(bio_err, "Error loading responder certificate\n");
goto end; goto end;
@@ -625,20 +600,20 @@ int ocsp_main(int argc, char **argv)
} }
} }
#ifdef OCSP_DAEMON #ifdef HTTP_DAEMON
if (multi && acbio != NULL) if (multi && acbio != NULL)
spawn_loop(); spawn_loop(prog);
if (acbio != NULL && req_timeout > 0) if (acbio != NULL && req_timeout > 0)
signal(SIGALRM, socket_timeout); signal(SIGALRM, socket_timeout);
#endif #endif
if (acbio != NULL) if (acbio != NULL)
log_message(LOG_INFO, "waiting for OCSP client connections..."); log_message(prog, LOG_INFO, "waiting for OCSP client connections...");
redo_accept: redo_accept:
if (acbio != NULL) { if (acbio != NULL) {
#ifdef OCSP_DAEMON #ifdef HTTP_DAEMON
if (index_changed(rdb)) { if (index_changed(rdb)) {
CA_DB *newrdb = load_index(ridx_filename, NULL); CA_DB *newrdb = load_index(ridx_filename, NULL);
@@ -647,7 +622,7 @@ redo_accept:
rdb = newrdb; rdb = newrdb;
} else { } else {
free_index(newrdb); free_index(newrdb);
log_message(LOG_ERR, "error reloading updated index: %s", log_message(prog, LOG_ERR, "error reloading updated index: %s",
ridx_filename); ridx_filename);
} }
} }
@@ -658,9 +633,8 @@ redo_accept:
goto redo_accept; goto redo_accept;
if (req == NULL) { if (req == NULL) {
resp = resp = OCSP_response_create(OCSP_RESPONSE_STATUS_MALFORMEDREQUEST,
OCSP_response_create(OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, NULL);
NULL);
send_ocsp_response(cbio, resp); send_ocsp_response(cbio, resp);
goto done_resp; goto done_resp;
} }
@@ -681,7 +655,7 @@ redo_accept:
if (signfile != NULL) { if (signfile != NULL) {
if (keyfile == NULL) if (keyfile == NULL)
keyfile = signfile; keyfile = signfile;
signer = load_cert(signfile, FORMAT_PEM, "signer certificate"); signer = load_cert(signfile, FORMAT_UNDEF, "signer certificate");
if (signer == NULL) { if (signer == NULL) {
BIO_printf(bio_err, "Error loading signer certificate\n"); BIO_printf(bio_err, "Error loading signer certificate\n");
goto end; goto end;
@@ -728,7 +702,7 @@ redo_accept:
goto end; goto end;
#else #else
BIO_printf(bio_err, BIO_printf(bio_err,
"Error creating connect BIO - sockets not supported.\n"); "Error creating connect BIO - sockets not supported\n");
goto end; goto end;
#endif #endif
} else if (respin != NULL) { } else if (respin != NULL) {
@@ -868,41 +842,7 @@ redo_accept:
return ret; return ret;
} }
static void #ifdef HTTP_DAEMON
log_message(int level, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
#ifdef OCSP_DAEMON
if (multi) {
char buf[1024];
if (vsnprintf(buf, sizeof(buf), fmt, ap) > 0) {
syslog(level, "%s", buf);
}
if (level >= LOG_ERR)
ERR_print_errors_cb(print_syslog, &level);
}
#endif
if (!multi) {
BIO_printf(bio_err, "%s: ", prog);
BIO_vprintf(bio_err, fmt, ap);
BIO_printf(bio_err, "\n");
}
va_end(ap);
}
#ifdef OCSP_DAEMON
static int print_syslog(const char *str, size_t len, void *levPtr)
{
int level = *(int *)levPtr;
int ilen = (len > MAXERRLEN) ? MAXERRLEN : len;
syslog(level, "%.*s", ilen, str);
return ilen;
}
static int index_changed(CA_DB *rdb) static int index_changed(CA_DB *rdb)
{ {
@@ -920,131 +860,6 @@ static int index_changed(CA_DB *rdb)
return 0; return 0;
} }
static void killall(int ret, pid_t *kidpids)
{
int i;
for (i = 0; i < multi; ++i)
if (kidpids[i] != 0)
(void)kill(kidpids[i], SIGTERM);
OPENSSL_free(kidpids);
sleep(1);
exit(ret);
}
static int termsig = 0;
static void noteterm (int sig)
{
termsig = sig;
}
/*
* Loop spawning up to `multi` child processes, only child processes return
* from this function. The parent process loops until receiving a termination
* signal, kills extant children and exits without returning.
*/
static void spawn_loop(void)
{
pid_t *kidpids = NULL;
int status;
int procs = 0;
int i;
openlog(prog, LOG_PID, LOG_DAEMON);
if (setpgid(0, 0)) {
syslog(LOG_ERR, "fatal: error detaching from parent process group: %s",
strerror(errno));
exit(1);
}
kidpids = app_malloc(multi * sizeof(*kidpids), "child PID array");
for (i = 0; i < multi; ++i)
kidpids[i] = 0;
signal(SIGINT, noteterm);
signal(SIGTERM, noteterm);
while (termsig == 0) {
pid_t fpid;
/*
* Wait for a child to replace when we're at the limit.
* Slow down if a child exited abnormally or waitpid() < 0
*/
while (termsig == 0 && procs >= multi) {
if ((fpid = waitpid(-1, &status, 0)) > 0) {
for (i = 0; i < procs; ++i) {
if (kidpids[i] == fpid) {
kidpids[i] = 0;
--procs;
break;
}
}
if (i >= multi) {
syslog(LOG_ERR, "fatal: internal error: "
"no matching child slot for pid: %ld",
(long) fpid);
killall(1, kidpids);
}
if (status != 0) {
if (WIFEXITED(status))
syslog(LOG_WARNING, "child process: %ld, exit status: %d",
(long)fpid, WEXITSTATUS(status));
else if (WIFSIGNALED(status))
syslog(LOG_WARNING, "child process: %ld, term signal %d%s",
(long)fpid, WTERMSIG(status),
#ifdef WCOREDUMP
WCOREDUMP(status) ? " (core dumped)" :
#endif
"");
sleep(1);
}
break;
} else if (errno != EINTR) {
syslog(LOG_ERR, "fatal: waitpid(): %s", strerror(errno));
killall(1, kidpids);
}
}
if (termsig)
break;
switch(fpid = fork()) {
case -1: /* error */
/* System critically low on memory, pause and try again later */
sleep(30);
break;
case 0: /* child */
OPENSSL_free(kidpids);
signal(SIGINT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
if (termsig)
_exit(0);
if (RAND_poll() <= 0) {
syslog(LOG_ERR, "fatal: RAND_poll() failed");
_exit(1);
}
return;
default: /* parent */
for (i = 0; i < multi; ++i) {
if (kidpids[i] == 0) {
kidpids[i] = fpid;
procs++;
break;
}
}
if (i >= multi) {
syslog(LOG_ERR, "fatal: internal error: no free child slots");
killall(1, kidpids);
}
break;
}
}
/* The loop above can only break on termsig */
syslog(LOG_INFO, "terminating on signal: %d", termsig);
killall(0, kidpids);
}
#endif #endif
static int add_ocsp_cert(OCSP_REQUEST **req, X509 *cert, static int add_ocsp_cert(OCSP_REQUEST **req, X509 *cert,
@@ -1331,209 +1146,32 @@ static char **lookup_serial(CA_DB *db, ASN1_INTEGER *ser)
return rrow; return rrow;
} }
/* Quick and dirty OCSP server: read in and parse input request */
static BIO *init_responder(const char *port)
{
#ifdef OPENSSL_NO_SOCK
BIO_printf(bio_err,
"Error setting up accept BIO - sockets not supported.\n");
return NULL;
#else
BIO *acbio = NULL, *bufbio = NULL;
bufbio = BIO_new(BIO_f_buffer());
if (bufbio == NULL)
goto err;
acbio = BIO_new(BIO_s_accept());
if (acbio == NULL
|| BIO_set_bind_mode(acbio, BIO_BIND_REUSEADDR) < 0
|| BIO_set_accept_port(acbio, port) < 0) {
log_message(LOG_ERR, "Error setting up accept BIO");
goto err;
}
BIO_set_accept_bios(acbio, bufbio);
bufbio = NULL;
if (BIO_do_accept(acbio) <= 0) {
log_message(LOG_ERR, "Error starting accept");
goto err;
}
return acbio;
err:
BIO_free_all(acbio);
BIO_free(bufbio);
return NULL;
#endif
}
#ifndef OPENSSL_NO_SOCK
/*
* Decode %xx URL-decoding in-place. Ignores mal-formed sequences.
*/
static int urldecode(char *p)
{
unsigned char *out = (unsigned char *)p;
unsigned char *save = out;
for (; *p; p++) {
if (*p != '%')
*out++ = *p;
else if (isxdigit(_UC(p[1])) && isxdigit(_UC(p[2]))) {
/* Don't check, can't fail because of ixdigit() call. */
*out++ = (OPENSSL_hexchar2int(p[1]) << 4)
| OPENSSL_hexchar2int(p[2]);
p += 2;
}
else
return -1;
}
*out = '\0';
return (int)(out - save);
}
#endif
#ifdef OCSP_DAEMON
static void socket_timeout(int signum)
{
if (acfd != (int)INVALID_SOCKET)
(void)shutdown(acfd, SHUT_RD);
}
#endif
static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio, static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio,
int timeout) int timeout)
{ {
#ifdef OPENSSL_NO_SOCK #ifndef OPENSSL_NO_SOCK
return 0; return http_server_get_asn1_req(ASN1_ITEM_rptr(OCSP_RESPONSE),
(ASN1_VALUE **)preq, pcbio, acbio,
prog, 1 /* accept_get */, timeout);
#else #else
int len; BIO_printf(bio_err,
OCSP_REQUEST *req = NULL; "Error getting OCSP request - sockets not supported\n");
char inbuf[2048], reqbuf[2048];
char *p, *q;
BIO *cbio = NULL, *getbio = NULL, *b64 = NULL;
const char *client;
*preq = NULL; *preq = NULL;
return 0;
/* Connection loss before accept() is routine, ignore silently */
if (BIO_do_accept(acbio) <= 0)
return 0;
cbio = BIO_pop(acbio);
*pcbio = cbio;
client = BIO_get_peer_name(cbio);
# ifdef OCSP_DAEMON
if (timeout > 0) {
(void) BIO_get_fd(cbio, &acfd);
alarm(timeout);
}
# endif
/* Read the request line. */
len = BIO_gets(cbio, reqbuf, sizeof(reqbuf));
if (len <= 0)
goto out;
if (strncmp(reqbuf, "GET ", 4) == 0) {
/* Expecting GET {sp} /URL {sp} HTTP/1.x */
for (p = reqbuf + 4; *p == ' '; ++p)
continue;
if (*p != '/') {
log_message(LOG_INFO, "Invalid request -- bad URL: %s", client);
goto out;
}
p++;
/* Splice off the HTTP version identifier. */
for (q = p; *q; q++)
if (*q == ' ')
break;
if (strncmp(q, " HTTP/1.", 8) != 0) {
log_message(LOG_INFO,
"Invalid request -- bad HTTP version: %s", client);
goto out;
}
*q = '\0';
/*
* Skip "GET / HTTP..." requests often used by load-balancers. Note:
* 'p' was incremented above to point to the first byte *after* the
* leading slash, so with 'GET / ' it is now an empty string.
*/
if (p[0] == '\0')
goto out;
len = urldecode(p);
if (len <= 0) {
log_message(LOG_INFO,
"Invalid request -- bad URL encoding: %s", client);
goto out;
}
if ((getbio = BIO_new_mem_buf(p, len)) == NULL
|| (b64 = BIO_new(BIO_f_base64())) == NULL) {
log_message(LOG_ERR, "Could not allocate base64 bio: %s", client);
goto out;
}
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
getbio = BIO_push(b64, getbio);
} else if (strncmp(reqbuf, "POST ", 5) != 0) {
log_message(LOG_INFO, "Invalid request -- bad HTTP verb: %s", client);
goto out;
}
/* Read and skip past the headers. */
for (;;) {
len = BIO_gets(cbio, inbuf, sizeof(inbuf));
if (len <= 0)
goto out;
if ((inbuf[0] == '\r') || (inbuf[0] == '\n'))
break;
}
# ifdef OCSP_DAEMON
/* Clear alarm before we close the client socket */
alarm(0);
timeout = 0;
# endif
/* Try to read OCSP request */
if (getbio != NULL) {
req = d2i_OCSP_REQUEST_bio(getbio, NULL);
BIO_free_all(getbio);
} else {
req = d2i_OCSP_REQUEST_bio(cbio, NULL);
}
if (req == NULL)
log_message(LOG_ERR, "Error parsing OCSP request");
*preq = req;
out:
# ifdef OCSP_DAEMON
if (timeout > 0)
alarm(0);
acfd = (int)INVALID_SOCKET;
# endif
return 1;
#endif #endif
} }
static int send_ocsp_response(BIO *cbio, OCSP_RESPONSE *resp) static int send_ocsp_response(BIO *cbio, const OCSP_RESPONSE *resp)
{ {
char http_resp[] = #ifndef OPENSSL_NO_SOCK
"HTTP/1.0 200 OK\r\nContent-type: application/ocsp-response\r\n" return http_server_send_asn1_resp(cbio, "application/ocsp-response",
"Content-Length: %d\r\n\r\n"; ASN1_ITEM_rptr(OCSP_RESPONSE),
if (cbio == NULL) (const ASN1_VALUE *)resp);
return 0; #else
BIO_printf(cbio, http_resp, i2d_OCSP_RESPONSE(resp, NULL)); BIO_printf(bio_err,
i2d_OCSP_RESPONSE_bio(cbio, resp); "Error sending OCSP response - sockets not supported\n");
(void)BIO_flush(cbio); return 0;
return 1; #endif
} }
#ifndef OPENSSL_NO_SOCK #ifndef OPENSSL_NO_SOCK
+56
View File
@@ -348,3 +348,59 @@ ess_cert_id_chain = no # Must the ESS cert id chain be included?
# (optional, default: no) # (optional, default: no)
ess_cert_id_alg = sha1 # algorithm to compute certificate ess_cert_id_alg = sha1 # algorithm to compute certificate
# identifier (optional, default: sha1) # identifier (optional, default: sha1)
[insta] # CMP using Insta Demo CA
# Message transfer
server = pki.certificate.fi:8700
# proxy = # set this as far as needed, e.g., http://192.168.1.1:8080
# tls_use = 0
path = pkix/
# Server authentication
recipient = "/C=FI/O=Insta Demo/CN=Insta Demo CA" # or set srvcert or issuer
ignore_keyusage = 1 # potentially needed quirk
unprotected_errors = 1 # potentially needed quirk
extracertsout = insta.extracerts.pem
# Client authentication
ref = 3078 # user identification
secret = pass:insta # can be used for both client and server side
# Generic message options
cmd = ir # default operation, can be overridden on cmd line with, e.g., kur
# Certificate enrollment
subject = "/CN=openssl-cmp-test"
newkey = insta.priv.pem
out_trusted = insta.ca.crt
certout = insta.cert.pem
[pbm] # Password-based protection for Insta CA
# Server and client authentication
ref = $insta::ref # 3078
secret = $insta::secret # pass:insta
[signature] # Signature-based protection for Insta CA
# Server authentication
trusted = insta.ca.crt # does not include keyUsage digitalSignature
# Client authentication
secret = # disable PBM
key = $insta::newkey # insta.priv.pem
cert = $insta::certout # insta.cert.pem
[ir]
cmd = ir
[cr]
cmd = cr
[kur]
# Certificate update
cmd = kur
oldcert = $insta::certout # insta.cert.pem
[rr]
# Certificate revocation
cmd = rr
oldcert = $insta::certout # insta.cert.pem
+56
View File
@@ -348,3 +348,59 @@ ess_cert_id_chain = no # Must the ESS cert id chain be included?
# (optional, default: no) # (optional, default: no)
ess_cert_id_alg = sha1 # algorithm to compute certificate ess_cert_id_alg = sha1 # algorithm to compute certificate
# identifier (optional, default: sha1) # identifier (optional, default: sha1)
[insta] # CMP using Insta Demo CA
# Message transfer
server = pki.certificate.fi:8700
# proxy = # set this as far as needed, e.g., http://192.168.1.1:8080
# tls_use = 0
path = pkix/
# Server authentication
recipient = "/C=FI/O=Insta Demo/CN=Insta Demo CA" # or set srvcert or issuer
ignore_keyusage = 1 # potentially needed quirk
unprotected_errors = 1 # potentially needed quirk
extracertsout = insta.extracerts.pem
# Client authentication
ref = 3078 # user identification
secret = pass:insta # can be used for both client and server side
# Generic message options
cmd = ir # default operation, can be overridden on cmd line with, e.g., kur
# Certificate enrollment
subject = "/CN=openssl-cmp-test"
newkey = insta.priv.pem
out_trusted = insta.ca.crt
certout = insta.cert.pem
[pbm] # Password-based protection for Insta CA
# Server and client authentication
ref = $insta::ref # 3078
secret = $insta::secret # pass:insta
[signature] # Signature-based protection for Insta CA
# Server authentication
trusted = insta.ca.crt # does not include keyUsage digitalSignature
# Client authentication
secret = # disable PBM
key = $insta::newkey # insta.priv.pem
cert = $insta::certout # insta.cert.pem
[ir]
cmd = ir
[cr]
cmd = cr
[kur]
# Certificate update
cmd = kur
oldcert = $insta::certout # insta.cert.pem
[rr]
# Certificate revocation
cmd = rr
oldcert = $insta::certout # insta.cert.pem
+6
View File
@@ -19,6 +19,12 @@
#include <openssl/pem.h> #include <openssl/pem.h>
#include <openssl/pkcs12.h> #include <openssl/pkcs12.h>
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(PKCS7)
DEFINE_STACK_OF(PKCS12_SAFEBAG)
DEFINE_STACK_OF(X509_ATTRIBUTE)
DEFINE_STACK_OF_STRING()
#define NOKEYS 0x1 #define NOKEYS 0x1
#define NOCERTS 0x2 #define NOCERTS 0x2
#define INFO 0x4 #define INFO 0x4
+3
View File
@@ -20,6 +20,9 @@
#include <openssl/pkcs7.h> #include <openssl/pkcs7.h>
#include <openssl/pem.h> #include <openssl/pem.h>
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_CRL)
typedef enum OPTION_choice { typedef enum OPTION_choice {
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_NOOUT, OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_NOOUT,
+1 -1
View File
@@ -57,7 +57,7 @@ const OPTIONS pkey_options[] = {
OPT_SECTION("Input"), OPT_SECTION("Input"),
{"in", OPT_IN, 's', "Input key"}, {"in", OPT_IN, 's', "Input key"},
{"inform", OPT_INFORM, 'f', "Input format (DER or PEM)"}, {"inform", OPT_INFORM, 'f', "Input format (DER/PEM/P12/ENGINE)"},
{"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, {"passin", OPT_PASSIN, 's', "Input file pass phrase source"},
{"pubin", OPT_PUBIN, '-', {"pubin", OPT_PUBIN, '-',
"Read public key from input (default is private key)"}, "Read public key from input (default is private key)"},
+7 -5
View File
@@ -15,6 +15,8 @@
#include <openssl/evp.h> #include <openssl/evp.h>
#include <sys/stat.h> #include <sys/stat.h>
DEFINE_STACK_OF_STRING()
#define KEY_NONE 0 #define KEY_NONE 0
#define KEY_PRIVKEY 1 #define KEY_PRIVKEY 1
#define KEY_PUBKEY 2 #define KEY_PUBKEY 2
@@ -69,11 +71,11 @@ const OPTIONS pkeyutl_options[] = {
{"inkey", OPT_INKEY, 's', "Input private key file"}, {"inkey", OPT_INKEY, 's', "Input private key file"},
{"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, {"passin", OPT_PASSIN, 's', "Input file pass phrase source"},
{"peerkey", OPT_PEERKEY, 's', "Peer key file used in key derivation"}, {"peerkey", OPT_PEERKEY, 's', "Peer key file used in key derivation"},
{"peerform", OPT_PEERFORM, 'E', "Peer key format - default PEM"}, {"peerform", OPT_PEERFORM, 'E', "Peer key format (DER/PEM/P12/ENGINE)"},
{"certin", OPT_CERTIN, '-', "Input is a cert with a public key"}, {"certin", OPT_CERTIN, '-', "Input is a cert with a public key"},
{"rev", OPT_REV, '-', "Reverse the order of the input buffer"}, {"rev", OPT_REV, '-', "Reverse the order of the input buffer"},
{"sigfile", OPT_SIGFILE, '<', "Signature file (verify operation only)"}, {"sigfile", OPT_SIGFILE, '<', "Signature file (verify operation only)"},
{"keyform", OPT_KEYFORM, 'E', "Private key format - default PEM"}, {"keyform", OPT_KEYFORM, 'E', "Private key format (ENGINE, other values ignored)"},
OPT_SECTION("Output"), OPT_SECTION("Output"),
{"out", OPT_OUT, '>', "Output file - default stdout"}, {"out", OPT_OUT, '>', "Output file - default stdout"},
@@ -155,11 +157,11 @@ int pkeyutl_main(int argc, char **argv)
passinarg = opt_arg(); passinarg = opt_arg();
break; break;
case OPT_PEERFORM: case OPT_PEERFORM:
if (!opt_format(opt_arg(), OPT_FMT_PDE, &peerform)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &peerform))
goto opthelp; goto opthelp;
break; break;
case OPT_KEYFORM: case OPT_KEYFORM:
if (!opt_format(opt_arg(), OPT_FMT_PDE, &keyform)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &keyform))
goto opthelp; goto opthelp;
break; break;
case OPT_R_CASES: case OPT_R_CASES:
@@ -517,7 +519,7 @@ static EVP_PKEY_CTX *init_ctx(const char *kdfalg, int *pkeysize,
break; break;
case KEY_CERT: case KEY_CERT:
x = load_cert(keyfile, keyform, "Certificate"); x = load_cert(keyfile, FORMAT_UNDEF, "Certificate");
if (x) { if (x) {
pkey = X509_get_pubkey(x); pkey = X509_get_pubkey(x);
X509_free(x); X509_free(x);
+3 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -20,6 +20,8 @@
#include <openssl/core.h> #include <openssl/core.h>
#include <openssl/core_numbers.h> #include <openssl/core_numbers.h>
DEFINE_STACK_OF_CSTRING()
typedef enum OPTION_choice { typedef enum OPTION_choice {
OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
OPT_V = 100, OPT_VV, OPT_VVV OPT_V = 100, OPT_VV, OPT_VVV
+2
View File
@@ -42,6 +42,8 @@
# include <openssl/pem.h> # include <openssl/pem.h>
# include <openssl/x509.h> # include <openssl/x509.h>
DEFINE_STACK_OF(X509_INFO)
DEFINE_STACK_OF_STRING()
# ifndef PATH_MAX # ifndef PATH_MAX
# define PATH_MAX 4096 # define PATH_MAX 4096
+3 -1
View File
@@ -32,6 +32,8 @@
# include <openssl/dsa.h> # include <openssl/dsa.h>
#endif #endif
DEFINE_STACK_OF(CONF_VALUE)
DEFINE_STACK_OF_STRING()
#define BITS "default_bits" #define BITS "default_bits"
#define KEYFILE "default_keyfile" #define KEYFILE "default_keyfile"
@@ -135,7 +137,7 @@ const OPTIONS req_options[] = {
OPT_SECTION("Keys and Signing"), OPT_SECTION("Keys and Signing"),
{"key", OPT_KEY, 's', "Private key to use"}, {"key", OPT_KEY, 's', "Private key to use"},
{"keyform", OPT_KEYFORM, 'f', "Key file format"}, {"keyform", OPT_KEYFORM, 'f', "Key file format (ENGINE, other values ignored)"},
{"pubkey", OPT_PUBKEY, '-', "Output public key"}, {"pubkey", OPT_PUBKEY, '-', "Output public key"},
{"keyout", OPT_KEYOUT, '>', "File to send the key to"}, {"keyout", OPT_KEYOUT, '>', "File to send the key to"},
{"passin", OPT_PASSIN, 's', "Private key password source"}, {"passin", OPT_PASSIN, 's', "Private key password source"},
+1 -1
View File
@@ -45,7 +45,7 @@ const OPTIONS rsa_options[] = {
OPT_SECTION("Input"), OPT_SECTION("Input"),
{"in", OPT_IN, 's', "Input file"}, {"in", OPT_IN, 's', "Input file"},
{"inform", OPT_INFORM, 'f', "Input format, one of DER PEM"}, {"inform", OPT_INFORM, 'f', "Input format (DER/PEM/P12/ENGINE"},
{"pubin", OPT_PUBIN, '-', "Expect a public key in input file"}, {"pubin", OPT_PUBIN, '-', "Expect a public key in input file"},
{"RSAPublicKey_in", OPT_RSAPUBKEY_IN, '-', "Input is an RSAPublicKey"}, {"RSAPublicKey_in", OPT_RSAPUBKEY_IN, '-', "Input is an RSAPublicKey"},
{"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, {"passin", OPT_PASSIN, 's', "Input file pass phrase source"},
+1 -3
View File
@@ -1,5 +1,4 @@
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
MIISKAIBAAKCBAEAiQ2f1X6Bte1DKD0OoCBKEikzPW+5w3oXk3WwnE97Wxzy6wJZ MIISKAIBAAKCBAEAiQ2f1X6Bte1DKD0OoCBKEikzPW+5w3oXk3WwnE97Wxzy6wJZ
ebbZC3CZKKBnJeBMrysPf+lK+9+fP6Vm8bp1wvbcSIA59BDrX6irFSuM/bdnkbuF ebbZC3CZKKBnJeBMrysPf+lK+9+fP6Vm8bp1wvbcSIA59BDrX6irFSuM/bdnkbuF
MFlDjt+uVrxwoyqfPi2IPot1HQg3l5mdyBqcTWvbOnU2L9HZxJfPUCjfzdTMPrMY MFlDjt+uVrxwoyqfPi2IPot1HQg3l5mdyBqcTWvbOnU2L9HZxJfPUCjfzdTMPrMY
@@ -62,7 +61,7 @@ JH1/Qx7C/mTAMRsN5SkOthnGq0djCNWfPv/3JV0H67Uf5krFlnwLebrgfTYoPPdo
yO7iBUNJzv6Qh22malLp4P8gzACkD7DGlSTnoB5cLwcjmDGg+i9WrUBbOiVTeQfZ yO7iBUNJzv6Qh22malLp4P8gzACkD7DGlSTnoB5cLwcjmDGg+i9WrUBbOiVTeQfZ
kOj1o+Tz35ndpq/DDUVlqliB9krcxva+QHeJPH53EGI+YVg1nD+s/vUDZ3mQMGX9 kOj1o+Tz35ndpq/DDUVlqliB9krcxva+QHeJPH53EGI+YVg1nD+s/vUDZ3mQMGX9
DQou2L8uU6RnWNv/BihGcL8QvS4Ty6QyPOUPpD3zc70JQAEcQk9BxQNaELgJX0IN DQou2L8uU6RnWNv/BihGcL8QvS4Ty6QyPOUPpD3zc70JQAEcQk9BxQNaELgJX0IN
22cYn22tYvElew9G41OpDqzBRcfbdJmKXQ2HcroShutYJQRGUpAXHk24fy6JVkIU 2cYUn22tYvElew9G41OpDqzBRcfbdJmKXQ2HcroShutYJQRGUpAXHk24fy6JVkIU
ojF5U6cwextMja1ZIIZgh9eugIRUeIE7319nQNDzuXWjRCcoBLA25P7wnpHWDRpz ojF5U6cwextMja1ZIIZgh9eugIRUeIE7319nQNDzuXWjRCcoBLA25P7wnpHWDRpz
D9ovXCIvdja74lL5psqobV6L5+fbLPkSgXoImKR0LQKCAgAIC9Jk8kxumCyIVGCP D9ovXCIvdja74lL5psqobV6L5+fbLPkSgXoImKR0LQKCAgAIC9Jk8kxumCyIVGCP
PeM5Uby9M3GMuKrfYsn0Y5e97+kSJF1dpojTodBgR2KQar6eVrvXt+8uZCcIjfx8 PeM5Uby9M3GMuKrfYsn0Y5e97+kSJF1dpojTodBgR2KQar6eVrvXt+8uZCcIjfx8
@@ -98,4 +97,3 @@ TwEgE67iOb2iIoUpon/NyP4LesMzvdpsu2JFlfz13PmmQ34mFI7tWvOb3NA5DP3c
rMlMLtKfp2w8HlMZpsUlToNCx6CI+tJrohzcs3BAVAbjFAXRKWGijB1rxwyDdHPv rMlMLtKfp2w8HlMZpsUlToNCx6CI+tJrohzcs3BAVAbjFAXRKWGijB1rxwyDdHPv
I+/wJTNaRNPQ1M0SwtEL/zJd21y3KSPn4eL+GP3efhlDSjtlDvZqkdAUsU8= I+/wJTNaRNPQ1M0SwtEL/zJd21y3KSPn4eL+GP3efhlDSjtlDvZqkdAUsU8=
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
+3 -3
View File
@@ -48,7 +48,7 @@ const OPTIONS rsautl_options[] = {
OPT_SECTION("Input"), OPT_SECTION("Input"),
{"in", OPT_IN, '<', "Input file"}, {"in", OPT_IN, '<', "Input file"},
{"inkey", OPT_INKEY, 's', "Input key"}, {"inkey", OPT_INKEY, 's', "Input key"},
{"keyform", OPT_KEYFORM, 'E', "Private key format - default PEM"}, {"keyform", OPT_KEYFORM, 'E', "Private key format (ENGINE, other values ignored)"},
{"pubin", OPT_PUBIN, '-', "Input is an RSA public"}, {"pubin", OPT_PUBIN, '-', "Input is an RSA public"},
{"certin", OPT_CERTIN, '-', "Input is a cert carrying an RSA public key"}, {"certin", OPT_CERTIN, '-', "Input is a cert carrying an RSA public key"},
{"rev", OPT_REV, '-', "Reverse the order of the input buffer"}, {"rev", OPT_REV, '-', "Reverse the order of the input buffer"},
@@ -98,7 +98,7 @@ int rsautl_main(int argc, char **argv)
ret = 0; ret = 0;
goto end; goto end;
case OPT_KEYFORM: case OPT_KEYFORM:
if (!opt_format(opt_arg(), OPT_FMT_PDE, &keyformat)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &keyformat))
goto opthelp; goto opthelp;
break; break;
case OPT_IN: case OPT_IN:
@@ -194,7 +194,7 @@ int rsautl_main(int argc, char **argv)
break; break;
case KEY_CERT: case KEY_CERT:
x = load_cert(keyfile, keyformat, "Certificate"); x = load_cert(keyfile, FORMAT_UNDEF, "Certificate");
if (x) { if (x) {
pkey = X509_get_pubkey(x); pkey = X509_get_pubkey(x);
X509_free(x); X509_free(x);
+11 -27
View File
@@ -56,6 +56,12 @@ typedef unsigned int u_int;
# endif # endif
#endif #endif
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_CRL)
DEFINE_STACK_OF(X509_NAME)
DEFINE_STACK_OF(SCT)
DEFINE_STACK_OF_STRING()
#undef BUFSIZZ #undef BUFSIZZ
#define BUFSIZZ 1024*8 #define BUFSIZZ 1024*8
#define S_CLIENT_IRC_READ_TIMEOUT 8 #define S_CLIENT_IRC_READ_TIMEOUT 8
@@ -92,27 +98,6 @@ static int restore_errno(void)
return ret; return ret;
} }
static void do_ssl_shutdown(SSL *ssl)
{
int ret;
do {
/* We only do unidirectional shutdown */
ret = SSL_shutdown(ssl);
if (ret < 0) {
switch (SSL_get_error(ssl, ret)) {
case SSL_ERROR_WANT_READ:
case SSL_ERROR_WANT_WRITE:
case SSL_ERROR_WANT_ASYNC:
case SSL_ERROR_WANT_ASYNC_JOB:
/* We just do busy waiting. Nothing clever */
continue;
}
ret = 0;
}
} while (ret < 0);
}
/* Default PSK identity and key */ /* Default PSK identity and key */
static char *psk_identity = "Client_identity"; static char *psk_identity = "Client_identity";
@@ -651,12 +636,12 @@ const OPTIONS s_client_options[] = {
OPT_SECTION("Identity"), OPT_SECTION("Identity"),
{"cert", OPT_CERT, '<', "Client certificate file to use"}, {"cert", OPT_CERT, '<', "Client certificate file to use"},
{"certform", OPT_CERTFORM, 'F', {"certform", OPT_CERTFORM, 'F',
"Client certificate file format (PEM or DER) PEM default"}, "Client certificate file format (PEM/DER/P12); has no effect"},
{"cert_chain", OPT_CERT_CHAIN, '<', {"cert_chain", OPT_CERT_CHAIN, '<',
"Client certificate chain file (in PEM format)"}, "Client certificate chain file (in PEM format)"},
{"build_chain", OPT_BUILD_CHAIN, '-', "Build client certificate chain"}, {"build_chain", OPT_BUILD_CHAIN, '-', "Build client certificate chain"},
{"key", OPT_KEY, 's', "Private key file to use; default is: -cert file"}, {"key", OPT_KEY, 's', "Private key file to use; default is: -cert file"},
{"keyform", OPT_KEYFORM, 'E', "Key format (PEM, DER or engine) PEM default"}, {"keyform", OPT_KEYFORM, 'E', "Key format (ENGINE, other values ignored)"},
{"pass", OPT_PASS, 's', "Private key file pass phrase source"}, {"pass", OPT_PASS, 's', "Private key file pass phrase source"},
{"verify", OPT_VERIFY, 'p', "Turn on peer certificate verification"}, {"verify", OPT_VERIFY, 'p', "Turn on peer certificate verification"},
{"nameopt", OPT_NAMEOPT, 's', "Certificate subject/issuer name printing options"}, {"nameopt", OPT_NAMEOPT, 's', "Certificate subject/issuer name printing options"},
@@ -1159,7 +1144,7 @@ int s_client_main(int argc, char **argv)
sess_in = opt_arg(); sess_in = opt_arg();
break; break;
case OPT_CERTFORM: case OPT_CERTFORM:
if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &cert_format)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &cert_format))
goto opthelp; goto opthelp;
break; break;
case OPT_CRLFORM: case OPT_CRLFORM:
@@ -1393,7 +1378,7 @@ int s_client_main(int argc, char **argv)
fallback_scsv = 1; fallback_scsv = 1;
break; break;
case OPT_KEYFORM: case OPT_KEYFORM:
if (!opt_format(opt_arg(), OPT_FMT_PDE, &key_format)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &key_format))
goto opthelp; goto opthelp;
break; break;
case OPT_PASS: case OPT_PASS:
@@ -3152,8 +3137,7 @@ int s_client_main(int argc, char **argv)
OPENSSL_clear_free(cbuf, BUFSIZZ); OPENSSL_clear_free(cbuf, BUFSIZZ);
OPENSSL_clear_free(sbuf, BUFSIZZ); OPENSSL_clear_free(sbuf, BUFSIZZ);
OPENSSL_clear_free(mbuf, BUFSIZZ); OPENSSL_clear_free(mbuf, BUFSIZZ);
if (proxypass != NULL) clear_free(proxypass);
OPENSSL_clear_free(proxypass, strlen(proxypass));
release_engine(e); release_engine(e);
BIO_free(bio_c_out); BIO_free(bio_c_out);
bio_c_out = NULL; bio_c_out = NULL;
+31 -16
View File
@@ -60,6 +60,12 @@ typedef unsigned int u_int;
#endif #endif
#include "internal/sockets.h" #include "internal/sockets.h"
DEFINE_STACK_OF(X509_EXTENSION)
DEFINE_STACK_OF(X509_CRL)
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(SSL_CIPHER)
DEFINE_STACK_OF_STRING()
static int not_resumable_sess_cb(SSL *s, int is_forward_secure); static int not_resumable_sess_cb(SSL *s, int is_forward_secure);
static int sv_body(int s, int stype, int prot, unsigned char *context); static int sv_body(int s, int stype, int prot, unsigned char *context);
static int www_body(int s, int stype, int prot, unsigned char *context); static int www_body(int s, int stype, int prot, unsigned char *context);
@@ -755,7 +761,7 @@ typedef enum OPTION_choice {
OPT_SRTP_PROFILES, OPT_KEYMATEXPORT, OPT_KEYMATEXPORTLEN, OPT_SRTP_PROFILES, OPT_KEYMATEXPORT, OPT_KEYMATEXPORTLEN,
OPT_KEYLOG_FILE, OPT_MAX_EARLY, OPT_RECV_MAX_EARLY, OPT_EARLY_DATA, OPT_KEYLOG_FILE, OPT_MAX_EARLY, OPT_RECV_MAX_EARLY, OPT_EARLY_DATA,
OPT_S_NUM_TICKETS, OPT_ANTI_REPLAY, OPT_NO_ANTI_REPLAY, OPT_SCTP_LABEL_BUG, OPT_S_NUM_TICKETS, OPT_ANTI_REPLAY, OPT_NO_ANTI_REPLAY, OPT_SCTP_LABEL_BUG,
OPT_HTTP_SERVER_BINMODE, OPT_HTTP_SERVER_BINMODE, OPT_NOCANAMES,
OPT_R_ENUM, OPT_R_ENUM,
OPT_S_ENUM, OPT_S_ENUM,
OPT_V_ENUM, OPT_V_ENUM,
@@ -807,7 +813,7 @@ const OPTIONS s_server_options[] = {
{"cert2", OPT_CERT2, '<', {"cert2", OPT_CERT2, '<',
"Certificate file to use for servername; default is" TEST_CERT2}, "Certificate file to use for servername; default is" TEST_CERT2},
{"certform", OPT_CERTFORM, 'F', {"certform", OPT_CERTFORM, 'F',
"Server certificate file format (PEM or DER) PEM default"}, "Server certificate file format (PEM/DER/P12); has no effect"},
{"cert_chain", OPT_CERT_CHAIN, '<', {"cert_chain", OPT_CERT_CHAIN, '<',
"Server certificate chain file in PEM format"}, "Server certificate chain file in PEM format"},
{"build_chain", OPT_BUILD_CHAIN, '-', "Build server certificate chain"}, {"build_chain", OPT_BUILD_CHAIN, '-', "Build server certificate chain"},
@@ -817,19 +823,18 @@ const OPTIONS s_server_options[] = {
"Private key file to use; default is -cert file or else" TEST_CERT}, "Private key file to use; default is -cert file or else" TEST_CERT},
{"key2", OPT_KEY2, '<', {"key2", OPT_KEY2, '<',
"-Private Key file to use for servername if not in -cert2"}, "-Private Key file to use for servername if not in -cert2"},
{"keyform", OPT_KEYFORM, 'f', {"keyform", OPT_KEYFORM, 'f', "Key format (ENGINE, other values ignored)"},
"Key format (PEM, DER or ENGINE) PEM default"},
{"pass", OPT_PASS, 's', "Private key file pass phrase source"}, {"pass", OPT_PASS, 's', "Private key file pass phrase source"},
{"dcert", OPT_DCERT, '<', {"dcert", OPT_DCERT, '<',
"Second server certificate file to use (usually for DSA)"}, "Second server certificate file to use (usually for DSA)"},
{"dcertform", OPT_DCERTFORM, 'F', {"dcertform", OPT_DCERTFORM, 'F',
"Second server certificate file format (PEM or DER) PEM default"}, "Second server certificate file format (PEM/DER/P12); has no effect"},
{"dcert_chain", OPT_DCERT_CHAIN, '<', {"dcert_chain", OPT_DCERT_CHAIN, '<',
"second server certificate chain file in PEM format"}, "second server certificate chain file in PEM format"},
{"dkey", OPT_DKEY, '<', {"dkey", OPT_DKEY, '<',
"Second private key file to use (usually for DSA)"}, "Second private key file to use (usually for DSA)"},
{"dkeyform", OPT_DKEYFORM, 'F', {"dkeyform", OPT_DKEYFORM, 'F',
"Second key file format (PEM, DER or ENGINE) PEM default"}, "Second key file format (ENGINE, other values ignored)"},
{"dpass", OPT_DPASS, 's', "Second private key file pass phrase source"}, {"dpass", OPT_DPASS, 's', "Second private key file pass phrase source"},
{"dhparam", OPT_DHPARAM, '<', "DH parameters file to use"}, {"dhparam", OPT_DHPARAM, '<', "DH parameters file to use"},
{"servername", OPT_SERVERNAME, 's', {"servername", OPT_SERVERNAME, 's',
@@ -946,6 +951,8 @@ const OPTIONS s_server_options[] = {
{"anti_replay", OPT_ANTI_REPLAY, '-', "Switch on anti-replay protection (default)"}, {"anti_replay", OPT_ANTI_REPLAY, '-', "Switch on anti-replay protection (default)"},
{"no_anti_replay", OPT_NO_ANTI_REPLAY, '-', "Switch off anti-replay protection"}, {"no_anti_replay", OPT_NO_ANTI_REPLAY, '-', "Switch off anti-replay protection"},
{"http_server_binmode", OPT_HTTP_SERVER_BINMODE, '-', "opening files in binary mode when acting as http server (-WWW and -HTTP)"}, {"http_server_binmode", OPT_HTTP_SERVER_BINMODE, '-', "opening files in binary mode when acting as http server (-WWW and -HTTP)"},
{"no_ca_names", OPT_NOCANAMES, '-',
"Disable TLS Extension CA Names"},
{"stateless", OPT_STATELESS, '-', "Require TLSv1.3 cookies"}, {"stateless", OPT_STATELESS, '-', "Require TLSv1.3 cookies"},
#ifndef OPENSSL_NO_SSL3 #ifndef OPENSSL_NO_SSL3
{"ssl3", OPT_SSL3, '-', "Just talk SSLv3"}, {"ssl3", OPT_SSL3, '-', "Just talk SSLv3"},
@@ -1083,6 +1090,7 @@ int s_server_main(int argc, char *argv[])
const char *keylog_file = NULL; const char *keylog_file = NULL;
int max_early_data = -1, recv_max_early_data = -1; int max_early_data = -1, recv_max_early_data = -1;
char *psksessf = NULL; char *psksessf = NULL;
int no_ca_names = 0;
#ifndef OPENSSL_NO_SCTP #ifndef OPENSSL_NO_SCTP
int sctp_label_bug = 0; int sctp_label_bug = 0;
#endif #endif
@@ -1237,14 +1245,14 @@ int s_server_main(int argc, char *argv[])
s_serverinfo_file = opt_arg(); s_serverinfo_file = opt_arg();
break; break;
case OPT_CERTFORM: case OPT_CERTFORM:
if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &s_cert_format)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &s_cert_format))
goto opthelp; goto opthelp;
break; break;
case OPT_KEY: case OPT_KEY:
s_key_file = opt_arg(); s_key_file = opt_arg();
break; break;
case OPT_KEYFORM: case OPT_KEYFORM:
if (!opt_format(opt_arg(), OPT_FMT_PDE, &s_key_format)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &s_key_format))
goto opthelp; goto opthelp;
break; break;
case OPT_PASS: case OPT_PASS:
@@ -1259,14 +1267,14 @@ int s_server_main(int argc, char *argv[])
#endif #endif
break; break;
case OPT_DCERTFORM: case OPT_DCERTFORM:
if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &s_dcert_format)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &s_dcert_format))
goto opthelp; goto opthelp;
break; break;
case OPT_DCERT: case OPT_DCERT:
s_dcert_file = opt_arg(); s_dcert_file = opt_arg();
break; break;
case OPT_DKEYFORM: case OPT_DKEYFORM:
if (!opt_format(opt_arg(), OPT_FMT_PDE, &s_dkey_format)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &s_dkey_format))
goto opthelp; goto opthelp;
break; break;
case OPT_DPASS: case OPT_DPASS:
@@ -1568,7 +1576,9 @@ int s_server_main(int argc, char *argv[])
session_id_prefix = opt_arg(); session_id_prefix = opt_arg();
break; break;
case OPT_ENGINE: case OPT_ENGINE:
engine = setup_engine(opt_arg(), 1); #ifndef OPENSSL_NO_ENGINE
engine = setup_engine(opt_arg(), s_debug);
#endif
break; break;
case OPT_R_CASES: case OPT_R_CASES:
if (!opt_rand(o)) if (!opt_rand(o))
@@ -1649,6 +1659,9 @@ int s_server_main(int argc, char *argv[])
case OPT_HTTP_SERVER_BINMODE: case OPT_HTTP_SERVER_BINMODE:
http_server_binmode = 1; http_server_binmode = 1;
break; break;
case OPT_NOCANAMES:
no_ca_names = 1;
break;
case OPT_SENDFILE: case OPT_SENDFILE:
#ifndef OPENSSL_NO_KTLS #ifndef OPENSSL_NO_KTLS
use_sendfile = 1; use_sendfile = 1;
@@ -1878,7 +1891,6 @@ int s_server_main(int argc, char *argv[])
} }
BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix); BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix);
} }
SSL_CTX_set_quiet_shutdown(ctx, 1);
if (exc != NULL) if (exc != NULL)
ssl_ctx_set_excert(ctx, exc); ssl_ctx_set_excert(ctx, exc);
@@ -1895,6 +1907,10 @@ int s_server_main(int argc, char *argv[])
SSL_CTX_set_mode(ctx, SSL_MODE_ASYNC); SSL_CTX_set_mode(ctx, SSL_MODE_ASYNC);
} }
if (no_ca_names) {
SSL_CTX_set_options(ctx, SSL_OP_DISABLE_TLSEXT_CA_NAMES);
}
if (max_send_fragment > 0 if (max_send_fragment > 0
&& !SSL_CTX_set_max_send_fragment(ctx, max_send_fragment)) { && !SSL_CTX_set_max_send_fragment(ctx, max_send_fragment)) {
BIO_printf(bio_err, "%s: Max send fragment size %u is out of permitted range\n", BIO_printf(bio_err, "%s: Max send fragment size %u is out of permitted range\n",
@@ -1976,7 +1992,6 @@ int s_server_main(int argc, char *argv[])
} }
BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix); BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix);
} }
SSL_CTX_set_quiet_shutdown(ctx2, 1);
if (exc != NULL) if (exc != NULL)
ssl_ctx_set_excert(ctx2, exc); ssl_ctx_set_excert(ctx2, exc);
@@ -2764,7 +2779,7 @@ static int sv_body(int s, int stype, int prot, unsigned char *context)
err: err:
if (con != NULL) { if (con != NULL) {
BIO_printf(bio_s_out, "shutting down SSL\n"); BIO_printf(bio_s_out, "shutting down SSL\n");
SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); do_ssl_shutdown(con);
SSL_free(con); SSL_free(con);
} }
BIO_printf(bio_s_out, "CONNECTION CLOSED\n"); BIO_printf(bio_s_out, "CONNECTION CLOSED\n");
@@ -3433,7 +3448,7 @@ static int www_body(int s, int stype, int prot, unsigned char *context)
} }
end: end:
/* make sure we re-use sessions */ /* make sure we re-use sessions */
SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); do_ssl_shutdown(con);
err: err:
OPENSSL_free(buf); OPENSSL_free(buf);
@@ -3587,7 +3602,7 @@ static int rev_body(int s, int stype, int prot, unsigned char *context)
} }
end: end:
/* make sure we re-use sessions */ /* make sure we re-use sessions */
SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN); do_ssl_shutdown(con);
err: err:
+7 -4
View File
@@ -19,6 +19,9 @@
#include <openssl/x509_vfy.h> #include <openssl/x509_vfy.h>
#include <openssl/x509v3.h> #include <openssl/x509v3.h>
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF_STRING()
static int save_certs(char *signerfile, STACK_OF(X509) *signers); static int save_certs(char *signerfile, STACK_OF(X509) *signers);
static int smime_cb(int ok, X509_STORE_CTX *ctx); static int smime_cb(int ok, X509_STORE_CTX *ctx);
@@ -60,7 +63,7 @@ const OPTIONS smime_options[] = {
"Output format SMIME (default), PEM or DER"}, "Output format SMIME (default), PEM or DER"},
{"inkey", OPT_INKEY, 's', {"inkey", OPT_INKEY, 's',
"Input private key (if not signer or recipient)"}, "Input private key (if not signer or recipient)"},
{"keyform", OPT_KEYFORM, 'f', "Input private key format (PEM or ENGINE)"}, {"keyform", OPT_KEYFORM, 'f', "Input private key format (ENGINE, other values ignored)"},
#ifndef OPENSSL_NO_ENGINE #ifndef OPENSSL_NO_ENGINE
{"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"}, {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
#endif #endif
@@ -426,7 +429,7 @@ int smime_main(int argc, char **argv)
if (encerts == NULL) if (encerts == NULL)
goto end; goto end;
while (*argv != NULL) { while (*argv != NULL) {
cert = load_cert(*argv, FORMAT_PEM, cert = load_cert(*argv, FORMAT_UNDEF,
"recipient certificate file"); "recipient certificate file");
if (cert == NULL) if (cert == NULL)
goto end; goto end;
@@ -445,7 +448,7 @@ int smime_main(int argc, char **argv)
} }
if (recipfile != NULL && (operation == SMIME_DECRYPT)) { if (recipfile != NULL && (operation == SMIME_DECRYPT)) {
if ((recip = load_cert(recipfile, FORMAT_PEM, if ((recip = load_cert(recipfile, FORMAT_UNDEF,
"recipient certificate file")) == NULL) { "recipient certificate file")) == NULL) {
ERR_print_errors(bio_err); ERR_print_errors(bio_err);
goto end; goto end;
@@ -545,7 +548,7 @@ int smime_main(int argc, char **argv)
for (i = 0; i < sk_OPENSSL_STRING_num(sksigners); i++) { for (i = 0; i < sk_OPENSSL_STRING_num(sksigners); i++) {
signerfile = sk_OPENSSL_STRING_value(sksigners, i); signerfile = sk_OPENSSL_STRING_value(sksigners, i);
keyfile = sk_OPENSSL_STRING_value(skkeys, i); keyfile = sk_OPENSSL_STRING_value(skkeys, i);
signer = load_cert(signerfile, FORMAT_PEM, signer = load_cert(signerfile, FORMAT_UNDEF,
"signer certificate"); "signer certificate");
if (signer == NULL) if (signer == NULL)
goto end; goto end;
+1 -1
View File
@@ -40,7 +40,7 @@ const OPTIONS spkac_options[] = {
OPT_SECTION("Input"), OPT_SECTION("Input"),
{"in", OPT_IN, '<', "Input file"}, {"in", OPT_IN, '<', "Input file"},
{"key", OPT_KEY, '<', "Create SPKAC using private key"}, {"key", OPT_KEY, '<', "Create SPKAC using private key"},
{"keyform", OPT_KEYFORM, 'f', "Private key file format - default PEM (PEM, DER, or ENGINE)"}, {"keyform", OPT_KEYFORM, 'f', "Private key file format (ENGINE, other values ignored)"},
{"passin", OPT_PASSIN, 's', "Input file pass phrase source"}, {"passin", OPT_PASSIN, 's', "Input file pass phrase source"},
{"challenge", OPT_CHALLENGE, 's', "Challenge string"}, {"challenge", OPT_CHALLENGE, 's', "Challenge string"},
{"spkac", OPT_SPKAC, 's', "Alternative SPKAC name"}, {"spkac", OPT_SPKAC, 's', "Alternative SPKAC name"},
+5 -1
View File
@@ -18,6 +18,10 @@
#include <openssl/x509v3.h> #include <openssl/x509v3.h>
#include <openssl/pem.h> #include <openssl/pem.h>
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_CRL)
DEFINE_STACK_OF_STRING()
static int cb(int ok, X509_STORE_CTX *ctx); static int cb(int ok, X509_STORE_CTX *ctx);
static int check(X509_STORE *ctx, const char *file, static int check(X509_STORE *ctx, const char *file,
STACK_OF(X509) *uchain, STACK_OF(X509) *tchain, STACK_OF(X509) *uchain, STACK_OF(X509) *tchain,
@@ -252,7 +256,7 @@ static int check(X509_STORE *ctx, const char *file,
STACK_OF(X509) *chain = NULL; STACK_OF(X509) *chain = NULL;
int num_untrusted; int num_untrusted;
x = load_cert(file, FORMAT_PEM, "certificate file"); x = load_cert(file, FORMAT_UNDEF, "certificate file");
if (x == NULL) if (x == NULL)
goto end; goto end;
+14 -10
View File
@@ -28,6 +28,10 @@
# include <openssl/dsa.h> # include <openssl/dsa.h>
#endif #endif
DEFINE_STACK_OF(ASN1_OBJECT)
DEFINE_STACK_OF(X509_EXTENSION)
DEFINE_STACK_OF_STRING()
#undef POSTFIX #undef POSTFIX
#define POSTFIX ".srl" #define POSTFIX ".srl"
#define DEF_DAYS 30 #define DEF_DAYS 30
@@ -74,13 +78,13 @@ const OPTIONS x509_options[] = {
#endif #endif
{"inform", OPT_INFORM, 'f', {"inform", OPT_INFORM, 'f',
"Input format - default PEM (one of DER or PEM)"}, "CSR input format (DER or PEM) - default PEM"},
{"in", OPT_IN, '<', "Input file - default stdin"}, {"in", OPT_IN, '<', "Input file - default stdin"},
{"passin", OPT_PASSIN, 's', "Private key password/pass-phrase source"}, {"passin", OPT_PASSIN, 's', "Private key password/pass-phrase source"},
{"outform", OPT_OUTFORM, 'f', {"outform", OPT_OUTFORM, 'f',
"Output format - default PEM (one of DER or PEM)"}, "Output format (DER or PEM) - default PEM"},
{"out", OPT_OUT, '>', "Output file - default stdout"}, {"out", OPT_OUT, '>', "Output file - default stdout"},
{"keyform", OPT_KEYFORM, 'E', "Private key format - default PEM"}, {"keyform", OPT_KEYFORM, 'E', "Private key format (ENGINE, other values ignored)"},
{"req", OPT_REQ, '-', "Input is a certificate request, sign and output"}, {"req", OPT_REQ, '-', "Input is a certificate request, sign and output"},
{"vfyopt", OPT_VFYOPT, 's', "Verification parameter in n:v form"}, {"vfyopt", OPT_VFYOPT, 's', "Verification parameter in n:v form"},
@@ -148,8 +152,8 @@ const OPTIONS x509_options[] = {
{"extfile", OPT_EXTFILE, '<', "File with X509V3 extensions to add"}, {"extfile", OPT_EXTFILE, '<', "File with X509V3 extensions to add"},
OPT_R_OPTIONS, OPT_R_OPTIONS,
OPT_PROV_OPTIONS, OPT_PROV_OPTIONS,
{"CAform", OPT_CAFORM, 'F', "CA format - default PEM"}, {"CAform", OPT_CAFORM, 'F', "CA cert format (PEM/DER/P12); has no effect"},
{"CAkeyform", OPT_CAKEYFORM, 'E', "CA key format - default PEM"}, {"CAkeyform", OPT_CAKEYFORM, 'E', "CA key format (ENGINE, other values ignored)"},
{"sigopt", OPT_SIGOPT, 's', "Signature parameter in n:v form"}, {"sigopt", OPT_SIGOPT, 's', "Signature parameter in n:v form"},
{"CAcreateserial", OPT_CACREATESERIAL, '-', {"CAcreateserial", OPT_CACREATESERIAL, '-',
"Create serial number file if it does not exist"}, "Create serial number file if it does not exist"},
@@ -224,7 +228,7 @@ int x509_main(int argc, char **argv)
ret = 0; ret = 0;
goto end; goto end;
case OPT_INFORM: case OPT_INFORM:
if (!opt_format(opt_arg(), OPT_FMT_ANY, &informat)) if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &informat))
goto opthelp; goto opthelp;
break; break;
case OPT_IN: case OPT_IN:
@@ -235,15 +239,15 @@ int x509_main(int argc, char **argv)
goto opthelp; goto opthelp;
break; break;
case OPT_KEYFORM: case OPT_KEYFORM:
if (!opt_format(opt_arg(), OPT_FMT_PDE, &keyformat)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &keyformat))
goto opthelp; goto opthelp;
break; break;
case OPT_CAFORM: case OPT_CAFORM:
if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &CAformat)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &CAformat))
goto opthelp; goto opthelp;
break; break;
case OPT_CAKEYFORM: case OPT_CAKEYFORM:
if (!opt_format(opt_arg(), OPT_FMT_PDE, &CAkeyformat)) if (!opt_format(opt_arg(), OPT_FMT_ANY, &CAkeyformat))
goto opthelp; goto opthelp;
break; break;
case OPT_OUT: case OPT_OUT:
@@ -627,7 +631,7 @@ int x509_main(int argc, char **argv)
if (!X509_set_pubkey(x, fkey != NULL ? fkey : X509_REQ_get0_pubkey(req))) if (!X509_set_pubkey(x, fkey != NULL ? fkey : X509_REQ_get0_pubkey(req)))
goto end; goto end;
} else { } else {
x = load_cert(infile, informat, "Certificate"); x = load_cert(infile, FORMAT_UNDEF, "Certificate");
if (x == NULL) if (x == NULL)
goto end; goto end;
if (fkey != NULL && !X509_set_pubkey(x, fkey)) if (fkey != NULL && !X509_set_pubkey(x, fkey))
+3 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 1999-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -12,6 +12,8 @@
#include <openssl/asn1.h> #include <openssl/asn1.h>
#include <openssl/objects.h> #include <openssl/objects.h>
DEFINE_STACK_OF(ASN1_STRING_TABLE)
static STACK_OF(ASN1_STRING_TABLE) *stable = NULL; static STACK_OF(ASN1_STRING_TABLE) *stable = NULL;
static void st_free(ASN1_STRING_TABLE *tbl); static void st_free(ASN1_STRING_TABLE *tbl);
static int sk_table_cmp(const ASN1_STRING_TABLE *const *a, static int sk_table_cmp(const ASN1_STRING_TABLE *const *a,
+4 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -23,6 +23,9 @@
#define ASN1_GEN_STR(str,val) {str, sizeof(str) - 1, val} #define ASN1_GEN_STR(str,val) {str, sizeof(str) - 1, val}
DEFINE_STACK_OF(ASN1_TYPE)
DEFINE_STACK_OF(CONF_VALUE)
#define ASN1_FLAG_EXP_MAX 20 #define ASN1_FLAG_EXP_MAX 20
/* Maximum number of nested sequences */ /* Maximum number of nested sequences */
#define ASN1_GEN_SEQ_MAX_DEPTH 50 #define ASN1_GEN_SEQ_MAX_DEPTH 50
+2
View File
@@ -13,6 +13,8 @@
#include <openssl/asn1.h> #include <openssl/asn1.h>
#include "asn1_local.h" #include "asn1_local.h"
DEFINE_STACK_OF(ASN1_UTF8STRING)
static int asn1_get_length(const unsigned char **pp, int *inf, long *rl, static int asn1_get_length(const unsigned char **pp, int *inf, long *rl,
long max); long max);
static void asn1_put_length(unsigned char **pp, int length); static void asn1_put_length(unsigned char **pp, int length);
+3
View File
@@ -18,6 +18,9 @@
#include "internal/bio.h" #include "internal/bio.h"
#include "asn1_local.h" #include "asn1_local.h"
DEFINE_STACK_OF(BIO)
DEFINE_STACK_OF(X509_ALGOR)
/* /*
* Generalised MIME like utilities for streaming ASN1. Although many have a * Generalised MIME like utilities for streaming ASN1. Although many have a
* PKCS7/CMS like flavour others are more general purpose. * PKCS7/CMS like flavour others are more general purpose.
+3 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -16,6 +16,8 @@
#include "crypto/asn1.h" #include "crypto/asn1.h"
#include "crypto/objects.h" #include "crypto/objects.h"
DEFINE_STACK_OF(CONF_VALUE)
/* Simple ASN1 OID module: add all objects in a given section */ /* Simple ASN1 OID module: add all objects in a given section */
static int do_create(const char *value, const char *name); static int do_create(const char *value, const char *name);
+2 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2017 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2012-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -13,6 +13,7 @@
#include <openssl/conf.h> #include <openssl/conf.h>
#include <openssl/x509v3.h> #include <openssl/x509v3.h>
DEFINE_STACK_OF(CONF_VALUE)
/* Multi string module: add table entries from a given section */ /* Multi string module: add table entries from a given section */
static int do_tcreate(const char *value, const char *name); static int do_tcreate(const char *value, const char *name);
+3
View File
@@ -18,6 +18,7 @@
#include "crypto/asn1.h" #include "crypto/asn1.h"
#include "crypto/evp.h" #include "crypto/evp.h"
DEFINE_STACK_OF(ASN1_TYPE)
EVP_PKEY *d2i_PrivateKey_ex(int type, EVP_PKEY **a, const unsigned char **pp, EVP_PKEY *d2i_PrivateKey_ex(int type, EVP_PKEY **a, const unsigned char **pp,
long length, OPENSSL_CTX *libctx, const char *propq) long length, OPENSSL_CTX *libctx, const char *propq)
{ {
@@ -57,6 +58,8 @@ EVP_PKEY *d2i_PrivateKey_ex(int type, EVP_PKEY **a, const unsigned char **pp,
goto err; goto err;
EVP_PKEY_free(ret); EVP_PKEY_free(ret);
ret = tmp; ret = tmp;
if (EVP_PKEY_type(type) != EVP_PKEY_base_id(ret))
goto err;
} else { } else {
ASN1err(0, ERR_R_ASN1_LIB); ASN1err(0, ERR_R_ASN1_LIB);
goto err; goto err;
+2 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -17,6 +17,7 @@
#include "internal/numbers.h" #include "internal/numbers.h"
#include "asn1_local.h" #include "asn1_local.h"
DEFINE_STACK_OF(ASN1_VALUE)
/* /*
* Constructed types with a recursive definition (such as can be found in PKCS7) * Constructed types with a recursive definition (such as can be found in PKCS7)
+3 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -13,6 +13,8 @@
#include <openssl/objects.h> #include <openssl/objects.h>
#include "asn1_local.h" #include "asn1_local.h"
DEFINE_STACK_OF(ASN1_VALUE)
/* Free up an ASN1 structure */ /* Free up an ASN1 structure */
void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it) void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it)
+3 -1
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -15,6 +15,8 @@
#include <string.h> #include <string.h>
#include "asn1_local.h" #include "asn1_local.h"
DEFINE_STACK_OF(ASN1_VALUE)
static int asn1_item_embed_new(ASN1_VALUE **pval, const ASN1_ITEM *it, static int asn1_item_embed_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
int embed); int embed);
static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it, static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
+2
View File
@@ -788,7 +788,9 @@ void bio_cleanup(void)
/* Internal variant of the below BIO_wait() not calling BIOerr() */ /* Internal variant of the below BIO_wait() not calling BIOerr() */
static int bio_wait(BIO *bio, time_t max_time, unsigned int milliseconds) static int bio_wait(BIO *bio, time_t max_time, unsigned int milliseconds)
{ {
#ifndef OPENSSL_NO_SOCK
int fd; int fd;
#endif
if (max_time == 0) if (max_time == 0)
return 1; return 1;
+3 -3
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -46,8 +46,8 @@ char *BN_bn2hex(const BIGNUM *a)
return buf; return buf;
} }
#ifndef FIPS_MODE #ifndef FIPS_MODULE
/* No BIO_snprintf in FIPS_MODE */ /* No BIO_snprintf in FIPS_MODULE */
/* Must 'OPENSSL_free' the returned data */ /* Must 'OPENSSL_free' the returned data */
char *BN_bn2dec(const BIGNUM *a) char *BN_bn2dec(const BIGNUM *a)
{ {
+6 -6
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2019 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -90,7 +90,7 @@ struct bignum_ctx {
OPENSSL_CTX *libctx; OPENSSL_CTX *libctx;
}; };
#ifndef FIPS_MODE #ifndef FIPS_MODULE
/* Debugging functionality */ /* Debugging functionality */
static void ctxdbg(BIO *channel, const char *text, BN_CTX *ctx) static void ctxdbg(BIO *channel, const char *text, BN_CTX *ctx)
{ {
@@ -126,7 +126,7 @@ static void ctxdbg(BIO *channel, const char *text, BN_CTX *ctx)
#else #else
/* TODO(3.0): Consider if we want to do this in FIPS mode */ /* TODO(3.0): Consider if we want to do this in FIPS mode */
# define CTXDBG(str, ctx) do {} while(0) # define CTXDBG(str, ctx) do {} while(0)
#endif /* FIPS_MODE */ #endif /* FIPS_MODULE */
BN_CTX *BN_CTX_new_ex(OPENSSL_CTX *ctx) BN_CTX *BN_CTX_new_ex(OPENSSL_CTX *ctx)
{ {
@@ -143,7 +143,7 @@ BN_CTX *BN_CTX_new_ex(OPENSSL_CTX *ctx)
return ret; return ret;
} }
#ifndef FIPS_MODE #ifndef FIPS_MODULE
BN_CTX *BN_CTX_new(void) BN_CTX *BN_CTX_new(void)
{ {
return BN_CTX_new_ex(NULL); return BN_CTX_new_ex(NULL);
@@ -159,7 +159,7 @@ BN_CTX *BN_CTX_secure_new_ex(OPENSSL_CTX *ctx)
return ret; return ret;
} }
#ifndef FIPS_MODE #ifndef FIPS_MODULE
BN_CTX *BN_CTX_secure_new(void) BN_CTX *BN_CTX_secure_new(void)
{ {
return BN_CTX_secure_new_ex(NULL); return BN_CTX_secure_new_ex(NULL);
@@ -170,7 +170,7 @@ void BN_CTX_free(BN_CTX *ctx)
{ {
if (ctx == NULL) if (ctx == NULL)
return; return;
#ifndef FIPS_MODE #ifndef FIPS_MODULE
OSSL_TRACE_BEGIN(BN_CTX) { OSSL_TRACE_BEGIN(BN_CTX) {
BN_POOL_ITEM *pool = ctx->pool.head; BN_POOL_ITEM *pool = ctx->pool.head;
BIO_printf(trc_out, BIO_printf(trc_out,
+3 -3
View File
@@ -22,7 +22,7 @@
/* DH parameters from RFC3526 */ /* DH parameters from RFC3526 */
# ifndef FIPS_MODE # ifndef FIPS_MODULE
/* /*
* "1536-bit MODP Group" from RFC3526, Section 2. * "1536-bit MODP Group" from RFC3526, Section 2.
* *
@@ -60,7 +60,7 @@ static const BN_ULONG modp_1536_q[] = {
BN_DEF(0x4533E63A, 0x94812704), BN_DEF(0xC06E0E68, 0x62633145), BN_DEF(0x4533E63A, 0x94812704), BN_DEF(0xC06E0E68, 0x62633145),
BN_DEF(0x10B4611A, 0xE487ED51), BN_DEF(0xFFFFFFFF, 0x7FFFFFFF) BN_DEF(0x10B4611A, 0xE487ED51), BN_DEF(0xFFFFFFFF, 0x7FFFFFFF)
}; };
# endif /* FIPS_MODE */ # endif /* FIPS_MODULE */
/*- /*-
* "2048-bit MODP Group" from RFC3526, Section 3. * "2048-bit MODP Group" from RFC3526, Section 3.
@@ -1037,7 +1037,7 @@ make_dh_bn(ffdhe6144_q)
make_dh_bn(ffdhe8192_p) make_dh_bn(ffdhe8192_p)
make_dh_bn(ffdhe8192_q) make_dh_bn(ffdhe8192_q)
# ifndef FIPS_MODE # ifndef FIPS_MODULE
make_dh_bn(modp_1536_p) make_dh_bn(modp_1536_p)
make_dh_bn(modp_1536_q) make_dh_bn(modp_1536_q)
# endif # endif
+5 -5
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved. * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
* *
* Licensed under the Apache License 2.0 (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
@@ -207,7 +207,7 @@ int BN_generate_prime_ex2(BIGNUM *ret, int bits, int safe,
return found; return found;
} }
#ifndef FIPS_MODE #ifndef FIPS_MODULE
int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe,
const BIGNUM *add, const BIGNUM *rem, BN_GENCB *cb) const BIGNUM *add, const BIGNUM *rem, BN_GENCB *cb)
{ {
@@ -265,7 +265,7 @@ static int bn_is_prime_int(const BIGNUM *w, int checks, BN_CTX *ctx,
int do_trial_division, BN_GENCB *cb) int do_trial_division, BN_GENCB *cb)
{ {
int i, status, ret = -1; int i, status, ret = -1;
#ifndef FIPS_MODE #ifndef FIPS_MODULE
BN_CTX *ctxlocal = NULL; BN_CTX *ctxlocal = NULL;
#else #else
@@ -301,7 +301,7 @@ static int bn_is_prime_int(const BIGNUM *w, int checks, BN_CTX *ctx,
if (!BN_GENCB_call(cb, 1, -1)) if (!BN_GENCB_call(cb, 1, -1))
return -1; return -1;
} }
#ifndef FIPS_MODE #ifndef FIPS_MODULE
if (ctx == NULL && (ctxlocal = ctx = BN_CTX_new()) == NULL) if (ctx == NULL && (ctxlocal = ctx = BN_CTX_new()) == NULL)
goto err; goto err;
#endif #endif
@@ -311,7 +311,7 @@ static int bn_is_prime_int(const BIGNUM *w, int checks, BN_CTX *ctx,
goto err; goto err;
ret = (status == BN_PRIMETEST_PROBABLY_PRIME); ret = (status == BN_PRIMETEST_PROBABLY_PRIME);
err: err:
#ifndef FIPS_MODE #ifndef FIPS_MODULE
BN_CTX_free(ctxlocal); BN_CTX_free(ctxlocal);
#endif #endif
return ret; return ret;
+4 -4
View File
@@ -103,7 +103,7 @@ int BN_rand_ex(BIGNUM *rnd, int bits, int top, int bottom, BN_CTX *ctx)
{ {
return bnrand(NORMAL, rnd, bits, top, bottom, ctx); return bnrand(NORMAL, rnd, bits, top, bottom, ctx);
} }
#ifndef FIPS_MODE #ifndef FIPS_MODULE
int BN_rand(BIGNUM *rnd, int bits, int top, int bottom) int BN_rand(BIGNUM *rnd, int bits, int top, int bottom)
{ {
return bnrand(NORMAL, rnd, bits, top, bottom, NULL); return bnrand(NORMAL, rnd, bits, top, bottom, NULL);
@@ -120,7 +120,7 @@ int BN_priv_rand_ex(BIGNUM *rnd, int bits, int top, int bottom, BN_CTX *ctx)
return bnrand(PRIVATE, rnd, bits, top, bottom, ctx); return bnrand(PRIVATE, rnd, bits, top, bottom, ctx);
} }
#ifndef FIPS_MODE #ifndef FIPS_MODULE
int BN_priv_rand(BIGNUM *rnd, int bits, int top, int bottom) int BN_priv_rand(BIGNUM *rnd, int bits, int top, int bottom)
{ {
return bnrand(PRIVATE, rnd, bits, top, bottom, NULL); return bnrand(PRIVATE, rnd, bits, top, bottom, NULL);
@@ -199,7 +199,7 @@ int BN_rand_range_ex(BIGNUM *r, const BIGNUM *range, BN_CTX *ctx)
return bnrand_range(NORMAL, r, range, ctx); return bnrand_range(NORMAL, r, range, ctx);
} }
#ifndef FIPS_MODE #ifndef FIPS_MODULE
int BN_rand_range(BIGNUM *r, const BIGNUM *range) int BN_rand_range(BIGNUM *r, const BIGNUM *range)
{ {
return bnrand_range(NORMAL, r, range, NULL); return bnrand_range(NORMAL, r, range, NULL);
@@ -211,7 +211,7 @@ int BN_priv_rand_range_ex(BIGNUM *r, const BIGNUM *range, BN_CTX *ctx)
return bnrand_range(PRIVATE, r, range, ctx); return bnrand_range(PRIVATE, r, range, ctx);
} }
#ifndef FIPS_MODE #ifndef FIPS_MODULE
int BN_priv_rand_range(BIGNUM *r, const BIGNUM *range) int BN_priv_rand_range(BIGNUM *r, const BIGNUM *range)
{ {
return bnrand_range(PRIVATE, r, range, NULL); return bnrand_range(PRIVATE, r, range, NULL);
+2 -2
View File
@@ -1,8 +1,8 @@
/* /*
* Copyright 2018-2019 The OpenSSL Project Authors. All Rights Reserved. * Copyright 2018-2020 The OpenSSL Project Authors. All Rights Reserved.
* Copyright (c) 2018-2019, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018-2019, Oracle and/or its affiliates. All rights reserved.
* *
* Licensed under the OpenSSL license (the "License"). You may not use * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy * this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at * in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html * https://www.openssl.org/source/license.html
+5 -3
View File
@@ -112,16 +112,18 @@ $COMMON=bn_add.c bn_div.c bn_exp.c bn_lib.c bn_ctx.c bn_mul.c \
bn_kron.c bn_sqrt.c bn_gcd.c bn_prime.c bn_sqr.c \ bn_kron.c bn_sqrt.c bn_gcd.c bn_prime.c bn_sqr.c \
bn_recp.c bn_mont.c bn_mpi.c bn_exp2.c bn_gf2m.c bn_nist.c \ bn_recp.c bn_mont.c bn_mpi.c bn_exp2.c bn_gf2m.c bn_nist.c \
bn_x931p.c bn_intern.c bn_dh.c \ bn_x931p.c bn_intern.c bn_dh.c \
bn_rsa_fips186_4.c $BNDH $BNASM bn_rsa_fips186_4.c $BNDH
SOURCE[../../libcrypto]=$COMMON bn_print.c bn_err.c bn_srp.c SOURCE[../../libcrypto]=$COMMON $BNASM bn_print.c bn_err.c bn_srp.c
IF[{- !$disabled{'deprecated-3.0'} -}] IF[{- !$disabled{'deprecated-3.0'} -}]
SOURCE[../../libcrypto]=bn_depr.c SOURCE[../../libcrypto]=bn_depr.c
ENDIF ENDIF
SOURCE[../../providers/libfips.a]=$COMMON SOURCE[../../providers/libfips.a]=$COMMON $BNASM
SOURCE[../../providers/liblegacy.a]=$BNASM
# Implementations are now spread across several libraries, so the defines # Implementations are now spread across several libraries, so the defines
# need to be applied to all affected libraries and modules. # need to be applied to all affected libraries and modules.
DEFINE[../../libcrypto]=$BNDEF DEFINE[../../libcrypto]=$BNDEF
DEFINE[../../providers/libfips.a]=$BNDEF DEFINE[../../providers/libfips.a]=$BNDEF
DEFINE[../../providers/liblegacy.a]=$BNDEF
DEFINE[../../providers/libimplementations.a]=$BNDEF DEFINE[../../providers/libimplementations.a]=$BNDEF
INCLUDE[../../libcrypto]=../../crypto/include INCLUDE[../../libcrypto]=../../crypto/include
+1 -2
View File
@@ -77,7 +77,7 @@ $UTIL_DEFINE=$CPUIDDEF
SOURCE[../libcrypto]=$UTIL_COMMON \ SOURCE[../libcrypto]=$UTIL_COMMON \
mem.c mem_sec.c \ mem.c mem_sec.c \
cversion.c info.c cpt_err.c ebcdic.c uid.c o_time.c o_dir.c \ cversion.c info.c cpt_err.c ebcdic.c uid.c o_time.c o_dir.c \
o_fopen.c getenv.c o_init.c o_fips.c init.c trace.c provider.c \ o_fopen.c getenv.c o_init.c init.c trace.c provider.c \
$UPLINKSRC $UPLINKSRC
SOURCE[../providers/libfips.a]=$UTIL_COMMON SOURCE[../providers/libfips.a]=$UTIL_COMMON
SOURCE[../providers/liblegacy.a]=$UTIL_COMMON SOURCE[../providers/liblegacy.a]=$UTIL_COMMON
@@ -94,7 +94,6 @@ DEFINE[../providers/libcommon.a]=$UTIL_DEFINE
DEPEND[info.o]=buildinf.h DEPEND[info.o]=buildinf.h
DEPEND[cversion.o]=buildinf.h DEPEND[cversion.o]=buildinf.h
GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(CC) $(LIB_CFLAGS) $(CPPFLAGS_Q)" "$(PLATFORM)" GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(CC) $(LIB_CFLAGS) $(CPPFLAGS_Q)" "$(PLATFORM)"
DEPEND[buildinf.h]=../configdata.pm
GENERATE[uplink-x86.s]=../ms/uplink-x86.pl GENERATE[uplink-x86.s]=../ms/uplink-x86.pl
GENERATE[uplink-x86_64.s]=../ms/uplink-x86_64.pl GENERATE[uplink-x86_64.s]=../ms/uplink-x86_64.pl
+8 -3
View File
@@ -17,6 +17,8 @@
#include <openssl/cmp.h> #include <openssl/cmp.h>
#include <openssl/crmf.h> #include <openssl/crmf.h>
DEFINE_STACK_OF(OSSL_CMP_ITAV)
/* ASN.1 declarations from RFC4210 */ /* ASN.1 declarations from RFC4210 */
ASN1_SEQUENCE(OSSL_CMP_REVANNCONTENT) = { ASN1_SEQUENCE(OSSL_CMP_REVANNCONTENT) = {
/* OSSL_CMP_PKISTATUS is effectively ASN1_INTEGER so it is used directly */ /* OSSL_CMP_PKISTATUS is effectively ASN1_INTEGER so it is used directly */
@@ -68,7 +70,8 @@ ASN1_SEQUENCE(OSSL_CMP_ERRORMSGCONTENT) = {
* so it is used directly * so it is used directly
* *
*/ */
ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ERRORMSGCONTENT, errorDetails, ASN1_UTF8STRING) ASN1_SEQUENCE_OF_OPT(OSSL_CMP_ERRORMSGCONTENT, errorDetails,
ASN1_UTF8STRING)
} ASN1_SEQUENCE_END(OSSL_CMP_ERRORMSGCONTENT) } ASN1_SEQUENCE_END(OSSL_CMP_ERRORMSGCONTENT)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_ERRORMSGCONTENT) IMPLEMENT_ASN1_FUNCTIONS(OSSL_CMP_ERRORMSGCONTENT)
@@ -350,8 +353,10 @@ ASN1_CHOICE(OSSL_CMP_PKIBODY) = {
ASN1_EXP(OSSL_CMP_PKIBODY, value.cr, OSSL_CRMF_MSGS, 2), ASN1_EXP(OSSL_CMP_PKIBODY, value.cr, OSSL_CRMF_MSGS, 2),
ASN1_EXP(OSSL_CMP_PKIBODY, value.cp, OSSL_CMP_CERTREPMESSAGE, 3), ASN1_EXP(OSSL_CMP_PKIBODY, value.cp, OSSL_CMP_CERTREPMESSAGE, 3),
ASN1_EXP(OSSL_CMP_PKIBODY, value.p10cr, X509_REQ, 4), ASN1_EXP(OSSL_CMP_PKIBODY, value.p10cr, X509_REQ, 4),
ASN1_EXP(OSSL_CMP_PKIBODY, value.popdecc, OSSL_CMP_POPODECKEYCHALLCONTENT, 5), ASN1_EXP(OSSL_CMP_PKIBODY, value.popdecc,
ASN1_EXP(OSSL_CMP_PKIBODY, value.popdecr, OSSL_CMP_POPODECKEYRESPCONTENT, 6), OSSL_CMP_POPODECKEYCHALLCONTENT, 5),
ASN1_EXP(OSSL_CMP_PKIBODY, value.popdecr,
OSSL_CMP_POPODECKEYRESPCONTENT, 6),
ASN1_EXP(OSSL_CMP_PKIBODY, value.kur, OSSL_CRMF_MSGS, 7), ASN1_EXP(OSSL_CMP_PKIBODY, value.kur, OSSL_CRMF_MSGS, 7),
ASN1_EXP(OSSL_CMP_PKIBODY, value.kup, OSSL_CMP_CERTREPMESSAGE, 8), ASN1_EXP(OSSL_CMP_PKIBODY, value.kup, OSSL_CMP_CERTREPMESSAGE, 8),
ASN1_EXP(OSSL_CMP_PKIBODY, value.krr, OSSL_CRMF_MSGS, 9), ASN1_EXP(OSSL_CMP_PKIBODY, value.krr, OSSL_CRMF_MSGS, 9),
+9 -2
View File
@@ -21,6 +21,12 @@
#include "openssl/cmp_util.h" #include "openssl/cmp_util.h"
DEFINE_STACK_OF(ASN1_UTF8STRING)
DEFINE_STACK_OF(X509_CRL)
DEFINE_STACK_OF(OSSL_CMP_CERTRESPONSE)
DEFINE_STACK_OF(OSSL_CMP_PKISI)
DEFINE_STACK_OF(OSSL_CRMF_CERTID)
#define IS_CREP(t) ((t) == OSSL_CMP_PKIBODY_IP || (t) == OSSL_CMP_PKIBODY_CP \ #define IS_CREP(t) ((t) == OSSL_CMP_PKIBODY_IP || (t) == OSSL_CMP_PKIBODY_CP \
|| (t) == OSSL_CMP_PKIBODY_KUP) || (t) == OSSL_CMP_PKIBODY_KUP)
@@ -170,7 +176,7 @@ static int send_receive_check(OSSL_CMP_CTX *ctx, const OSSL_CMP_MSG *req,
if (*rep == NULL) { if (*rep == NULL) {
CMPerr(0, CMP_R_TRANSFER_ERROR); /* or receiving response */ CMPerr(0, CMP_R_TRANSFER_ERROR); /* or receiving response */
ERR_add_error_data(1, req_type_str); ERR_add_error_data(2, "request sent: ", req_type_str);
ERR_add_error_data(2, ", expected response: ", expected_type_str); ERR_add_error_data(2, ", expected response: ", expected_type_str);
return 0; return 0;
} }
@@ -205,7 +211,8 @@ static int send_receive_check(OSSL_CMP_CTX *ctx, const OSSL_CMP_MSG *req,
char buf[OSSL_CMP_PKISI_BUFLEN]; char buf[OSSL_CMP_PKISI_BUFLEN];
if (save_statusInfo(ctx, si) if (save_statusInfo(ctx, si)
&& OSSL_CMP_CTX_snprint_PKIStatus(ctx, buf, sizeof(buf)) != NULL) && OSSL_CMP_CTX_snprint_PKIStatus(ctx, buf,
sizeof(buf)) != NULL)
ERR_add_error_data(1, buf); ERR_add_error_data(1, buf);
if (emc->errorCode != NULL if (emc->errorCode != NULL
&& BIO_snprintf(buf, sizeof(buf), "; errorCode: %ld", && BIO_snprintf(buf, sizeof(buf), "; errorCode: %ld",
+13 -4
View File
@@ -20,7 +20,16 @@
#include <openssl/crmf.h> #include <openssl/crmf.h>
#include <openssl/err.h> #include <openssl/err.h>
/* Get current certificate store containing trusted root CA certs */ DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_EXTENSION)
DEFINE_STACK_OF(POLICYINFO)
DEFINE_STACK_OF(ASN1_UTF8STRING)
DEFINE_STACK_OF(GENERAL_NAME)
DEFINE_STACK_OF(OSSL_CMP_ITAV)
/*
* Get current certificate store containing trusted root CA certs
*/
X509_STORE *OSSL_CMP_CTX_get0_trustedStore(const OSSL_CMP_CTX *ctx) X509_STORE *OSSL_CMP_CTX_get0_trustedStore(const OSSL_CMP_CTX *ctx)
{ {
if (ctx == NULL) { if (ctx == NULL) {
@@ -155,7 +164,7 @@ void OSSL_CMP_CTX_free(OSSL_CMP_CTX *ctx)
X509_STORE_free(ctx->trusted); X509_STORE_free(ctx->trusted);
sk_X509_pop_free(ctx->untrusted_certs, X509_free); sk_X509_pop_free(ctx->untrusted_certs, X509_free);
X509_free(ctx->clCert); X509_free(ctx->cert);
EVP_PKEY_free(ctx->pkey); EVP_PKEY_free(ctx->pkey);
ASN1_OCTET_STRING_free(ctx->referenceValue); ASN1_OCTET_STRING_free(ctx->referenceValue);
if (ctx->secretValue != NULL) if (ctx->secretValue != NULL)
@@ -667,12 +676,12 @@ int OSSL_CMP_CTX_push1_subjectAltName(OSSL_CMP_CTX *ctx,
* Set our own client certificate, used for example in KUR and when * Set our own client certificate, used for example in KUR and when
* doing the IR with existing certificate. * doing the IR with existing certificate.
*/ */
DEFINE_OSSL_CMP_CTX_set1_up_ref(clCert, X509) DEFINE_OSSL_CMP_CTX_set1_up_ref(cert, X509)
/* /*
* Set the old certificate that we are updating in KUR * Set the old certificate that we are updating in KUR
* or the certificate to be revoked in RR, respectively. * or the certificate to be revoked in RR, respectively.
* Also used as reference cert (defaulting to clCert) for deriving subject DN * Also used as reference cert (defaulting to cert) for deriving subject DN
* and SANs. Its issuer is used as default recipient in the CMP message header. * and SANs. Its issuer is used as default recipient in the CMP message header.
*/ */
DEFINE_OSSL_CMP_CTX_set1_up_ref(oldCert, X509) DEFINE_OSSL_CMP_CTX_set1_up_ref(oldCert, X509)
+29 -20
View File
@@ -20,6 +20,9 @@
#include <openssl/cmp.h> #include <openssl/cmp.h>
#include <openssl/err.h> #include <openssl/err.h>
DEFINE_STACK_OF(ASN1_UTF8STRING)
DEFINE_STACK_OF(OSSL_CMP_ITAV)
int ossl_cmp_hdr_set_pvno(OSSL_CMP_PKIHEADER *hdr, int pvno) int ossl_cmp_hdr_set_pvno(OSSL_CMP_PKIHEADER *hdr, int pvno)
{ {
if (!ossl_assert(hdr != NULL)) if (!ossl_assert(hdr != NULL))
@@ -38,7 +41,8 @@ int ossl_cmp_hdr_get_pvno(const OSSL_CMP_PKIHEADER *hdr)
return (int)pvno; return (int)pvno;
} }
ASN1_OCTET_STRING *OSSL_CMP_HDR_get0_transactionID(const OSSL_CMP_PKIHEADER *hdr) ASN1_OCTET_STRING *OSSL_CMP_HDR_get0_transactionID(const
OSSL_CMP_PKIHEADER *hdr)
{ {
if (hdr == NULL) { if (hdr == NULL) {
CMPerr(0, CMP_R_NULL_ARGUMENT); CMPerr(0, CMP_R_NULL_ARGUMENT);
@@ -263,6 +267,25 @@ int ossl_cmp_hdr_has_implicitConfirm(const OSSL_CMP_PKIHEADER *hdr)
return 0; return 0;
} }
/*
* set ctx->transactionID in CMP header
* if ctx->transactionID is NULL, a random one is created with 128 bit
* according to section 5.1.1:
*
* It is RECOMMENDED that the clients fill the transactionID field with
* 128 bits of (pseudo-) random data for the start of a transaction to
* reduce the probability of having the transactionID in use at the server.
*/
int ossl_cmp_hdr_set_transactionID(OSSL_CMP_CTX *ctx, OSSL_CMP_PKIHEADER *hdr)
{
if (ctx->transactionID == NULL
&& !set1_aostr_else_random(&ctx->transactionID, NULL,
OSSL_CMP_TRANSACTIONID_LENGTH))
return 0;
return ossl_cmp_asn1_octet_string_set1(&hdr->transactionID,
ctx->transactionID);
}
/* fill in all fields of the hdr according to the info given in ctx */ /* fill in all fields of the hdr according to the info given in ctx */
int ossl_cmp_hdr_init(OSSL_CMP_CTX *ctx, OSSL_CMP_PKIHEADER *hdr) int ossl_cmp_hdr_init(OSSL_CMP_CTX *ctx, OSSL_CMP_PKIHEADER *hdr)
{ {
@@ -280,8 +303,8 @@ int ossl_cmp_hdr_init(OSSL_CMP_CTX *ctx, OSSL_CMP_PKIHEADER *hdr)
* The sender name is copied from the subject of the client cert, if any, * The sender name is copied from the subject of the client cert, if any,
* or else from the subject name provided for certification requests. * or else from the subject name provided for certification requests.
*/ */
sender = ctx->clCert != NULL ? sender = ctx->cert != NULL ?
X509_get_subject_name(ctx->clCert) : ctx->subjectName; X509_get_subject_name(ctx->cert) : ctx->subjectName;
if (!ossl_cmp_hdr_set1_sender(hdr, sender)) if (!ossl_cmp_hdr_set1_sender(hdr, sender))
return 0; return 0;
@@ -298,8 +321,8 @@ int ossl_cmp_hdr_init(OSSL_CMP_CTX *ctx, OSSL_CMP_PKIHEADER *hdr)
rcp = ctx->issuer; rcp = ctx->issuer;
} else if (ctx->oldCert != NULL) { } else if (ctx->oldCert != NULL) {
rcp = X509_get_issuer_name(ctx->oldCert); rcp = X509_get_issuer_name(ctx->oldCert);
} else if (ctx->clCert != NULL) { } else if (ctx->cert != NULL) {
rcp = X509_get_issuer_name(ctx->clCert); rcp = X509_get_issuer_name(ctx->cert);
} }
if (!ossl_cmp_hdr_set1_recipient(hdr, rcp)) if (!ossl_cmp_hdr_set1_recipient(hdr, rcp))
return 0; return 0;
@@ -313,21 +336,7 @@ int ossl_cmp_hdr_init(OSSL_CMP_CTX *ctx, OSSL_CMP_PKIHEADER *hdr)
ctx->recipNonce)) ctx->recipNonce))
return 0; return 0;
/* if (!ossl_cmp_hdr_set_transactionID(ctx, hdr))
* set ctx->transactionID in CMP header
* if ctx->transactionID is NULL, a random one is created with 128 bit
* according to section 5.1.1:
*
* It is RECOMMENDED that the clients fill the transactionID field with
* 128 bits of (pseudo-) random data for the start of a transaction to
* reduce the probability of having the transactionID in use at the server.
*/
if (ctx->transactionID == NULL
&& !set1_aostr_else_random(&ctx->transactionID, NULL,
OSSL_CMP_TRANSACTIONID_LENGTH))
return 0;
if (!ossl_cmp_asn1_octet_string_set1(&hdr->transactionID,
ctx->transactionID))
return 0; return 0;
/*- /*-
+4 -2
View File
@@ -28,6 +28,8 @@
#include <openssl/cmp.h> #include <openssl/cmp.h>
#include <openssl/err.h> #include <openssl/err.h>
DEFINE_STACK_OF(CONF_VALUE)
/* /*
* Send the PKIMessage req and on success return the response, else NULL. * Send the PKIMessage req and on success return the response, else NULL.
* Any previous error queue entries will likely be removed by ERR_clear_error(). * Any previous error queue entries will likely be removed by ERR_clear_error().
@@ -56,8 +58,8 @@ OSSL_CMP_MSG *OSSL_CMP_MSG_http_perform(OSSL_CMP_CTX *ctx,
OSSL_CMP_CTX_get_http_cb_arg(ctx) != NULL, OSSL_CMP_CTX_get_http_cb_arg(ctx) != NULL,
ctx->proxy, ctx->no_proxy, NULL, NULL, ctx->proxy, ctx->no_proxy, NULL, NULL,
ctx->http_cb, OSSL_CMP_CTX_get_http_cb_arg(ctx), ctx->http_cb, OSSL_CMP_CTX_get_http_cb_arg(ctx),
headers, content_type_pkix, headers, content_type_pkix, (const ASN1_VALUE *)req,
(ASN1_VALUE *)req, ASN1_ITEM_rptr(OSSL_CMP_MSG), ASN1_ITEM_rptr(OSSL_CMP_MSG),
0, 0, ctx->msg_timeout, content_type_pkix, 0, 0, ctx->msg_timeout, content_type_pkix,
ASN1_ITEM_rptr(OSSL_CMP_MSG)); ASN1_ITEM_rptr(OSSL_CMP_MSG));
+7 -6
View File
@@ -68,8 +68,8 @@ struct ossl_cmp_ctx_st {
/* client authentication */ /* client authentication */
int unprotectedSend; /* send unprotected PKI messages */ int unprotectedSend; /* send unprotected PKI messages */
X509 *clCert; /* client cert used to identify and sign for MSG_SIG_ALG */ X509 *cert; /* protection cert used to identify and sign for MSG_SIG_ALG */
EVP_PKEY *pkey; /* the key pair corresponding to clCert */ EVP_PKEY *pkey; /* the key pair corresponding to cert */
ASN1_OCTET_STRING *referenceValue; /* optional user name for MSG_MAC_ALG */ ASN1_OCTET_STRING *referenceValue; /* optional user name for MSG_MAC_ALG */
ASN1_OCTET_STRING *secretValue; /* password/shared secret for MSG_MAC_ALG */ ASN1_OCTET_STRING *secretValue; /* password/shared secret for MSG_MAC_ALG */
/* PBMParameters for MSG_MAC_ALG */ /* PBMParameters for MSG_MAC_ALG */
@@ -790,7 +790,7 @@ int ossl_cmp_ctx_set1_recipNonce(OSSL_CMP_CTX *ctx,
/* from cmp_status.c */ /* from cmp_status.c */
int ossl_cmp_pkisi_get_status(const OSSL_CMP_PKISI *si); int ossl_cmp_pkisi_get_status(const OSSL_CMP_PKISI *si);
const char *ossl_cmp_PKIStatus_to_string(int status); const char *ossl_cmp_PKIStatus_to_string(int status);
OSSL_CMP_PKIFREETEXT *ossl_cmp_pkisi_get0_statusString(const OSSL_CMP_PKISI *si); OSSL_CMP_PKIFREETEXT *ossl_cmp_pkisi_get0_statusString(const OSSL_CMP_PKISI *s);
int ossl_cmp_pkisi_get_pkifailureinfo(const OSSL_CMP_PKISI *si); int ossl_cmp_pkisi_get_pkifailureinfo(const OSSL_CMP_PKISI *si);
int ossl_cmp_pkisi_check_pkifailureinfo(const OSSL_CMP_PKISI *si, int index); int ossl_cmp_pkisi_check_pkifailureinfo(const OSSL_CMP_PKISI *si, int index);
@@ -814,6 +814,7 @@ int ossl_cmp_hdr_set_implicitConfirm(OSSL_CMP_PKIHEADER *hdr);
int ossl_cmp_hdr_has_implicitConfirm(const OSSL_CMP_PKIHEADER *hdr); int ossl_cmp_hdr_has_implicitConfirm(const OSSL_CMP_PKIHEADER *hdr);
# define OSSL_CMP_TRANSACTIONID_LENGTH 16 # define OSSL_CMP_TRANSACTIONID_LENGTH 16
# define OSSL_CMP_SENDERNONCE_LENGTH 16 # define OSSL_CMP_SENDERNONCE_LENGTH 16
int ossl_cmp_hdr_set_transactionID(OSSL_CMP_CTX *ctx, OSSL_CMP_PKIHEADER *hdr);
int ossl_cmp_hdr_init(OSSL_CMP_CTX *ctx, OSSL_CMP_PKIHEADER *hdr); int ossl_cmp_hdr_init(OSSL_CMP_CTX *ctx, OSSL_CMP_PKIHEADER *hdr);
/* from cmp_msg.c */ /* from cmp_msg.c */
@@ -885,13 +886,13 @@ OSSL_CMP_MSG *ossl_cmp_pollRep_new(OSSL_CMP_CTX *ctx, int crid,
int64_t poll_after); int64_t poll_after);
OSSL_CMP_PKISI * OSSL_CMP_PKISI *
ossl_cmp_revrepcontent_get_pkisi(OSSL_CMP_REVREPCONTENT *rrep, int rsid); ossl_cmp_revrepcontent_get_pkisi(OSSL_CMP_REVREPCONTENT *rrep, int rsid);
OSSL_CRMF_CERTID *ossl_cmp_revrepcontent_get_CertId(OSSL_CMP_REVREPCONTENT *rrep, OSSL_CRMF_CERTID *ossl_cmp_revrepcontent_get_CertId(OSSL_CMP_REVREPCONTENT *rc,
int rsid); int rsid);
OSSL_CMP_POLLREP * OSSL_CMP_POLLREP *
ossl_cmp_pollrepcontent_get0_pollrep(const OSSL_CMP_POLLREPCONTENT *prc, ossl_cmp_pollrepcontent_get0_pollrep(const OSSL_CMP_POLLREPCONTENT *prc,
int rid); int rid);
OSSL_CMP_CERTRESPONSE * OSSL_CMP_CERTRESPONSE *
ossl_cmp_certrepmessage_get0_certresponse(const OSSL_CMP_CERTREPMESSAGE *crepmsg, ossl_cmp_certrepmessage_get0_certresponse(const OSSL_CMP_CERTREPMESSAGE *crm,
int rid); int rid);
X509 *ossl_cmp_certresponse_get1_certificate(EVP_PKEY *privkey, X509 *ossl_cmp_certresponse_get1_certificate(EVP_PKEY *privkey,
const OSSL_CMP_CERTRESPONSE *crep); const OSSL_CMP_CERTRESPONSE *crep);
@@ -916,6 +917,6 @@ int ossl_cmp_verify_popo(const OSSL_CMP_MSG *msg, int accept_RAVerified);
int ossl_cmp_exchange_certConf(OSSL_CMP_CTX *ctx, int fail_info, int ossl_cmp_exchange_certConf(OSSL_CMP_CTX *ctx, int fail_info,
const char *txt); const char *txt);
int ossl_cmp_exchange_error(OSSL_CMP_CTX *ctx, int status, int fail_info, int ossl_cmp_exchange_error(OSSL_CMP_CTX *ctx, int status, int fail_info,
const char *txt, int errorCode, const char *details); const char *txt, int errorCode, const char *detail);
#endif /* !defined(OSSL_CRYPTO_CMP_LOCAL_H) */ #endif /* !defined(OSSL_CRYPTO_CMP_LOCAL_H) */
+26 -4
View File
@@ -20,6 +20,16 @@
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/x509.h> #include <openssl/x509.h>
DEFINE_STACK_OF(OSSL_CMP_CERTSTATUS)
DEFINE_STACK_OF(OSSL_CMP_ITAV)
DEFINE_STACK_OF(GENERAL_NAME)
DEFINE_STACK_OF(X509_EXTENSION)
DEFINE_STACK_OF(OSSL_CMP_PKISI)
DEFINE_STACK_OF(OSSL_CRMF_MSG)
DEFINE_STACK_OF(OSSL_CMP_CERTRESPONSE)
DEFINE_STACK_OF(OSSL_CRMF_CERTID)
DEFINE_STACK_OF(ASN1_UTF8STRING)
OSSL_CMP_PKIHEADER *OSSL_CMP_MSG_get0_header(const OSSL_CMP_MSG *msg) OSSL_CMP_PKIHEADER *OSSL_CMP_MSG_get0_header(const OSSL_CMP_MSG *msg)
{ {
if (msg == NULL) { if (msg == NULL) {
@@ -208,7 +218,7 @@ static const X509_NAME *determine_subj(OSSL_CMP_CTX *ctx, X509 *refcert,
static OSSL_CRMF_MSG *crm_new(OSSL_CMP_CTX *ctx, int bodytype, int rid) static OSSL_CRMF_MSG *crm_new(OSSL_CMP_CTX *ctx, int bodytype, int rid)
{ {
OSSL_CRMF_MSG *crm = NULL; OSSL_CRMF_MSG *crm = NULL;
X509 *refcert = ctx->oldCert != NULL ? ctx->oldCert : ctx->clCert; X509 *refcert = ctx->oldCert != NULL ? ctx->oldCert : ctx->cert;
/* refcert defaults to current client cert */ /* refcert defaults to current client cert */
EVP_PKEY *rkey = OSSL_CMP_CTX_get0_newPkey(ctx, 0); EVP_PKEY *rkey = OSSL_CMP_CTX_get0_newPkey(ctx, 0);
STACK_OF(GENERAL_NAME) *default_sans = NULL; STACK_OF(GENERAL_NAME) *default_sans = NULL;
@@ -574,9 +584,9 @@ int ossl_cmp_msg_gen_push1_ITAVs(OSSL_CMP_MSG *msg,
return 0; return 0;
for (i = 0; i < sk_OSSL_CMP_ITAV_num(itavs); i++) { for (i = 0; i < sk_OSSL_CMP_ITAV_num(itavs); i++) {
if ((itav = OSSL_CMP_ITAV_dup(sk_OSSL_CMP_ITAV_value(itavs, i))) == NULL) itav = OSSL_CMP_ITAV_dup(sk_OSSL_CMP_ITAV_value(itavs, i));
return 0; if (itav == NULL
if (!ossl_cmp_msg_gen_push0_ITAV(msg, itav)) { || !ossl_cmp_msg_gen_push0_ITAV(msg, itav)) {
OSSL_CMP_ITAV_free(itav); OSSL_CMP_ITAV_free(itav);
return 0; return 0;
} }
@@ -972,6 +982,18 @@ X509 *ossl_cmp_certresponse_get1_certificate(EVP_PKEY *privkey,
return crt; return crt;
} }
int OSSL_CMP_MSG_update_transactionID(OSSL_CMP_CTX *ctx, OSSL_CMP_MSG *msg)
{
if (ctx == NULL || msg == NULL) {
CMPerr(0, CMP_R_NULL_ARGUMENT);
return 0;
}
if (!ossl_cmp_hdr_set_transactionID(ctx, msg->header))
return 0;
return msg->header->protectionAlg == NULL
|| ossl_cmp_msg_protect(ctx, msg);
}
OSSL_CMP_MSG *ossl_cmp_msg_load(const char *file) OSSL_CMP_MSG *ossl_cmp_msg_load(const char *file)
{ {
OSSL_CMP_MSG *msg = NULL; OSSL_CMP_MSG *msg = NULL;
+67 -73
View File
@@ -18,6 +18,8 @@
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/x509.h> #include <openssl/x509.h>
DEFINE_STACK_OF(X509)
/* /*
* This function is also used for verification from cmp_vfy. * This function is also used for verification from cmp_vfy.
* *
@@ -143,21 +145,18 @@ int ossl_cmp_msg_add_extraCerts(OSSL_CMP_CTX *ctx, OSSL_CMP_MSG *msg)
&& (msg->extraCerts = sk_X509_new_null()) == NULL) && (msg->extraCerts = sk_X509_new_null()) == NULL)
return 0; return 0;
if (ctx->clCert != NULL) { if (ctx->cert != NULL && ctx->pkey != NULL) {
/* Make sure that our own cert gets sent, in the first position */ /* make sure that our own cert is included in the first position */
if (!X509_up_ref(ctx->clCert)) if (!ossl_cmp_sk_X509_add1_cert(msg->extraCerts, ctx->cert, 1, 1))
return 0; return 0;
if (!sk_X509_push(msg->extraCerts, ctx->clCert)) { /* if we have untrusted certs, try to add intermediate certs */
X509_free(ctx->clCert);
return 0;
}
/* if we have untrusted store, try to add intermediate certs */
if (ctx->untrusted_certs != NULL) { if (ctx->untrusted_certs != NULL) {
STACK_OF(X509) *chain = STACK_OF(X509) *chain =
ossl_cmp_build_cert_chain(ctx->untrusted_certs, ctx->clCert); ossl_cmp_build_cert_chain(ctx->untrusted_certs, ctx->cert);
int res = ossl_cmp_sk_X509_add1_certs(msg->extraCerts, chain, int res = ossl_cmp_sk_X509_add1_certs(msg->extraCerts, chain,
1 /* no self-issued */, 1 /* no self-issued */,
1 /* no duplicates */, 0); 1 /* no duplicates */, 0);
sk_X509_pop_free(chain, X509_free); sk_X509_pop_free(chain, X509_free);
if (res == 0) if (res == 0)
return 0; return 0;
@@ -225,6 +224,15 @@ int ossl_cmp_msg_protect(OSSL_CMP_CTX *ctx, OSSL_CMP_MSG *msg)
if (!ossl_assert(ctx != NULL && msg != NULL)) if (!ossl_assert(ctx != NULL && msg != NULL))
return 0; return 0;
/*
* For the case of re-protection remove pre-existing protection.
* TODO: Consider also removing any pre-existing extraCerts.
*/
X509_ALGOR_free(msg->header->protectionAlg);
msg->header->protectionAlg = NULL;
ASN1_BIT_STRING_free(msg->protection);
msg->protection = NULL;
if (ctx->unprotectedSend) if (ctx->unprotectedSend)
return 1; return 1;
@@ -236,84 +244,70 @@ int ossl_cmp_msg_protect(OSSL_CMP_CTX *ctx, OSSL_CMP_MSG *msg)
&& !ossl_cmp_hdr_set1_senderKID(msg->header, && !ossl_cmp_hdr_set1_senderKID(msg->header,
ctx->referenceValue)) ctx->referenceValue))
goto err; goto err;
} else if (ctx->cert != NULL && ctx->pkey != NULL) {
/*
* add any additional certificates from ctx->extraCertsOut
* while not needed to validate the signing cert, the option to do
* this might be handy for certain use cases
*/
if (!ossl_cmp_msg_add_extraCerts(ctx, msg))
goto err;
if ((msg->protection =
ossl_cmp_calc_protection(msg, ctx->secretValue, NULL)) == NULL)
goto err;
} else {
/* /*
* use MSG_SIG_ALG according to 5.1.3.3 if client Certificate and * use MSG_SIG_ALG according to 5.1.3.3 if client Certificate and
* private key is given * private key is given
*/ */
if (ctx->clCert != NULL && ctx->pkey != NULL) { const ASN1_OCTET_STRING *subjKeyIDStr = NULL;
const ASN1_OCTET_STRING *subjKeyIDStr = NULL; int algNID = 0;
int algNID = 0; ASN1_OBJECT *alg = NULL;
ASN1_OBJECT *alg = NULL;
/* make sure that key and certificate match */ /* make sure that key and certificate match */
if (!X509_check_private_key(ctx->clCert, ctx->pkey)) { if (!X509_check_private_key(ctx->cert, ctx->pkey)) {
CMPerr(0, CMP_R_CERT_AND_KEY_DO_NOT_MATCH); CMPerr(0, CMP_R_CERT_AND_KEY_DO_NOT_MATCH);
goto err;
}
if (msg->header->protectionAlg == NULL)
if ((msg->header->protectionAlg = X509_ALGOR_new()) == NULL)
goto err;
if (!OBJ_find_sigid_by_algs(&algNID, ctx->digest,
EVP_PKEY_id(ctx->pkey))) {
CMPerr(0, CMP_R_UNSUPPORTED_KEY_TYPE);
goto err;
}
if ((alg = OBJ_nid2obj(algNID)) == NULL)
goto err;
if (!X509_ALGOR_set0(msg->header->protectionAlg,
alg, V_ASN1_UNDEF, NULL)) {
ASN1_OBJECT_free(alg);
goto err;
}
/*
* set senderKID to keyIdentifier of the used certificate according
* to section 5.1.1
*/
subjKeyIDStr = X509_get0_subject_key_id(ctx->clCert);
if (subjKeyIDStr == NULL)
subjKeyIDStr = ctx->referenceValue; /* fallback */
if (subjKeyIDStr != NULL
&& !ossl_cmp_hdr_set1_senderKID(msg->header, subjKeyIDStr))
goto err;
/*
* Add ctx->clCert followed, if possible, by its chain built
* from ctx->untrusted_certs, and then ctx->extraCertsOut
*/
if (!ossl_cmp_msg_add_extraCerts(ctx, msg))
goto err;
if ((msg->protection =
ossl_cmp_calc_protection(msg, NULL, ctx->pkey)) == NULL)
goto err;
} else {
CMPerr(0, CMP_R_MISSING_KEY_INPUT_FOR_CREATING_PROTECTION);
goto err; goto err;
} }
if (msg->header->protectionAlg == NULL)
if ((msg->header->protectionAlg = X509_ALGOR_new()) == NULL)
goto err;
if (!OBJ_find_sigid_by_algs(&algNID, ctx->digest,
EVP_PKEY_id(ctx->pkey))) {
CMPerr(0, CMP_R_UNSUPPORTED_KEY_TYPE);
goto err;
}
if ((alg = OBJ_nid2obj(algNID)) == NULL)
goto err;
if (!X509_ALGOR_set0(msg->header->protectionAlg, alg,
V_ASN1_UNDEF, NULL)) {
ASN1_OBJECT_free(alg);
goto err;
}
/*
* set senderKID to keyIdentifier of the used certificate according
* to section 5.1.1
*/
subjKeyIDStr = X509_get0_subject_key_id(ctx->cert);
if (subjKeyIDStr == NULL)
subjKeyIDStr = ctx->referenceValue; /* fallback */
if (subjKeyIDStr != NULL
&& !ossl_cmp_hdr_set1_senderKID(msg->header, subjKeyIDStr))
goto err;
} else {
CMPerr(0, CMP_R_MISSING_KEY_INPUT_FOR_CREATING_PROTECTION);
goto err;
} }
if ((msg->protection =
ossl_cmp_calc_protection(msg, ctx->secretValue, ctx->pkey)) == NULL)
goto err;
/*
* If present, add ctx->cert followed by its chain as far as possible.
* Finally add any additional certificates from ctx->extraCertsOut;
* even if not needed to validate the protection
* the option to do this might be handy for certain use cases.
*/
if (!ossl_cmp_msg_add_extraCerts(ctx, msg))
goto err;
/* /*
* As required by RFC 4210 section 5.1.1., if the sender name is not known * As required by RFC 4210 section 5.1.1., if the sender name is not known
* to the client it set to NULL-DN. In this case for identification at least * to the client it set to NULL-DN. In this case for identification at least
* the senderKID must be set, where we took the referenceValue as fallback. * the senderKID must be set, where we took the referenceValue as fallback.
*/ */
if (ossl_cmp_general_name_is_NULL_DN(msg->header->sender) if (ossl_cmp_general_name_is_NULL_DN(msg->header->sender)
&& msg->header->senderKID == NULL) && msg->header->senderKID == NULL)
CMPerr(0, CMP_R_MISSING_SENDER_IDENTIFICATION); CMPerr(0, CMP_R_MISSING_SENDER_IDENTIFICATION);
+13 -5
View File
@@ -19,6 +19,11 @@
#include <openssl/cmp.h> #include <openssl/cmp.h>
#include <openssl/err.h> #include <openssl/err.h>
DEFINE_STACK_OF(OSSL_CRMF_MSG)
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(OSSL_CMP_ITAV)
DEFINE_STACK_OF(OSSL_CMP_CERTSTATUS)
/* the context for the generic CMP server */ /* the context for the generic CMP server */
struct ossl_cmp_srv_ctx_st struct ossl_cmp_srv_ctx_st
{ {
@@ -216,7 +221,8 @@ static OSSL_CMP_MSG *process_cert_request(OSSL_CMP_SRV_CTX *srv_ctx,
if (si == NULL) if (si == NULL)
goto err; goto err;
/* set OSSL_CMP_OPT_IMPLICIT_CONFIRM if and only if transaction ends */ /* set OSSL_CMP_OPT_IMPLICIT_CONFIRM if and only if transaction ends */
if (!OSSL_CMP_CTX_set_option(srv_ctx->ctx, OSSL_CMP_OPT_IMPLICIT_CONFIRM, if (!OSSL_CMP_CTX_set_option(srv_ctx->ctx,
OSSL_CMP_OPT_IMPLICIT_CONFIRM,
ossl_cmp_hdr_has_implicitConfirm(hdr) ossl_cmp_hdr_has_implicitConfirm(hdr)
&& srv_ctx->grantImplicitConfirm && srv_ctx->grantImplicitConfirm
/* do not set if polling starts: */ /* do not set if polling starts: */
@@ -484,9 +490,9 @@ OSSL_CMP_MSG *OSSL_CMP_SRV_process_request(OSSL_CMP_SRV_CTX *srv_ctx,
tid); tid);
OPENSSL_free(tid); OPENSSL_free(tid);
} }
/* start of a new transaction, set transactionID and senderNonce */ /* start of a new transaction, reset transactionID and senderNonce */
if (!OSSL_CMP_CTX_set1_transactionID(ctx, hdr->transactionID) if (!OSSL_CMP_CTX_set1_transactionID(ctx, NULL)
|| !ossl_cmp_ctx_set1_recipNonce(ctx, hdr->senderNonce)) || !OSSL_CMP_CTX_set1_senderNonce(ctx, NULL))
goto err; goto err;
break; break;
default: default:
@@ -589,7 +595,9 @@ OSSL_CMP_MSG *OSSL_CMP_SRV_process_request(OSSL_CMP_SRV_CTX *srv_ctx,
case OSSL_CMP_PKIBODY_GENP: case OSSL_CMP_PKIBODY_GENP:
case OSSL_CMP_PKIBODY_ERROR: case OSSL_CMP_PKIBODY_ERROR:
/* TODO possibly support further terminating response message types */ /* TODO possibly support further terminating response message types */
(void)OSSL_CMP_CTX_set1_transactionID(ctx, NULL); /* ignore any error */ /* prepare for next transaction, ignoring any errors here: */
(void)OSSL_CMP_CTX_set1_transactionID(ctx, NULL);
(void)OSSL_CMP_CTX_set1_senderNonce(ctx, NULL);
default: /* not closing transaction in other cases */ default: /* not closing transaction in other cases */
break; break;
+2
View File
@@ -26,6 +26,8 @@
#include <openssl/x509.h> #include <openssl/x509.h>
#include <openssl/asn1err.h> /* for ASN1_R_TOO_SMALL and ASN1_R_TOO_LARGE */ #include <openssl/asn1err.h> /* for ASN1_R_TOO_SMALL and ASN1_R_TOO_LARGE */
DEFINE_STACK_OF(ASN1_UTF8STRING)
/* CMP functions related to PKIStatus */ /* CMP functions related to PKIStatus */
int ossl_cmp_pkisi_get_status(const OSSL_CMP_PKISI *si) int ossl_cmp_pkisi_get_status(const OSSL_CMP_PKISI *si)
+4
View File
@@ -16,6 +16,10 @@
#include <openssl/err.h> /* should be implied by cmperr.h */ #include <openssl/err.h> /* should be implied by cmperr.h */
#include <openssl/x509v3.h> #include <openssl/x509v3.h>
DEFINE_STACK_OF(X509)
DEFINE_STACK_OF(X509_OBJECT)
DEFINE_STACK_OF(ASN1_UTF8STRING)
/* /*
* use trace API for CMP-specific logging, prefixed by "CMP " and severity * use trace API for CMP-specific logging, prefixed by "CMP " and severity
*/ */
+2
View File
@@ -22,6 +22,8 @@
#include <openssl/x509.h> #include <openssl/x509.h>
#include "crypto/x509.h" #include "crypto/x509.h"
DEFINE_STACK_OF(X509)
/* /*
* Verify a message protected by signature according to section 5.1.3.3 * Verify a message protected by signature according to section 5.1.3.3
* (sha1+RSA/DSA or any other algorithm supported by OpenSSL). * (sha1+RSA/DSA or any other algorithm supported by OpenSSL).
+4
View File
@@ -18,6 +18,10 @@
#include "crypto/asn1.h" #include "crypto/asn1.h"
#include "crypto/evp.h" #include "crypto/evp.h"
DEFINE_STACK_OF(CMS_RecipientInfo)
DEFINE_STACK_OF(CMS_RevocationInfoChoice)
DEFINE_STACK_OF(X509_ATTRIBUTE)
/* CMS EnvelopedData Utilities */ /* CMS EnvelopedData Utilities */
static void cms_env_set_version(CMS_EnvelopedData *env); static void cms_env_set_version(CMS_EnvelopedData *env);

Some files were not shown because too many files have changed in this diff Show More