<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE appref SYSTEM "appref.dtd">

<appref>
  <header>
    <copyright>
      <year>1999</year>
      <year>2022</year>
      <holder>Ericsson AB, All Rights Reserved</holder>
    </copyright>
    <legalnotice>
  Licensed 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.

  The Initial Developer of the Original Code is Ericsson AB.
    </legalnotice>

    <title>crypto</title>
    <file>crypto_app.sgml</file>
  </header>
  <app>crypto</app>
  <appsummary>The Crypto Application</appsummary>
  <description>
    <p>The purpose of the Crypto application is to provide an Erlang API
    to cryptographic functions, see <seeerl marker="crypto">crypto(3)</seeerl>.
    Note that the API is on a fairly low level and there are some
    corresponding API functions available in <seeerl marker="public_key:public_key">public_key(3)</seeerl>,
    on a higher abstraction level, that uses the crypto application in its implementation.
    </p>
  </description>

  <section>
    <title>DEPENDENCIES</title>

    <p>The current crypto implementation uses nifs to interface
    OpenSSLs crypto library and may work with limited functionality
    with as old versions as <em>OpenSSL</em> 0.9.8c.
    FIPS mode support requires at least
    version 1.0.1 and a FIPS capable OpenSSL installation. We recommend using a
    version that is officially supported by the OpenSSL project. API compatible backends like
    LibreSSL should also work.</p>

    <p>The crypto app is tested daily with at least one version of each of the
    OpenSSL 1.0.1, 1.0.2, 1.1.0, 1.1.1 and 3.0. FIPS mode is also tested for 1.0.1 and 1.0.2.</p>
    
    <note><p>Compiling, linking and running with OpenSSL 3.0 works from OTP-25.0. However, we do
    not yet recommend it for other purposes than testing, since the crypto application is not yet
    extensively tested with that OpenSSL version.</p>
    </note>

    <p>Source releases of OpenSSL can be downloaded from the <url href="http://www.openssl.org">OpenSSL</url> project home page,
    or mirror sites listed there.
    </p>
    </section>

  <section>
    <title>CONFIGURATION</title>
    <p>The following configuration parameters are defined for the
    crypto application. See <c>app(3)</c> for more information about
    configuration parameters.</p>
    <taglist>
      <tag><c>fips_mode = boolean()</c></tag>
      <item>
        <p>Specifies whether to run crypto in FIPS mode. This setting
        will take effect when the nif module is loaded. If FIPS mode
        is requested but not available at run time the nif module and
        thus the crypto module will fail to load. This mechanism
        prevents the accidental use of non-validated algorithms.</p>
      </item>
      <tag><c>rand_cache_size = integer()</c></tag>
      <item>
        <p>
	  Sets the cache size in bytes to use by
	  <seemfa marker="crypto#rand_seed_alg/1">
	    <c>crypto:rand_seed_alg(crypto_cache)</c>
	  </seemfa> and
	  <seemfa marker="crypto#rand_seed_alg_s/1">
	    <c>crypto:rand_seed_alg_s(crypto_cache)</c>
	  </seemfa>.
	  This parameter is read when a seed function is called,
	  and then kept in generators state object.  It has a rather
	  small default value that causes reads of strong random bytes
	  about once per hundred calls for a random value.
	  The set value is rounded up to an integral number of words
	  of the size these seed functions use.
	</p>
      </item>
    </taglist>
  </section>

  <section>
    <title>SEE ALSO</title>
    <p>application(3)</p>
  </section>
</appref>

