Provided by: afnix_2.8.1-1_amd64 bug

NAME

       sec - standard security module

STANDARD SECURITY MODULE

       The  Standard  Securitymodule  is  an  original  implementation  of  several standards and
       techniques used in the field of cryptography. The module provides the objects than enables
       message  hashing,  symetric  and assymetric ciphers and digital signature computation. The
       implementation follows the recommendation from NIST and PKCS and  the  standard  reference
       that it implements is always attached to the underlying object.

       Hash objects
       Hashing is the ability to generate an almostunique representation from a string. Although,
       there is no guarantee that two different string will not produce the same result --  known
       as  a  collision  --  the  sophistication of the hashing function attempt to minimize such
       eventuality. The hashing process is not reversible. There are  several  hashing  functions
       available in the public domain. To name a few, MD5 is the message digest 5, and SHA is the
       secure hash algorithm. The following  table  illustrates  the  size  of  the  result  with
       different hashing functions.

       Function   Result size
       MD-2       128 bits
       MD-4       128 bits
       MD-5       128 bits
       SHA-1      160 bits
       SHA-224    224 bits
       SHA-256    256 bits
       SHA-384    384 bits
       SHA-512    512 bits

       Hasher object
       The  Hasherclass is a text hashing computation class. The class computes a hash value from
       a literal object, a buffer or an input stream. Once computed, the hash value is stored  as
       an  array  of  bytes  that  can  be retrieved one by one or at all in the form of a string
       representation.

       Creating a hasher
       Several hasher objects are available in the module. For  example,  the  Md5object  is  the
       hasher  object  that  implements  the  MD-5  algorithm.  The constructor does not take any
       argument.

       # get a  MD-5 hasher
       const md (afnix:sec:Md5)
       # check the object
       afnix:sec:hasher-p md # true

       The computemethod computes the hash value. For example, the string "abc" returns the value
       "900150983CD24FB0D6963F7D28E17F72"which is 16 bytes long.

       const hval (md:compute "abc")

       Creating a SHA hasher
       There  are several SHA objects that produces results of different size as indicated in the
       next table.

       Hasher    Size       Constructor
       SHA-1     160 bits   Sha1
       SHA-224   224 bits   Sha224
       SHA-256   256 bits   Sha256
       SHA-384   384 bits   Sha384

       SHA-512   512 bits   Sha512

       The computemethod computes the hash value. For example,  the  string  "abc"  returns  with
       SHA-1 the 20 bytes long value: "A9993E364706816ABA3E25717850C26C9CD0D89D"

       Cipher key principles
       Cipher  key  management is an important concept in the ciphering land. In a simple mode, a
       key is used by a cipher to encode some data. Although the  key  can  be  any  sequence  of
       bytes,  it  is  preferable  to have the key built from a specific source such like a pass-
       phrase. A cipher key comes basically into two flavors: keys for symmetric ciphers and keys
       for  asymmetric  ciphers.  A  key  for  a symmetric cipher is easy to derive and generally
       follows a standard process which is independent  of  the  cipher  itself.  A  key  for  an
       asymmetric  cipher  is  more  complex  to  derive and is generally dependent on the cipher
       itself.

       Key operations
       The basic operations associated with a key are the key identification by  type  and  size.
       The key type is an item that identifies the key nature. The get-typemethod returns the key
       type as specified by the table below.

       Key    Description
       KSYM   Symmetric cipher key
       KRSA   Asymmetric RSA cipher key
       KMAC   Message authentication key
       KDSA   Message signature key

       The message authentication key  as  represented  by  the  KMACsymbol  is  similar  to  the
       symmetric key. The key type can be obtained with the get-typemethod.

       # get the key type
       const type (key:get-type)

       The  key  size  is the canonical size as specified by the key or the cipher specification.
       The get-bitsreturns the key size in bits.  The  get-sizereturns  the  key  size  in  bytes
       rounded  to  the  nearest  value.  The  table  below  describes the nature of the key size
       returned.

       Key    Type   Description
       KSYM   byte   Byte array size
       KRSA   bits   Modulus size
       KMAC   byte   Byte array size
       KDSA   bits   Signature size

       const bits (key:get-bits)
       const size (key:get-size)

       Key representation
       Unfortunately, it is not easy to represent a key, since the representation depends on  the
       key's type. For example, a symmetric key can be formatted as a simple octet string. On the
       other hand, a RSA key has two components; namely the modulus and the exponent, which needs
       to  be  distinguished and therefore making the representation more difficult. Other cipher
       keys are even more complicated. For this reason, the representation  model  is  a  relaxed
       one.  The  formatmethod  can  be  called without argument to obtain an unique octet string
       representation if this representation is possible. If the key representation requires some
       parameters,  the  format method may accept one or several arguments to distinguish the key
       components.

       Key    Argument               Description
       KSYM   none                   Symmetric key octet string
       KRSA   RSA-MODULUS            RSA modulus octet string
       KRSA   RSA-PUBLIC-EXPONENT    RSA public exponent octet string
       KRSA   RSA-SECRET-EXPONENT    RSA secret exponent octet string
       KMAC   none                   Message authentication key octet string

       KDSA   DSA-P-PRIME            DSA secret prime octet string
       KDSA   DSA-Q-PRIME            DSA secret prime octet string
       KDSA   DSA-SECRET-KEY         DSA secret key
       KDSA   DSA-PUBLIC-KEY         DSA public key
       KDSA   DSA-PUBLIC-GENERATOR   DSA public generator

       # get a simple key representation
       println (key:format)
       # get a rsa modulus key representation
       println (key:format afnix:sec:Key:RSA-MODULUS)

       There are other key representations. The natural one is  the  byte  representation  for  a
       symmetric  key,  while  a  number  based  representation is generally more convenient with
       asymmetric keys. The get-bytemethod returns a key byte by  index  if  possible.  The  get-
       relatif-keyreturns a key value by relatif number if possible.

       Symmetric cipher key

       Creating a symmetric cipher key
       The  Keyclass  can  be  used  to  create  a cipher key suitable for a symmetric cipher. By
       default a 128 bits random key is generated, but the key can  be  also  generated  from  an
       octet string.

       const  key  (afnix:sec:Key)
       assert true (afnix:sec:key-p key)

       The constructor also supports the use of an octet string representation of the key.

       # create an octet string key
       const  key  (afnix:sec:Key "0123456789ABCDEF")
       assert true (afnix:sec:key-p key)

       Symmetric key functions
       The  basic  operation  associated  with  a  symmetric key is the byte extraction. The get-
       sizemethod can be used to determine the  byte  key  size.  Once  the  key  size  has  been
       obtained, the key byte can be accessed by index with the get-bytemethod.

       # create a 256 random symmetric key
       const key  (afnix:sec:Key afnix:sec:Key:KSYM 256)
       # get the key size
       const size (key:get-size)
       # get the first byte
       const byte (key:get-byte 0)

       Asymmetric cipher key
       An  asymmetric  cipher  key can be generated for a particular asymmetric cipher, such like
       RSA. Generally, the key contains several components identified as the  public  and  secret
       key  components.  These  components  are  highly  dependent on the cipher type. Under some
       circumstances, all components might not be available.

       Creating an asymmetric cipher key
       The Keyclass can be used to create a specific asymmetric cipher key. Generally, the key is
       created by type and and bits size.

       # create a 1024 bits rsa key
       const  key  (afnix:sec:Key afnix:sec:Key:KRSA 1024)

       An  asymmetric  cipher key constructor is extremely dependent on the cipher type. For this
       reason, there is no constructor that can operate with a pass-phrase.

       Asymmetric key functions
       The basic operation associated with a asymmetric key is the relatif  based  representation
       which  is  generally available for all key components. For example, in the case of the RSA
       cipher, the modulus, the public and secret exponents can be obtained in a  relatif  number
       based representation with the help of the get-relatif-keymethod.

       # create a 512 rsa key
       const key  (afnix:sec:Key afnix:sec:Key:KRSA 512)
       # get the key modulus
       const kmod (
         key:get-relatif-key afnix:sec:Key:RSA-MODULUS)
       # get the public exponent
       const pexp (
         key:get-relatif-key afnix:sec:Key:RSA-PUBLIC-EXPONENT)
       # get the secret exponent
       const sexp (
         key:get-relatif-key afnix:sec:Key:RSA-SECRET-EXPONENT)

       Message authentication key

       Creating a message authentication key
       The  Keyclass  can  also  be  used  to  create a message authentication key suitable for a
       message authentication code generator or validator. By default a 128 bits  random  key  is
       generated, but the key can be also generated from an octet string.

       const  key  (afnix:sec:Key afnix:sec:Key:KMAC)
       assert true (afnix:sec:key-p key)

       The constructor also supports the use of an octet string as a key representation.

       # create an octet string key
       const key (
         afnix:sec:Key afnix:sec:Key:KMAC "0123456789ABCDEF")
       assert true (afnix:sec:key-p key)

       Message authentication key functions
       The  basic  operation associated with a message authentication key is the byte extraction.
       The get-sizemethod can be used to determine the byte key size. Once the key size has  been
       obtained, the key byte can be accessed by index with the get-bytemethod.

       # create a 256 random message authentication key
       const key  (afnix:sec:Key afnix:sec:Key:KMAC 256)
       # get the key size
       const size (key:get-size)
       # get the first byte
       const byte (key:get-byte 0)

       Signature key functions
       The  basic  operation  associated with a signature key is the relatif based representation
       which is generally available for all key components. For example, in the case of  the  DSA
       signer,  the  prime numbers, the public and secret components can be obtained in a relatif
       number based representation with the help of the get-relatif-keymethod.

       # create a 1024 dsa key
       const key  (afnix:sec:Key afnix:sec:Key:KDSA)
       # get the key size
       const size (key:get-size)
       # get the secret component
       const sexp (
         key:get-relatif-key afnix:sec:Key:DSA-SECRET-KEY)

       Stream cipher
       A stream cipher is an object that encodes an input stream into an output stream. The  data
       are  read from the input stream, encoded and transmitted onto the output stream. There are
       basically two types of stream ciphers known as symmetric cipher and asymmetric cipher.

       Symmetric cipher
       A symmetric cipher is a cipher that encodes and decode data with the same  key.  Normally,
       the  key  is  kept  secret,  and the data are encoded by block. For this reason, symmetric
       cipher are also called block cipher. In normal mode, a symmetric cipher  is  created  with
       key and the data are encoded from an input stream as long as they are available. The block
       size depends on the nature of the cipher. As of today, the recommended symmetric cipher is
       the Advanced Encryption Standardor AES, also known as Rijndael.

       Asymmetric cipher
       An asymmetric cipher is a cipher that encodes and decode data with two keys. Normally, the
       data are encoded with a public key and decoded with a private key. In this model,  anybody
       can  encode  a data stream, but only one person can read them. Obviously, the model can be
       reverse to operate in a kind of signature mode, where only one person can encode the  data
       stream and anybody can read them. Asymmetric cipher are particularly useful when operating
       on unsecured channels. In this model, one end can send its public key as a mean for  other
       people  to  crypt  data  that  can  only be read by the sender who is supposed to have the
       private key. As of today, the recommended asymmetric ciphers are RSA and DH.

       Serial cipher
       A serial cipher is a cipher that encodes and decode data on a byte  basis.  Normally,  the
       data  are encoded and decoded with the same key, thus making the symmetric cipher key, the
       ideal candidate for a serial cipher key. Since the data is encoded on a byte basis, it can
       be used efficiently with a stream. However, the serial cipher does not define a block size
       and therefore require some mechanism to prevent a buffer overrun when reading bytes from a
       stream.  For this reason, the serial cipher defines a default serial block sizethat can be
       used to buffer the stream data. A method is provided in the class to  control  the  buffer
       size and is by default set to 4Kib bytes.

       Cipher base class
       The  Cipherbase  class  is  an  abstract class that supports the symmetric, asymmetric and
       serial cipher models. A cipher object has a name and is bound to a key that is used by the
       cipher. The class provides some base methods that can be used to retrieve some information
       about the cipher.  The  get-namemethod  returns  the  cipher  name.  The  set-keyand  get-
       keymethods are both used to set or retrieve the cipher key.  The cipher operating mode can
       be found with the get-reversemethod. If the get-reversemethod returns true, the cipher  is
       operating in decoding mode. Note that a set-reversemethod also exists.

       Block cipher
       A  block cipher is an object that encodes an input stream with a symmetric cipher bound to
       a unique key. Since a block cipher is symmetric, the data can be coded and  later  decoded
       to   their   original  form.  The  difference  with  the  Cipherbase  class  is  that  the
       BlockCipherclass provides a get-block-sizemethod which returns the cipher block size.

       Block Cipher base
       The BlockCipherclass is a base class for the block cipher engine. The class implements the
       streammethod  that  reads  from  an  input  stream  and  write  into an output stream. The
       BlockCipherclass is an abstract class and cannot be instantiated by itself. The object  is
       actually created by using a cipher algorithm class such like the Aesclass.

       trans count (cipher:stream os is)

       The  streammethod  returns the number of characters that have been encoded. Care should be
       taken that most of the stream cipher operates by block and therefore, will block  until  a
       complete  block has been read from the input stream, unless the end of stream is read. The
       block cipher is always associated with a padding scheme.  By  default,  the  NIST  800-38A
       recommendation  is  associated  with  the  block  cipher, but can be changed with the set-
       padding-mode.

       Creating a block cipher
       A BlockCipherobject can be created with a cipher constructor. As of  today,  the  Advanced
       Encryption  Standardor AES is the recommended symmetric cipher. The Aesclass creates a new
       block cipher that conforms to the AES standard.

       const cipher (afnix:sec:Aes)

       A block cipher can be created with a key and eventually a reverse flag. With one argument,
       the  block  cipher key is associated with the cipher. Such key can be created as indicated
       in the previous section. The reverse flag is used to determine if the  cipher  operate  in
       encoding or decoding mode. By default, the cipher operates in coding mode.

       # create a 256 bits random key
       const key (afnix:sec:Key afnix:sec:KSYM 256)
       # create an aes block cipher
       const aes (afnix:sec:Aes key)

       Block cipher information
       The  BlockCipherclass  is  derived  from the Cipherclass and contains several methods that
       provide information about the cipher. This include the cipher block  size  with  the  get-
       block-sizemethod.

       println (aes:get-block-size)

       Input cipher
       In  the presence of a Cipherobject, it is difficult to read an input stream and encode the
       character of a block basis. Furthermore, the existence of various method for block padding
       makes  the  coding  operation  even  more difficult. For this reason, the InputCipherclass
       provides the necessary method to code or  decode  an  input  stream  in  various  mode  of
       operations.

       Input cipher mode
       The  InputCipherclass  is  an  input  stream that binds an input stream with a cipher. The
       class acts like an input stream, read the character from  the  bounded  input  stream  and
       encode  or  decode  them  from  the bended cipher. The InputCipherdefines several modes of
       operations. In electronic codebook modeor ECB, the character are encoded in a block basis.
       In  cipher  block  chainingmode,  the block are encoded by doing an XOR operation with the
       previous block. Other modes are also available such like cipher  feedback  modeand  output
       feedback mode.

       Creating an input cipher
       By  default  an  input cipher is created with a cipher object. Eventually, an input stream
       and/or the input mode can be specified at the object construction.

       # create a key
       const key (afnix:sec:Key "hello world")
       # create a direct cipher
       const aes (afnix:sec:Aes key)
       # create an input cipher
       const ic (afnix:sec:InputCipher aes)

       In this example, the input cipher is created in  ECB  mode.  The  input  stream  is  later
       associated with the set-ismethod.

       Input cipher operation
       The InputCipherclass operates with one or several input streams. The set-ismethod sets the
       input stream. Read operation can be made with the help of the valid-ppredicate.

       while (ic:valid-p) (os:write (ic:read))

       Since the InputCipheroperates like an input stream, the stream can be read as long as  the
       valid-ppredicate  returns true. Note that the InputCiphermanages automatically the padding
       operations with the mode associated with the block cipher.

       Asymmetric cipher
       A public cipher is an object that encodes an input stream with a asymmetric  cipher  bound
       to a public and secret key. In theory, there is no difference between a block cipher and a
       public cipher. Furthermore, the interface provided by the engine  is  the  same  for  both
       objects.

       Public cipher
       A  public cipher is an asymmetric stream cipher which operates with an asymmetric key. The
       main difference between a block cipher and a public cipher is the key nature  as  well  as
       the  encoded  block  size. With an asymmetric cipher, the size of the message to encode is
       generally not the same as the encoded block, because  a  message  padding  operation  must
       occurs for each message block.

       trans count (cipher:stream os is)

       The  streammethod  returns the number of characters that have been encoded. Like the block
       cipher, the streammethod encodes an input stream or a buffer object. The number of encoded
       bytes is returned by the method.

       Creating a public cipher
       A PublicCipherobject can be created with a cipher constructor. The RSAasymmetric cipher is
       the typical example of public cipher. It is created by  binding  a  RSA  key  to  it.  For
       security  reasons,  the  key  size must be large enough, typically with a size of at lease
       1024 bits.

       const key (afnix:sec:Key afnix:sec:Key:KRSA 1024)
       const rsa (afnix:sec:Rsa key)

       A block cipher can be created with  a  key  and  eventually  a  reverse  flag.  Additional
       constructors  are  available to support various padding mode. Such padding mode depends on
       the cipher type. For example, the RSA cipher supports the ISO 18033-2 padding mode with  a
       KDF1 or KDF2 object. Such constructor requires a hasher object as well.

       # create a 1024 bits rsa key
       const key (afnix:sec:Key afnix:sec:KRSA 1024)
       # create a SHA-1 hasher
       const ash (afnix:sec:Sha1)
       # create a rsa public cipher
       const rsa (afnix:sec:Rsa key ash "Demo")
       # set the padding mode
       rsa:set-padding-mode afnix:sec:Rsa:PAD-OAEP-K1

       Public cipher padding mode
       Like  any  cipher,  a  padding  mode  can  be associated with the cipher. The set-padding-
       modemethod can be used to set or change the padding mode. Depending on  the  padding  mode
       type, additional objects might be needed at construction.

       Cipher   Padding mode                          Default
       RSA      PKCS 1.5, PKCS 2.1, ISO/IEC 18033-2   PKCS 1.5

       The  default padding mode depends on the cipher type. For RSA, the default padding mode is
       set to PKCS 1.5 for compatibility reason.

       Signature objects
       A digital signature is a unique representation,  supposedly  non  forgeable,  designed  to
       authenticate  a  document, in whatever form it is represented. For example, a signature is
       used to sign a certificate which is  used  during  the  process  of  establish  a  secured
       connection over the Internet. A signature can also be used to sign a courrieror keys as it
       is in the Openssh protocol.  Digital  signatures  come  into  several  flavors  eventually
       associated  with  the  signed  document.  Sometimes, the signature acts as a container and
       permits to retrieve the document itself. Whatever the method, the  principle  remains  the
       same.  As  of today technology, there are two standards used to sign document as indicated
       below.

       Standard   Name
       DSS        Digital Signature Standard
       RSA        RSA based signature

       Signer and signature objects
       The process of generating a signature is done with the help of a  Signerobject.  A  signer
       object  is  a  generic  object,  similar in functionality to the hasher object. The result
       produced by a signer object is a Signatureobject which holds the generated signature.

       Signature key
       The process of generating a signature often requires the use of a key.  Such  key  can  be
       generated  with the help of the Keyobject. The nature of the key will depend on the target
       signature. The following table is a resume of the supported keys.

       Standard   Key    Signer
       DSS        KDSA   Dsa

       In the case of DSS, a key can be generated automatically, although this  process  is  time
       consuming. The default key size is 1024 bits.

       const key (afnix:sec:Key afnix:sec:Key:KDSA)
       assert 1024 (key:get-bits)

       Creating a signer
       A  Signerobject is created with a particular signature object such like DSA. The Dsaobject
       is a signer object that implements the Digital  Signature  Algorithmas  specified  by  the
       Digital Signature Standard (DSS)in FIPS-PUB 186-3.

       # create a dsa signer
       const dsa (afnix:sec:Dsa key)
       assert true (afnix:sec:dsa-p dsa)

       Creating a signature
       A  signature is created with the help of the computemethod. The Signatureobject is similar
       to the Hasherand operates with string or streams.

       # create a signature object
       const sgn   (dsa:compute "afnix")
       assert true (afnix:sec:signature-p sgn)

       Once the signature is created, each data can be  accessed  directly  with  the  associated
       component mapper. In the case of DSS, there are two components as show below.

       # get the DSS S component
       sgn:get-relatif-component
       afnix:sec:Signature:DSA-S-COMPONENT
       # get the DSS R component
       sgn:get-relatif-component
       afnix:sec:Signature:DSA-R-COMPONENT

STANDARD SECURITY REFERENCE

       Hasher
       The  Hasherclass  is a base class that is used to build a message hash. The hash result is
       stored in an array of bytes and can be retrieved byte by byte or as a formatted  printable
       string. This class does not have a constructor.

       Predicate

              hasher-p

       Inheritance

              Nameable

       Methods

              reset -> none (none)
              The resetmethod reset the hasher object with its associated internal states.

              hash-p -> Boolean (String)
              The  hash-ppredicate  returns  true  if  the  string argument is potentially a hash
              value. It is not possible, with our current technology, to reverse a hash value  to
              one  or  several  representations,  nor  it  is  possible to assert that such value
              exists.

              get-byte -> Byte (Integer)
              The get-bytemethod returns the hash byte value by index. The argument is  the  byte
              index which must be in the range of the hash result length.

              format -> String (none)
              The formatmethod return a string representation of the hash value.

              compute -> String (Literal|Buffer|InputStream)
              The  computemethod  computes  the  hash  value  from a string, a buffer or an input
              stream. The method returns a string representation of the result hash  value.  When
              the  argument  is  a  buffer object or an input stream, the characters are consumed
              from the object.

              derive -> String (String)
              The derivemethod computes the hash value from an octet string  which  is  converted
              before  the  hash  computation.  The  method returns a string representation of the
              result hash value.

              get-hash-length -> Integer (none)
              The get-hash-lengthmethod returns the hasher length in bytes.

              get-result-length -> Integer (none)
              The get-result-lengthmethod returns the hasher result length in bytes.  The  result
              length is less or equal to the hasher length and is set at construction.

       Md2
       The Md2class is a hashing class that implements the MD-2 algorithm.

       Predicate

              md2-p

       Inheritance

              Hasher

       Constructors

              Md2 (none)
              The  Md2constructor  creates  a  default  hashing  object  that implements the MD-2
              algorithm.

              Md2 (Integer)
              The Md2constructor creates a MD-2 hashing object with a result length. The argument
              is the hasher result length that must be less or equal to the hasher length.

       Md4
       The Md4class is a hashing class that implements the MD-4 algorithm.

       Predicate

              md4-p

       Inheritance

              Hasher

       Constructors

              Md4 (none)
              The  Md4constructor  creates  a  default  hashing  object  that implements the MD-4
              algorithm.

              Md4 (Integer)
              The Md4constructor creates a MD-4 hashing object with a result length. The argument
              is the hasher result length that must be less or equal to the hasher length.

       Md5
       The Md5class is a hashing class that implements the MD-5 algorithm.

       Predicate

              md5-p

       Inheritance

              Hasher

       Constructors

              Md5 (none)
              The  Md5constructor  creates  a  default  hashing  object  that implements the MD-5
              algorithm.

              Md5 (Integer)
              The Md5constructor creates a MD-5 hashing object with a result length. The argument
              is the hasher result length that must be less or equal to the hasher length.

       Sha1
       The Sha1class is a hashing class that implements the SHA-1 algorithm.

       Predicate

              sha1-p

       Inheritance

              Hasher

       Constructors

              Sha1 (none)
              The  Sha1constructor  creates  a  default  hashing object that implements the SHA-1
              algorithm.

              Sha1 (Integer)
              The Sha1constructor creates a SHA-1  hashing  object  with  a  result  length.  The
              argument  is  the  hasher  result  length  that must be less or equal to the hasher
              length.

       Sha224
       The Sha224class is a hashing class that implements the SHA-224 algorithm.

       Predicate

              sha224-p

       Inheritance

              Hasher

       Constructors

              Sha224 (none)
              The Sha224constructor creates a default hashing object that implements the  SHA-224
              algorithm.

              Sha224 (Integer)
              The  Sha224constructor  creates  a SHA-224 hashing object with a result length. The
              argument is the hasher result length that must be  less  or  equal  to  the  hasher
              length.

       Sha256
       The Sha256class is a hashing class that implements the SHA-256 algorithm.

       Predicate

              sha256-p

       Inheritance

              Hasher

       Constructors

              Sha256 (none)
              The  Sha256constructor creates a default hashing object that implements the SHA-256
              algorithm.

              Sha256 (Integer)
              The Sha256constructor creates a SHA-256 hashing object with a  result  length.  The
              argument  is  the  hasher  result  length  that must be less or equal to the hasher
              length.

       Sha384
       The Sha384class is a hashing class that implements the SHA-384 algorithm.

       Predicate

              sha384-p

       Inheritance

              Hasher

       Constructors

              Sha384 (none)
              The Sha384constructor creates a default hashing object that implements the  SHA-384
              algorithm.

              Sha384 (Integer)
              The  Sha384constructor  creates  a SHA-384 hashing object with a result length. The
              argument is the hasher result length that must be  less  or  equal  to  the  hasher
              length.

       Sha512
       The Sha512class is a hashing class that implements the SHA-512 algorithm.

       Predicate

              sha512-p

       Inheritance

              Hasher

       Constructors

              Sha512 (none)
              The  Sha512constructor creates a default hashing object that implements the SHA-512
              algorithm.

              Sha512 (Integer)
              The Sha512constructor creates a SHA-512 hashing object with a  result  length.  The
              argument  is  the  hasher  result  length  that must be less or equal to the hasher
              length.

       Key
       The Keyclass is an original class used to store a particular key or to generate one. A key
       is  designed  to  operate  with  a  variety  of  cipher  that  can  be either symmetric or
       asymmetric. In the symmetric case, the key is generally an array of bytes. Asymmetric  key
       are  generally  stored in the form of number list that can be computed or loaded by value.
       By default, a random 128 bit symmetric key is created.

       Predicate

              key-p

       Inheritance

              Object

       Constructors

              Key (none)
              The Keyconstructor creates a default cipher key. The key is generated  with  random
              bytes and is 128 bits long.

              Key (String)
              The  Keyconstructor  creates a symmetric key from an octet string. The octet string
              argument determines the size of the key. The octet string  argument  is  compatible
              with the string obtained from the formatmethod.

              Key (Item)
              The  Keyconstructor creates a key by type. If the key type is KSYM, a symmetric 128
              bytes random key is generated. If the key type is KRSA, a 1024 bits RSA random  key
              is generated.

              Key (Item Integer|String|Vector)
              The  Keyconstructor  creates  a  key by type. The first argument is the key type to
              generate. The second argument is either the key size, the key octet string  or  the
              key  byte  values. In the first form, an integer argument specifies the key size in
              bytes or bits depending on the key nature. In the second form, a string is used  as
              octet  string  to represent the key. In the third form, a vector of byte values can
              be used to load the key.

       Constants

              KSYM
              The KSYMconstant indicates that the key is a symmetric key.

              KRSA
              The KRSAconstant indicates that the key is a asymmetric RSA key.

              KMAC
              The KMACconstant indicates that the key is a message authentication (MAC) key.

              RSA-MODULUS
              The RSA-MODULUSconstant corresponds to the RSA modulus value.

              RSA-PUBLIC-EXPONENT
              The RSA-PUBLIC-EXPONENTconstant corresponds to the RSA public exponent value  which
              is generally 65537.

              RSA-SECRET-EXPONENT
              The RSA-SECRET-EXPONENTconstant corresponds to the RSA secret exponent value.

       Methods

              get-byte -> Byte (Integer)
              The  get-bytemethod returns a key byte value by index. The index must be in the key
              range or an exception is raised. This method is primarily used with symmetric key.

              get-type -> Item (none)
              The get-typemethod returns the key type in the form of an item object.

              get-bits -> Integer (none)
              The get-bitsmethod returns the key size in bits.

              get-size -> Integer (none)
              The get-sizemethod returns the key size in bytes.

              format -> String (none|Item)
              The formatmethod returns a string representation of the key.  In  the  first  form,
              without argument, the key is returned as an octet string if possible. In the second
              form, the key value is returned as an octet string based  on  the  key  element  to
              access.

              get-relatif-key -> Relatif (Item)
              The  get-relatif-keymethod  returns a relatif representation of a key element. This
              method is well suited for asymmetric key. The key value is returned  as  a  relatif
              based on the key element to access.

       Kdf
       The  Kdfclass  is  an  abstract  class  used  to  model key derivation function. The class
       provides only a byte buffer which  can  be  accessed  by  index.  In  the  key  derivation
       functions land, there are numerous standards, such like PKCS 2.1, IEEE P1363-2000, ISO/IEC
       18033-2. All of these standards have sometimes conflicting definitions.

       Predicate

              kdf-p

       Inheritance

              Nameable

       Methods

              reset -> none (none)
              The resetmethod reset the internal state of the kdf object.

              get-size -> Integer (none)
              The get-sizemethod returns the kdf size in bytes.

              get-byte -> Byte (Integer)
              The get-bytemethod returns a kdf byte value by index. The index must be in the  key
              range or an exception is raised.

              format -> String (none)
              The formatmethod returns a string representation of the derived key.

              derive -> String (String)
              The derivemethod returns a string representation of a derived key computed from the
              octet string argument.

              compute -> String (String)
              The computemethod returns a string representation of a derived  key  computed  from
              the string argument.

       Hkdf
       The  Hkdfclass  is  an  abstract class used to model key derivation function based on hash
       function. The class maintains a hasher object that is used to derive the key from an octet
       string.

       Predicate

              hashed-kdf-p

       Inheritance

              Kdf

       Methods

              get-hasher -> none (none)
              The  get-hashermethod  returns the hasher object associated with the key derivation
              function object. object.

       Kdf1
       The Kdf1class is  a  hashed  key  derivation  function  class  that  implements  the  KDF1
       specification  as defined by ISO/IEC 18033-2. The class is strictly equivalent to the mask
       generation function (MGF1) defined in PKCS 2.1. On the  other  hand,  this  implementation
       does  not  conform  to  the  KDF1  specification of IEEE 1363-2000 which is somehow rather
       bizarre. The class operates in theory with any type of hasher object as long as the  octet
       string is not too long.

       Predicate

              kdf1-p

       Inheritance

              Hkdf

       Constructors

              Kdf1 (Hasher Integer)
              The  Kdf1constructor  creates  a  KDF1  key  derivation  function object. The first
              argument is the hasher object to bind and the second argument is the kdf size.

       Kdf2
       The Kdf2class is  a  hashed  key  derivation  function  class  that  implements  the  KDF2
       specification  as  defined by ISO/IEC 18033-2. The class is strictly equivalent to the key
       function derivation (KDF1) except that the internal counter runs from 1 to k instead of  0
       to  k-1.  The class operates in theory with any type of hasher object as long as the octet
       string is not too long.

       Predicate

              kdf2-p

       Inheritance

              Hkdf

       Constructors

              Kdf2 (Hasher Integer)
              The Kdf2constructor creates a  KDF2  key  derivation  function  object.  The  first
              argument is the hasher object to bind and the second argument is the kdf size.

       Cipher
       The  Cipherclass  is  a base class that is used to implement a cipher. A cipher is used to
       encrypt or decrypt a message. There are basically two types of ciphers,  namely  symmetric
       cipher  and  asymmetric cipher. For the base class operation, only the cipher name and key
       is needed. A reverse flag  controls  whether  or  not  an  encryption  operation  must  be
       reversed. A reset method can also be used to reset the internal cipher state.

       Predicate

              cipher-p

       Inheritance

              Nameable

       Methods

              reset -> none (none)
              The resetmethod reset the cipher internal state.

              stream -> Integer (OutputStream InputStream)
              The  streammethod  process  an  input  stream  and write into an output stream. The
              method returns the number of character processed. The first argument is the  output
              stream  used to write the coded characters. The second argument is the input stream
              used to read the characters.

              set-key -> none (Key)
              The set-keymethod sets the cipher key. The first argument is the key to set.

              get-key -> Key (none)
              The get-keymethod returns the cipher key.

              set-reverse -> none (Boolean)
              The set-reversemethod sets the cipher reverse flag. The first argument is the  flag
              to  set.  If  the flag is true, the cipher operates in reverse mode. If the flag is
              false, the cipher operates in direct mode.

              get-reverse -> Boolean (none)
              The get-reversemethod returns the cipher reverse flag. If the  flag  is  true,  the
              cipher  operates  in  reverse  mode.  If  the flag is false, the cipher operates in
              direct mode.

       BlockCipher
       The BlockCipherclass is an abstract class that is used  to  implement  a  symmetric  block
       cipher.  By  default the cipher operates in encryption mode. When the reverse flag is set,
       the decryption mode is activated. For a block cipher, a block  size  controls  the  cipher
       operations.  The  class also defines the constants that control the block padding with the
       associated methods.

       Predicate

              block-cipher-p

       Inheritance

              Cipher

       Constants

              PAD-NONE
              The PAD-NONEconstant indicates that the block should not be padded.

              PAD-BIT-MODE
              The PAD-BITconstant indicates that the block should be padded in bit mode.

              PAD-ANSI-X923
              The PAD-ANSI-X923constant indicates that the block should be  padded  according  to
              ANSI X 923 standard.

              PAD-NIST-800
              The  PAD-NIST-800constant  indicates  that  the block should be padded according to
              NIST 800-38A recommendations. This is the default mode.

       Methods

              get-block-size -> Integer (none)
              The get-block-sizemethod returns the cipher block size.

              set-padding-mode -> none (Item)
              The set-padding-modemethod sets the cipher padding mode.

              get-padding-mode -> Item (none)
              The get-padding-modemethod returns the cipher padding mode.

       InputCipher
       The InputCipherclass is an stream interface that can stream out an  input  stream  from  a
       cipher.  In other word, an input stream is read and block are encoded as long as the input
       stream read characters. If the cipher is nil, the  input  cipher  simply  read  the  input
       stream  and  is  therefore  transparent.  The  class  acts  like an input stream, read the
       character from the bounded input stream and encode or decode them from the bounded cipher.
       The InputCipherdefines several modes of operations. In electronic codebook modeor ECB, the
       character are encoded in a block basis.  In  cipher  block  chainingmode,  the  block  are
       encoded  by  doing  an XOR operation with the previous block. Other modes such like cipher
       feedback modeand output feedback modeare also defined.

       Predicate

              input-cipher-p

       Inheritance

              Input

       Constructors

              InputCipher (Cipher)
              The InputCipherconstructor creates an input cipher with a cipher object. The  first
              argument is the cipher to used for processing.

              InputCipher (Cipher Input)
              The  InputCipherconstructor  creates  an  input  cipher with a cipher object and an
              input stream. The first argument is the cipher to used for processing.  The  second
              argument is the input stream object used for the character reading.

              InputCipher (Cipher InputStream Item)
              The  InputCipherconstructor  creates an input cipher with a cipher object, an input
              stream and a mode. The first argument is the cipher to  used  for  processing.  The
              second  argument  is  the  input  stream object used for the character reading. The
              third argument is the input cipher mode which can be either ECB, CBC, CFB or OFB.

       Constants

              ECB
              The ECBconstant indicates that  the  input  cipher  is  to  operate  in  electronic
              codebookmode. This mode is the default mode.

              CBC
              The  CBCconstant  indicates  that the input cipher is to operate in cipher chaining
              blockmode.

              CFB
              The CFBconstant indicates that the input cipher is to operate  in  cipher  feedback
              blockmode.

              OFB
              The  OFBconstant  indicates  that the input cipher is to operate in output feedback
              blockmode.

       Methods

              reset -> none (none)
              The resetmethod reset the input cipher object.

              get-mode -> Item (none)
              The get-modemethod returns the input cipher operating mode.

              set-iv -> none (String|Buffer)
              The set-ivmethod sets the input cipher initial  vector.  In  the  first  form,  the
              initial  vector is set from an octet string. In the second form, the initial vector
              is set from a buffer object.

              get-iv -> String (none)
              The get-ivmethod returns the input cipher initial vector as an octet string.

              set-is -> none (InputStream)
              The set-ismethod sets the input cipher input stream. This method  can  be  used  to
              chain multiple input streams in a unique coding session.

       Aes
       The   Aesclass   is   a  block  cipher  class  that  implements  the  advanced  encryption
       standard(AES), originally known as Rijndael.  This  is  an  original  implementation  that
       conforms  to  the  standard FIPS PUB 197. It should be noted that the AES standard, unlike
       Rijndael, defines a fixed block size of 16 bytes (4 words) and 3  keys  sizes  (128,  192,
       256).

       Predicate

              aes-p

       Inheritance

              BlockCipher

       Constructors

              Aes (Key)
              The  Aesconstructor  creates  a direct cipher with a key. The first argument is the
              key used by the cipher.

              Aes (Key Boolean)
              The Aesconstructor creates a cipher with a  key  and  a  reverse  flag.  The  first
              argument is the key used by the cipher. The second argument is the reverse flag.

       PublicCipher
       The PublicCipherclass is an abstract class that is used to implement an asymmetric cipher.
       An asymmetric cipher or public key cipher is designed to operate with a public key  and  a
       secret  key.  Depending  on the use model, the public key might be used to crypt the data,
       and the secret key to decrypt. The basic assumption around a public  cipher  is  that  the
       secret key cannot be derived from the public key.

       Predicate

              public-cipher-p

       Inheritance

              Cipher

       Methods

              get-message-size -> Integer (none)
              The get-message-sizemethod returns the cipher message size.

              get-crypted-size -> Integer (none)
              The get-crypted-sizemethod returns the cipher crypted block size.

       Rsa
       The  Rsaclass  is  a public cipher class that implements the RSA algorithm as described by
       PKCS 2.1, RFC 2437 and ISO 18033-2. The  class  implements  also  some  padding  mechanism
       described  in  PKCS  1.5, 2.1 and ISO 18033-2. The RSA algorithm is a public cryptographic
       cipher based on a secret and public keys. The class operates in crypting mode  by  default
       and  uses  the  public  key  to  do the encryption while the secret key is used in reverse
       (decryption) mode. By default, the PKCS 1.5 type 2  padding  is  used.  The  ISO  RSA-REM1
       padding  with  a key derivation function (KDF1) is equivalent to PKCS 2.1 padding with the
       mask generation function (MGF1). The ISO RSA-REM1 padding with KDF2 is  not  described  in
       the PKCS 2.1.

       Predicate

              rsa-p

       Inheritance

              PublicCipher

       Constructors

              Rsa (none)
              The  Rsaconstructor  creates  a  default  RSA  public cipher by binding a 1024 bits
              random key.

              Rsa (Key)
              The Rsaconstructor creates a RSA public cipher by binding the key argument.

              Rsa (Key Boolean)
              The Rsaconstructor creates a RSA public cipher by binding the key argument and  the
              reverse  flag.  The  first  argument is the key to bind. The second argument is the
              reverse flag to set.

              Rsa (Key Hasher String)
              The Rsaconstructor creates a RSA public cipher by binding the key argument and OAEP
              padding  objects.  The  first  argument  is the key to bind. The second argument is
              hasher object to use with the OAEP padding mode. The third argument is an  optional
              label to be used by the KDF object.

       Constants

              PAD-PKCS-11
              The  PAD-PKCS-11constant indicates that the PKCS 1.5 type 1 block should be used to
              pad the message.

              PAD-PKCS-12
              The PAD-PKCS-12constant indicates that the PKCS 1.5 type 3 block should be used  to
              pad the message.

              PAD-OAEP-K1
              The PAD-OAEP-K1constant indicates that the ISO/IEC 18033-2 OAEP with KDF1 should be
              used to pad the message.

              PAD-OAEP-K2
              The PAD-OAEP-K2constant indicates that the ISO/IEC 18033-2 OAEP with KDF2 should be
              used to pad the message.

       Methods

              get-hasher -> Hasher (none)
              The get-hashermethod returns the hasher object used by the OAEP padding mode.

              set-hasher -> none (Hasher)
              The set-hashermethod sets the hasher object used by the OAEP padding mode.

              get-padding-mode -> Item (none)
              The get-padding-modemethod returns the cipher padding mode.

              set-padding-mode -> none (Item)
              The set-padding-modemethod sets the cipher padding mode.

              get-padding-label -> String (none)
              The get-padding-labelmethod returns the cipher padding label.

              set-padding-label -> none (String)
              The set-padding-modemethod sets the cipher padding label.

              get-padding-seed -> String (none)
              The get-padding-seedmethod returns the cipher padding seed.

              set-padding-seed -> none (String)
              The set-padding-seedmethod sets the cipher padding seed.

              pkcs-primitive -> Relatif (Integer|Relatif)
              The  pkcs-primitivemethod compute a relatif value from a relatif argument by either
              crypting or decrypting the argument. seed.

       Signer
       The Signerclass is a base class that is used to build a message signature.  The  signature
       result is stored in a special signature object which is algorithm dependent.

       Predicate

              signer-p

       Inheritance

              Nameable

       Methods

              reset -> none (none)
              The resetmethod reset the signer object with its associated internal states.

              compute -> Signature (Literal|Buffer|InputStream)
              The  computemethod  computes  the  signature  from  a  string, a buffer or an input
              stream. The method returns a signature object. When the argument is a buffer object
              or an input stream, the characters are consumed from the object.

              derive -> Signature (String)
              The  derivemethod  computes  the  signature from an octet string which is converted
              before the signature computation. The method returns a signature object.

       Signature
       The Signatureclass is a container  class  designed  to  store  a  message  signature.  The
       signature  object  is  produced by a signing process, implemented in the form of a digital
       signature algorithm such like RSA or DSA.

       Predicate

              signature-p

       Inheritance

              Object

       Constructors

              Signature (none)
              The Signatureconstructor creates an empty signature.

       Constants

              NIL
              The NILconstant indicates that the signature is a null signature.

              DSA
              The DSAconstant indicates that the signature is conforming to DSS.

              DSA-S-COMPONENT
              The DSA-S-COMPONENTconstant corresponds to the DSA S component value.

              DSA-R-COMPONENT
              The DSA-R-COMPONENTconstant corresponds to the DSA R component value.

       Methods

              reset -> none (none)
              The resetmethod reset the signature object to a null signature.

              format -> String (Item)
              The formatmethod returns a string representation of the  signature  component.  The
              signature component is returned as an octet string based on the signature component
              to access.

              get-relatif-component -> Relatif (Item)
              The get-relatif-componentmethod returns a relatif  representation  of  a  signature
              component.

       Dsa
       The  Dsaclass  is  an  original  implementation of the Digital Signature Standard (DSS) as
       published in FIPS PUB 186-3. This class implements the Digital Signature  Algorithm  (DSA)
       with  an approved key length of 1024, 2048 and 3072 bits with a 160, 224 and 256 bits hash
       function which is part of the SHA family.

       Predicate

              dsa-p

       Inheritance

              Signer

       Constructors

              Dsa (none)
              The Dsaconstructor creates a signer object with a default DSA key.

              Dsa (Key)
              The Dsaconstructor creates a signer object with a DSA key as its argument.

              Dsa (Key Relatif)
              The Dsaconstructor creates a signer object with a DSA key as its first argument and
              a fixed kargument as specified by DSS.