providing richer API for Pi-Cipher
This commit is contained in:
parent
8e4081389a
commit
d4c9750fc4
|
@ -16,7 +16,6 @@
|
|||
with Crypto_Types; use Crypto_Types;
|
||||
use Crypto_Types.Crypto_Utils_u16;
|
||||
use Crypto_Types.Crypto_Utils_u64;
|
||||
with System; use System;
|
||||
|
||||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
|
||||
|
@ -331,6 +330,16 @@ package body Pi16Cipher_Spec is
|
|||
return +Context.Tag;
|
||||
end Get_Tag;
|
||||
|
||||
function Is_Valid(Is_Tag : in Tag_T; Should_Tag : in Tag_T) return Boolean is
|
||||
begin
|
||||
return Is_Tag = Should_Tag;
|
||||
end Is_Valid;
|
||||
|
||||
function Is_Valid(Context : in Context_T; Should_Tag : in Tag_T) return Boolean is
|
||||
begin
|
||||
return Get_Tag(Context) = Should_Tag;
|
||||
end Is_Valid;
|
||||
|
||||
function Encrypt(Msg : u8_Array; AD : u8_Array; Public_Nonce : u8_Array; Secret_Nonce : Block_T; Key : u8_Array) return u8_Array is
|
||||
Crypt : u8_Array(1 .. Secret_Nonce'Length + Msg'Length + Tag_Bytes);
|
||||
Ctx : Context_T;
|
||||
|
@ -346,7 +355,6 @@ package body Pi16Cipher_Spec is
|
|||
end Encrypt;
|
||||
|
||||
procedure Decrypt(Is_Valid : out Boolean; Msg : out u8_Array; Secret_Nonce : out Block_T; Cipher : in u8_Array; AD : in u8_Array; Public_Nonce : in u8_Array; Key : in u8_Array) is
|
||||
Tag : Tag_T;
|
||||
Ctx : Context_T;
|
||||
begin
|
||||
Initialize(Context => Ctx, Key => Key, Public_Nonce => Public_Nonce);
|
||||
|
@ -355,8 +363,7 @@ package body Pi16Cipher_Spec is
|
|||
Msg := Cipher(Cipher'First + Secret_Message_Number_Bytes .. Cipher'Last - Tag_Bytes);
|
||||
Decrypt_Secret_Message_Number(Context => Ctx, Block => Secret_Nonce);
|
||||
Decrypt_Last_Block(Context => Ctx, Block => Msg, Block_Number => 1);
|
||||
Tag := Get_Tag(Ctx);
|
||||
Is_Valid := Tag = Cipher(Cipher'Last - Tag_Bytes + 1 .. Cipher'Last);
|
||||
Is_Valid := Pi16Cipher_Spec.Is_Valid(Ctx, Cipher(Cipher'Last - Tag_Bytes + 1 .. Cipher'Last));
|
||||
end Decrypt;
|
||||
|
||||
end Pi16Cipher_Spec;
|
||||
|
|
|
@ -39,19 +39,21 @@ package Pi16Cipher_Spec is
|
|||
Secret_Message_Number_Bytes : constant := Secret_Message_Number_Bits / 8;
|
||||
|
||||
subtype Block_Number_T is Natural;
|
||||
|
||||
subtype Block_T is u8_Array (1 .. Rate_Bytes);
|
||||
subtype Tag_T is u8_Array(1 .. Rate_Bytes);
|
||||
|
||||
procedure Initialize(Context : out Context_T; Key : in u8_Array; Public_Nonce : in u8_Array);
|
||||
-- procedure Encrypt_Secret_Message_Number(Context : in out Context; Secret_Message_Number : in u8_Array);
|
||||
-- procedure Header_Next_Block(Context : in out Context_T; Header : in u8_Array);
|
||||
-- procedure Header_Last_Block(Context : in out Context_T; Header : in u8_Array);
|
||||
-- procedure Encrypt_Next_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Encrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Decrypt_Next_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Decrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Get_Tag(Context : in Context_T; Tag : out u8_Array);
|
||||
-- function Is_Valid(Context : in Context_T; Tag : in u8_Array) return Boolean;
|
||||
procedure Process_Header_Block (Context : in out Context_T; Block : Block_T; Block_Number : Block_Number_T);
|
||||
procedure Process_Header_Last_Block (Context : in out Context_T; Block : u8_Array; Block_Number : Block_Number_T);
|
||||
procedure Encrypt_Secret_Message_Number(Context : in out Context_T; Block : in out Block_T);
|
||||
procedure Decrypt_Secret_Message_Number(Context : in out Context_T; Block : in out Block_T);
|
||||
procedure Encrypt_Block(Context : in out Context_T; Block : in out Block_T; Block_Number : Block_Number_T);
|
||||
procedure Decrypt_Block(Context : in out Context_T; Block : in out Block_T; Block_Number : Block_Number_T);
|
||||
procedure Encrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array; Block_Number : Block_Number_T);
|
||||
procedure Decrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array; Block_Number : Block_Number_T);
|
||||
function Get_Tag(Context : Context_T) return Tag_T;
|
||||
function Is_Valid(Is_Tag : in Tag_T; Should_Tag : in Tag_T) return Boolean;
|
||||
function Is_Valid(Context : in Context_T; Should_Tag : in Tag_T) return Boolean;
|
||||
|
||||
function Encrypt(Msg : u8_Array; AD : u8_Array; Public_Nonce : u8_Array; Secret_Nonce : Block_T; Key : u8_Array) return u8_Array;
|
||||
procedure Decrypt(Is_Valid : out Boolean; Msg : out u8_Array; Secret_Nonce : out Block_T; Cipher : in u8_Array; AD : in u8_Array; Public_Nonce : in u8_Array; Key : in u8_Array);
|
||||
|
@ -62,7 +64,6 @@ private
|
|||
subtype Word_T is u16;
|
||||
subtype Chunk_T is u16_Array(1 .. 4);
|
||||
subtype Tag_Int_T is u16_Array(1 .. 4 * N / 2);
|
||||
subtype Tag_T is u8_Array(1 .. Rate_Bytes);
|
||||
|
||||
type State_T is array (1 .. N) of Chunk_T;
|
||||
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
with Crypto_Types; use Crypto_Types;
|
||||
use Crypto_Types.Crypto_Utils_u32;
|
||||
use Crypto_Types.Crypto_Utils_u64;
|
||||
with System; use System;
|
||||
|
||||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
|
||||
|
@ -331,6 +330,16 @@ package body Pi32Cipher_Spec is
|
|||
return +Context.Tag;
|
||||
end Get_Tag;
|
||||
|
||||
function Is_Valid(Is_Tag : in Tag_T; Should_Tag : in Tag_T) return Boolean is
|
||||
begin
|
||||
return Is_Tag = Should_Tag;
|
||||
end Is_Valid;
|
||||
|
||||
function Is_Valid(Context : in Context_T; Should_Tag : in Tag_T) return Boolean is
|
||||
begin
|
||||
return Get_Tag(Context) = Should_Tag;
|
||||
end Is_Valid;
|
||||
|
||||
function Encrypt(Msg : u8_Array; AD : u8_Array; Public_Nonce : u8_Array; Secret_Nonce : Block_T; Key : u8_Array) return u8_Array is
|
||||
Crypt : u8_Array(1 .. Secret_Nonce'Length + Msg'Length + Tag_Bytes);
|
||||
Ctx : Context_T;
|
||||
|
@ -346,7 +355,6 @@ package body Pi32Cipher_Spec is
|
|||
end Encrypt;
|
||||
|
||||
procedure Decrypt(Is_Valid : out Boolean; Msg : out u8_Array; Secret_Nonce : out Block_T; Cipher : in u8_Array; AD : in u8_Array; Public_Nonce : in u8_Array; Key : in u8_Array) is
|
||||
Tag : Tag_T;
|
||||
Ctx : Context_T;
|
||||
begin
|
||||
Initialize(Context => Ctx, Key => Key, Public_Nonce => Public_Nonce);
|
||||
|
@ -355,8 +363,7 @@ package body Pi32Cipher_Spec is
|
|||
Msg := Cipher(Cipher'First + Secret_Message_Number_Bytes .. Cipher'Last - Tag_Bytes);
|
||||
Decrypt_Secret_Message_Number(Context => Ctx, Block => Secret_Nonce);
|
||||
Decrypt_Last_Block(Context => Ctx, Block => Msg, Block_Number => 1);
|
||||
Tag := Get_Tag(Ctx);
|
||||
Is_Valid := Tag = Cipher(Cipher'Last - Tag_Bytes + 1 .. Cipher'Last);
|
||||
Is_Valid := Pi32Cipher_Spec.Is_Valid(Ctx, Cipher(Cipher'Last - Tag_Bytes + 1 .. Cipher'Last));
|
||||
end Decrypt;
|
||||
|
||||
end Pi32Cipher_Spec;
|
||||
|
|
|
@ -39,19 +39,21 @@ package Pi32Cipher_Spec is
|
|||
Secret_Message_Number_Bytes : constant := Secret_Message_Number_Bits / 8;
|
||||
|
||||
subtype Block_Number_T is Natural;
|
||||
|
||||
subtype Block_T is u8_Array (1 .. Rate_Bytes);
|
||||
subtype Tag_T is u8_Array(1 .. Rate_Bytes);
|
||||
|
||||
procedure Initialize(Context : out Context_T; Key : in u8_Array; Public_Nonce : in u8_Array);
|
||||
-- procedure Encrypt_Secret_Message_Number(Context : in out Context; Secret_Message_Number : in u8_Array);
|
||||
-- procedure Header_Next_Block(Context : in out Context_T; Header : in u8_Array);
|
||||
-- procedure Header_Last_Block(Context : in out Context_T; Header : in u8_Array);
|
||||
-- procedure Encrypt_Next_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Encrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Decrypt_Next_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Decrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Get_Tag(Context : in Context_T; Tag : out u8_Array);
|
||||
-- function Is_Valid(Context : in Context_T; Tag : in u8_Array) return Boolean;
|
||||
procedure Process_Header_Block (Context : in out Context_T; Block : Block_T; Block_Number : Block_Number_T);
|
||||
procedure Process_Header_Last_Block (Context : in out Context_T; Block : u8_Array; Block_Number : Block_Number_T);
|
||||
procedure Encrypt_Secret_Message_Number(Context : in out Context_T; Block : in out Block_T);
|
||||
procedure Decrypt_Secret_Message_Number(Context : in out Context_T; Block : in out Block_T);
|
||||
procedure Encrypt_Block(Context : in out Context_T; Block : in out Block_T; Block_Number : Block_Number_T);
|
||||
procedure Decrypt_Block(Context : in out Context_T; Block : in out Block_T; Block_Number : Block_Number_T);
|
||||
procedure Encrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array; Block_Number : Block_Number_T);
|
||||
procedure Decrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array; Block_Number : Block_Number_T);
|
||||
function Get_Tag(Context : Context_T) return Tag_T;
|
||||
function Is_Valid(Is_Tag : in Tag_T; Should_Tag : in Tag_T) return Boolean;
|
||||
function Is_Valid(Context : in Context_T; Should_Tag : in Tag_T) return Boolean;
|
||||
|
||||
function Encrypt(Msg : u8_Array; AD : u8_Array; Public_Nonce : u8_Array; Secret_Nonce : Block_T; Key : u8_Array) return u8_Array;
|
||||
procedure Decrypt(Is_Valid : out Boolean; Msg : out u8_Array; Secret_Nonce : out Block_T; Cipher : in u8_Array; AD : in u8_Array; Public_Nonce : in u8_Array; Key : in u8_Array);
|
||||
|
@ -62,7 +64,6 @@ private
|
|||
subtype Word_T is u32;
|
||||
subtype Chunk_T is u32_Array(1 .. 4);
|
||||
subtype Tag_Int_T is u32_Array(1 .. 4 * N / 2);
|
||||
subtype Tag_T is u8_Array(1 .. Rate_Bytes);
|
||||
|
||||
type State_T is array (1 .. N) of Chunk_T;
|
||||
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
with Crypto_Types; use Crypto_Types;
|
||||
use Crypto_Types.Crypto_Utils_u16;
|
||||
use Crypto_Types.Crypto_Utils_u64;
|
||||
with System; use System;
|
||||
|
||||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
|
||||
|
@ -339,6 +338,16 @@ package body Pi64Cipher_Spec is
|
|||
return +Context.Tag;
|
||||
end Get_Tag;
|
||||
|
||||
function Is_Valid(Is_Tag : in Tag_T; Should_Tag : in Tag_T) return Boolean is
|
||||
begin
|
||||
return Is_Tag = Should_Tag;
|
||||
end Is_Valid;
|
||||
|
||||
function Is_Valid(Context : in Context_T; Should_Tag : in Tag_T) return Boolean is
|
||||
begin
|
||||
return Get_Tag(Context) = Should_Tag;
|
||||
end Is_Valid;
|
||||
|
||||
function Encrypt(Msg : u8_Array; AD : u8_Array; Public_Nonce : u8_Array; Secret_Nonce : Block_T; Key : u8_Array) return u8_Array is
|
||||
Crypt : u8_Array(1 .. Secret_Nonce'Length + Msg'Length + Tag_Bytes);
|
||||
Ctx : Context_T;
|
||||
|
@ -354,7 +363,6 @@ package body Pi64Cipher_Spec is
|
|||
end Encrypt;
|
||||
|
||||
procedure Decrypt(Is_Valid : out Boolean; Msg : out u8_Array; Secret_Nonce : out Block_T; Cipher : in u8_Array; AD : in u8_Array; Public_Nonce : in u8_Array; Key : in u8_Array) is
|
||||
Tag : Tag_T;
|
||||
Ctx : Context_T;
|
||||
begin
|
||||
Initialize(Context => Ctx, Key => Key, Public_Nonce => Public_Nonce);
|
||||
|
@ -363,8 +371,7 @@ package body Pi64Cipher_Spec is
|
|||
Msg := Cipher(Cipher'First + Secret_Message_Number_Bytes .. Cipher'Last - Tag_Bytes);
|
||||
Decrypt_Secret_Message_Number(Context => Ctx, Block => Secret_Nonce);
|
||||
Decrypt_Last_Block(Context => Ctx, Block => Msg, Block_Number => 1);
|
||||
Tag := Get_Tag(Ctx);
|
||||
Is_Valid := Tag = Cipher(Cipher'Last - Tag_Bytes + 1 .. Cipher'Last);
|
||||
Is_Valid := Pi64Cipher_Spec.Is_Valid(Ctx, Cipher(Cipher'Last - Tag_Bytes + 1 .. Cipher'Last));
|
||||
end Decrypt;
|
||||
|
||||
end Pi64Cipher_Spec;
|
||||
|
|
|
@ -39,19 +39,21 @@ package Pi64Cipher_Spec is
|
|||
Secret_Message_Number_Bytes : constant := Secret_Message_Number_Bits / 8;
|
||||
|
||||
subtype Block_Number_T is Natural;
|
||||
|
||||
subtype Block_T is u8_Array (1 .. Rate_Bytes);
|
||||
subtype Tag_T is u8_Array(1 .. Rate_Bytes);
|
||||
|
||||
procedure Initialize(Context : out Context_T; Key : in u8_Array; Public_Nonce : in u8_Array);
|
||||
-- procedure Encrypt_Secret_Message_Number(Context : in out Context; Secret_Message_Number : in u8_Array);
|
||||
-- procedure Header_Next_Block(Context : in out Context_T; Header : in u8_Array);
|
||||
-- procedure Header_Last_Block(Context : in out Context_T; Header : in u8_Array);
|
||||
-- procedure Encrypt_Next_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Encrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Decrypt_Next_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Decrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array);
|
||||
-- procedure Get_Tag(Context : in Context_T; Tag : out u8_Array);
|
||||
-- function Is_Valid(Context : in Context_T; Tag : in u8_Array) return Boolean;
|
||||
procedure Process_Header_Block (Context : in out Context_T; Block : Block_T; Block_Number : Block_Number_T);
|
||||
procedure Process_Header_Last_Block (Context : in out Context_T; Block : u8_Array; Block_Number : Block_Number_T);
|
||||
procedure Encrypt_Secret_Message_Number(Context : in out Context_T; Block : in out Block_T);
|
||||
procedure Decrypt_Secret_Message_Number(Context : in out Context_T; Block : in out Block_T);
|
||||
procedure Encrypt_Block(Context : in out Context_T; Block : in out Block_T; Block_Number : Block_Number_T);
|
||||
procedure Decrypt_Block(Context : in out Context_T; Block : in out Block_T; Block_Number : Block_Number_T);
|
||||
procedure Encrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array; Block_Number : Block_Number_T);
|
||||
procedure Decrypt_Last_Block(Context : in out Context_T; Block : in out u8_Array; Block_Number : Block_Number_T);
|
||||
function Get_Tag(Context : Context_T) return Tag_T;
|
||||
function Is_Valid(Is_Tag : in Tag_T; Should_Tag : in Tag_T) return Boolean;
|
||||
function Is_Valid(Context : in Context_T; Should_Tag : in Tag_T) return Boolean;
|
||||
|
||||
function Encrypt(Msg : u8_Array; AD : u8_Array; Public_Nonce : u8_Array; Secret_Nonce : Block_T; Key : u8_Array) return u8_Array;
|
||||
procedure Decrypt(Is_Valid : out Boolean; Msg : out u8_Array; Secret_Nonce : out Block_T; Cipher : in u8_Array; AD : in u8_Array; Public_Nonce : in u8_Array; Key : in u8_Array);
|
||||
|
@ -62,7 +64,6 @@ private
|
|||
subtype Word_T is u64;
|
||||
subtype Chunk_T is u64_Array(1 .. 4);
|
||||
subtype Tag_Int_T is u64_Array(1 .. 4 * N / 2);
|
||||
subtype Tag_T is u8_Array(1 .. Rate_Bytes);
|
||||
|
||||
type State_T is array (1 .. N) of Chunk_T;
|
||||
|
||||
|
|
|
@ -189,8 +189,12 @@ procedure Test_Pi16Cipher is
|
|||
begin
|
||||
-- Test_Pi16("0123456789ABCDEF", "ABCD", "FEDCBA9876543210", "Header", "PlaintextPlaintext");
|
||||
for i in Key_Sizes'Range loop
|
||||
Create(File => File, Name => "testvectors/pi-cipher/" & PiCipher.Cipher_Name & Trim(Integer'Image(Key_Sizes(i)), Both)
|
||||
declare
|
||||
Key_Size_Str : constant String := Trim(Integer'Image(Key_Sizes(i)), Both);
|
||||
begin
|
||||
Create(File => File, Name => "testvectors/pi-cipher/" & PiCipher.Cipher_Name & (3 - Key_Size_Str'Length) * '0' & Key_Size_Str
|
||||
& "_" & Trim(Integer'Image(Public_Nonce_Length), Both) & ".test-vectors", Mode => Out_File);
|
||||
end;
|
||||
Set_Output(File);
|
||||
Put_Line("# Testvectors for " & PiCipher.Cipher_Name);
|
||||
Put_Line("# key size: " & Trim(Integer'Image(Key_Sizes(i)), Both) & " bits");
|
||||
|
|
Loading…
Reference in New Issue