with AUnit.Assertions; package body Test_Support is ---------------------------------------------------------------------------- -- Assertions ---------------------------------------------------------------------------- procedure Assert_Success (Result : Integer; What : String) is begin AUnit.Assertions.Assert (Result = 0, What & " failed, Result = " & Integer'Image (Result)); end Assert_Success; ---------------------------------------------------------------------------- -- Data helpers ---------------------------------------------------------------------------- function Bytes (S : String) return WolfSSL.Byte_Array is -- WolfSSL.Byte_Array is Interfaces.C.char_array indexed by -- WolfSSL.Byte_Index (size_t). Avoid doing arithmetic directly on that -- index type; instead, use Natural for arithmetic and convert at the -- point of indexing. begin if S'Length = 0 then -- Return a null range for empty input declare Empty : WolfSSL.Byte_Array (1 .. 0); begin return Empty; end; end if; declare Last_N : constant Natural := S'Length - 1; B : WolfSSL.Byte_Array (0 .. WolfSSL.Byte_Index (Last_N)); N : Natural := 0; begin for C of S loop B (WolfSSL.Byte_Index (N)) := WolfSSL.Byte_Type'Val (Character'Pos (C)); N := N + 1; end loop; return B; end; end Bytes; function Hex_Value (C : Character) return Natural is begin case C is when '0' .. '9' => return Character'Pos (C) - Character'Pos ('0'); when 'A' .. 'F' => return 10 + (Character'Pos (C) - Character'Pos ('A')); when 'a' .. 'f' => return 10 + (Character'Pos (C) - Character'Pos ('a')); when others => AUnit.Assertions.Assert (False, "invalid hex character '" & C & "'"); return 0; end case; end Hex_Value; function Hex_Bytes (Hex : String) return WolfSSL.Byte_Array is Len : constant Natural := Hex'Length; begin AUnit.Assertions.Assert (Len mod 2 = 0, "hex string length must be even, got" & Integer'Image (Len)); declare N : constant Natural := Len / 2; begin if N = 0 then -- Return a null range for empty input declare Empty : WolfSSL.Byte_Array (1 .. 0); begin return Empty; end; end if; declare Last_N : constant Natural := N - 1; B : WolfSSL.Byte_Array (0 .. WolfSSL.Byte_Index (Last_N)); Hi : Natural; Lo : Natural; J : Natural := 0; begin for K in 0 .. N - 1 loop J := 2 * K; Hi := Hex_Value (Hex (Hex'First + J)); Lo := Hex_Value (Hex (Hex'First + J + 1)); B (WolfSSL.Byte_Index (K)) := WolfSSL.Byte_Type'Val (16 * Hi + Lo); end loop; return B; end; end; end Hex_Bytes; function SHA256_Text (Hex : String) return WolfSSL.SHA256_As_String is T : WolfSSL.SHA256_As_String; I : Natural := 0; begin AUnit.Assertions.Assert (Hex'Length = T'Length, "SHA256 hex must be 64 characters, got" & Integer'Image (Hex'Length)); for C of Hex loop I := I + 1; T (T'First + (I - 1)) := C; end loop; return T; end SHA256_Text; end Test_Support;