<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!DOCTYPE document [
  <!ENTITY project SYSTEM "project.xml">
]>
<?xml-stylesheet type="application/xslt+xml" href="../style.xsl"?>
<document url="changelog.html">

  &project;

  <properties>
    <author email="jfclere@apache.org">Jean-Frederic Clere</author>
    </properties>

<body>

<section name="Preface">
  <p>
  This is the Changelog for Tomcat Native 1.2.
  </p>
</section>
<section name="Changes in 1.2.7">
  <changelog>
    <update>
      Update minimum recommended OpenSSL version to 1.0.2h. (markt)
    </update>
  </changelog>
</section>
<section name="Changes in 1.2.6">
  <changelog>
    <update>
      Change the OpenSSL version check in <code>configure</code>
      to be fatal. (rjung)
    </update>
    <update>
      Use new OpenSSL 1.1.0 protocol version max and min API
      when creating a new SSL context. (rjung)
    </update>
    <update>
      Improve renegotiation code and make it compatible with
      OpenSSL 1.1.0. (rjung)
    </update>
    <scode>
      OpenSSL 1.1.0 compatibility updates. (rjung)
    </scode>
    <fix>
      Fix some compiler warnings in native ssl code. (rjung)
    </fix>
    <add>
      Add support for using Java keystores for certificate chains. (markt)
    </add>
    <update>
      Remove the explicit CRL check when verifying certificates.
      The checks were already part of the internal certification
      verification since OpenSSL 0.9.7. Backport from mod_ssl.
      (rjung)
    </update>
  </changelog>
</section>
<section name="Changes in 1.2.5">
  <changelog>
    <update>
      Enable OpenSSL version check in <code>configure</code> by
      default. It can be turned off using
      <code>--disable-openssl-version-check</code>. (rjung)
    </update>
    <fix>
      <bug>59024</bug>: Native function <code>versionString()</code> and
      for OpenSSL 1.1.0 also <code>version()</code> (both in in ssl.c) now
      return the OpenSSL run time version, not the compile time version.
      (rjung)
    </fix>
    <scode>
      Track changes in the OpenSSL master branch so it is possible to build
      Tomcat Native with that branch. (billbarker)
    </scode>
  </changelog>
</section>
<section name="Changes in 1.2.4">
  <changelog>
    <fix>
      SSL.getHandshakeCount(), which was unused, now returns the handshake
      completed count rather than the handshake started count. (remm)
    </fix>
  </changelog>
</section>
<section name="Changes in 1.2.3">
  <changelog>
    <fix>
      Remove Java classes that do not have C implementation code
      for their native methods in the current library. They were
      used for NPN support which is superseded by ALPN support
      in the current code. (kkolinko)
    </fix>
    <fix>
      Fix typo in declaration of a stub method used when the library is
      compiled without OpenSSL support. (kkolinko)
    </fix>
    <fix>
      Fix the signature of the implementation of the native SSL method
      newSSL() in the case when OPENSSL is not available. (rjung)
    </fix>
    <fix>
      Fix the signature of the implementation of the native SSLSocket
      method getInfoB() to return jbyteArray instead of jobject.
      This is consistent with what it actually returns and how
      the native Java method is declared. (rjung)
    </fix>
    <add>
      Add support for using Java keystores for certificates and keys. (jfclere)
    </add>
    <scode>
      Remove code that performs a read after a renegotiation that appears to be
      unnecessary with OpenSSL 1.0.2. (billbarker)
    </scode>
    <add>
      Expose <code>SSL_renegotiate</code> to the Java API. (remm)
    </add>
  </changelog>
</section>
<section name="Changes in 1.2.2">
  <changelog>
    <fix>
      Fix broken debug and maintainer mode build. (rjung)
    </fix>
    <fix>
      Forward port additional fixes to the OpenSSL I/O to align it with
      non-OpenSSL I/O. (markt)
    </fix>
  </changelog>
</section>
<section name="Changes in 1.2.1">
  <changelog>
    <fix>
      <bug>58566</bug>: Enable Tomcat Native 1.2.x to work with Tomcat releases
      that do not have the necessary Java code to support SNI. (markt)
    </fix>
    <update>
      Minor rework of "buildconf" script. (rjung)
    </update>
    <fix>
      Fix APR dependency version expression in RPM spec file. (rjung)
    </fix>
    <fix>
      Fix major library version number in Windows build files, RPM spec file
      and build description. (rjung)
    </fix>
    <fix>
      Remove files "KEYS" and "download_deps.sh" from Windows (zip)
      source distribution. (rjung)
    </fix>
    <fix>
      Fix "unused variable" compiler warning. (rjung)
    </fix>
  </changelog>
</section>
<section name="Changes in 1.2.0">
  <changelog>
    <add>
      Add support for TLS extension ALPN. (markt)
    </add>
    <add>
      Add support for TLS extension SNI (Server Name Indication).
      (markt)
    </add>
    <add>
      Add support for OpenSSL BIO. (jfclere)
    </add>
    <add>
      Support wakeable pollsets and add Poll.interrupt() API.
      (mturk)
    </add>
    <add>
      Add Pool.unmanaged() API. (mturk)
    </add>
    <update>
      APIs SSL.generateRSATempKey() and SSL.loadDSATempKey()
      have been removed. (rjung)
    </update>
    <update>
      The minimum required APR version is 1.4.3.
    </update>
    <update>
      The minimum required OpenSSL version is 1.0.2.
    </update>
  </changelog>
</section>
<section name="Changes in 1.1.x">
<p>Please see the <a href="../../native-1.1-doc/miscellaneous/changelog.html">1.1.x
   changelog</a>.</p>
</section>
</body>
</document>
