diff --git a/src/algorithms/pi-cipher/pi16cipher_spec.adb b/src/algorithms/pi-cipher/pi16cipher_spec.adb index b71d361..9475fd8 100644 --- a/src/algorithms/pi-cipher/pi16cipher_spec.adb +++ b/src/algorithms/pi-cipher/pi16cipher_spec.adb @@ -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; diff --git a/src/algorithms/pi-cipher/pi16cipher_spec.ads b/src/algorithms/pi-cipher/pi16cipher_spec.ads index c8405e6..0d9c476 100644 --- a/src/algorithms/pi-cipher/pi16cipher_spec.ads +++ b/src/algorithms/pi-cipher/pi16cipher_spec.ads @@ -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; diff --git a/src/algorithms/pi-cipher/pi32cipher_spec.adb b/src/algorithms/pi-cipher/pi32cipher_spec.adb index d6f2acc..4bbacb2 100644 --- a/src/algorithms/pi-cipher/pi32cipher_spec.adb +++ b/src/algorithms/pi-cipher/pi32cipher_spec.adb @@ -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; diff --git a/src/algorithms/pi-cipher/pi32cipher_spec.ads b/src/algorithms/pi-cipher/pi32cipher_spec.ads index 6725771..117f46f 100644 --- a/src/algorithms/pi-cipher/pi32cipher_spec.ads +++ b/src/algorithms/pi-cipher/pi32cipher_spec.ads @@ -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; diff --git a/src/algorithms/pi-cipher/pi64cipher_spec.adb b/src/algorithms/pi-cipher/pi64cipher_spec.adb index bcaa7f7..0a60c2b 100644 --- a/src/algorithms/pi-cipher/pi64cipher_spec.adb +++ b/src/algorithms/pi-cipher/pi64cipher_spec.adb @@ -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; diff --git a/src/algorithms/pi-cipher/pi64cipher_spec.ads b/src/algorithms/pi-cipher/pi64cipher_spec.ads index a8d2aa8..0be6f7d 100644 --- a/src/algorithms/pi-cipher/pi64cipher_spec.ads +++ b/src/algorithms/pi-cipher/pi64cipher_spec.ads @@ -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; diff --git a/src/tests/test_pi16cipher.adb b/src/tests/test_pi16cipher.adb index 23436e8..9c9d846 100644 --- a/src/tests/test_pi16cipher.adb +++ b/src/tests/test_pi16cipher.adb @@ -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");