with Interfaces.C;
use Interfaces.C;
package adare_dilithium5.dilithium with Pure is
pragma Assertion_Policy (Check);
dilithium5_private_key_length : constant Interfaces.C.size_t;
dilithium5_public_key_length : constant Interfaces.C.size_t;
dilithium5_signature_length : constant Interfaces.C.size_t;
type dilithium5_private_key is private
with Preelaborable_Initialization;
type dilithium5_public_key is private
with Preelaborable_Initialization;
type dilithium5_signature is private
with Preelaborable_Initialization;
function get_dilithium5_private_key (from_key : aliased dilithium5_private_key) return Interfaces.C.char_array;
function get_dilithium5_public_key (from_key : aliased dilithium5_public_key) return Interfaces.C.char_array;
function get_dilithium5_signature (from_ciphertext : aliased dilithium5_signature) return Interfaces.C.char_array;
procedure set_dilithium5_private_key
(to_key : out dilithium5_private_key;
from : aliased in Interfaces.C.char_array)
with Pre => from'Length = dilithium5_private_key_length;
procedure set_dilithium5_public_key
(to_key : out dilithium5_public_key;
from : aliased in Interfaces.C.char_array)
with Pre => from'Length = dilithium5_public_key_length;
procedure set_dilithium5_signature
(to_sign : out dilithium5_signature;
from : aliased in Interfaces.C.char_array)
with Pre => from'Length = dilithium5_signature_length;
procedure dilithium5_keypair
(public_key : out dilithium5_public_key;
private_key : out dilithium5_private_key);
procedure dilithium5_sign -- create a signature only part. a PQClean Bonus (Thanks)!
(signature : out dilithium5_signature; -- create a sign only :-)
data_to_sign : aliased in Interfaces.C.char_array;
private_key : aliased in dilithium5_private_key)
with Pre => data_to_sign'Length > 1;
function dilithium5_verify
(signature : aliased in dilithium5_signature; -- verify a sign only. a PQClean Bonus (Thanks)!
data_to_verify : aliased in Interfaces.C.char_array;
public_key : aliased in dilithium5_public_key
) return Boolean
with Pre => data_to_verify'Length > 1;
-- return if ok => create and return a combination of signature and message
-- otherwise return a zero length char_array
function dilithium5_sign_message
(data_to_sign : aliased in Interfaces.C.char_array;
private_key : aliased in dilithium5_private_key) return Interfaces.C.char_array
with Pre => data_to_sign'Length > 1;
-- return if ok => create and return the original message
-- otherwise return a zero length char_array.
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
with Pre => signature_and_message'Length > dilithium5_signature_length + 1;
private
dilithium5_private_key_length : constant Interfaces.C.size_t := 4896;
dilithium5_public_key_length : constant Interfaces.C.size_t := 2592;
dilithium5_signature_length : constant Interfaces.C.size_t := 4627;
type dilithium5_private_key is
record
val : aliased Interfaces.C.char_array (1 .. dilithium5_private_key_length)
:= (others => Interfaces.C.char'Val (0));
end record;
type dilithium5_public_key is
record
val : aliased Interfaces.C.char_array (1 .. dilithium5_public_key_length)
:= (others => Interfaces.C.char'Val (0));
end record;
type dilithium5_signature is
record
val : aliased Interfaces.C.char_array (1 .. dilithium5_signature_length)
:= (others => Interfaces.C.char'Val (0));
end record;
end adare_dilithium5.dilithium;