CHANGES 462 KB
Newer Older
     (which previously caused an internal error).
     [Bodo Moeller]

Ben Laurie's avatar
Ben Laurie committed
  *) Squeeze another 10% out of IGE mode when in != out.
     [Ben Laurie]

Ben Laurie's avatar
Ben Laurie committed
  *) AES IGE mode speedup.
     [Dean Gaudet (Google)]

  *) Add the Korean symmetric 128-bit cipher SEED (see
     http://www.kisa.or.kr/kisa/seed/jsp/seed_eng.jsp) and
     add SEED ciphersuites from RFC 4162:

        TLS_RSA_WITH_SEED_CBC_SHA      =  "SEED-SHA"
        TLS_DHE_DSS_WITH_SEED_CBC_SHA  =  "DHE-DSS-SEED-SHA"
        TLS_DHE_RSA_WITH_SEED_CBC_SHA  =  "DHE-RSA-SEED-SHA"
        TLS_DH_anon_WITH_SEED_CBC_SHA  =  "ADH-SEED-SHA"

     To minimize changes between patchlevels in the OpenSSL 0.9.8
     series, SEED remains excluded from compilation unless OpenSSL
     is configured with 'enable-seed'.
     [KISA, Bodo Moeller]

  *) Mitigate branch prediction attacks, which can be practical if a
     single processor is shared, allowing a spy process to extract
     information.  For detailed background information, see
     http://eprint.iacr.org/2007/039 (O. Aciicmez, S. Gueron,
     J.-P. Seifert, "New Branch Prediction Vulnerabilities in OpenSSL
     and Necessary Software Countermeasures").  The core of the change
     are new versions BN_div_no_branch() and
     BN_mod_inverse_no_branch() of BN_div() and BN_mod_inverse(),
     respectively, which are slower, but avoid the security-relevant
     conditional branches.  These are automatically called by BN_div()
     and BN_mod_inverse() if the flag BN_FLG_CONSTTIME is set for one
     of the input BIGNUMs.  Also, BN_is_bit_set() has been changed to
     remove a conditional branch.

     BN_FLG_CONSTTIME is the new name for the previous
     BN_FLG_EXP_CONSTTIME flag, since it now affects more than just
     modular exponentiation.  (Since OpenSSL 0.9.7h, setting this flag
     in the exponent causes BN_mod_exp_mont() to use the alternative
     implementation in BN_mod_exp_mont_consttime().)  The old name
     remains as a deprecated alias.

     Similary, RSA_FLAG_NO_EXP_CONSTTIME is replaced by a more general
     RSA_FLAG_NO_CONSTTIME flag since the RSA implementation now uses
     constant-time implementations for more than just exponentiation.
     Here too the old name is kept as a deprecated alias.

     BN_BLINDING_new() will now use BN_dup() for the modulus so that
     the BN_BLINDING structure gets an independent copy of the
     modulus.  This means that the previous "BIGNUM *m" argument to
     BN_BLINDING_new() and to BN_BLINDING_create_param() now
     essentially becomes "const BIGNUM *m", although we can't actually
     change this in the header file before 0.9.9.  It allows
     RSA_setup_blinding() to use BN_with_flags() on the modulus to
     enable BN_FLG_CONSTTIME.

     [Matthew D Wood (Intel Corp)]

  *) In the SSL/TLS server implementation, be strict about session ID
     context matching (which matters if an application uses a single
     external cache for different purposes).  Previously,
     out-of-context reuse was forbidden only if SSL_VERIFY_PEER was
     set.  This did ensure strict client verification, but meant that,
     with applications using a single external cache for quite
     different requirements, clients could circumvent ciphersuite
     restrictions for a given session ID context by starting a session
     in a different context.
     [Bodo Moeller]
  *) Include "!eNULL" in SSL_DEFAULT_CIPHER_LIST to make sure that
     a ciphersuite string such as "DEFAULT:RSA" cannot enable
     authentication-only ciphersuites.
     [Bodo Moeller]

  *) Update the SSL_get_shared_ciphers() fix CVE-2006-3738 which was
     not complete and could lead to a possible single byte overflow
     (CVE-2007-5135) [Ben Laurie]

 Changes between 0.9.8d and 0.9.8e  [23 Feb 2007]

  *) Since AES128 and AES256 (and similarly Camellia128 and
     Camellia256) share a single mask bit in the logic of
     ssl/ssl_ciph.c, the code for masking out disabled ciphers needs a
     kludge to work properly if AES128 is available and AES256 isn't
     (or if Camellia128 is available and Camellia256 isn't).
     [Victor Duchovni]

  *) Fix the BIT STRING encoding generated by crypto/ec/ec_asn1.c
     (within i2d_ECPrivateKey, i2d_ECPKParameters, i2d_ECParameters):
     When a point or a seed is encoded in a BIT STRING, we need to
     prevent the removal of trailing zero bits to get the proper DER
     encoding.  (By default, crypto/asn1/a_bitstr.c assumes the case
     of a NamedBitList, for which trailing 0 bits need to be removed.)
     [Bodo Moeller]

  *) Have SSL/TLS server implementation tolerate "mismatched" record
     protocol version while receiving ClientHello even if the
     ClientHello is fragmented.  (The server can't insist on the
     particular protocol version it has chosen before the ServerHello
     message has informed the client about his choice.)
     [Bodo Moeller]

Ben Laurie's avatar
Ben Laurie committed
  *) Add RFC 3779 support.
     [Rob Austein for ARIN, Ben Laurie]

  *) Load error codes if they are not already present instead of using a
     static variable. This allows them to be cleanly unloaded and reloaded.
     Improve header file function name parsing.
     [Steve Henson]

  *) extend SMTP and IMAP protocol emulation in s_client to use EHLO
     or CAPABILITY handshake as required by RFCs.
     [Goetz Babin-Ebell]

 Changes between 0.9.8c and 0.9.8d  [28 Sep 2006]
  *) Introduce limits to prevent malicious keys being able to
     cause a denial of service.  (CVE-2006-2940)
     [Steve Henson, Bodo Moeller]

  *) Fix ASN.1 parsing of certain invalid structures that can result
     in a denial of service.  (CVE-2006-2937)  [Steve Henson]

  *) Fix buffer overflow in SSL_get_shared_ciphers() function. 
     (CVE-2006-3738) [Tavis Ormandy and Will Drewry, Google Security Team]

  *) Fix SSL client code which could crash if connecting to a
     malicious SSLv2 server.  (CVE-2006-4343)
     [Tavis Ormandy and Will Drewry, Google Security Team]

  *) Since 0.9.8b, ciphersuite strings naming explicit ciphersuites
     match only those.  Before that, "AES256-SHA" would be interpreted
Bodo Möller's avatar
Bodo Möller committed
     as a pattern and match "AES128-SHA" too (since AES128-SHA got
     the same strength classification in 0.9.7h) as we currently only
     have a single AES bit in the ciphersuite description bitmap.
     That change, however, also applied to ciphersuite strings such as
     "RC4-MD5" that intentionally matched multiple ciphersuites --
     namely, SSL 2.0 ciphersuites in addition to the more common ones
     from SSL 3.0/TLS 1.0.

     So we change the selection algorithm again: Naming an explicit
     ciphersuite selects this one ciphersuite, and any other similar
     ciphersuite (same bitmap) from *other* protocol versions.
     Thus, "RC4-MD5" again will properly select both the SSL 2.0
     ciphersuite and the SSL 3.0/TLS 1.0 ciphersuite.

     Since SSL 2.0 does not have any ciphersuites for which the
     128/256 bit distinction would be relevant, this works for now.
     The proper fix will be to use different bits for AES128 and
     AES256, which would have avoided the problems from the beginning;
     however, bits are scarce, so we can only do this in a new release
     (not just a patchlevel) when we can change the SSL_CIPHER
     definition to split the single 'unsigned long mask' bitmap into
     multiple values to extend the available space.

     [Bodo Moeller]

 Changes between 0.9.8b and 0.9.8c  [05 Sep 2006]

  *) Avoid PKCS #1 v1.5 signature attack discovered by Daniel Bleichenbacher
     (CVE-2006-4339)  [Ben Laurie and Google Security Team]
Ben Laurie's avatar
Ben Laurie committed
  *) Add AES IGE and biIGE modes.
     [Ben Laurie]

  *) Change the Unix randomness entropy gathering to use poll() when
     possible instead of select(), since the latter has some
     undesirable limitations.
     [Darryl Miles via Richard Levitte and Bodo Moeller]

Bodo Möller's avatar
Bodo Möller committed
  *) Disable "ECCdraft" ciphersuites more thoroughly.  Now special
     treatment in ssl/ssl_ciph.s makes sure that these ciphersuites
     cannot be implicitly activated as part of, e.g., the "AES" alias.
     However, please upgrade to OpenSSL 0.9.9[-dev] for
     non-experimental use of the ECC ciphersuites to get TLS extension
     support, which is required for curve and point format negotiation
     to avoid potential handshake problems.
  *) Disable rogue ciphersuites:

      - SSLv2 0x08 0x00 0x80 ("RC4-64-MD5")
      - SSLv3/TLSv1 0x00 0x61 ("EXP1024-RC2-CBC-MD5")
      - SSLv3/TLSv1 0x00 0x60 ("EXP1024-RC4-MD5")

     The latter two were purportedly from
     draft-ietf-tls-56-bit-ciphersuites-0[01].txt, but do not really
     appear there.

Nils Larsch's avatar
Nils Larsch committed
     Also deactivate the remaining ciphersuites from
     draft-ietf-tls-56-bit-ciphersuites-01.txt.  These are just as
     unofficial, and the ID has long expired.
     [Bodo Moeller]

  *) Fix RSA blinding Heisenbug (problems sometimes occured on
Bodo Möller's avatar
Bodo Möller committed
     dual-core machines) and other potential thread-safety issues.
     [Bodo Moeller]

  *) Add the symmetric cipher Camellia (128-bit, 192-bit, 256-bit key
     versions), which is now available for royalty-free use
     (see http://info.isl.ntt.co.jp/crypt/eng/info/chiteki.html).
     Also, add Camellia TLS ciphersuites from RFC 4132.

     To minimize changes between patchlevels in the OpenSSL 0.9.8
     series, Camellia remains excluded from compilation unless OpenSSL
     is configured with 'enable-camellia'.
     [NTT]

  *) Disable the padding bug check when compression is in use. The padding
     bug check assumes the first packet is of even length, this is not
     necessarily true if compresssion is enabled and can result in false
     positives causing handshake failure. The actual bug test is ancient
     code so it is hoped that implementations will either have fixed it by
     now or any which still have the bug do not support compression.
     [Steve Henson]

 Changes between 0.9.8a and 0.9.8b  [04 May 2006]
Richard Levitte's avatar
Richard Levitte committed

  *) 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.
     [Steve Henson]

  *) Link in manifests for VC++ if needed.
     [Austin Ziegler <halostatue@gmail.com>]

Bodo Möller's avatar
Bodo Möller committed
  *) Update support for ECC-based TLS ciphersuites according to
Bodo Möller's avatar
Bodo Möller committed
     draft-ietf-tls-ecc-12.txt with proposed changes (but without
     TLS extensions, which are supported starting with the 0.9.9
     branch, not in the OpenSSL 0.9.8 branch).
Bodo Möller's avatar
Bodo Möller committed
     [Douglas Stebila]

  *) New functions EVP_CIPHER_CTX_new() and EVP_CIPHER_CTX_free() to support
     opaque EVP_CIPHER_CTX handling.
     [Steve Henson]

  *) Fixes and enhancements to zlib compression code. We now only use
     "zlib1.dll" and use the default __cdecl calling convention on Win32
     to conform with the standards mentioned here:
           http://www.zlib.net/DLL_FAQ.txt
     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
     of the headers and library. Gracefully handle case where zlib library
     can't be loaded.
     [Steve Henson]

  *) Several fixes and enhancements to the OID generation code. The old code
     sometimes allowed invalid OIDs (1.X for X >= 40 for example), couldn't
     handle numbers larger than ULONG_MAX, truncated printing and had a
     non standard OBJ_obj2txt() behaviour.
     [Steve Henson]

  *) Add support for building of engines under engine/ as shared libraries
     under VC++ build system.
     [Steve Henson]

Richard Levitte's avatar
Richard Levitte committed
  *) Corrected the numerous bugs in the Win32 path splitter in DSO.
     Hopefully, we will not see any false combination of paths any more.
     [Richard Levitte]

 Changes between 0.9.8 and 0.9.8a  [11 Oct 2005]

  *) Remove the functionality of SSL_OP_MSIE_SSLV2_RSA_PADDING
     (part of SSL_OP_ALL).  This option used to disable the
     countermeasure against man-in-the-middle protocol-version
     rollback in the SSL 2.0 server implementation, which is a bad
Mark J. Cox's avatar
Mark J. Cox committed
     idea.  (CVE-2005-2969)

     [Bodo Moeller; problem pointed out by Yutaka Oiwa (Research Center
     for Information Security, National Institute of Advanced Industrial
     Science and Technology [AIST], Japan)]
  *) Add two function to clear and return the verify parameter flags.
     [Steve Henson]

  *) Keep cipherlists sorted in the source instead of sorting them at
     runtime, thus removing the need for a lock.
     [Nils Larsch]

  *) Avoid some small subgroup attacks in Diffie-Hellman.
     [Nick Mathewson and Ben Laurie]

  *) Add functions for well-known primes.
     [Nick Mathewson]

Andy Polyakov's avatar
Andy Polyakov committed
  *) Extended Windows CE support.
     [Satoshi Nakamura and Andy Polyakov]
  *) Initialize SSL_METHOD structures at compile time instead of during
     runtime, thus removing the need for a lock.
     [Steve Henson]

  *) Make PKCS7_decrypt() work even if no certificate is supplied by
     attempting to decrypt each encrypted key in turn. Add support to
     smime utility.
     [Steve Henson]

 Changes between 0.9.7h and 0.9.8  [05 Jul 2005]
Bodo Möller's avatar
Bodo Möller committed
  [NB: OpenSSL 0.9.7i and later 0.9.7 patch levels were released after
  OpenSSL 0.9.8.]

  *) Add libcrypto.pc and libssl.pc for those who feel they need them.
     [Richard Levitte]

  *) Change CA.sh and CA.pl so they don't bundle the CSR and the private
     key into the same file any more.
     [Richard Levitte]

  *) Add initial support for Win64, both IA64 and AMD64/x64 flavors.
     [Andy Polyakov]

  *) Add -utf8 command line and config file option to 'ca'.
     [Stefan <stf@udoma.org]

  *) Removed the macro des_crypt(), as it seems to conflict with some
     libraries.  Use DES_crypt().
     [Richard Levitte]

  *) Correct naming of the 'chil' and '4758cca' ENGINEs. This
     involves renaming the source and generated shared-libs for
     both. The engines will accept the corrected or legacy ids
     ('ncipher' and '4758_cca' respectively) when binding. NB,
     this only applies when building 'shared'.
     [Corinna Vinschen <vinschen@redhat.com> and Geoff Thorpe]

  *) Add attribute functions to EVP_PKEY structure. Modify
     PKCS12_create() to recognize a CSP name attribute and
     use it. Make -CSP option work again in pkcs12 utility.
     [Steve Henson]

  *) Add new functionality to the bn blinding code:
     - automatic re-creation of the BN_BLINDING parameters after
       a fixed number of uses (currently 32)
     - add new function for parameter creation
     - introduce flags to control the update behaviour of the
       BN_BLINDING parameters
     - hide BN_BLINDING structure
     Add a second BN_BLINDING slot to the RSA structure to improve
     performance when a single RSA object is shared among several
     threads.
     [Nils Larsch]

Ben Laurie's avatar
Ben Laurie committed
  *) Add support for DTLS.
     [Nagendra Modadugu <nagendra@cs.stanford.edu> and Ben Laurie]

  *) Add support for DER encoded private keys (SSL_FILETYPE_ASN1)
     to SSL_CTX_use_PrivateKey_file() and SSL_use_PrivateKey_file()
     [Walter Goulet]

  *) Remove buggy and incomplete DH cert support from
     ssl/ssl_rsa.c and ssl/s3_both.c
     [Nils Larsch]

  *) Use SHA-1 instead of MD5 as the default digest algorithm for
     the apps/openssl applications.
     [Nils Larsch]
Bodo Möller's avatar
Bodo Möller committed

  *) Compile clean with "-Wall -Wmissing-prototypes
     -Wstrict-prototypes -Wmissing-declarations -Werror". Currently
     DEBUG_SAFESTACK must also be set.
     [Ben Laurie]

  *) Change ./Configure so that certain algorithms can be disabled by default.
     The new counterpiece to "no-xxx" is "enable-xxx".

     The patented RC5 and MDC2 algorithms will now be disabled unless
     "enable-rc5" and "enable-mdc2", respectively, are specified.

     (IDEA remains enabled despite being patented.  This is because IDEA
     is frequently required for interoperability, and there is no license
     fee for non-commercial use.  As before, "no-idea" can be used to
     avoid this algorithm.)

  *) Add processing of proxy certificates (see RFC 3820).  This work was
     sponsored by KTH (The Royal Institute of Technology in Stockholm) and
     EGEE (Enabling Grids for E-science in Europe).
     [Richard Levitte]

  *) RC4 performance overhaul on modern architectures/implementations, such
     as Intel P4, IA-64 and AMD64.
     [Andy Polyakov]

  *) New utility extract-section.pl. This can be used specify an alternative
     section number in a pod file instead of having to treat each file as
     a separate case in Makefile. This can be done by adding two lines to the
     pod file:

     =for comment openssl_section:XXX

     The blank line is mandatory.

     [Steve Henson]

Dr. Stephen Henson's avatar
Dr. Stephen Henson committed
  *) New arguments -certform, -keyform and -pass for s_client and s_server
     to allow alternative format key and certificate files and passphrase
     sources.
     [Steve Henson]

  *) New structure X509_VERIFY_PARAM which combines current verify parameters,
     update associated structures and add various utility functions.

     Add new policy related verify parameters, include policy checking in 
     standard verify code. Enhance 'smime' application with extra parameters
     to support policy checking and print out.
     [Steve Henson]

  *) Add a new engine to support VIA PadLock ACE extensions in the VIA C3
     Nehemiah processors. These extensions support AES encryption in hardware
     as well as RNG (though RNG support is currently disabled).
     [Michal Ludvig <michal@logix.cz>, with help from Andy Polyakov]

  *) Deprecate BN_[get|set]_params() functions (they were ignored internally).
     [Geoff Thorpe]

  *) New FIPS 180-2 algorithms, SHA-224/-256/-384/-512 are implemented.
     [Andy Polyakov and a number of other people]

  *) Improved PowerPC platform support. Most notably BIGNUM assembler
     implementation contributed by IBM.
     [Suresh Chari, Peter Waltenberg, Andy Polyakov]

  *) The new 'RSA_generate_key_ex' function now takes a BIGNUM for the public
     exponent rather than 'unsigned long'. There is a corresponding change to
     the new 'rsa_keygen' element of the RSA_METHOD structure.
     [Jelte Jansen, Geoff Thorpe]

  *) Functionality for creating the initial serial number file is now
     moved from CA.pl to the 'ca' utility with a new option -create_serial.

     (Before OpenSSL 0.9.7e, CA.pl used to initialize the serial
     number file to 1, which is bound to cause problems.  To avoid
     the problems while respecting compatibility between different 0.9.7
     patchlevels, 0.9.7e  employed 'openssl x509 -next_serial' in
     CA.pl for serial number initialization.  With the new release 0.9.8,
     we can fix the problem directly in the 'ca' utility.)
  *) Reduced header interdepencies by declaring more opaque objects in
     ossl_typ.h. As a consequence, including some headers (eg. engine.h) will
     give fewer recursive includes, which could break lazy source code - so
     this change is covered by the OPENSSL_NO_DEPRECATED symbol. As always,
     developers should define this symbol when building and using openssl to
     ensure they track the recommended behaviour, interfaces, [etc], but
     backwards-compatible behaviour prevails when this isn't defined.
     [Geoff Thorpe]

  *) New function X509_POLICY_NODE_print() which prints out policy nodes.
     [Steve Henson]

  *) Add new EVP function EVP_CIPHER_CTX_rand_key and associated functionality.
     This will generate a random key of the appropriate length based on the 
     cipher context. The EVP_CIPHER can provide its own random key generation
     routine to support keys of a specific form. This is used in the des and 
     3des routines to generate a key of the correct parity. Update S/MIME
     code to use new functions and hence generate correct parity DES keys.
     Add EVP_CHECK_DES_KEY #define to return an error if the key is not 
     valid (weak or incorrect parity).
     [Steve Henson]

  *) Add a local set of CRLs that can be used by X509_verify_cert() as well
     as looking them up. This is useful when the verified structure may contain
     CRLs, for example PKCS#7 signedData. Modify PKCS7_verify() to use any CRLs
     present unless the new PKCS7_NO_CRL flag is asserted.
     [Steve Henson]

  *) Extend ASN1 oid configuration module. It now additionally accepts the
     syntax:

     shortName = some long name, 1.2.3.4
     [Steve Henson]

  *) Reimplemented the BN_CTX implementation. There is now no more static
     limitation on the number of variables it can handle nor the depth of the
     "stack" handling for BN_CTX_start()/BN_CTX_end() pairs. The stack
     information can now expand as required, and rather than having a single
     static array of bignums, BN_CTX now uses a linked-list of such arrays
     allowing it to expand on demand whilst maintaining the usefulness of
     BN_CTX's "bundling".
     [Geoff Thorpe]

  *) Add a missing BN_CTX parameter to the 'rsa_mod_exp' callback in RSA_METHOD
     to allow all RSA operations to function using a single BN_CTX.
     [Geoff Thorpe]

  *) Preliminary support for certificate policy evaluation and checking. This
     is initially intended to pass the tests outlined in "Conformance Testing
     of Relying Party Client Certificate Path Processing Logic" v1.07.
     [Steve Henson]

  *) bn_dup_expand() has been deprecated, it was introduced in 0.9.7 and
     remained unused and not that useful. A variety of other little bignum
     tweaks and fixes have also been made continuing on from the audit (see
     below).
     [Geoff Thorpe]

  *) Constify all or almost all d2i, c2i, s2i and r2i functions, along with
     associated ASN1, EVP and SSL functions and old ASN1 macros.
  *) BN_zero() only needs to set 'top' and 'neg' to zero for correct results,
     and this should never fail. So the return value from the use of
     BN_set_word() (which can fail due to needless expansion) is now deprecated;
     if OPENSSL_NO_DEPRECATED is defined, BN_zero() is a void macro.
     [Geoff Thorpe]

  *) BN_CTX_get() should return zero-valued bignums, providing the same
     initialised value as BN_new().
     [Geoff Thorpe, suggested by Ulf Möller]

  *) Support for inhibitAnyPolicy certificate extension.
     [Steve Henson]

  *) An audit of the BIGNUM code is underway, for which debugging code is
     enabled when BN_DEBUG is defined. This makes stricter enforcements on what
     is considered valid when processing BIGNUMs, and causes execution to
     assert() when a problem is discovered. If BN_DEBUG_RAND is defined,
     further steps are taken to deliberately pollute unused data in BIGNUM
     structures to try and expose faulty code further on. For now, openssl will
     (in its default mode of operation) continue to tolerate the inconsistent
     forms that it has tolerated in the past, but authors and packagers should
     consider trying openssl and their own applications when compiled with
     these debugging symbols defined. It will help highlight potential bugs in
     their own code, and will improve the test coverage for OpenSSL itself. At
     some point, these tighter rules will become openssl's default to improve
     maintainability, though the assert()s and other overheads will remain only
     in debugging configurations. See bn.h for more details.
     [Geoff Thorpe, Nils Larsch, Ulf Möller]
  *) BN_CTX_init() has been deprecated, as BN_CTX is an opaque structure
     that can only be obtained through BN_CTX_new() (which implicitly
     initialises it). The presence of this function only made it possible
     to overwrite an existing structure (and cause memory leaks).
     [Geoff Thorpe]

  *) Because of the callback-based approach for implementing LHASH as a
     template type, lh_insert() adds opaque objects to hash-tables and
     lh_doall() or lh_doall_arg() are typically used with a destructor callback
     to clean up those corresponding objects before destroying the hash table
     (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
     objects as "const" and the lh_doall[_arg] callback wrappers are not
     prototyped to have "const" restrictions on the object pointers they are
     given (and so aren't required to cast them away any more).
     [Geoff Thorpe]

  *) The tmdiff.h API was so ugly and minimal that our own timing utility
     (speed) prefers to use its own implementation. The two implementations
     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
     *". 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
     internally to the implementation so I've used that for now.
     [Geoff Thorpe]

  *) Ensure that deprecated functions do not get compiled when
     OPENSSL_NO_DEPRECATED is defined. Some "openssl" subcommands and a few of
     the self-tests were still using deprecated key-generation functions so
     these have been updated also.
  *) Reorganise PKCS#7 code to separate the digest location functionality
     into PKCS7_find_digest(), digest addition into PKCS7_bio_add_digest().
     New function PKCS7_set_digest() to set the digest type for PKCS#7
     digestedData type. Add additional code to correctly generate the
     digestedData type and add support for this type in PKCS7 initialization
     functions.
  *) New function PKCS7_set0_type_other() this initializes a PKCS7 
     structure of type "other".
  *) Fix prime generation loop in crypto/bn/bn_prime.pl by making
     sure the loop does correctly stop and breaking ("division by zero")
     modulus operations are not performed. The (pre-generated) prime
     table crypto/bn/bn_prime.h was already correct, but it could not be
     re-generated on some platforms because of the "division by zero"
     situation in the script.
     [Ralf S. Engelschall]

  *) Update support for ECC-based TLS ciphersuites according to
     draft-ietf-tls-ecc-03.txt: the KDF1 key derivation function with
     SHA-1 now is only used for "small" curves (where the
     representation of a field element takes up to 24 bytes); for
     larger curves, the field element resulting from ECDH is directly
     used as premaster secret.
     [Douglas Stebila (Sun Microsystems Laboratories)]

Bodo Möller's avatar
Bodo Möller committed
  *) Add code for kP+lQ timings to crypto/ec/ectest.c, and add SEC2
     curve secp160r1 to the tests.
     [Douglas Stebila (Sun Microsystems Laboratories)]

  *) Add the possibility to load symbols globally with DSO.
     [Götz Babin-Ebell <babin-ebell@trustcenter.de> via Richard Levitte]

  *) Add the functions ERR_set_mark() and ERR_pop_to_mark() for better
     control of the error stack.
     [Richard Levitte]

  *) Add support for STORE in ENGINE.
     [Richard Levitte]

  *) Add the STORE type.  The intention is to provide a common interface
     to certificate and key stores, be they simple file-based stores, or
     HSM-type store, or LDAP stores, or...
     NOTE: The code is currently UNTESTED and isn't really used anywhere.
     [Richard Levitte]

  *) Add a generic structure called OPENSSL_ITEM.  This can be used to
     pass a list of arguments to any function as well as provide a way
     for a function to pass data back to the caller.
     [Richard Levitte]

  *) Add the functions BUF_strndup() and BUF_memdup().  BUF_strndup()
     works like BUF_strdup() but can be used to duplicate a portion of
     a string.  The copy gets NUL-terminated.  BUF_memdup() duplicates
     a memory area.
     [Richard Levitte]

  *) Add the function sk_find_ex() which works like sk_find(), but will
     return an index to an element even if an exact match couldn't be
     found.  The index is guaranteed to point at the element where the
     searched-for key would be inserted to preserve sorting order.
     [Richard Levitte]

  *) Add the function OBJ_bsearch_ex() which works like OBJ_bsearch() but
     takes an extra flags argument for optional functionality.  Currently,
     the following flags are defined:

	OBJ_BSEARCH_VALUE_ON_NOMATCH
	This one gets OBJ_bsearch_ex() to return a pointer to the first
	element where the comparing function returns a negative or zero
	number.

	OBJ_BSEARCH_FIRST_VALUE_ON_MATCH
	This one gets OBJ_bsearch_ex() to return a pointer to the first
	element where the comparing function returns zero.  This is useful
	if there are more than one element where the comparing function
	returns zero.
  *) Make it possible to create self-signed certificates with 'openssl ca'
     in such a way that the self-signed certificate becomes part of the
     CA database and uses the same mechanisms for serial number generation
     as all other certificate signing.  The new flag '-selfsign' enables
     this functionality.  Adapt CA.sh and CA.pl.in.
     [Richard Levitte]

  *) Add functionality to check the public key of a certificate request
     against a given private.  This is useful to check that a certificate
     request can be signed by that key (self-signing).
     [Richard Levitte]

  *) Make it possible to have multiple active certificates with the same
     subject in the CA index file.  This is done only if the keyword
     'unique_subject' is set to 'no' in the main CA section (default
     if 'CA_default') of the configuration file.  The value is saved
     with the database itself in a separate index attribute file,
     named like the index file with '.attr' appended to the name.
     [Richard Levitte]

  *) Generate muti valued AVAs using '+' notation in config files for
     req and dirName.
     [Steve Henson]

  *) Support for nameConstraints certificate extension.
     [Steve Henson]

  *) Support for policyConstraints certificate extension.
     [Steve Henson]

  *) Support for policyMappings certificate extension.
     [Steve Henson]

  *) Make sure the default DSA_METHOD implementation only uses its
     dsa_mod_exp() and/or bn_mod_exp() handlers if they are non-NULL,
     and change its own handlers to be NULL so as to remove unnecessary
     indirection. This lets alternative implementations fallback to the
     default implementation more easily.
     [Geoff Thorpe]

  *) Support for directoryName in GeneralName related extensions
     in config files.
     [Steve Henson]

  *) Make it possible to link applications using Makefile.shared.
     Make that possible even when linking against static libraries!
     [Richard Levitte]

  *) Support for single pass processing for S/MIME signing. This now
     means that S/MIME signing can be done from a pipe, in addition
     cleartext signing (multipart/signed type) is effectively streaming
     and the signed data does not need to be all held in memory.

     This is done with a new flag PKCS7_STREAM. When this flag is set
     PKCS7_sign() only initializes the PKCS7 structure and the actual signing
     is done after the data is output (and digests calculated) in
     SMIME_write_PKCS7().
     [Steve Henson]

  *) Add full support for -rpath/-R, both in shared libraries and
     applications, at least on the platforms where it's known how
     to do it.
     [Richard Levitte]

  *) In crypto/ec/ec_mult.c, implement fast point multiplication with
Bodo Möller's avatar
Bodo Möller committed
     precomputation, based on wNAF splitting: EC_GROUP_precompute_mult()
     will now compute a table of multiples of the generator that
Bodo Möller's avatar
Bodo Möller committed
     makes subsequent invocations of EC_POINTs_mul() or EC_POINT_mul()
     faster (notably in the case of a single point multiplication,
     scalar * generator).
     [Nils Larsch, Bodo Moeller]

  *) IPv6 support for certificate extensions. The various extensions
     which use the IP:a.b.c.d can now take IPv6 addresses using the
     formats of RFC1884 2.2 . IPv6 addresses are now also displayed
     correctly.
     [Steve Henson]

  *) Added an ENGINE that implements RSA by performing private key
     exponentiations with the GMP library. The conversions to and from
     GMP's mpz_t format aren't optimised nor are any montgomery forms
     cached, and on x86 it appears OpenSSL's own performance has caught up.
     However there are likely to be other architectures where GMP could
     provide a boost. This ENGINE is not built in by default, but it can be
     specified at Configure time and should be accompanied by the necessary
     linker additions, eg;
         ./config -DOPENSSL_USE_GMP -lgmp
     [Geoff Thorpe]

  *) "openssl engine" will not display ENGINE/DSO load failure errors when
     testing availability of engines with "-t" - the old behaviour is
     produced by increasing the feature's verbosity with "-tt".
     [Geoff Thorpe]

  *) ECDSA routines: under certain error conditions uninitialized BN objects
     could be freed. Solution: make sure initialization is performed early
     enough. (Reported and fix supplied by Nils Larsch <nla@trustcenter.de>
     via PR#459)
     [Lutz Jaenicke]

  *) Key-generation can now be implemented in RSA_METHOD, DSA_METHOD
     and DH_METHOD (eg. by ENGINE implementations) to override the normal
     software implementations. For DSA and DH, parameter generation can
     also be overriden by providing the appropriate method callbacks.
  *) Change the "progress" mechanism used in key-generation and
     primality testing to functions that take a new BN_GENCB pointer in
     place of callback/argument pairs. The new API functions have "_ex"
     postfixes and the older functions are reimplemented as wrappers for
     the new ones. The OPENSSL_NO_DEPRECATED symbol can be used to hide
     declarations of the old functions to help (graceful) attempts to
     migrate to the new functions. Also, the new key-generation API
     functions operate on a caller-supplied key-structure and return
     success/failure rather than returning a key or NULL - this is to
     help make "keygen" another member function of RSA_METHOD etc.

     Example for using the new callback interface:

          int (*my_callback)(int a, int b, BN_GENCB *cb) = ...;
          void *my_arg = ...;
          BN_GENCB my_cb;

          BN_GENCB_set(&my_cb, my_callback, my_arg);

          return BN_is_prime_ex(some_bignum, BN_prime_checks, NULL, &cb);
          /* For the meaning of a, b in calls to my_callback(), see the
           * documentation of the function that calls the callback.
           * cb will point to my_cb; my_arg can be retrieved as cb->arg.
           * my_callback should return 1 if it wants BN_is_prime_ex()
           * to continue, or 0 to stop.
           */

  *) Change the ZLIB compression method to be stateful, and make it
     available to TLS with the number defined in 
     draft-ietf-tls-compression-04.txt.
     [Richard Levitte]

  *) Add the ASN.1 structures and functions for CertificatePair, which
     is defined as follows (according to X.509_4thEditionDraftV6.pdf):

     CertificatePair ::= SEQUENCE {
        forward		[0]	Certificate OPTIONAL,
        reverse		[1]	Certificate OPTIONAL,
        -- at least one of the pair shall be present -- }

     Also implement the PEM functions to read and write certificate
     pairs, and defined the PEM tag as "CERTIFICATE PAIR".

     This needed to be defined, mostly for the sake of the LDAP
     attribute crossCertificatePair, but may prove useful elsewhere as
     well.
     [Richard Levitte]

  *) Make it possible to inhibit symlinking of shared libraries in
     Makefile.shared, for Cygwin's sake.
     [Richard Levitte]

  *) Extend the BIGNUM API by creating a function 
          void BN_set_negative(BIGNUM *a, int neg);
     and a macro that behave like
          int  BN_is_negative(const BIGNUM *a);
     to avoid the need to access 'a->neg' directly in applications.
     [Nils Larsch]
  *) Implement fast modular reduction for pseudo-Mersenne primes
     used in NIST curves (crypto/bn/bn_nist.c, crypto/ec/ecp_nist.c).
     EC_GROUP_new_curve_GFp() will now automatically use this
     if applicable.
     [Nils Larsch <nla@trustcenter.de>]

  *) Add new lock type (CRYPTO_LOCK_BN).
     [Bodo Moeller]

  *) Change the ENGINE framework to automatically load engines
     dynamically from specific directories unless they could be
     found to already be built in or loaded.  Move all the
     current engines except for the cryptodev one to a new
     directory engines/.
     The engines in engines/ are built as shared libraries if
     the "shared" options was given to ./Configure or ./config.
     Otherwise, they are inserted in libcrypto.a.
     /usr/local/ssl/engines is the default directory for dynamic
     engines, but that can be overriden at configure time through
     the usual use of --prefix and/or --openssldir, and at run
     time with the environment variable OPENSSL_ENGINES.
     [Geoff Thorpe and Richard Levitte]

  *) Add Makefile.shared, a helper makefile to build shared
     libraries.  Adapt Makefile.org.
Dr. Stephen Henson's avatar
 
Dr. Stephen Henson committed
  *) Add version info to Win32 DLLs.
     [Peter 'Luna' Runestig" <peter@runestig.com>]

Dr. Stephen Henson's avatar
 
Dr. Stephen Henson committed
  *) Add new 'medium level' PKCS#12 API. Certificates and keys
     can be added using this API to created arbitrary PKCS#12
     files while avoiding the low level API.

     New options to PKCS12_create(), key or cert can be NULL and
     will then be omitted from the output file. The encryption
     algorithm NIDs can be set to -1 for no encryption, the mac
     iteration count can be set to 0 to omit the mac.

     Enhance pkcs12 utility by making the -nokeys and -nocerts
     options work when creating a PKCS#12 file. New option -nomac
     to omit the mac, NONE can be set for an encryption algorithm.
     New code is modified to use the enhanced PKCS12_create()
     instead of the low level API.
     [Steve Henson]

  *) Extend ASN1 encoder to support indefinite length constructed
     encoding. This can output sequences tags and octet strings in
     this form. Modify pk7_asn1.c to support indefinite length
     encoding. This is experimental and needs additional code to
     be useful, such as an ASN1 bio and some enhanced streaming
     PKCS#7 code.

     Extend template encode functionality so that tagging is passed
     down to the template encoder.
     [Steve Henson]

  *) Let 'openssl req' fail if an argument to '-newkey' is not
     recognized instead of using RSA as a default.
     [Bodo Moeller]

Bodo Möller's avatar
Bodo Möller committed
  *) Add support for ECC-based ciphersuites from draft-ietf-tls-ecc-01.txt.
     As these are not official, they are not included in "ALL";
     the "ECCdraft" ciphersuite group alias can be used to select them.
     [Vipul Gupta and Sumit Gupta (Sun Microsystems Laboratories)]

Bodo Möller's avatar
Bodo Möller committed
  *) Add ECDH engine support.
     [Nils Gura and Douglas Stebila (Sun Microsystems Laboratories)]

  *) Add ECDH in new directory crypto/ecdh/.
     [Douglas Stebila (Sun Microsystems Laboratories)]

  *) Let BN_rand_range() abort with an error after 100 iterations
     without success (which indicates a broken PRNG).
     [Bodo Moeller]

  *) Change BN_mod_sqrt() so that it verifies that the input value
     is really the square of the return value.  (Previously,
     BN_mod_sqrt would show GIGO behaviour.)
     [Bodo Moeller]

  *) Add named elliptic curves over binary fields from X9.62, SECG,
     and WAP/WTLS; add OIDs that were still missing.

     [Sheueling Chang Shantz and Douglas Stebila
     (Sun Microsystems Laboratories)]

  *) 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 EC_METHOD:

          EC_GF2m_simple_method

     New API functions:

          EC_GROUP_new_curve_GF2m
          EC_GROUP_set_curve_GF2m
          EC_GROUP_get_curve_GF2m
          EC_POINT_set_affine_coordinates_GF2m
          EC_POINT_get_affine_coordinates_GF2m
          EC_POINT_set_compressed_coordinates_GF2m

     Point compression for binary fields is disabled by default for
     patent reasons (compile with OPENSSL_EC_BIN_PT_COMP defined to
     enable it).

     As binary polynomials are represented as BIGNUMs, various members
     of the EC_GROUP and EC_POINT data structures can be shared
     between the implementations for prime fields and binary fields;
     the above ..._GF2m functions (except for EX_GROUP_new_curve_GF2m)
     are essentially identical to their ..._GFp counterparts.
Bodo Möller's avatar
Bodo Möller committed
     (For simplicity, the '..._GFp' prefix has been dropped from
     various internal method names.)

     An internal 'field_div' method (similar to 'field_mul' and
     'field_sqr') has been added; this is used only for binary fields.

     [Sheueling Chang Shantz and Douglas Stebila
     (Sun Microsystems Laboratories)]

Bodo Möller's avatar
Bodo Möller committed
  *) Optionally dispatch EC_POINT_mul(), EC_POINT_precompute_mult()
     through methods ('mul', 'precompute_mult').

     The generic implementations (now internally called 'ec_wNAF_mul'
     and 'ec_wNAF_precomputed_mult') remain the default if these
     methods are undefined.

     [Sheueling Chang Shantz and Douglas Stebila
     (Sun Microsystems Laboratories)]

  *) New function EC_GROUP_get_degree, which is defined through
     EC_METHOD.  For curves over prime fields, this returns the bit
     length of the modulus.

     [Sheueling Chang Shantz and Douglas Stebila
     (Sun Microsystems Laboratories)]

  *) New functions EC_GROUP_dup, EC_POINT_dup.
     (These simply call ..._new  and ..._copy).

     [Sheueling Chang Shantz and Douglas Stebila
     (Sun Microsystems Laboratories)]

  *) Add binary polynomial arithmetic software in crypto/bn/bn_gf2m.c.
     Polynomials are represented as BIGNUMs (where the sign bit is not
     used) in the following functions [macros]:  

          BN_GF2m_add
          BN_GF2m_sub             [= BN_GF2m_add]
          BN_GF2m_mod             [wrapper for BN_GF2m_mod_arr]
          BN_GF2m_mod_mul         [wrapper for BN_GF2m_mod_mul_arr]
          BN_GF2m_mod_sqr         [wrapper for BN_GF2m_mod_sqr_arr]
          BN_GF2m_mod_inv
          BN_GF2m_mod_exp         [wrapper for BN_GF2m_mod_exp_arr]
          BN_GF2m_mod_sqrt        [wrapper for BN_GF2m_mod_sqrt_arr]
          BN_GF2m_mod_solve_quad  [wrapper for BN_GF2m_mod_solve_quad_arr]
          BN_GF2m_cmp             [= BN_ucmp]

     (Note that only the 'mod' functions are actually for fields GF(2^m).
     BN_GF2m_add() is misnomer, but this is for the sake of consistency.)

     For some functions, an the irreducible polynomial defining a
     field can be given as an 'unsigned int[]' with strictly
     decreasing elements giving the indices of those bits that are set;
     i.e., p[] represents the polynomial
          f(t) = t^p[0] + t^p[1] + ... + t^p[k]
     where
          p[0] > p[1] > ... > p[k] = 0.
     This applies to the following functions:

          BN_GF2m_mod_arr
          BN_GF2m_mod_mul_arr
          BN_GF2m_mod_sqr_arr
          BN_GF2m_mod_inv_arr        [wrapper for BN_GF2m_mod_inv]
          BN_GF2m_mod_div_arr        [wrapper for BN_GF2m_mod_div]
          BN_GF2m_mod_exp_arr
          BN_GF2m_mod_sqrt_arr
          BN_GF2m_mod_solve_quad_arr
          BN_GF2m_poly2arr
          BN_GF2m_arr2poly

     Conversion can be performed by the following functions:

          BN_GF2m_poly2arr
          BN_GF2m_arr2poly

     bntest.c has additional tests for binary polynomial arithmetic.