Provided by: erlang-manpages_18.3-dfsg-1ubuntu3.1_all bug

NAME

       ssl - Interface Functions for Secure Socket Layer

DESCRIPTION

       This  module  contains  interface  functions for the SSL/TLS protocol. For detailed information about the
       supported standards see ssl(7).

DATA TYPES

       The following data types are used in the functions for SSL:

         boolean() =:
           true | false

         option() =:
           socketoption() | ssloption() | transportoption()

         socketoption() =:
           proplists:property()

           The default socket options are [{mode,list},{packet, 0},{header, 0},{active, true}].

           For valid options, see the inet(3erl) and gen_tcp(3erl) manual pages in Kernel.

         ssloption() =:
           {verify, verify_type()}

           | {verify_fun, {fun(), term()}}

           | {fail_if_no_peer_cert, boolean()}

           | {depth, integer()}

           | {cert, public_key:der_encoded()}

           | {certfile, path()}

           |    {key,    {'RSAPrivateKey'|    'DSAPrivateKey'    |    'ECPrivateKey'     |     'PrivateKeyInfo',
           public_key:der_encoded()}}

           | {keyfile, path()}

           | {password, string()}

           | {cacerts, [public_key:der_encoded()]}

           | {cacertfile, path()}

           | {dh, public_key:der_encoded()}

           | {dhfile, path()}

           | {ciphers, ciphers()}

           | {user_lookup_fun, {fun(), term()}}, {psk_identity, string()}, {srp_identity, {string(), string()}}

           | {reuse_sessions, boolean()}

           | {reuse_session, fun()} {next_protocols_advertised, [binary()]}

           |  {client_preferred_next_protocols,  {client  |  server, [binary()]} | {client | server, [binary()],
           binary()}}

           | {log_alert, boolean()}

           | {server_name_indication, hostname() | disable}

           | {sni_hosts, [{hostname(), ssloptions()}]}

           | {sni_fun, SNIfun::fun()}

         transportoption() =:
           {cb_info, {CallbackModule::atom(), DataTag::atom(), ClosedTag::atom(), ErrTag:atom()}}

           Defaults to {gen_tcp, tcp, tcp_closed, tcp_error}. Can be used to customize the transport layer.  The
           callback  module  must implement a reliable transport protocol, behave as gen_tcp, and have functions
           corresponding to inet:setopts/2, inet:getopts/2, inet:peername/1, inet:sockname/1,  and  inet:port/1.
           The callback gen_tcp is treated specially and calls inet directly.

           CallbackModule =:
             atom()

           DataTag =:
             atom()

             Used in socket data message.

           ClosedTag =:
             atom()

             Used in socket close message.

         verify_type() =:
           verify_none | verify_peer

         path() =:
           string()

           Represents a file path.

         public_key:der_encoded() =:
           binary()

           ASN.1 DER-encoded entity as an Erlang binary.

         host() =:
           hostname() | ipaddress()

         hostname() =:
           string()

         ip_address() =:
           {N1,N2,N3,N4} % IPv4 | {K1,K2,K3,K4,K5,K6,K7,K8} % IPv6

         sslsocket() =:
           opaque()

         protocol() =:
           sslv3 | tlsv1 | 'tlsv1.1' | 'tlsv1.2'

         ciphers() =:
           = [ciphersuite()] | string()

           According to old API.

         ciphersuite() =:
           {key_exchange(), cipher(), MAC::hash()} | {key_exchange(), cipher(), MAC::hash(), PRF::hash()}

         key_exchange()=:
           rsa  |  dhe_dss  |  dhe_rsa  |  dh_anon  |  psk  | dhe_psk | rsa_psk | srp_anon | srp_dss | srp_rsa |
           ecdh_anon | ecdh_ecdsa | ecdhe_ecdsa | ecdh_rsa | ecdhe_rsa

         cipher() =:
           rc4_128 | des_cbc | '3des_ede_cbc' | aes_128_cbc | aes_256_cbc | aes_128_gcm | aes_256_gcm

         hash() =:
           md5 | sha | sha224 | sha256 | sha348 | sha512

         prf_random() =:
           client_random | server_random

         srp_param_type() =:
           srp_1024 | srp_1536 | srp_2048 | srp_3072 | srp_4096 | srp_6144 | srp_8192

         SNIfun::fun():
           = fun(ServerName :: string()) -> ssloptions()

SSL OPTION DESCRIPTIONS - COMMON FOR SERVER AND CLIENT

       The following options have the same meaning in the client and the server:

         {cert, public_key:der_encoded()}:
           The DER-encoded users certificate. If this option is supplied, it overrides option certfile.

         {certfile, path()}:
           Path to a file containing the user certificate.

         {key, {'RSAPrivateKey'| 'DSAPrivateKey' | 'ECPrivateKey' |'PrivateKeyInfo', public_key:der_encoded()}}:
           The DER-encoded user's private key. If this option is supplied, it overrides option keyfile.

         {keyfile, path()}:
           Path to the file containing the user's private PEM-encoded key.  As  PEM-files  can  contain  several
           entries, this option defaults to the same file as given by option certfile.

         {password, string()}:
           String containing the user's password. Only used if the private keyfile is password-protected.

         {ciphers, ciphers()}:
           Supported  cipher  suites.  The  function  cipher_suites/0  can  be used to find all ciphers that are
           supported by default. cipher_suites(all) can be called to find  all  available  cipher  suites.  Pre-
           Shared  Key  (RFC  4279  and  RFC  5487),  Secure  Remote Password (RFC 5054), RC4 cipher suites, and
           anonymous cipher suites only work if explicitly enabled by this option; they are supported/enabled by
           the peer also. Anonymous cipher suites are supported for testing purposes only and are  not  be  used
           when security matters.

         {secure_renegotiate, boolean()}:
           Specifies  if  to  reject  renegotiation  attempt  that  does  not  live  up  to RFC 5746. By default
           secure_renegotiate is set to false, that is, secure renegotiation is used if possible, but  it  falls
           back to insecure renegotiation if the peer does not support RFC 5746.

         {depth, integer()}:
           Maximum number of non-self-issued intermediate certificates that can follow the peer certificate in a
           valid  certification path. So, if depth is 0 the PEER must be signed by the trusted ROOT-CA directly;
           if 1 the path can be PEER, CA, ROOT-CA; if 2 the path can be PEER, CA, CA, ROOT-CA, and  so  on.  The
           default value is 1.

         {verify_fun, {Verifyfun :: fun(), InitialUserState :: term()}}:
           The verification fun is to be defined as follows:

         fun(OtpCert :: #'OTPCertificate'{}, Event :: {bad_cert, Reason :: atom() | {revoked,
         atom()}} |
                   {extension, #'Extension'{}}, InitialUserState :: term()) ->
              {valid, UserState :: term()} | {valid_peer, UserState :: term()} |
              {fail, Reason :: term()} | {unknown, UserState :: term()}.

           The  verification fun is called during the X509-path validation when an error or an extension unknown
           to the SSL application is encountered. It is also called when a certificate is  considered  valid  by
           the  path  validation  to  allow  access  to each certificate in the path to the user application. It
           differentiates between the peer certificate and the CA certificates by using valid_peer or  valid  as
           second  argument  to  the  verification  fun.  See  the  public_key  User's  Guide  for definition of
           #'OTPCertificate'{} and #'Extension'{}.

           * If the verify callback fun returns {fail, Reason}, the verification process is immediately stopped,
             an alert is sent to the peer, and the TLS/SSL handshake terminates.

           * If the verify callback fun returns {valid, UserState}, the verification process continues.

           * If the verify callback fun always returns  {valid,  UserState},  the  TLS/SSL  handshake  does  not
             terminate regarding verification failures and the connection is established.

           * If  called  with an extension unknown to the user application, return value {unknown, UserState} is
             to be used.

             Note that if the fun returns unknown for an extension marked as critical, validation will fail.

           Default option verify_fun in verify_peer mode:

         {fun(_,{bad_cert, _} = Reason, _) ->
               {fail, Reason};
             (_,{extension, _}, UserState) ->
               {unknown, UserState};
             (_, valid, UserState) ->
               {valid, UserState};
             (_, valid_peer, UserState) ->
                  {valid, UserState}
          end, []}

           Default option verify_fun in mode verify_none:

         {fun(_,{bad_cert, _}, UserState) ->
               {valid, UserState};
             (_,{extension, #'Extension'{critical = true}}, UserState) ->
               {valid, UserState};
             (_,{extension, _}, UserState) ->
               {unknown, UserState};
             (_, valid, UserState) ->
               {valid, UserState};
             (_, valid_peer, UserState) ->
                  {valid, UserState}
          end, []}

           The possible path validation errors are given on form {bad_cert, Reason} where Reason is:

           unknown_ca:
             No trusted CA was found in the trusted store. The trusted CA is normally a so called ROOT CA, which
             is a self-signed certificate. Trust can be claimed for an intermediate CA (trusted anchor does  not
             have to be self-signed according to X-509) by using option partial_chain.

           selfsigned_peer:
             The chain consisted only of one self-signed certificate.

           PKIX X-509-path validation error:
             For possible reasons, see public_key:pkix_path_validation/3

         {crl_check, boolean() | peer | best_effort }:
            Perform CRL (Certificate Revocation List) verification  (public_key:pkix_crls_validate/3) on all the
           certificates  during  the  path  validation  (public_key:pkix_path_validation/3)   of the certificate
           chain. Defaults to false.

           peer - check is only performed on the peer certificate.

           best_effort - if certificate revocation status can not be determined it will be accepted as valid.

           The CA certificates specified for the connection will be used  to  construct  the  certificate  chain
           validating the CRLs.

           The CRLs will be fetched from a local or external cache see ssl_crl_cache_api(3erl).

         {crl_cache, {Module :: atom(), {DbHandle :: internal | term(), Args :: list()}}}:
           Module  defaults  to ssl_crl_cache with  DbHandle  internal and an empty argument list. The following
           arguments may be specified for the internal cache.

           {http, timeout()}:
             Enables fetching of CRLs specified as http URIs in X509 certificate extensions.  Requires  the  OTP
             inets application.

         {partial_chain, fun(Chain::[DerCert]) -> {trusted_ca, DerCert} | unknown_ca }:
           Claim an intermediate CA in the chain as trusted. TLS then performs public_key:pkix_path_validation/3
           with the selected CA as trusted anchor and the rest of the chain.

         {versions, [protocol()]}:
           TLS protocol versions supported by started clients and servers. This option overrides the application
           environment  option  protocol_version.  If  the  environment  option  is  not set, it defaults to all
           versions, except SSL-3.0, supported by the SSL application. See also ssl(7).

         {hibernate_after, integer()|undefined}:
           When an integer-value is specified, ssl_connection goes into hibernation after the  specified  number
           of  milliseconds of inactivity, thus reducing its memory footprint. When undefined is specified (this
           is the default), the process never goes into hibernation.

         {user_lookup_fun, {Lookupfun :: fun(), UserState :: term()}}:
           The lookup fun is to defined as follows:

         fun(psk, PSKIdentity ::string(), UserState :: term()) ->
              {ok, SharedSecret :: binary()} | error;
         fun(srp, Username :: string(), UserState :: term()) ->
              {ok, {SRPParams :: srp_param_type(), Salt :: binary(), DerivedKey :: binary()}} | error.

           For Pre-Shared Key (PSK) cipher suites, the lookup  fun  is  called  by  the  client  and  server  to
           determine  the  shared secret. When called by the client, PSKIdentity is set to the hint presented by
           the server or to undefined. When called by the server, PSKIdentity is the identity presented  by  the
           client.

           For  Secure  Remote  Password  (SRP), the fun is only used by the server to obtain parameters that it
           uses to generate its session keys. DerivedKey is to be derived according to  RFC 2945 and  RFC  5054:
           crypto:sha([Salt, crypto:sha([Username, <<$:>>, Password])])

         {padding_check, boolean()}:
           Affects  TLS-1.0  connections only. If set to false, it disables the block cipher padding check to be
           able to interoperate with legacy software.

   Warning:
       Using {padding_check, boolean()} makes TLS vulnerable to the Poodle attack.

SSL OPTION DESCRIPTIONS - CLIENT SIDE

       The following options are client-specific or have a slightly different meaning in the client than in  the
       server:

         {verify, verify_type()}:
           In mode verify_none the default behavior is to allow all x509-path validation errors. See also option
           verify_fun.

         {reuse_sessions, boolean()}:
           Specifies if the client is to try to reuse sessions when possible.

         {cacerts, [public_key:der_encoded()]}:
           The DER-encoded trusted certificates. If this option is supplied it overrides option cacertfile.

         {cacertfile, path()}:
           Path  to  a  file  containing PEM-encoded CA certificates. The CA certificates are used during server
           authentication and when building the client certificate chain.

         {alpn_advertised_protocols, [binary()]}:
           The list of protocols supported by the client to be sent to the server to be used for an Application-
           Layer Protocol Negotiation (ALPN). If the server supports ALPN then it will choose  a  protocol  from
           this  list;  otherwise  it  will fail the connection with a "no_application_protocol" alert. A server
           that does not support ALPN will ignore this value.

           The list of protocols must not contain an empty binary.

           The negotiated protocol can be retrieved using the negotiated_protocol/1 function.

         {client_preferred_next_protocols, {Precedence :: server | client, ClientPrefs :: [binary()]}}
           {client_preferred_next_protocols, {Precedence :: server | client, ClientPrefs :: [binary()],  Default
           :: binary()}}: Indicates that the client is to try to perform Next Protocol Negotiation.

           If  precedence  is  server,  the  negotiated protocol is the first protocol to be shown on the server
           advertised list, which is also on the client preference list.

           If precedence is client, the negotiated protocol is the first protocol to  be  shown  on  the  client
           preference list, which is also on the server advertised list.

           If  the  client  does  not  support  any  of  the  server advertised protocols or the server does not
           advertise any protocols, the client falls back to the first protocol in its list or  to  the  default
           protocol  (if  a  default is supplied). If the server does not support Next Protocol Negotiation, the
           connection terminates if no default protocol is supplied.

         {psk_identity, string()}:
           Specifies the identity the client presents to the server. The matching secret  is  found  by  calling
           user_lookup_fun.

         {srp_identity, {Username :: string(), Password :: string()} :
           Specifies the username and password to use to authenticate to the server.

         {server_name_indication, hostname()}:
           Can  be  specified  when upgrading a TCP socket to a TLS socket to use the TLS Server Name Indication
           extension.

         {server_name_indication, disable}:
           When starting a TLS connection without upgrade, the Server  Name  Indication  extension  is  sent  if
           possible. This option can be used to disable that behavior.

         {fallback, boolean()}:
           Send  special  cipher  suite  TLS_FALLBACK_SCSV to avoid undesired TLS version downgrade. Defaults to
           false

     Warning:
         Note this option is not needed in normal TLS usage and should not be used to implement new clients. But
         legacy clients that retries connections in the following manner

          ssl:connect(Host, Port, [...{versions, ['tlsv2', 'tlsv1.1', 'tlsv1', 'sslv3']}])

          ssl:connect(Host, Port, [...{versions, [tlsv1.1', 'tlsv1', 'sslv3']}, {fallback, true}])

          ssl:connect(Host, Port, [...{versions, ['tlsv1', 'sslv3']}, {fallback, true}])

          ssl:connect(Host, Port, [...{versions, ['sslv3']}, {fallback, true}])

         may use it to avoid undesired TLS version downgrade. Note that TLS_FALLBACK_SCSV must also be supported
         by the server for the prevention to work.

SSL OPTION DESCRIPTIONS - SERVER SIDE

       The following options are server-specific or have a slightly different meaning in the server than in  the
       client:

         {cacerts, [public_key:der_encoded()]}:
           The DER-encoded trusted certificates. If this option is supplied it overrides option cacertfile.

         {cacertfile, path()}:
           Path  to  a  file  containing  PEM-encoded CA certificates. The CA certificates are used to build the
           server certificate chain and for client authentication.  The  CAs  are  also  used  in  the  list  of
           acceptable  client  CAs passed to the client when a certificate is requested. Can be omitted if there
           is no need to verify the client and if there are no intermediate CAs for the server certificate.

         {dh, public_key:der_encoded()}:
           The DER-encoded Diffie-Hellman parameters. If specified, it overrides option dhfile.

         {dhfile, path()}:
           Path to a file containing PEM-encoded Diffie Hellman parameters to be used by the server if a  cipher
           suite using Diffie Hellman key exchange is negotiated. If not specified, default parameters are used.

         {verify, verify_type()}:
           A  server  only does x509-path validation in mode verify_peer, as it then sends a certificate request
           to the client (this message is not sent if the verify option is verify_none). You can then also  want
           to specify option fail_if_no_peer_cert.

         {fail_if_no_peer_cert, boolean()}:
           Used  together  with  {verify, verify_peer} by an SSL server. If set to true, the server fails if the
           client does not have a certificate to send, that is, sends an empty certificate. If set to false,  it
           fails  only  if  the  client sends an invalid certificate (an empty certificate is considered valid).
           Defaults to false.

         {reuse_sessions, boolean()}:
           Specifies if the server is to agree to reuse sessions when requested by the clients. See also  option
           reuse_session.

         {reuse_session, fun(SuggestedSessionId, PeerCert, Compression, CipherSuite) -> boolean()}:
           Enables  the  SSL  server  to  have  a local policy for deciding if a session is to be reused or not.
           Meaningful only if reuse_sessions is set to true. SuggestedSessionId is a  binary(),  PeerCert  is  a
           DER-encoded  certificate,  Compression  is  an  enumeration  integer,  and  CipherSuite  is  of  type
           ciphersuite().

         {alpn_preferred_protocols, [binary()]}:
           Indicates the server will try to perform Application-Layer Protocol Negotiation (ALPN).

           The list of protocols is in order of preference. The protocol negotiated will be  the  first  in  the
           list  that  matches one of the protocols advertised by the client. If no protocol matches, the server
           will fail the connection with a "no_application_protocol" alert.

           The negotiated protocol can be retrieved using the negotiated_protocol/1 function.

         {next_protocols_advertised, Protocols :: [binary()]}:
           List of protocols to send to the client if the client indicates that it supports  the  Next  Protocol
           extension.  The client can select a protocol that is not on this list. The list of protocols must not
           contain an empty binary. If the server negotiates a Next Protocol,  it  can  be  accessed  using  the
           negotiated_next_protocol/1 method.

         {psk_identity, string()}:
           Specifies the server identity hint, which the server presents to the client.

         {log_alert, boolean()}:
           If set to false, error reports are not displayed.

         {honor_cipher_order, boolean()}:
           If  set  to  true, use the server preference for cipher selection. If set to false (the default), use
           the client preference.

         {sni_hosts, [{hostname(), ssloptions()}]}:
           If the server receives a SNI (Server Name Indication) from the client matching a host listed  in  the
           sni_hosts  option, the specific options for that host will override previously specified options. The
           option sni_fun, and sni_hosts are mutually exclusive.

         {sni_fun, SNIfun::fun()}:
           If the server receives a SNI (Server Name Indication) from the client, the  given  function  will  be
           called  to  retrieve  ssloptions()  for  the  indicated  server.  These  options  will be merged into
           predefined  ssloptions().  The  function  should  be  defined  as:  fun(ServerName  ::  string())  ->
           ssloptions()  and can be specified as a fun or as named fun module:function/1 The option sni_fun, and
           sni_hosts are mutually exclusive.

         {client_renegotiation, boolean()}:
           In protocols that support client-initiated renegotiation, the cost of resources of such an  operation
           is higher for the server than the client. This can act as a vector for denial of service attacks. The
           SSL   application   already  takes  measures  to  counter-act  such  attempts,  but  client-initiated
           renegotiation can be strictly disabled by setting this option to false. The default  value  is  true.
           Note  that  disabling  renegotiation  can  result  in long-lived connections becoming unusable due to
           limits on the number of messages the underlying cipher suite can encipher.

         {honor_cipher_order, boolean()}:
           If true, use the server's preference for cipher selection. If false (the default), use  the  client's
           preference.

GENERAL

       When an SSL socket is in active mode (the default), data from the socket is delivered to the owner of the
       socket in the form of messages:

         * {ssl, Socket, Data}

         * {ssl_closed, Socket}

         * {ssl_error, Socket, Reason}

       A  Timeout  argument  specifies  a  time-out  in  milliseconds. The default value for argument Timeout is
       infinity.

EXPORTS

       cipher_suites() ->
       cipher_suites(Type) -> ciphers()

              Types:

                 Type = erlang | openssl | all

              Returns a list of supported cipher suites. cipher_suites() is equivalent to cipher_suites(erlang).
              Type openssl is provided for backwards  compatibility  with  the  old  SSL,  which  used  OpenSSL.
              cipher_suites(all)  returns  all  available  cipher  suites.  The  cipher  suites  not  present in
              cipher_suites(erlang) but included in cipher_suites(all) are not used unless explicitly configured
              by the user.

       clear_pem_cache() -> ok

              PEM files, used by ssl API-functions, are cached. The cache is regularly checked  to  see  if  any
              cache entries should be invalidated, however this function provides a way to unconditionally clear
              the whole cache.

       connect(Socket, SslOptions) ->
       connect(Socket, SslOptions, Timeout) -> {ok, SslSocket} | {error, Reason}

              Types:

                 Socket = socket()
                 SslOptions = [ssloption()]
                 Timeout = integer() | infinity
                 SslSocket = sslsocket()
                 Reason = term()

              Upgrades  a  gen_tcp,  or  equivalent,  connected  socket  to an SSL socket, that is, performs the
              client-side ssl handshake.

       connect(Host, Port, Options) ->
       connect(Host, Port, Options, Timeout) -> {ok, SslSocket} | {error, Reason}

              Types:

                 Host = host()
                 Port = integer()
                 Options = [option()]
                 Timeout = integer() | infinity
                 SslSocket = sslsocket()
                 Reason = term()

              Opens an SSL connection to Host, Port.

       close(SslSocket) -> ok | {error, Reason}

              Types:

                 SslSocket = sslsocket()
                 Reason = term()

              Closes an SSL connection.

       close(SslSocket, How) -> ok | {ok, port()} | {error, Reason}

              Types:

                 SslSocket = sslsocket()
                 How = timeout() | {NewController::pid(), timeout()}
                 Reason = term()

              Closes or downgrades an SSL connection. In the latter case the transport connection will be handed
              over to the NewController process after receiving the TLS close alert from the peer. The  returned
              transport  socket  will  have  the  following  options  set: [{active, false}, {packet, 0}, {mode,
              binary}]

       controlling_process(SslSocket, NewOwner) -> ok | {error, Reason}

              Types:

                 SslSocket = sslsocket()
                 NewOwner = pid()
                 Reason = term()

              Assigns a new controlling process to the SSL socket. A controlling process is the owner of an  SSL
              socket, and receives all messages from the socket.

       connection_information(SslSocket) -> {ok, Result} | {error, Reason}

              Types:

                 Item = protocol | cipher_suite | sni_hostname | atom()
                   Meaningful atoms, not specified above, are the ssl option names.
                 Result = [{Item::atom(), Value::term()}]
                 Reason = term()

              Returns  all  relevant  information  about  the connection, ssl options that are undefined will be
              filtered out.

       connection_information(SslSocket, Items) -> {ok, Result} | {error, Reason}

              Types:

                 Items = [Item]
                 Item = protocol | cipher_suite | sni_hostname | atom()
                   Meaningful atoms, not specified above, are the ssl option names.
                 Result = [{Item::atom(), Value::term()}]
                 Reason = term()

              Returns the requested information items about the connection, if they are defined.

          Note:
              If only undefined options are requested the resulting list can be empty.

       format_error(Reason) -> string()

              Types:

                 Reason = term()

              Presents the error returned by an SSL function as a printable string.

       getopts(Socket, OptionNames) -> {ok, [socketoption()]} | {error, Reason}

              Types:

                 Socket = sslsocket()
                 OptionNames = [atom()]

              Gets the values of the specified socket options.

       listen(Port, Options) -> {ok, ListenSocket} | {error, Reason}

              Types:

                 Port = integer()
                 Options = options()
                 ListenSocket = sslsocket()

              Creates an SSL listen socket.

       negotiated_protocol(Socket) -> {ok, Protocol} | {error, protocol_not_negotiated}

              Types:

                 Socket = sslsocket()
                 Protocol = binary()

              Returns the protocol negotiated through ALPN or NPN extensions.

       peercert(Socket) -> {ok, Cert} | {error, Reason}

              Types:

                 Socket = sslsocket()
                 Cert = binary()

              The peer certificate is returned as a DER-encoded binary. The  certificate  can  be  decoded  with
              public_key:pkix_decode_cert/2.

       peername(Socket) -> {ok, {Address, Port}} | {error, Reason}

              Types:

                 Socket = sslsocket()
                 Address = ipaddress()
                 Port = integer()

              Returns the address and port number of the peer.

       prf(Socket, Secret, Label, Seed, WantedLength) -> {ok, binary()} | {error, reason()}

              Types:

                 Socket = sslsocket()
                 Secret = binary() | master_secret
                 Label = binary()
                 Seed = [binary() | prf_random()]
                 WantedLength = non_neg_integer()

              Uses  the  Pseudo-Random Function (PRF) of a TLS session to generate extra key material. It either
              takes user-generated values for Secret and Seed or atoms directing it to use a specific value from
              the session security parameters.

              Can only be used with TLS connections; {error, undefined} is returned for SSLv3 connections.

       recv(Socket, Length) ->
       recv(Socket, Length, Timeout) -> {ok, Data} | {error, Reason}

              Types:

                 Socket = sslsocket()
                 Length = integer()
                 Timeout = integer()
                 Data = [char()] | binary()

              Receives a packet from a socket in passive mode. A closed socket  is  indicated  by  return  value
              {error, closed}.

              Argument  Length is meaningful only when the socket is in mode raw and denotes the number of bytes
              to read. If Length = 0, all available bytes are returned. If Length > 0, exactly Length bytes  are
              returned,  or  an  error;  possibly discarding less than Length bytes of data when the socket gets
              closed from the other side.

              Optional argument Timeout specifies a time-out in milliseconds. The default value is infinity.

       renegotiate(Socket) -> ok | {error, Reason}

              Types:

                 Socket = sslsocket()

              Initiates a new handshake. A notable return value is  {error,  renegotiation_rejected}  indicating
              that  the  peer  refused  to go through with the renegotiation, but the connection is still active
              using the previously negotiated session.

       send(Socket, Data) -> ok | {error, Reason}

              Types:

                 Socket = sslsocket()
                 Data = iodata()

              Writes Data to Socket.

              A notable return value is {error, closed} indicating that the socket is closed.

       setopts(Socket, Options) -> ok | {error, Reason}

              Types:

                 Socket = sslsocket()
                 Options = [socketoption]()

              Sets options according to Options for socket Socket.

       shutdown(Socket, How) -> ok | {error, Reason}

              Types:

                 Socket = sslsocket()
                 How = read | write | read_write
                 Reason = reason()

              Immediately closes a socket in one or two directions.

              How == write means closing the socket for writing, reading from it is still possible.

              To be able to handle that the peer has done a shutdown on the write side,  option  {exit_on_close,
              false} is useful.

       ssl_accept(Socket) ->
       ssl_accept(Socket, Timeout) -> ok | {error, Reason}

              Types:

                 Socket = sslsocket()
                 Timeout = integer()
                 Reason = term()

              Performs the SSL/TLS server-side handshake.

              Socket is a socket as returned by ssl:transport_accept/[1,2]

       ssl_accept(Socket, SslOptions) ->
       ssl_accept(Socket, SslOptions, Timeout) -> {ok, Socket} | ok | {error, Reason}

              Types:

                 Socket = socket() | sslsocket()
                 SslOptions = ssloptions()
                 Timeout = integer()
                 Reason = term()

              If  Socket  is  a  socket():  upgrades a gen_tcp, or equivalent, socket to an SSL socket, that is,
              performs the SSL/TLS server-side handshake and returns the SSL socket.

          Warning:
              The listen socket is to be in mode {active, false} before telling the client that  the  server  is
              ready to upgrade by calling this function, else the upgrade succeeds or does not succeed depending
              on timing.

              If  Socket  is  an sslsocket(): provides extra SSL/TLS options to those specified in ssl:listen/2
              and then performs the SSL/TLS handshake.

       sockname(Socket) -> {ok, {Address, Port}} | {error, Reason}

              Types:

                 Socket = sslsocket()
                 Address = ipaddress()
                 Port = integer()

              Returns the local address and port number of socket Socket.

       start() ->
       start(Type) -> ok | {error, Reason}

              Types:

                 Type = permanent | transient | temporary

              Starts the SSL application. Default type is temporary.

       stop() -> ok

              Stops the SSL application.

       transport_accept(ListenSocket) ->
       transport_accept(ListenSocket, Timeout) -> {ok, NewSocket} | {error, Reason}

              Types:

                 ListenSocket = NewSocket = sslsocket()
                 Timeout = integer()
                 Reason = reason()

              Accepts an incoming connection request on a listen socket. ListenSocket must be a socket  returned
              from   ssl:listen/2.  The  socket  returned  is  to  be passed to  ssl:ssl_accept[2,3] to complete
              handshaking, that is, establishing the SSL/TLS connection.

          Warning:
              The socket returned can only be used with  ssl:ssl_accept[2,3]. No traffic can be sent or received
              before that call.

              The accepted socket inherits the options set for ListenSocket in  ssl:listen/2.

              The default value for Timeout is infinity. If Timeout is specified and no connection  is  accepted
              within the given time, {error, timeout} is returned.

       versions() -> [versions_info()]

              Types:

                 versions_info() = {app_vsn, string()} | {supported | available, [protocol()]

              Returns version information relevant for the SSL application.

                app_vsn:
                  The application version of the SSL application.

                supported:
                  TLS/SSL  versions  supported  by  default. Overridden by a version option on  connect/[2,3,4],
                  listen/2,   and   ssl_accept/[1,2,3].   For    the    negotiated    TLS/SSL    version,    see
                  ssl:connection_information/1 .

                available:
                  All  TLS/SSL  versions  supported  by the SSL application. TLS 1.2 requires sufficient support
                  from the Crypto application.

SEE ALSO

       inet(3erl) and gen_tcp(3erl)

Ericsson AB                                          ssl 7.3                                           ssl(3erl)