with AUnit.Assertions; with AUnit.Test_Caller; with WolfSSL; with Test_Support; package body SHA256_Bindings_Tests is ---------------------------------------------------------------------------- -- Helpers ---------------------------------------------------------------------------- procedure Compute_SHA256 (Input : WolfSSL.Byte_Array; Hash : out WolfSSL.SHA256_Hash; Result : out Integer) is SHA256 : WolfSSL.SHA256_Type; R : Integer; begin -- SHA256 instances are dynamically allocated; no index is required. WolfSSL.Create_SHA256 (SHA256 => SHA256, Result => R); if R /= 0 then Result := R; return; end if; WolfSSL.Update_SHA256 (SHA256 => SHA256, Byte => Input, Result => R); if R /= 0 then Result := R; WolfSSL.Free_SHA256 (SHA256 => SHA256); return; end if; WolfSSL.Finalize_SHA256 (SHA256 => SHA256, Hash => Hash, Result => R); Result := R; WolfSSL.Free_SHA256 (SHA256 => SHA256); end Compute_SHA256; ---------------------------------------------------------------------------- -- Tests ---------------------------------------------------------------------------- procedure Test_SHA256_Asdf_Known_Vector (F : in out Fixture) is pragma Unreferenced (F); Hash : WolfSSL.SHA256_Hash; R : Integer; Input : constant WolfSSL.Byte_Array := Test_Support.Bytes ("asdf"); Expected_Hash : constant WolfSSL.Byte_Array := Test_Support.Hex_Bytes (Test_Support.SHA256_Text ("F0E4C2F76C58916EC258F246851BEA091D14D4247A2FC3E18694461B1816E13B")); begin Compute_SHA256 (Input => Input, Hash => Hash, Result => R); Test_Support.Assert_Success (R, "SHA256(asdf)"); -- Compare the hash bytes declare use type WolfSSL.Byte_Array; Hash_Bytes : WolfSSL.Byte_Array (Expected_Hash'Range); J : WolfSSL.Byte_Index := Expected_Hash'First; begin for I in Hash'Range loop Hash_Bytes (J) := Hash (I); J := WolfSSL.Byte_Index'Succ (J); end loop; AUnit.Assertions.Assert (Hash_Bytes = Expected_Hash, "SHA256('asdf') hash mismatch"); end; end Test_SHA256_Asdf_Known_Vector; procedure Test_SHA256_Empty_Message (F : in out Fixture) is pragma Unreferenced (F); Hash : WolfSSL.SHA256_Hash; R : Integer; -- Represent empty input as a null range, matching the existing test style. Empty : constant WolfSSL.Byte_Array := (1 .. 0 => <>); Expected_Hash : constant WolfSSL.Byte_Array := Test_Support.Hex_Bytes (Test_Support.SHA256_Text ("E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855")); begin Compute_SHA256 (Input => Empty, Hash => Hash, Result => R); Test_Support.Assert_Success (R, "SHA256(empty)"); -- Compare the hash bytes declare use type WolfSSL.Byte_Array; Hash_Bytes : WolfSSL.Byte_Array (1 .. 32); J : WolfSSL.Byte_Index := 1; begin for I in Hash'Range loop Hash_Bytes (J) := Hash (I); J := WolfSSL.Byte_Index'Succ (J); end loop; AUnit.Assertions.Assert (Hash_Bytes = Expected_Hash, "SHA256('') hash mismatch"); end; end Test_SHA256_Empty_Message; ---------------------------------------------------------------------------- -- Statically allocated suite object; register tests at elaboration time ---------------------------------------------------------------------------- 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 SHA256-related tests once at elaboration time. -- Note: Caller.Create returns an access value; AUnit may still allocate -- the test-case objects internally. This keeps the suite itself static. AUnit.Test_Suites.Add_Test (Suite_Object'Access, Caller.Create (Name => "SHA256('asdf') produces expected hash", Test => Test_SHA256_Asdf_Known_Vector'Access)); AUnit.Test_Suites.Add_Test (Suite_Object'Access, Caller.Create (Name => "SHA256('') produces expected hash", Test => Test_SHA256_Empty_Message'Access)); end SHA256_Bindings_Tests;