View source with formatted comments or as raw
    1/*  Part of SWI-Prolog
    2
    3    Author:        Markus Triska and Matt Lilley
    4    WWW:           http://www.swi-prolog.org
    5    Copyright (c)  2004-2017, SWI-Prolog Foundation
    6                              VU University Amsterdam
    7    All rights reserved.
    8
    9    Redistribution and use in source and binary forms, with or without
   10    modification, are permitted provided that the following conditions
   11    are met:
   12
   13    1. Redistributions of source code must retain the above copyright
   14       notice, this list of conditions and the following disclaimer.
   15
   16    2. Redistributions in binary form must reproduce the above copyright
   17       notice, this list of conditions and the following disclaimer in
   18       the documentation and/or other materials provided with the
   19       distribution.
   20
   21    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   22    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   23    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
   24    FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
   25    COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
   26    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
   27    BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   28    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
   29    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   30    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
   31    ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   32    POSSIBILITY OF SUCH DAMAGE.
   33*/
   34
   35:- module(crypto,
   36          [ crypto_n_random_bytes/2,    % +N, -Bytes
   37            crypto_data_hash/3,         % +Data, -Hash, +Options
   38            crypto_file_hash/3,         % +File, -Hash, +Options
   39            crypto_context_new/2,       % -Context, +Options
   40            crypto_data_context/3,      % +Data, +C0, -C
   41            crypto_context_hash/2,      % +Context, -Hash
   42            crypto_open_hash_stream/3,  % +InStream, -HashStream, +Options
   43            crypto_stream_hash/2,       % +HashStream, -Hash
   44            crypto_password_hash/2,     % +Password, ?Hash
   45            crypto_password_hash/3,     % +Password, ?Hash, +Options
   46            crypto_data_hkdf/4,         % +Data, +Length, -Bytes, +Options
   47            ecdsa_sign/4,               % +Key, +Data, -Signature, +Options
   48            ecdsa_verify/4,             % +Key, +Data, +Signature, +Options
   49            crypto_data_decrypt/6,      % +CipherText, +Algorithm, +Key, +IV, -PlainText, +Options
   50            crypto_data_encrypt/6,      % +PlainText, +Algorithm, +Key, +IV, -CipherText, +Options
   51            hex_bytes/2,                % ?Hex, ?List
   52            rsa_private_decrypt/4,      % +Key, +Ciphertext, -Plaintext, +Enc
   53            rsa_private_encrypt/4,      % +Key, +Plaintext, -Ciphertext, +Enc
   54            rsa_public_decrypt/4,       % +Key, +Ciphertext, -Plaintext, +Enc
   55            rsa_public_encrypt/4,       % +Key, +Plaintext, -Ciphertext, +Enc
   56            rsa_sign/4,                 % +Key, +Data, -Signature, +Options
   57            rsa_verify/4,               % +Key, +Data, +Signature, +Options
   58            crypto_modular_inverse/3,   % +X, +M, -Y
   59            crypto_generate_prime/3,    % +N, -P, +Options
   60            crypto_is_prime/2,          % +P, +Options
   61            crypto_name_curve/2,        % +Name, -Curve
   62            crypto_curve_order/2,       % +Curve, -Order
   63            crypto_curve_generator/2,   % +Curve, -Generator
   64            crypto_curve_scalar_mult/4  % +Curve, +Scalar, +Point, -Result
   65          ]).   66:- autoload(library(apply),[foldl/4,maplist/3]).   67:- autoload(library(base64),[base64_encoded/3]).   68:- autoload(library(error),[must_be/2,domain_error/2]).   69:- autoload(library(lists),[select/3,reverse/2]).   70:- autoload(library(option),[option/3,option/2]).   71
   72:- use_foreign_library(foreign(crypto4pl)).   73
   74
   75/** <module> Cryptography and authentication library
   76
   77This library provides bindings  to  functionality   of  OpenSSL  that is
   78related to cryptography and authentication,   not  necessarily involving
   79connections, sockets or streams.
   80
   81The  hash functionality  of this  library subsumes  and extends  that of
   82`library(sha)`, `library(hash_stream)` and `library(md5)` by providing a
   83unified interface to all available digest algorithms.
   84
   85The underlying  OpenSSL library  (`libcrypto`) is dynamically  loaded if
   86_either_ `library(crypto)`  or `library(ssl)` are loaded.  Therefore, if
   87your application uses `library(ssl)`,  you can use `library(crypto)` for
   88hashing without increasing the memory  footprint of your application. In
   89other cases, the specialised hashing  libraries are more lightweight but
   90less general alternatives to `library(crypto)`.
   91
   92@author [Markus Triska](https://www.metalevel.at)
   93@author Matt Lilley
   94*/
   95
   96%%  crypto_n_random_bytes(+N, -Bytes) is det
   97%
   98%   Bytes is unified with a list of N cryptographically secure
   99%   pseudo-random bytes. Each byte is an integer between 0 and 255. If
  100%   the internal pseudo-random number generator (PRNG) has not been
  101%   seeded with enough entropy to ensure an unpredictable byte
  102%   sequence, an exception is thrown.
  103%
  104%   One way to relate such a list of bytes to an _integer_ is to use
  105%   CLP(FD) constraints as follows:
  106%
  107%   ==
  108%   :- use_module(library(clpfd)).
  109%
  110%   bytes_integer(Bs, N) :-
  111%           foldl(pow, Bs, 0-0, N-_).
  112%
  113%   pow(B, N0-I0, N-I) :-
  114%           B in 0..255,
  115%           N #= N0 + B*256^I0,
  116%           I #= I0 + 1.
  117%   ==
  118%
  119%   With this definition, you can generate a random 256-bit integer
  120%   _from_ a list of 32 random _bytes_:
  121%
  122%   ==
  123%   ?- crypto_n_random_bytes(32, Bs),
  124%      bytes_integer(Bs, I).
  125%   Bs = [98, 9, 35, 100, 126, 174, 48, 176, 246|...],
  126%   I = 109798276762338328820827...(53 digits omitted).
  127%   ==
  128%
  129%   The above relation also works in the other direction, letting you
  130%   translate an integer _to_ a list of bytes. In addition, you can
  131%   use hex_bytes/2 to convert bytes to _tokens_ that can be easily
  132%   exchanged in your applications. This also works if you have
  133%   compiled SWI-Prolog without support for large integers.
  134
  135
  136/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  137   SHA256 is the current default for several hash-related predicates.
  138   It is deemed sufficiently secure for the foreseeable future.  Yet,
  139   application programmers must be aware that the default may change in
  140   future versions. The hash predicates all yield the algorithm they
  141   used if a Prolog variable is used for the pertaining option.
  142- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  143
  144default_hash(sha256).
  145
  146functor_hash_options(F, Hash, Options0, [Option|Options]) :-
  147        Option =.. [F,Hash],
  148        (   select(Option, Options0, Options) ->
  149            (   var(Hash) ->
  150                default_hash(Hash)
  151            ;   must_be(atom, Hash)
  152            )
  153        ;   Options = Options0,
  154            default_hash(Hash)
  155        ).
  156
  157
  158%%  crypto_data_hash(+Data, -Hash, +Options) is det
  159%
  160%   Hash is the hash of Data. The conversion is controlled
  161%   by Options:
  162%
  163%    * algorithm(+Algorithm)
  164%    One of =md5= (_insecure_), =sha1= (_insecure_), =ripemd160=,
  165%    =sha224=, =sha256=, =sha384=, =sha512=, =sha3_224=, =sha3_256=,
  166%    =sha3_384=, =sha3_512=, =blake2s256= or =blake2b512=. The BLAKE
  167%    digest algorithms require OpenSSL 1.1.0 or greater, and the SHA-3
  168%    algorithms require OpenSSL 1.1.1 or greater. The default is a
  169%    cryptographically secure algorithm. If you specify a variable,
  170%    then that variable is unified with the algorithm that was used.
  171%    * encoding(+Encoding)
  172%    If Data is a sequence of character _codes_, this must be
  173%    translated into a sequence of _bytes_, because that is what
  174%    the hashing requires.  The default encoding is =utf8=.  The
  175%    other meaningful value is =octet=, claiming that Data contains
  176%    raw bytes.
  177%    * hmac(+Key)
  178%    If this option is specified, a _hash-based message authentication
  179%    code_ (HMAC) is computed, using the specified Key which is either
  180%    an atom, string or list of _bytes_. Any of the available digest
  181%    algorithms can be used with this option. The cryptographic
  182%    strength of the HMAC depends on that of the chosen algorithm and
  183%    also on the key. This option requires OpenSSL 1.1.0 or greater.
  184%
  185%  @param Data is either an atom, string or code-list
  186%  @param Hash is an atom that represents the hash in hexadecimal encoding.
  187%
  188%  @see hex_bytes/2 for conversion between hexadecimal encoding and
  189%  lists of bytes.
  190%  @see crypto_password_hash/2 for the important use case of passwords.
  191
  192crypto_data_hash(Data, Hash, Options) :-
  193    crypto_context_new(Context0, Options),
  194    crypto_data_context(Data, Context0, Context),
  195    crypto_context_hash(Context, Hash).
  196
  197%!  crypto_file_hash(+File, -Hash, +Options) is det.
  198%
  199%   True if  Hash is the hash  of the content of  File. For Options,
  200%   see crypto_data_hash/3.
  201
  202crypto_file_hash(File, Hash, Options) :-
  203    setup_call_cleanup(open(File, read, In, [type(binary)]),
  204                       crypto_stream_hash(In, Hash, Options),
  205                       close(In)).
  206
  207crypto_stream_hash(Stream, Hash, Options) :-
  208    crypto_context_new(Context0, Options),
  209    update_hash(Stream, Context0, Context),
  210    crypto_context_hash(Context, Hash).
  211
  212update_hash(In, Context0, Context) :-
  213    (   at_end_of_stream(In)
  214    ->  Context = Context0
  215    ;   read_pending_codes(In, Data, []),
  216        crypto_data_context(Data, Context0, Context1),
  217        update_hash(In, Context1, Context)
  218    ).
  219
  220
  221%!  crypto_context_new(-Context, +Options) is det.
  222%
  223%   Context is  unified with  the empty  context, taking  into account
  224%   Options.  The  context can be used  in crypto_data_context/3.  For
  225%   Options, see crypto_data_hash/3.
  226%
  227%   @param Context is an opaque pure  Prolog term that is subject to
  228%          garbage collection.
  229
  230crypto_context_new(Context, Options0) :-
  231    functor_hash_options(algorithm, _, Options0, Options),
  232    '_crypto_context_new'(Context, Options).
  233
  234
  235%!  crypto_data_context(+Data, +Context0, -Context) is det
  236%
  237%   Context0 is an existing computation  context, and Context is the
  238%   new context  after hashing  Data in  addition to  the previously
  239%   hashed data.  Context0 may be  produced by a prior invocation of
  240%   either crypto_context_new/2 or crypto_data_context/3 itself.
  241%
  242%   This predicate allows a hash to be computed in chunks, which may
  243%   be important while working  with Metalink (RFC 5854), BitTorrent
  244%   or similar technologies, or simply with big files.
  245
  246crypto_data_context(Data, Context0, Context) :-
  247    '_crypto_hash_context_copy'(Context0, Context),
  248    '_crypto_update_hash_context'(Data, Context).
  249
  250
  251%!  crypto_context_hash(+Context, -Hash)
  252%
  253%   Obtain the  hash code of  Context. Hash is an  atom representing
  254%   the hash code  that is associated with the current  state of the
  255%   computation context Context.
  256
  257crypto_context_hash(Context, Hash) :-
  258    '_crypto_hash_context_copy'(Context, Copy),
  259    '_crypto_hash_context_hash'(Copy, List),
  260    hex_bytes(Hash, List).
  261
  262%!  crypto_open_hash_stream(+OrgStream, -HashStream, +Options) is det.
  263%
  264%   Open a filter stream on OrgStream  that maintains a hash. The hash
  265%   can be retrieved at any time using crypto_stream_hash/2. Available
  266%   Options in addition to those of crypto_data_hash/3 are:
  267%
  268%     - close_parent(+Bool)
  269%     If `true` (default), closing the filter stream also closes the
  270%     original (parent) stream.
  271
  272crypto_open_hash_stream(OrgStream, HashStream, Options) :-
  273    crypto_context_new(Context, Options),
  274    '_crypto_open_hash_stream'(OrgStream, HashStream, Context).
  275
  276
  277%!  crypto_stream_hash(+HashStream, -Hash) is det.
  278%
  279%   Unify  Hash with  a hash  for  the bytes  sent to  or read  from
  280%   HashStream.  Note  that  the  hash is  computed  on  the  stream
  281%   buffers. If the stream is an  output stream, it is first flushed
  282%   and the Digest  represents the hash at the  current location. If
  283%   the stream is an input stream  the Digest represents the hash of
  284%   the processed input including the already buffered data.
  285
  286crypto_stream_hash(Stream, Hash) :-
  287    '_crypto_stream_hash_context'(Stream, Context),
  288    crypto_context_hash(Context, Hash).
  289
  290/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  291   The so-called modular crypt format (MCF) is a standard for encoding
  292   password hash strings. However, there's no official specification
  293   document describing it. Nor is there a central registry of
  294   identifiers or rules. This page describes what is known about it:
  295
  296   https://pythonhosted.org/passlib/modular_crypt_format.html
  297
  298   As of 2016, the MCF is deprecated in favor of the PHC String Format:
  299
  300   https://github.com/P-H-C/phc-string-format/blob/master/phc-sf-spec.md
  301
  302   This is what we are using below. For the time being, it is best to
  303   treat these hashes as opaque atoms in applications. Please let me
  304   know if you need to rely on any specifics of this format.
  305- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  306
  307%!  crypto_password_hash(+Password, ?Hash) is semidet.
  308%
  309%   If  Hash is  instantiated,  the predicate  succeeds  _iff_ the  hash
  310%   matches the  given password.  Otherwise, the  call is  equivalent to
  311%   crypto_password_hash(Password,    Hash,   [])    and   computes    a
  312%   password-based hash using the default options.
  313
  314crypto_password_hash(Password, Hash) :-
  315    (   nonvar(Hash) ->
  316        must_be(atom, Hash),
  317        split_string(Hash, "$", "$", ["pbkdf2-sha512",Ps,SaltB64,HashB64]),
  318        atom_to_term(Ps, t=Iterations, []),
  319        bytes_base64(SaltBytes, SaltB64),
  320        bytes_base64(HashBytes, HashB64),
  321        '_crypto_password_hash'(Password, SaltBytes, Iterations, HashBytes)
  322    ;   crypto_password_hash(Password, Hash, [])
  323    ).
  324
  325%!  crypto_password_hash(+Password, -Hash, +Options) is det.
  326%
  327%   Derive  Hash  based  on  Password.  This  predicate  is  similar  to
  328%   crypto_data_hash/3  in  that it  derives  a  hash from  given  data.
  329%   However,   it   is  tailored   for   the   specific  use   case   of
  330%   _passwords_. One  essential distinction is  that for this  use case,
  331%   the  derivation  of a  hash  should  be  _as  slow as  possible_  to
  332%   counteract brute-force attacks over possible passwords.
  333%
  334%   Another important  distinction is  that equal passwords  must yield,
  335%   with  very high  probability, _different_  hashes. For  this reason,
  336%   cryptographically strong  random numbers are automatically  added to
  337%   the password before a hash is derived.
  338%
  339%   Hash is unified with an atom that contains the computed hash and all
  340%   parameters  that were  used, except  for the  password.  Instead  of
  341%   storing passwords,  store these  hashes. Later,  you can  verify the
  342%   validity of  a password  with crypto_password_hash/2,  comparing the
  343%   then entered password to the stored hash. If you need to export this
  344%   atom, you should treat it as opaque  ASCII data with up to 255 bytes
  345%   of length. The maximal length may increase in the future.
  346%
  347%   Admissible options are:
  348%
  349%     - algorithm(+Algorithm)
  350%       The algorithm to use. Currently, the only available algorithm
  351%       is =|pbkdf2-sha512|=, which is therefore also the default.
  352%     - cost(+C)
  353%       C is an integer, denoting the binary logarithm of the number
  354%       of _iterations_ used for the derivation of the hash. This
  355%       means that the number of iterations is set to 2^C. Currently,
  356%       the default is 17, and thus more than one hundred _thousand_
  357%       iterations. You should set this option as high as your server
  358%       and users can tolerate. The default is subject to change and
  359%       will likely increase in the future or adapt to new algorithms.
  360%     - salt(+Salt)
  361%       Use the given list of bytes as salt. By default,
  362%       cryptographically secure random numbers are generated for this
  363%       purpose. The default is intended to be secure, and constitutes
  364%       the typical use case of this predicate.
  365%
  366%   Currently,  PBKDF2  with SHA-512  is  used  as the  hash  derivation
  367%   function, using 128 bits of  salt. All default parameters, including
  368%   the algorithm, are subject to change, and other algorithms will also
  369%   become available  in the  future.  Since  computed hashes  store all
  370%   parameters that were used during their derivation, such changes will
  371%   not affect the  operation of existing deployments.  Note though that
  372%   new hashes will then be computed with the new default parameters.
  373%
  374%   @see crypto_data_hkdf/4 for generating keys from Hash.
  375
  376crypto_password_hash(Password, Hash, Options) :-
  377    must_be(list, Options),
  378    option(cost(C), Options, 17),
  379    Iterations is 2^C,
  380    Algorithm = 'pbkdf2-sha512', % current default and only option
  381    option(algorithm(Algorithm), Options, Algorithm),
  382    (   option(salt(SaltBytes), Options) ->
  383        true
  384    ;   crypto_n_random_bytes(16, SaltBytes)
  385    ),
  386    '_crypto_password_hash'(Password, SaltBytes, Iterations, HashBytes),
  387    bytes_base64(HashBytes, HashB64),
  388    bytes_base64(SaltBytes, SaltB64),
  389    format(atom(Hash),
  390           "$pbkdf2-sha512$t=~d$~w$~w", [Iterations,SaltB64,HashB64]).
  391
  392
  393/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  394   Bidirectional Bytes <-> Base64 conversion as required by PHC format.
  395
  396   Note that *no padding* must be used, and that we must be able
  397   to encode the whole range of bytes, not only UTF-8 sequences!
  398- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  399
  400bytes_base64(Bytes, Base64) :-
  401    (   var(Bytes) ->
  402        base64_encoded(Atom, Base64, [padding(false)]),
  403        atom_codes(Atom, Bytes)
  404    ;   atom_codes(Atom, Bytes),
  405        base64_encoded(Atom, Base64, [padding(false)])
  406    ).
  407
  408
  409%!  crypto_data_hkdf(+Data, +Length, -Bytes, +Options) is det.
  410%
  411%   Concentrate possibly dispersed entropy of Data and then expand it to
  412%   the desired  length.  Bytes  is unified  with a  list of  _bytes_ of
  413%   length  Length,  and  is  suitable  as  input  keying  material  and
  414%   initialization vectors to the symmetric encryption predicates.
  415%
  416%   Admissible options are:
  417%
  418%      - algorithm(+Algorithm)
  419%        A hashing algorithm as specified to crypto_data_hash/3. The
  420%        default is a cryptographically secure algorithm. If you
  421%        specify a variable, then it is unified with the algorithm
  422%        that was used.
  423%      - info(+Info)
  424%        Optional context and application specific information,
  425%        specified as an atom, string or list of _bytes_. The default
  426%        is the zero length atom ''.
  427%      - salt(+List)
  428%        Optionally, a list of _bytes_ that are used as salt. The
  429%        default is all zeroes.
  430%      - encoding(+Atom)
  431%        Either =|utf8|= (default) or =|octet|=, denoting
  432%        the representation of Data as in crypto_data_hash/3.
  433%
  434%   The `info/1`  option can be  used to  generate multiple keys  from a
  435%   single  master key,  using for  example values  such as  =|key|= and
  436%   =|iv|=, or the name of a file that is to be encrypted.
  437%
  438%   This predicate requires OpenSSL 1.1.0 or greater.
  439%
  440%   @see crypto_n_random_bytes/2 to obtain a suitable salt.
  441
  442
  443crypto_data_hkdf(Data, L, Bytes, Options0) :-
  444        functor_hash_options(algorithm, Algorithm, Options0, Options),
  445        option(salt(SaltBytes), Options, []),
  446        option(info(Info), Options, ''),
  447        option(encoding(Enc), Options, utf8),
  448        '_crypto_data_hkdf'(Data, SaltBytes, Info, Algorithm, Enc, L, Bytes).
  449
  450%!  ecdsa_sign(+Key, +Data, -Signature, +Options)
  451%
  452%   Create  an ECDSA  signature for  Data with  EC private  key Key.
  453%   Among the most  common cases is signing a hash  that was created
  454%   with crypto_data_hash/3 or other predicates of this library. For
  455%   this reason, the  default encoding (`hex`) assumes  that Data is
  456%   an atom,  string, character list  or code list  representing the
  457%   data in hexadecimal notation. See rsa_sign/4 for an example.
  458%
  459%   Options:
  460%
  461%     - encoding(+Encoding)
  462%     Encoding to use for Data.  Default is `hex`.  Alternatives
  463%     are `octet`, `utf8` and `text`.
  464
  465ecdsa_sign(private_key(ec(Private,Public0,Curve)), Data0, Signature, Options) :-
  466    option(encoding(Enc0), Options, hex),
  467    hex_encoding(Enc0, Data0, Enc, Data),
  468    hex_bytes(Public0, Public),
  469    '_crypto_ecdsa_sign'(ec(Private,Public,Curve), Data, Enc, Signature).
  470
  471hex_encoding(hex, Data0, octet, Data) :- !,
  472    hex_bytes(Data0, Data).
  473hex_encoding(Enc, Data, Enc, Data).
  474
  475%!  ecdsa_verify(+Key, +Data, +Signature, +Options) is semidet.
  476%
  477%   True iff Signature can be verified as the ECDSA signature for
  478%   Data, using the EC public key Key.
  479%
  480%   Options:
  481%
  482%     - encoding(+Encoding)
  483%     Encoding to use for Data.  Default is `hex`.  Alternatives
  484%     are `octet`, `utf8` and `text`.
  485
  486ecdsa_verify(public_key(ec(Private,Public0,Curve)), Data0, Signature0, Options) :-
  487    option(encoding(Enc0), Options, hex),
  488    hex_encoding(Enc0, Data0, Enc, Data),
  489    hex_bytes(Public0, Public),
  490    hex_bytes(Signature0, Signature),
  491    '_crypto_ecdsa_verify'(ec(Private,Public,Curve), Data, Enc, Signature).
  492
  493
  494%!  hex_bytes(?Hex, ?List) is det.
  495%
  496%   Relation between a hexadecimal sequence  and a list of bytes.  Hex
  497%   is  an atom,  string,  list  of characters  or  list  of codes  in
  498%   hexadecimal  encoding.   This  is  the  format  that  is  used  by
  499%   crypto_data_hash/3 and  related predicates to  represent _hashes_.
  500%   Bytes is a list of _integers_ between 0 and 255 that represent the
  501%   sequence as a  list of bytes.  At least one  of the arguments must
  502%   be instantiated. When converting List  _to_ Hex, an _atom_ is used
  503%   to represent the sequence of hexadecimal digits.
  504%
  505%   Example:
  506%
  507%   ==
  508%   ?- hex_bytes('501ACE', Bs).
  509%   Bs = [80, 26, 206].
  510%   ==
  511%
  512%  @see base64_encoded/3 for Base64 encoding, which is often used to
  513%  transfer or embed binary data in applications.
  514
  515hex_bytes(Hs, Bytes) :-
  516    (   ground(Hs) ->
  517        string_chars(Hs, Chars),
  518        (   phrase(hex_bytes(Chars), Bytes)
  519        ->  true
  520        ;   domain_error(hex_encoding, Hs)
  521        )
  522    ;   must_be(list(between(0,255)), Bytes),
  523        phrase(bytes_hex(Bytes), Chars),
  524        atom_chars(Hs, Chars)
  525    ).
  526
  527hex_bytes([]) --> [].
  528hex_bytes([H1,H2|Hs]) --> [Byte],
  529    { char_type(H1, xdigit(High)),
  530      char_type(H2, xdigit(Low)),
  531      Byte is High*16 + Low },
  532    hex_bytes(Hs).
  533
  534bytes_hex([]) --> [].
  535bytes_hex([B|Bs]) -->
  536    { High is B>>4,
  537      Low is B /\ 0xf,
  538      char_type(C0, xdigit(High)),
  539      char_type(C1, xdigit(Low))
  540    },
  541    [C0,C1],
  542    bytes_hex(Bs).
  543
  544%!  rsa_private_decrypt(+PrivateKey, +CipherText, -PlainText, +Options) is det.
  545%!  rsa_private_encrypt(+PrivateKey, +PlainText, -CipherText, +Options) is det.
  546%!  rsa_public_decrypt(+PublicKey, +CipherText, -PlainText, +Options) is det.
  547%!  rsa_public_encrypt(+PublicKey, +PlainText, -CipherText, +Options) is det.
  548%
  549%   RSA Public key encryption and   decryption  primitives. A string
  550%   can be safely communicated by first   encrypting it and have the
  551%   peer decrypt it with the matching  key and predicate. The length
  552%   of the string is limited by  the   key  length.
  553%
  554%   Options:
  555%
  556%     - encoding(+Encoding)
  557%     Encoding to use for Data.  Default is `utf8`.  Alternatives
  558%     are `utf8` and `octet`.
  559%
  560%     - padding(+PaddingScheme)
  561%     Padding scheme to use.  Default is `pkcs1`.  Alternatives
  562%     are `pkcs1_oaep`, `sslv23` and `none`. Note that `none` should
  563%     only be used if you implement cryptographically sound padding
  564%     modes in your application code as encrypting unpadded data with
  565%     RSA is insecure
  566%
  567%   @see load_private_key/3, load_public_key/2 can be use to load
  568%   keys from a file.  The predicate load_certificate/2 can be used
  569%   to obtain the public key from a certificate.
  570%
  571%   @error ssl_error(Code, LibName, FuncName, Reason)   is raised if
  572%   there is an error, e.g., if the text is too long for the key.
  573
  574%!  rsa_sign(+Key, +Data, -Signature, +Options) is det.
  575%
  576%   Create an RSA signature for Data with private key Key.  Options:
  577%
  578%     - type(+Type)
  579%     SHA algorithm used to compute the digest.  Values are
  580%     `sha1`, `sha224`, `sha256`, `sha384` or `sha512`. The
  581%     default is a cryptographically secure algorithm. If you
  582%     specify a variable, then it is unified with the algorithm that
  583%     was used.
  584%
  585%     - encoding(+Encoding)
  586%     Encoding to use for Data.  Default is `hex`.  Alternatives
  587%     are `octet`, `utf8` and `text`.
  588%
  589%   This predicate can be used to compute a =|sha256WithRSAEncryption|=
  590%   signature as follows:
  591%
  592%     ```
  593%     sha256_with_rsa(PemKeyFile, Password, Data, Signature) :-
  594%         Algorithm = sha256,
  595%         read_key(PemKeyFile, Password, Key),
  596%         crypto_data_hash(Data, Hash, [algorithm(Algorithm),
  597%                                       encoding(octet)]),
  598%         rsa_sign(Key, Hash, Signature, [type(Algorithm)]).
  599%
  600%     read_key(File, Password, Key) :-
  601%         setup_call_cleanup(
  602%             open(File, read, In, [type(binary)]),
  603%             load_private_key(In, Password, Key),
  604%             close(In)).
  605%     ```
  606%
  607%   Note that a hash that is computed by crypto_data_hash/3 can be
  608%   directly used in rsa_sign/4 as well as ecdsa_sign/4.
  609
  610rsa_sign(Key, Data0, Signature, Options0) :-
  611    functor_hash_options(type, Type, Options0, Options),
  612    option(encoding(Enc0), Options, hex),
  613    hex_encoding(Enc0, Data0, Enc, Data),
  614    rsa_sign(Key, Type, Enc, Data, Signature).
  615
  616
  617%!  rsa_verify(+Key, +Data, +Signature, +Options) is semidet.
  618%
  619%   Verify an RSA signature for Data with public key Key.
  620%
  621%   Options:
  622%
  623%     - type(+Type)
  624%     SHA algorithm used to compute the digest.  Values are `sha1`,
  625%     `sha224`, `sha256`, `sha384` or `sha512`. The default is the
  626%     same as for rsa_sign/4.  This option must match the algorithm
  627%     that was used for signing. When operating with different parties,
  628%     the used algorithm must be communicated over an authenticated
  629%     channel.
  630%
  631%     - encoding(+Encoding)
  632%     Encoding to use for Data.  Default is `hex`.  Alternatives
  633%     are `octet`, `utf8` and `text`.
  634
  635rsa_verify(Key, Data0, Signature0, Options0) :-
  636    functor_hash_options(type, Type, Options0, Options),
  637    option(encoding(Enc0), Options, hex),
  638    hex_encoding(Enc0, Data0, Enc, Data),
  639    hex_bytes(Signature0, Signature),
  640    rsa_verify(Key, Type, Enc, Data, Signature).
  641
  642%!  crypto_data_decrypt(+CipherText,
  643%!                      +Algorithm,
  644%!                      +Key,
  645%!                      +IV,
  646%!                      -PlainText,
  647%!                      +Options).
  648%
  649%   Decrypt  the   given  CipherText,  using  the   symmetric  algorithm
  650%   Algorithm, key Key, and initialization vector IV, to give PlainText.
  651%   CipherText must  be a string, atom  or list of codes  or characters,
  652%   and PlainText  is created  as a  string.  Key  and IV  are typically
  653%   lists  of _bytes_,  though  atoms and  strings  are also  permitted.
  654%   Algorithm must be an algorithm which your copy of OpenSSL knows. See
  655%   crypto_data_encrypt/6 for an example.
  656%
  657%     - encoding(+Encoding)
  658%     Encoding to use for CipherText.  Default is `utf8`.
  659%     Alternatives are `utf8` and `octet`.
  660%
  661%     - padding(+PaddingScheme)
  662%     For block ciphers, the padding scheme to use.  Default is
  663%     `block`.  You can disable padding by supplying `none` here.
  664%
  665%     - tag(+Tag)
  666%     For authenticated encryption schemes, the tag must be specified as
  667%     a list of bytes exactly as they were generated upon encryption.
  668%     This option requires OpenSSL 1.1.0 or greater.
  669%
  670%     - min_tag_length(+Length)
  671%     If the tag length is smaller than 16, this option must be used
  672%     to permit such shorter tags. This is used as a safeguard against
  673%     truncation attacks, where an attacker provides a short tag that
  674%     is easier to guess.
  675
  676crypto_data_decrypt(CipherText, Algorithm, Key, IV, PlainText, Options) :-
  677        (   option(tag(Tag), Options) ->
  678            option(min_tag_length(MinTagLength), Options, 16),
  679            length(Tag, TagLength),
  680            compare(C, TagLength, MinTagLength),
  681            tag_length_ok(C, Tag)
  682        ;   Tag = []
  683        ),
  684        '_crypto_data_decrypt'(CipherText, Algorithm, Key, IV,
  685                               Tag, PlainText, Options).
  686
  687% This test is important to prevent truncation attacks of the tag.
  688
  689tag_length_ok(=, _).
  690tag_length_ok(>, _).
  691tag_length_ok(<, Tag) :- domain_error(tag_is_too_short, Tag).
  692
  693
  694%!  crypto_data_encrypt(+PlainText,
  695%!                      +Algorithm,
  696%!                      +Key,
  697%!                      +IV,
  698%!                      -CipherText,
  699%!                      +Options).
  700%
  701%   Encrypt  the   given  PlainText,   using  the   symmetric  algorithm
  702%   Algorithm, key Key, and initialization vector (or nonce) IV, to give
  703%   CipherText.
  704%
  705%   PlainText must be a string, atom or list of codes or characters, and
  706%   CipherText is created  as a string.  Key and IV  are typically lists
  707%   of _bytes_, though atoms and  strings are also permitted.  Algorithm
  708%   must   be  an   algorithm   which  your   copy   of  OpenSSL   knows
  709%   about.
  710%
  711%   Keys  and   IVs  can  be   chosen  at  random  (using   for  example
  712%   crypto_n_random_bytes/2) or derived from input keying material (IKM)
  713%   using for example crypto_data_hkdf/4.  This  input is often a shared
  714%   secret, such as a negotiated point on an elliptic curve, or the hash
  715%   that was computed from a  password via crypto_password_hash/3 with a
  716%   freshly generated and specified _salt_.
  717%
  718%   Reusing the same combination of Key  and IV typically leaks at least
  719%   _some_  information about  the  plaintext.   For example,  identical
  720%   plaintexts will  then correspond to identical  ciphertexts. For some
  721%   algorithms, reusing an  IV with the same Key  has disastrous results
  722%   and  can  cause  the  loss  of all  properties  that  are  otherwise
  723%   guaranteed.   Especially in  such  cases,  an IV  is  also called  a
  724%   _nonce_  (number used  once).   If  an IV  is  not  needed for  your
  725%   algorithm (such as =|'aes-128-ecb'|=) then any value can be provided
  726%   as it will  be ignored by the underlying  implementation.  Note that
  727%   such  algorithms do  not provide  _semantic security_  and are  thus
  728%   insecure. You should use stronger algorithms instead.
  729%
  730%   It is safe to store and  transfer the used initialization vector (or
  731%   nonce) in plain text, but the key _must be kept secret_.
  732%
  733%   Commonly used algorithms include:
  734%
  735%       $ =|'chacha20-poly1305'|= :
  736%       A powerful and efficient _authenticated_ encryption scheme,
  737%       providing secrecy and at the same time reliable protection
  738%       against undetected _modifications_ of the encrypted data. This
  739%       is a very good choice for virtually all use cases. It is a
  740%       _stream cipher_ and can encrypt data of any length up to 256 GB.
  741%       Further, the encrypted data has exactly the same length
  742%       as the original, and no padding is used. It requires OpenSSL
  743%       1.1.0 or greater. See below for an example.
  744%
  745%       $ =|'aes-128-gcm'|= :
  746%       Also an authenticated encryption scheme. It uses a 128-bit
  747%       (i.e., 16 bytes) key and a 96-bit (i.e., 12 bytes) nonce. It
  748%       requires OpenSSL 1.1.0 or greater.
  749%
  750%       $ =|'aes-128-cbc'|= :
  751%       A _block cipher_ that provides secrecy, but does not protect
  752%       against unintended modifications of the cipher text. This
  753%       algorithm uses 128-bit (16 bytes) keys and initialization
  754%       vectors.  It works with all supported versions of OpenSSL. If
  755%       possible, consider using an authenticated encryption scheme
  756%       instead.
  757%
  758%   Options:
  759%
  760%     - encoding(+Encoding)
  761%     Encoding to use for PlainText.  Default is `utf8`.  Alternatives
  762%     are `utf8` and `octet`.
  763%
  764%     - padding(+PaddingScheme)
  765%     For block ciphers, the padding scheme to use.  Default is
  766%     `block`.  You can disable padding by supplying `none` here. If
  767%     padding is disabled for block ciphers, then the length of the
  768%     ciphertext must be a multiple of the block size.
  769%
  770%     - tag(-List)
  771%     For authenticated encryption schemes, List is unified with a
  772%     list of _bytes_ holding the tag. This tag must be provided for
  773%     decryption. Authenticated encryption requires OpenSSL 1.1.0 or
  774%     greater.
  775%
  776%     - tag_length(+Length)
  777%     For authenticated encryption schemes, the desired length of the
  778%     tag, specified as the number of bytes.  The default is
  779%     16. Smaller numbers are not recommended.
  780%
  781%   For example, with OpenSSL 1.1.0 and greater, we can use the ChaCha20
  782%   stream cipher  with the Poly1305  authenticator. This cipher  uses a
  783%   256-bit  key  and  a  96-bit  _nonce_,  i.e.,  32  and  12  _bytes_,
  784%   respectively:
  785%
  786%     ```
  787%     ?- Algorithm = 'chacha20-poly1305',
  788%        crypto_n_random_bytes(32, Key),
  789%        crypto_n_random_bytes(12, IV),
  790%        crypto_data_encrypt("this is some input", Algorithm,
  791%                    Key, IV, CipherText, [tag(Tag)]),
  792%        crypto_data_decrypt(CipherText, Algorithm,
  793%                    Key, IV, RecoveredText, [tag(Tag)]).
  794%     Algorithm = 'chacha20-poly1305',
  795%     Key = [65, 147, 140, 197, 27, 60, 198, 50, 218|...],
  796%     IV = [253, 232, 174, 84, 168, 208, 218, 168, 228|...],
  797%     CipherText = <binary string>,
  798%     Tag = [248, 220, 46, 62, 255, 9, 178, 130, 250|...],
  799%     RecoveredText = "this is some input".
  800%     ```
  801%
  802%   In this  example, we use  crypto_n_random_bytes/2 to generate  a key
  803%   and  nonce  from  cryptographically   secure  random  numbers.   For
  804%   repeated applications,  you must  ensure that a  nonce is  only used
  805%   _once_ together  with the same  key.  Note that  for _authenticated_
  806%   encryption schemes, the _tag_ that was computed during encryption is
  807%   necessary for decryption.  It is safe  to store and transfer the tag
  808%   in plain text.
  809%
  810%   @see crypto_data_decrypt/6.
  811%   @see hex_bytes/2 for conversion between bytes and hex encoding.
  812
  813crypto_data_encrypt(PlainText, Algorithm, Key, IV, CipherText, Options) :-
  814        (   option(tag(AuthTag), Options) ->
  815            option(tag_length(AuthLength), Options, 16)
  816        ;   AuthTag = _,
  817            AuthLength = -1
  818        ),
  819        '_crypto_data_encrypt'(PlainText, Algorithm, Key, IV,
  820                               AuthLength, AuthTag, CipherText, Options).
  821
  822
  823%%  crypto_modular_inverse(+X, +M, -Y) is det
  824%
  825%   Compute the modular multiplicative inverse of the integer X. Y is
  826%   unified with an integer such that X*Y is congruent to 1 modulo M.
  827
  828
  829crypto_modular_inverse(X, M, Y) :-
  830    integer_serialized(X, XS),
  831    integer_serialized(M, MS),
  832    '_crypto_modular_inverse'(XS, MS, YHex),
  833    hex_to_integer(YHex, Y).
  834
  835integer_serialized(I, serialized(S)) :-
  836    must_be(integer, I),
  837    integer_atomic_sign(I, Sign),
  838    Abs is abs(I),
  839    format(atom(A0), "~16r", [Abs]),
  840    atom_length(A0, L),
  841    Rem is L mod 2,
  842    hex_pad(Rem, Sign, A0, S).
  843
  844integer_atomic_sign(I, S) :-
  845    Sign is sign(I),
  846    sign_atom(Sign, S).
  847
  848sign_atom(-1, '-').
  849sign_atom( 0, '').
  850sign_atom( 1, '').
  851
  852hex_pad(0, Sign, A0, A) :- atom_concat(Sign, A0, A).
  853hex_pad(1, Sign, A0, A) :- atomic_list_concat([Sign,'0',A0], A).
  854
  855pow256(Byte, N0-I0, N-I) :-
  856    N is N0 + Byte*256^I0,
  857    I is I0 + 1.
  858
  859hex_to_integer(Hex, N) :-
  860    hex_bytes(Hex, Bytes0),
  861    reverse(Bytes0, Bytes),
  862    foldl(pow256, Bytes, 0-0, N-_).
  863
  864%%  crypto_generate_prime(+N, -P, +Options) is det
  865%
  866%   Generate a prime P with at least N bits. Options is a list of options.
  867%   Currently, the only supported option is:
  868%
  869%   * safe(Boolean)
  870%     If `Boolean` is `true` (default is `false`), then a _safe_ prime
  871%     is generated. This means that P is of the form 2*Q + 1 where Q
  872%     is also prime.
  873
  874crypto_generate_prime(Bits, P, Options) :-
  875        must_be(list, Options),
  876        option(safe(Safe), Options, false),
  877        '_crypto_generate_prime'(Bits, Hex, Safe, Options),
  878        hex_to_integer(Hex, P).
  879
  880%%  crypto_is_prime(+P, +Options) is semidet
  881%
  882%   True iff P passes a probabilistic primality test. Options is a
  883%   list of options. Currently, the only supported option is:
  884%
  885%   * iterations(N)
  886%     N is the number of iterations that are performed. If this option
  887%     is not specified, a number of iterations is used such that the
  888%     probability of a false positive is at most 2^(-80).
  889
  890crypto_is_prime(P0, Options) :-
  891        must_be(integer, P0),
  892        must_be(list, Options),
  893        option(iterations(N), Options, -1),
  894        integer_serialized(P0, P),
  895        '_crypto_is_prime'(P, N).
  896
  897%%  crypto_name_curve(+Name, -Curve) is det
  898%
  899%   Obtain a handle for a _named_ elliptic curve. Name is an atom, and
  900%   Curve is unified with an opaque object that represents the curve.
  901%   Currently, only elliptic curves over prime fields are
  902%   supported. Examples of such curves are `prime256v1` and
  903%   `secp256k1`.
  904%
  905%   If you have OpenSSL installed, you can get a list of supported
  906%   curves via:
  907%
  908%   ==
  909%   $ openssl ecparam -list_curves
  910%   ==
  911
  912%%  crypto_curve_order(+Curve, -Order) is det
  913%
  914%   Obtain the order of an elliptic curve. Order is an integer,
  915%   denoting how many points on the curve can be reached by
  916%   multiplying the curve's generator with a scalar.
  917
  918crypto_curve_order(Curve, Order) :-
  919    '_crypto_curve_order'(Curve, Hex),
  920    hex_to_integer(Hex, Order).
  921
  922
  923%%  crypto_curve_generator(+Curve, -Point) is det
  924%
  925%   Point is the _generator_ of the elliptic curve Curve.
  926
  927crypto_curve_generator(Curve, point(X,Y)) :-
  928    '_crypto_curve_generator'(Curve, X0, Y0),
  929    hex_to_integer(X0, X),
  930    hex_to_integer(Y0, Y).
  931
  932%% crypto_curve_scalar_mult(+Curve, +N, +Point, -R) is det
  933%
  934%  R is the result of N times Point on the elliptic curve Curve. N
  935%  must be an integer, and Point must be a point on the curve.
  936
  937crypto_curve_scalar_mult(Curve, S0, point(X0,Y0), point(A,B)) :-
  938    maplist(integer_serialized, [S0,X0,Y0], [S,X,Y]),
  939    '_crypto_curve_scalar_mult'(Curve, S, X, Y, A0, B0),
  940    hex_to_integer(A0, A),
  941    hex_to_integer(B0, B).
  942
  943
  944                 /*******************************
  945                 *          Sandboxing          *
  946                 *******************************/
  947
  948:- multifile sandbox:safe_primitive/1.  949
  950sandbox:safe_primitive(crypto:hex_bytes(_,_)).
  951sandbox:safe_primitive(crypto:crypto_n_random_bytes(_,_)).
  952
  953sandbox:safe_primitive(crypto:crypto_data_hash(_,_,_)).
  954sandbox:safe_primitive(crypto:crypto_data_context(_,_,_)).
  955sandbox:safe_primitive(crypto:crypto_context_new(_,_)).
  956sandbox:safe_primitive(crypto:crypto_context_hash(_,_)).
  957
  958sandbox:safe_primitive(crypto:crypto_password_hash(_,_)).
  959sandbox:safe_primitive(crypto:crypto_password_hash(_,_,_)).
  960sandbox:safe_primitive(crypto:crypto_data_hkdf(_,_,_,_)).
  961
  962sandbox:safe_primitive(crypto:ecdsa_sign(_,_,_,_)).
  963sandbox:safe_primitive(crypto:ecdsa_verify(_,_,_,_)).
  964
  965sandbox:safe_primitive(crypto:rsa_sign(_,_,_,_)).
  966sandbox:safe_primitive(crypto:rsa_verify(_,_,_,_)).
  967sandbox:safe_primitive(crypto:rsa_public_encrypt(_,_,_,_)).
  968sandbox:safe_primitive(crypto:rsa_public_decrypt(_,_,_,_)).
  969sandbox:safe_primitive(crypto:rsa_private_encrypt(_,_,_,_)).
  970sandbox:safe_primitive(crypto:rsa_private_decrypt(_,_,_,_)).
  971
  972sandbox:safe_primitive(crypto:crypto_data_decrypt(_,_,_,_,_,_)).
  973sandbox:safe_primitive(crypto:crypto_data_encrypt(_,_,_,_,_,_)).
  974
  975sandbox:safe_primitive(crypto:crypto_modular_inverse(_,_,_)).
  976sandbox:safe_primitive(crypto:crypto_generate_prime(_,_,_)).
  977sandbox:safe_primitive(crypto:crypto_is_prime(_,_)).
  978
  979sandbox:safe_primitive(crypto:crypto_name_curve(_,_)).
  980sandbox:safe_primitive(crypto:crypto_curve_order(_,_)).
  981sandbox:safe_primitive(crypto:crypto_curve_generator(_,_)).
  982sandbox:safe_primitive(crypto:crypto_curve_scalar_mult(_,_,_,_)).
  983
  984                 /*******************************
  985                 *           MESSAGES           *
  986                 *******************************/
  987
  988:- multifile
  989    prolog:error_message//1.  990
  991prolog:error_message(ssl_error(ID, _Library, Function, Reason)) -->
  992    [ 'SSL(~w) ~w: ~w'-[ID, Function, Reason] ]