diff options
Diffstat (limited to 'src/crypto-types.ads')
-rw-r--r-- | src/crypto-types.ads | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/src/crypto-types.ads b/src/crypto-types.ads new file mode 100644 index 0000000..ebcd6dc --- /dev/null +++ b/src/crypto-types.ads @@ -0,0 +1,357 @@ +-- This program is free software; you can redistribute it and/or +-- modify it under the terms of the GNU General Public License as +-- published by the Free Software Foundation; either version 2 of the +-- License, or (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +-- General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-- 02111-1307, USA. + +-- As a special exception, if other files instantiate generics from +-- this unit, or you link this unit with other files to produce an +-- executable, this unit does not by itself cause the resulting +-- executable to be covered by the GNU General Public License. This +-- exception does not however invalidate any other reasons why the +-- executable file might be covered by the GNU Public License. + +package Crypto.Types is + + --------------------------------------------------------------------------- + ---------------------------TYPES------------------------------------------- + --------------------------------------------------------------------------- + + -- primary types; + + type Bit is mod 2; + for Bit'Size use 1; + + type Byte is mod 2 ** 8; + for Byte'Size use 8; + + type DByte is mod 2 ** 16; + for DByte'Size use 16; + + type TByte is mod 2 ** 24 with Size => 24; + + type Word is mod 2 ** 32; + for Word'Size use 32; + + type DWord is mod 2 ** 64; + for DWord'Size use 64; + + --package BIO is new Ada.Text_Io.Modular_IO (Byte); + --package WIO is new Ada.Text_Io.Modular_IO (Word); + --package DIO is new Ada.Text_Io.Modular_IO (DWord); + + -- Arrays of primary types + type Bits is array (Integer range <>) of Bit; + type Bytes is array (Integer range <>) of Byte; + type DBytes is array (Integer range <>) of DByte; + type Words is array (Integer range <>) of Word; + type DWords is array (Integer range <>) of DWord; + + subtype Byte_Word_Range is Natural range 0..3; + subtype Byte_DWord_Range is Natural range 0..7; + + subtype Byte_Word is Bytes (Byte_Word_Range); + subtype Byte_DWord is Bytes (Byte_DWord_Range); + + -- N : #bits + -- byte-blocks (B_BlockN): array of N/8 bytes + subtype B_Block32_Range is Natural range 0..3; + subtype B_Block48_Range is Natural range 0..5; + subtype B_Block56_Range is Natural range 0..6; + subtype B_Block64_Range is Natural range 0..7; + subtype B_Block128_Range is Natural range 0..15; + subtype B_Block160_Range is Natural range 0..19; + subtype B_Block192_Range is Natural range 0..23; + subtype B_Block256_Range is Natural range 0..31; + + type B_Block32 is array(B_Block32_Range) of Byte; + type B_Block48 is array(B_Block48_Range) of Byte; + type B_Block56 is array(B_Block56_Range) of Byte; + type B_Block64 is array(B_Block64_Range) of Byte; + type B_Block128 is array(B_Block128_Range) of Byte; + type B_Block160 is array(B_Block160_Range) of Byte; + type B_Block192 is array(B_Block192_Range) of Byte; + type B_Block256 is array(B_Block256_Range) of Byte; + + + -- word blocks (W_BlockN): array of N/32 Words + subtype W_Block128_Range is Natural range 0..3; + subtype W_Block160_Range is Natural range 0..4; + subtype W_Block192_Range is Natural range 0..5; + subtype W_Block256_Range is Natural range 0..7; + subtype W_Block512_Range is Natural range 0..15; + + type W_Block128 is array(W_Block128_Range) of Word; + type W_Block160 is array(W_Block160_Range) of Word; + type W_Block192 is array(W_Block192_Range) of Word; + type W_Block256 is array(W_Block256_Range) of Word; + type W_Block512 is array(W_Block512_Range) of Word; + + + -- double wordblocks (DW_BlockN): array of N/64 Words + subtype DW_Block128_Range is Natural range 0..1; + subtype DW_Block256_Range is Natural range 0..3; + subtype DW_Block384_Range is Natural range 0..5; + subtype DW_Block512_Range is Natural range 0..7; + subtype DW_Block1024_Range is Natural range 0..15; + subtype DW_Block8192_Range is Natural range 0..127; + + type DW_Block128 is array(DW_Block128_Range) of DWord; + type DW_Block256 is array(DW_Block256_Range) of DWord; + type DW_Block384 is array(DW_Block384_Range) of DWord; + type DW_Block512 is array(DW_Block512_Range) of DWord; + type DW_Block1024 is array(DW_Block1024_Range) of DWord; + type DW_Block8192 is array(DW_Block8192_Range) of DWord; + + + subtype Hex_Byte_Range is Natural range 1..2; + subtype Hex_Word_Range is Natural range 1..8; + subtype Hex_DWord_Range is Natural range 1..16; + + + subtype Hex_Byte is String (Hex_Byte_Range); + subtype Hex_Word is String (Hex_Word_Range); + subtype Hex_DWord is String (Hex_DWord_Range); + + subtype Message_Block_Length256 is Natural range 0 .. 32; + subtype Message_Block_Length512 is Natural range 0 .. 64; + subtype Message_Block_Length1024 is Natural range 0 .. 128; + + + + + + + + --------------------------------------------------------------------------- + ---------------------------FUNCTIONS--------------------------------------- + --------------------------------------------------------------------------- + + function Shift_Left (Value : Byte; Amount : Natural) return Byte; + function Shift_Right (Value : Byte; Amount : Natural) return Byte; + function Rotate_Left (Value : Byte; Amount : Natural) return Byte; + function Rotate_Right (Value : Byte; Amount : Natural) return Byte; + + function Shift_Left (Value : DByte; Amount : Natural) return DByte; + function Shift_Right (Value : DByte; Amount : Natural) return DByte; + function Rotate_Left (Value : DByte; Amount : Natural) return DByte; + function Rotate_Right (Value : DByte; Amount : Natural) return DByte; + + function Shift_Left (Value : Word; Amount : Natural) return Word; + function Shift_Right (Value : Word; Amount : Natural) return Word; + function Rotate_Left (Value : Word; Amount : Natural) return Word; + function Rotate_Right (Value : Word; Amount : Natural) return Word; + + function Shift_Left (Value : DWord; Amount : Natural) return DWord; + function Shift_Right (Value : DWord; Amount : Natural) return DWord; + function Rotate_Left (Value : DWord; Amount : Natural) return DWord; + function Rotate_Right (Value : DWord; Amount : Natural) return DWord; + + pragma Import (Intrinsic, Shift_Left); + pragma Import (Intrinsic, Shift_Right); + + function Shift_Left (Value : Bytes; Amount : Natural) return Bytes; + function Shift_Left (Value : B_Block128; Amount : Natural) return B_Block128; + function Shift_Right(Value : Bytes; Amount : Natural) return Bytes; + function Shift_Right(Value : B_Block128; Amount : Natural) return B_Block128; + + --Operations for Bytes + function "xor"(Left, Right : Bytes) return Bytes; + function "xor"(Left : Bytes; Right : Byte) return Bytes; + function "+"(Left : Bytes; Right : Byte) return Bytes; + function "+"(Left : Byte; Right : Bytes) return Bytes; + function "and"(Left, Right : Bytes) return Bytes; + + + -- Operations for Words + function "xor"(Left, Right : Words) return Words; + function "+"(Left : Words; Right : Word) return Words; + function "+"(Left : Word; Right : Words) return Words; + function "+"(Left : Words; Right : Byte) return Words; + + + -- Operations for DWords + function "xor"(Left, Right : DWords) return DWords; + function "+"(Left : DWords; Right : DWord) return DWords; + function "+"(Left : DWord; Right : DWords) return DWords; + function "+"(Left : DWords; Right : Byte) return DWords; + + -- Bytes to Word + function To_Word (A,B,C,D : Byte) return Word; + function To_Word (X : Byte_Word) return Word; + function R_To_Word (X : Byte_Word) return Word; -- reverse + function To_Words(Byte_Array : Bytes) return Words; + + -- Word to Bytes + function To_Bytes (X : Word) return Byte_Word; + function R_To_Bytes (X : Word) return Byte_Word; --reverse + function To_Bytes(Word_Array : Words) return Bytes; + + --Word = b_0 b_1 b2 b_3 + -- ByteX returns b_n + function Byte0 (W : Word) return Byte; + function Byte1 (W : Word) return Byte; + function Byte2 (W : Word) return Byte; + function Byte3 (W : Word) return Byte; + + -- Bytes to DWord + function To_DWord (X : Byte_DWord) return DWord; + function R_To_DWord (X : Byte_DWord) return DWord; + function To_DWords (Byte_Array : Bytes) return DWords; + + -- DWord to Bytes + function To_Bytes (X : DWord) return Byte_DWord; + function R_To_Bytes (X : DWord) return Byte_DWord; + function To_Bytes (DWord_Array : DWords) return Bytes; + + + --DWord = b_0 b_1 b2 b_3 b_4 b_5 b_6 b_7 + -- ByteX returns b_n + function Byte0 (D : DWord) return Byte; + function Byte1 (D : DWord) return Byte; + function Byte2 (D : DWord) return Byte; + function Byte3 (D : DWord) return Byte; + function Byte4 (D : DWord) return Byte; + function Byte5 (D : DWord) return Byte; + function Byte6 (D : DWord) return Byte; + function Byte7 (D : DWord) return Byte; + + -- To_Word + function To_Word (A,B,C,D : Character) return Word; + + -- String to Bytes + function To_Bytes(Message : String) return Bytes; + + -- Bytes to String + function To_String(ASCII : Bytes) return String; + + + -- To_Hex + function To_Hex(B : Byte) return Hex_Byte; + function To_Hex(W : Word) return Hex_Word; + function To_Hex(D : DWord) return Hex_DWord; + + -- To_Bytes + function Hex_To_Bytes(Hex : String) return Bytes; + + -- Is_Zero + -- returns only true if the "input array" X = (others => 0) + function Is_Zero(Byte_Array : Bytes) return Boolean; + function Is_Zero(Word_Array : Words) return Boolean; + function Is_Zero(DWord_Array : DWords) return Boolean; + + + -- Byte Blocks To Bytes. + -- Needed for generic packages to convert a specific byte block. + function To_Bytes(B : B_Block64) return Bytes; + function To_Bytes(B : B_Block128) return Bytes; + function To_Bytes(B : B_Block192) return Bytes; + function To_Bytes(B : B_Block256) return Bytes; + function To_Bytes(W : W_Block160) return Bytes; + function To_Bytes(W : W_Block256) return Bytes; + function To_Bytes(W : W_Block512) return Bytes; + function To_Bytes(D : DW_Block256) return Bytes; + function To_Bytes(D : DW_Block384) return Bytes; + function To_Bytes(D : DW_Block512) return Bytes; + function To_Bytes(D : DW_Block1024) return Bytes; + function To_Bytes(D : DW_Block8192) return Bytes; + + + -- Bytes To block of Bytes. + -- Needed for generic packages to convert a specific byte block. + function To_B_Block64(B : Bytes) return B_Block64; + function To_B_Block128(B : Bytes) return B_Block128; + function To_B_Block192(B : Bytes) return B_Block192; + function To_B_Block256(B : Bytes) return B_Block256; + + + -- Bytes To block of words. + -- Needed for generic packages to convert a specific byte block. + function To_W_Block160(B : Bytes) return W_Block160; + function To_W_Block256(B : Bytes) return W_Block256; + function To_W_Block512(B : Bytes) return W_Block512; + + + -- Bytes To block of double words. + -- Needed for generic packages to convert a specific byte block. + function To_DW_Block256(B : Bytes) return DW_Block256; + function To_DW_Block384(B : Bytes) return DW_Block384; + function To_DW_Block512(B : Bytes) return DW_Block512; + function To_DW_Block1024(B : Bytes) return DW_Block1024; + function To_DW_Block8192(B : Bytes) return DW_Block8192; + + -- Needed for generic packages to convert a specific byte block. + function "xor"(Left, Right : B_Block64) return B_Block64; + function "xor"(Left, Right : B_Block128) return B_Block128; + function "xor"(Left, Right : W_Block160) return W_Block160; + function "xor"(Left, Right : W_Block256) return W_Block256; + function "xor"(Left, Right : W_Block512) return W_Block512; + function "xor"(Left, Right : DW_Block512) return DW_Block512; + function "xor"(Left, Right : DW_Block1024) return DW_Block1024; + function "xor"(Left, Right : DW_Block8192) return DW_Block8192; + + function "+"(Left : B_Block128; Right : Byte) return B_Block128; + + + -- Splits byte array of length n into a left part of length + -- ceiling(n/2) and a right part of length floor(n/2). + function Left_Part(Block : in Bytes) return Bytes; + function Right_Part(Block : in Bytes) return Bytes; + + + + -- Nested generic package + generic + type T is mod <>; + type T_A is array (Integer range <>) of T; + with function Shift_Left (Value : T; Amount : Natural) return T is <>; + with function Shift_Right (Value : T; Amount : Natural) return T is <>; + + package Generic_Mod_Aux is + function "xor"(Left, Right : T_A) return T_A; + function "xor"(Left : T_A; Right : T) return T_A; + function "xor"(Left : T; Right : T_A) return T_A; + + function "and"(Left, Right : T_A) return T_A; + + function "+"(Left : T_A; Right : T) return T_A; + function "+"(Left : T; Right : T_A) return T_A; + + function Is_Zero(Item : T_A) return Boolean; + + function Left_Part (Block : in T_A) return T_A; + function Right_Part(Block : in T_A) return T_A; + + function Shift_Left(Value : T_A; Amount : Natural) return T_A; + function Shift_Right(Value : T_A; Amount : Natural) return T_A; + end Generic_Mod_Aux; + + + + --------------------------------------------------------------------------- + -------------------------------PRIVATE------------------------------------- + --------------------------------------------------------------------------- + +private + pragma Inline (To_B_Block128,To_B_Block192,To_B_Block256); + pragma Inline ("xor","+"); + pragma Inline (R_To_Bytes, To_Bytes); + pragma Inline (To_Word, Byte0, Byte1, Byte2, Byte3); + pragma Inline (Byte4, Byte5, Byte6, Byte7); + pragma Inline (To_DWord, R_To_DWord); + pragma Inline (Is_Zero); + pragma Inline (Left_Part, Right_Part); + pragma Import (Intrinsic, Rotate_Left); + pragma Import (Intrinsic, Rotate_Right); + + pragma Optimize(Time); +end Crypto.Types; |