providing richer API for Pi-Cipher

This commit is contained in:
bg nerilex 2015-09-21 13:35:18 +02:00
parent 8e4081389a
commit d4c9750fc4
7 changed files with 74 additions and 46 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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");