adare_dilithium5_0.2.3_48a77cb5/src/adare_dilithium5-dilithium.adb

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
with adare_dilithium5.inners;

package body adare_dilithium5.dilithium with Pure is

  function    get_dilithium5_private_key (from_key   :   aliased dilithium5_private_key)    return Interfaces.C.char_array
  is (Interfaces.C.char_array (from_key.val));

  function    get_dilithium5_public_key  (from_key   :   aliased dilithium5_public_key) return Interfaces.C.char_array
  is (Interfaces.C.char_array (from_key.val));

  function    get_dilithium5_signature   (from_ciphertext    :   aliased dilithium5_signature) return Interfaces.C.char_array
  is (Interfaces.C.char_array (from_ciphertext.val));


  procedure   set_dilithium5_private_key
    (to_key :   out dilithium5_private_key;
     from   :   aliased in  Interfaces.C.char_array)
  is
  begin
    to_key.val := from;
  end set_dilithium5_private_key;

  procedure   set_dilithium5_public_key
    (to_key :   out dilithium5_public_key;
      from   :   aliased in  Interfaces.C.char_array)
  is
  begin
      to_key.val := from;
  end set_dilithium5_public_key;

  procedure   set_dilithium5_signature
    (to_sign    :   out dilithium5_signature;
      from       :   aliased in  Interfaces.C.char_array)
  is
  begin
    to_sign.val := from;
  end set_dilithium5_signature;

  use adare_dilithium5.inners;

  procedure dilithium5_keypair
    (public_key     :   out dilithium5_public_key;
      private_key    :   out dilithium5_private_key)
  is
    i   :   constant    Interfaces.C.int
        := internal_dilithium5_keypair (public_key.val'Address, private_key.val'Address)
            with Unreferenced;
  begin
    null;
  end dilithium5_keypair;


  procedure dilithium5_sign
    (signature      :   out dilithium5_signature;
     data_to_sign   :   aliased in Interfaces.C.char_array;
     private_key    :   aliased in dilithium5_private_key)
  is
    sl  : aliased Interfaces.C.size_t := signature.val'Length;

    i   : constant    Interfaces.C.int
        := internal_dilithium5_sign_create (signature.val'Address, sl'Address,
            data_to_sign'Address, data_to_sign'Length, private_key.val'Address)
                with Unreferenced;
  begin
      null;
  end dilithium5_sign;

  function dilithium5_verify
    (signature      :   aliased in dilithium5_signature;
      data_to_verify :   aliased in Interfaces.C.char_array;
      public_key     :   aliased in dilithium5_public_key
    ) return Boolean
  is (0 = internal_dilithium5_sign_verify (signature.val'Address, signature.val'Length,
      data_to_verify'Address, data_to_verify'Length, public_key.val'Address));


  function dilithium5_sign_message -- create and return  or a combination of signature and message or a zero length char_array
  (data_to_sign : aliased in Interfaces.C.char_array;
    private_key  : aliased in dilithium5_private_key)
    return Interfaces.C.char_array
  is
    csl : aliased Interfaces.C.char_array :=
      Interfaces.C.char_array'(1 .. data_to_sign'Length + dilithium5_signature_length + 1 => char'Val (0));
    sl  : aliased Interfaces.C.size_t := csl'Length;

    i   : constant    Interfaces.C.int
        := internal_dilithium5_sign (csl'Address, sl'Address,
           data_to_sign'Address, data_to_sign'Length, private_key.val'Address);
  begin
    return char_array'(if i = 0 then csl (1 .. sl) else (1 .. 0 => char'Val (0)));
  end dilithium5_sign_message;


  function dilithium5_verify_open
    (signature_and_message : aliased in Interfaces.C.char_array;
      public_key            : aliased in dilithium5_public_key)
      return Interfaces.C.char_array
  is
    csl : aliased Interfaces.C.char_array :=
      Interfaces.C.char_array'(1 .. (signature_and_message'Length + 2) - dilithium5_signature_length => char'Val (0));

    sl  : aliased Interfaces.C.size_t := csl'Length;

    i   : constant    Interfaces.C.int
        := internal_dilithium5_open (csl'Address, sl'Address,
                signature_and_message'Address, signature_and_message'Length, public_key.val'Address);
  begin
      return char_array'(if i = 0 then csl (1 .. sl) else (1 .. 0 => char'Val (0)));
  end dilithium5_verify_open;

end adare_dilithium5.dilithium;