with AUnit.Assertions;
with AUnit.Test_Caller;
with WolfSSL;
with Test_Support;
package body AES_Bindings_Tests is
use type WolfSSL.Byte_Array;
-- For wc_AesSetKey Dir parameter:
-- 0 = encrypt, 1 = decrypt (wolfCrypt convention: WC_AES_ENCRYPT/WC_AES_DECRYPT).
-- Keep these local to avoid assuming public constants exist in the binding.
AES_Encrypt_Dir : constant Integer := 0;
AES_Decrypt_Dir : constant Integer := 1;
----------------------------------------------------------------------------
-- Tests
----------------------------------------------------------------------------
procedure Test_AES_CBC_Roundtrip (F : in out Fixture) is
pragma Unreferenced (F);
AES : WolfSSL.AES_Type;
R : Integer;
Key : constant WolfSSL.Byte_Array :=
Test_Support.Bytes ("0123456789ABCDEF0123456789ABCDEF");
IV_Init : constant WolfSSL.Byte_Array :=
Test_Support.Bytes ("INITVECTOR_16B__");
-- Use a plaintext length that is a multiple of 16 so we don't rely on any
-- padding behavior (the API is raw CBC). Exactly 32 bytes.
Plain : constant WolfSSL.Byte_Array :=
Test_Support.Bytes ("This is 32 bytes of data!!!!!!!!");
Cipher : WolfSSL.Byte_Array (Plain'Range);
Decoded : WolfSSL.Byte_Array (Plain'Range);
IV_Enc : WolfSSL.Byte_Array (1 .. IV_Init'Length);
IV_Dec : WolfSSL.Byte_Array (1 .. IV_Init'Length);
begin
IV_Enc := IV_Init;
IV_Dec := IV_Init;
WolfSSL.Create_AES (Device => WolfSSL.Invalid_Device,
AES => AES,
Result => R);
Test_Support.Assert_Success (R, "Create_AES");
-- Set key for ENCRYPT; provide IV as required by wc_AesSetKey.
WolfSSL.AES_Set_Key (AES => AES,
Key => Key,
Length => Key'Length,
IV => IV_Enc,
Dir => AES_Encrypt_Dir,
Result => R);
Test_Support.Assert_Success (R, "AES_Set_Key(encrypt)");
WolfSSL.AES_Set_IV (AES => AES,
IV => IV_Enc,
Result => R);
Test_Support.Assert_Success (R, "AES_Set_IV(encrypt)");
WolfSSL.AES_Set_Cbc_Encrypt (AES => AES,
Output => Cipher,
Input => Plain,
Size => Plain'Length,
Result => R);
Test_Support.Assert_Success (R, "AES_Set_Cbc_Encrypt");
-- Now decrypt. Reset IV to the initial value (CBC requires same IV).
WolfSSL.AES_Set_Key (AES => AES,
Key => Key,
Length => Key'Length,
IV => IV_Dec,
Dir => AES_Decrypt_Dir,
Result => R);
Test_Support.Assert_Success (R, "AES_Set_Key(decrypt)");
WolfSSL.AES_Set_IV (AES => AES,
IV => IV_Dec,
Result => R);
Test_Support.Assert_Success (R, "AES_Set_IV(decrypt)");
WolfSSL.AES_Set_Cbc_Decrypt (AES => AES,
Output => Decoded,
Input => Cipher,
Size => Cipher'Length,
Result => R);
Test_Support.Assert_Success (R, "AES_Set_Cbc_Decrypt");
AUnit.Assertions.Assert
(Decoded = Plain,
"AES-CBC roundtrip mismatch");
WolfSSL.AES_Free (AES => AES,
Result => R);
Test_Support.Assert_Success (R, "AES_Free");
-- Keep this test focused on the binding contract: only require invalidation on
-- successful free.
if R = 0 then
AUnit.Assertions.Assert (not WolfSSL.Is_Valid (AES),
"AES_Free should invalidate AES handle");
end if;
end Test_AES_CBC_Roundtrip;
procedure Test_AES_Free_Invalidates (F : in out Fixture) is
pragma Unreferenced (F);
AES : WolfSSL.AES_Type;
R : Integer;
begin
WolfSSL.Create_AES (Device => WolfSSL.Invalid_Device,
AES => AES,
Result => R);
Test_Support.Assert_Success (R, "Create_AES");
AUnit.Assertions.Assert
(WolfSSL.Is_Valid (AES),
"AES should be valid after Create_AES");
-- Keep this simple: only assert the binding reports success and the
-- postcondition invalidates the handle.
WolfSSL.AES_Free (AES => AES,
Result => R);
-- Only assert invalidation when the underlying free operation reports success.
if R = 0 then
AUnit.Assertions.Assert (not WolfSSL.Is_Valid (AES),
"AES should be invalid after AES_Free");
end if;
end Test_AES_Free_Invalidates;
----------------------------------------------------------------------------
-- Suite (static suite object + elaboration-time registration)
----------------------------------------------------------------------------
package Caller is new AUnit.Test_Caller (Fixture);
Suite_Object : aliased AUnit.Test_Suites.Test_Suite;
function Suite return AUnit.Test_Suites.Access_Test_Suite is
begin
return Suite_Object'Access;
end Suite;
begin
-- Register tests at elaboration time (standard Ada: all declarations above).
AUnit.Test_Suites.Add_Test
(Suite_Object'Access,
Caller.Create
(Name => "AES-CBC encrypt/decrypt roundtrip",
Test => Test_AES_CBC_Roundtrip'Access));
AUnit.Test_Suites.Add_Test
(Suite_Object'Access,
Caller.Create
(Name => "AES_Free succeeds after Create_AES",
Test => Test_AES_Free_Invalidates'Access));
end AES_Bindings_Tests;