diff -uNr a/eucrypt/crc32/crc32.adb b/eucrypt/crc32/crc32.adb --- a/eucrypt/crc32/crc32.adb false +++ b/eucrypt/crc32/crc32.adb e18b917bea4324244cdca1925b406bd2affc6c0588f12776bfe7e3e877f65d8b8dbe0252d8601b01879a93b2fb0df36841995b88129dd2cb71738f05170561fb @@ -0,0 +1,160 @@ +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- This file is part of 'CRC32' -- +-- -- +-- You do not have, nor can you ever acquire the right to use, copy or -- +-- distribute this software ; Should you use this software for any purpose, -- +-- or copy and distribute it to anyone or in any manner, you are breaking -- +-- the laws of whatever soi-disant jurisdiction, and you promise to -- +-- continue doing so for the indefinite future. In any case, please -- +-- always : read and understand any software ; verify any PGP signatures -- +-- that you use - for any purpose. -- +-- -- +-- See also http://trilema.com/2015/a-new-software-licensing-paradigm . -- +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + -- CRC32 implementation + -- S.MG, 2018 + +-- This implementation is based on bitwise operations (no table). +-- CRC32 is defined as a modulo 2 long division, these divisions can be +-- implemented as "long" divisions based on xor operations +-- (in the same way normal long divisions are based on subtractions). + +-- The bits in a register (with bits R31 .. R0), are xored with the +-- bits of the divisor. +-- The message is shifted into the register bit by bit at position r0 +-- The register is shifted to make room for each message bit. +-- The bit that is shifted off the register (that was at r31) is used +-- to determine if the xor operation is needed (if set then the xor +-- operation is performed). +-- To be able to operate on each bit of the message, 32 zero bits are +-- appended. + +-- The current implementation is an adapted version of the above algoritm +-- and the adaptations may not always be obvious, below a short list of +-- the adaptations; +-- (a) CRC32 has a reversed notion of the bit order in a byte (and integer) +-- the bits in each byte of the message are therefor shifted from +-- the right (and not left as expected from the algorithm) +-- (b) At the end of the algorithm the bit order needs to be reversed. +-- This step can be avoided by also shifting the register in a +-- different direction and using a reversed divisor. +-- (not implemented yet) +-- (c) Each message bit is shifted on the right side of the register and +-- step by step goes through to the right side of the register. Depending +-- on the bits before and the divisor it is xor-ed with a 1 or 0. +-- Per bit we have then this function; +-- end-bit = message-bit xor d0 xor d1 xor .. xor d31 +-- (where d0 .. d31 denote the bits of the divisor). +-- As an xor with 0 can always be added we can make this: +-- end-bit = message-bit xor d0 xor d1 xor .. xor d31 xor 0 +-- Next, the xor operation is commutative, +-- so the function can be rewritten as: +-- end_bit = 0 xor d0 xor d1 xor .. xor d31 xor message-bit +-- I.E. the message bit can be xor-ed with the register at the end +-- and then used to decide the next xor operation on the register. +-- (and shift the bit just used off the register) +-- Now, no appending of zero's is necessary and the initial value of +-- the register becomes a factor. +-- (CRC32 uses all ones, 16#ff_ff_ff_ff#) +-- (d) The implementation is constant time, no branching on the bits is +-- used +-- (i.e. no if statements that depend on the value of the bits) + +package body CRC32 is + -- Implementation of CRC that uses mod 2 division + function CRC ( S : in String ) return CRC32 is + + R : CRC32 := 16#FF_FF_FF_FF#; + + begin + + for I in Integer range S'First .. S'Last loop + declare + C : CRC32 := Character'Pos (S (I)); + begin + CRC_Step(C, R); + end; + end loop; + + R := Bits_Reverse(R); + + -- Xor the result as per spec + R := R xor 16#FF_FF_FF_FF#; + return R; + + end CRC; + + function CRC ( Data: in Octet_Array ) return CRC32 is + + R : CRC32 := 16#FF_FF_FF_FF#; + + begin + + for I in Integer range Data'First .. Data'Last loop + declare + C : CRC32 := CRC32'Val( Data (I) ); + begin + CRC_Step(C, R); + end; + end loop; + + R := Bits_Reverse(R); + + -- Xor the result as per spec + R := R xor 16#FF_FF_FF_FF#; + return R; + + end CRC; + + + --function CRC( Data: in Octet_Array ) return CRC32; + --end CRC; + + procedure CRC_Step(C : in out CRC32; R : in out CRC32) is + D : constant CRC32 := 16#04_C1_1D_B7#; + begin + for J in Integer range 1 .. 8 loop + declare + Bit31Set : CRC32 := 0; + Bit1 : constant CRC32 := Rotate_Right(1 and C, 1); + begin + R := R xor Bit1; + Bit31Set := Rotate_Left(Bit31 and R, 1); + R := Shift_Left (R, 1); + -- if the bit was set then bit31set == 1, else it is 0 + -- bit31set - 1 will do 1 -> 0 and 0 -> 16#ff_ff_ff_ff# + -- not will then make the + -- 0 -> 16#ff_ff_ff_ff# + -- and the 16#ff_ff_ff_ff# -> 0. + -- ie: (not (Bit31Set - 1)) does: + -- 1 --> 16#ff_ff_ff_ff# + -- 0 --> 0 + R := R xor ((not (Bit31Set - 1)) and D); + + -- Shift right as the bit order is reversed in CRC 32 + C := Shift_Right (C, 1); + + end; + end loop; + end CRC_Step; + + function Bits_Reverse(A : in CRC32) return CRC32 is + R : CRC32 := 16#00_00_00_00#; + B : CRC32 := A; + begin + for I in Integer range 1 .. 32 loop + declare + Bit : constant CRC32 := (1 and B); + begin + B := Shift_Right (B, 1); + R := Shift_Left (R, 1); + R := R or Bit; + end; + end loop; + return R; + end Bits_Reverse; +end CRC32; + diff -uNr a/eucrypt/crc32/crc32.ads b/eucrypt/crc32/crc32.ads --- a/eucrypt/crc32/crc32.ads false +++ b/eucrypt/crc32/crc32.ads e065abb2672ab869629579c4566ecff5872e15fc06eb95d54b3ad29785bad951eb1126b0ac5e40185eb3d24320445e3ab3ab3c25e424243d79aa295621cd1f33 @@ -0,0 +1,85 @@ +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- This file is part of 'CRC32' -- +-- -- +-- You do not have, nor can you ever acquire the right to use, copy or -- +-- distribute this software ; Should you use this software for any purpose, -- +-- or copy and distribute it to anyone or in any manner, you are breaking -- +-- the laws of whatever soi-disant jurisdiction, and you promise to -- +-- continue doing so for the indefinite future. In any case, please -- +-- always : read and understand any software ; verify any PGP signatures -- +-- that you use - for any purpose. -- +-- -- +-- See also http://trilema.com/2015/a-new-software-licensing-paradigm . -- +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + -- CRC32, modulo 2 based implementation + -- S.MG, 2018 + -- + -- The CRC32 is a checksum calculated as the remainder of dividing + -- the input data by the 0x04C11DB7 polynomial. Specifications: + -- Name : "CRC-32" + -- Width : 32 (number of bits) + -- Poly : 04C11DB7 (generator polynomial) + -- Init : FFFFFFFF + -- RefIn : True (input is reflected) + -- RefOut : True (output is reflected) + -- XorOut : FFFFFFFF + -- Check : CBF43926 (expected value for input "123456789") + -- + -- This implementation is based on the CRC32 example in: + -- Ross N. Williams, A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS + -- version 3, 1993 + -- http://ross.net/crc/download/crc_v3.txt + +with Interfaces; use Interfaces; + +package CRC32 is + -- local, shorthand version of Interfaces. types + subtype CRC32 is Interfaces.Unsigned_32; + subtype Octet is Interfaces.Unsigned_8; + + type Octet_Array is array( Integer range <> ) of Octet; + + -- interface for external callers + -- calculate CRC32 for the given string + function CRC( S: in String ) return CRC32; + + -- calculate CRC32 for the given array of octets + function CRC( Data: in Octet_Array ) return CRC32; + + -- internal constants and helper methods +private + -- These functions need to be imported to get to the shift operators. + -- (Specific for GNAT) + function Shift_Left ( Value : CRC32; + Amount : Natural ) + return CRC32; + function Shift_Right ( Value : CRC32; + Amount : Natural ) + return CRC32; + function Rotate_Left ( Value : CRC32; + Amount : Natural ) + return CRC32; + function Rotate_Right ( Value : CRC32; + Amount : Natural ) + return CRC32; + + pragma Import ( Intrinsic, Rotate_Left ); + pragma Import ( Intrinsic, Rotate_Right ); + pragma Import ( Intrinsic, Shift_Left ); + pragma Import ( Intrinsic, Shift_Right ); + + + -- The Shift_Left instruction does not return the bit that was shifted + -- We need a mask for this last bit + -- Bits are counted from right to left, starting at 0 + Bit31 : constant CRC32 := 16#80_00_00_00#; + + procedure CRC_Step(C : in out CRC32; R : in out CRC32); + pragma Inline_Always(CRC_Step); + + function Bits_Reverse(A : in CRC32) return CRC32; + +end CRC32; diff -uNr a/eucrypt/crc32/crc32.gpr b/eucrypt/crc32/crc32.gpr --- a/eucrypt/crc32/crc32.gpr false +++ b/eucrypt/crc32/crc32.gpr eb6f9147755c67830c904a92c4fa5d8d7ad7608987800fa8af09221bab132decea894d9b111db1d2a311976404f7e52401a3eb164fa31ddd11db89d87e546539 @@ -0,0 +1,61 @@ +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- CRC32 checksum lib -- +-- S.MG, 2018 -- +-- -- +-- You do not have, nor can you ever acquire the right to use, copy or -- +-- distribute this software ; Should you use this software for any purpose, -- +-- or copy and distribute it to anyone or in any manner, you are breaking -- +-- the laws of whatever soi-disant jurisdiction, and you promise to -- +-- continue doing so for the indefinite future. In any case, please -- +-- always : read and understand any software ; verify any PGP signatures -- +-- that you use - for any purpose. -- +-- -- +-- See also http://trilema.com/2015/a-new-software-licensing-paradigm . -- +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + +project CRC32 is + + for Object_Dir use "obj"; + + type Mode_Type is ("debug", "release"); + Mode : Mode_Type := external ("mode", "release"); + + for Languages use ("Ada"); + for Source_Dirs use ("."); + for Library_Dir use "lib"; + for Library_Name use "CRC32"; + for Library_Kind use "static"; + + package Compiler is + case Mode is + when "debug" => + for Switches ("Ada") + use ("-g"); + when "release" => + for Switches ("Ada") + use ("-O2", "-fdump-scos", "-gnata", "-fstack-check", + "-gnatyd", "-gnatym", + "-fdata-sections", "-ffunction-sections", "-gnatwr", "-gnatw.d", + "-gnatec=" & CRC32'Project_Dir & "restrict.adc"); + end case; + end Compiler; + + package Builder is + for Switches ("Ada") + use ("-nostdlib"); + end Builder; + + package Binder is + case Mode is + when "debug" => + for Switches ("Ada") + use (); + when "release" => + for Switches ("Ada") + use ("-static"); + end case; + end Binder; + +end CRC32; diff -uNr a/eucrypt/crc32/lib/README b/eucrypt/crc32/lib/README --- a/eucrypt/crc32/lib/README false +++ b/eucrypt/crc32/lib/README 9d94157633efc225d43225560f2c97c32a2f4bdbc7bf669e98be90f32204227814e961b4db329dc7b52329b9c62baf206208cdbe9a9f0623853a3d62584a00a4 @@ -0,0 +1 @@ +placeholder diff -uNr a/eucrypt/crc32/obj/README b/eucrypt/crc32/obj/README --- a/eucrypt/crc32/obj/README false +++ b/eucrypt/crc32/obj/README 9d94157633efc225d43225560f2c97c32a2f4bdbc7bf669e98be90f32204227814e961b4db329dc7b52329b9c62baf206208cdbe9a9f0623853a3d62584a00a4 @@ -0,0 +1 @@ +placeholder diff -uNr a/eucrypt/crc32/restrict.adc b/eucrypt/crc32/restrict.adc --- a/eucrypt/crc32/restrict.adc false +++ b/eucrypt/crc32/restrict.adc b95a723d11a7e92eef47717d6871df27d1dd3863b9a9fa2b5fc135d31337e6cef78e774abb3d2c62ddca16df40e76251b193e9bba3273ea2cc2988b6955a123a @@ -0,0 +1,80 @@ +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- This file is part of 'CRC32' -- +-- -- +-- You do not have, nor can you ever acquire the right to use, copy or -- +-- distribute this software ; Should you use this software for any purpose, -- +-- or copy and distribute it to anyone or in any manner, you are breaking -- +-- the laws of whatever soi-disant jurisdiction, and you promise to -- +-- continue doing so for the indefinite future. In any case, please -- +-- always : read and understand any software ; verify any PGP signatures -- +-- that you use - for any purpose. -- +-- -- +-- See also http://trilema.com/2015/a-new-software-licensing-paradigm . -- +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + +pragma Restrictions(Immediate_Reclamation); +pragma Restrictions(Max_Asynchronous_Select_Nesting => 0); +pragma Restrictions(Max_Protected_Entries => 0); +pragma Restrictions(Max_Select_Alternatives => 0); +pragma Restrictions(Max_Task_Entries => 0); +pragma Restrictions(Max_Tasks => 0); +pragma Restrictions(No_Abort_Statements); +pragma Restrictions(No_Access_Parameter_Allocators); +pragma Restrictions(No_Allocators); +pragma Restrictions(No_Asynchronous_Control); +pragma Restrictions(No_Calendar); +pragma Restrictions(No_Coextensions); +pragma Restrictions(No_Default_Stream_Attributes); +pragma Restrictions(No_Delay); +pragma Restrictions(No_Dispatch); +pragma Restrictions(No_Dispatching_Calls); +pragma Restrictions(No_Dynamic_Attachment); +pragma Restrictions(No_Dynamic_Priorities); +pragma Restrictions(No_Entry_Calls_In_Elaboration_Code); +pragma Restrictions(No_Entry_Queue); +pragma Restrictions(No_Enumeration_Maps); +pragma Restrictions(No_Exception_Propagation); +pragma Restrictions(No_Exception_Registration); +pragma Restrictions(No_Finalization); +pragma Restrictions(No_Fixed_Io); +pragma Restrictions(No_Floating_Point); +pragma Restrictions(No_Implementation_Aspect_Specifications); +pragma Restrictions(No_Implementation_Units); +pragma Restrictions(No_Implicit_Conditionals); +pragma Restrictions(No_Implicit_Dynamic_Code); +pragma Restrictions(No_Implicit_Heap_Allocations); +pragma Restrictions(No_Implicit_Protected_Object_Allocations); +pragma Restrictions(No_Implicit_Task_Allocations); +pragma Restrictions(No_Initialize_Scalars); +pragma Restrictions(No_Local_Protected_Objects); +pragma Restrictions(No_Local_Timing_Events); +pragma Restrictions(No_Multiple_Elaboration); +pragma Restrictions(No_Nested_Finalization); +pragma Restrictions(No_Protected_Type_Allocators); +pragma Restrictions(No_Protected_Types); +pragma Restrictions(No_Relative_Delay); +pragma Restrictions(No_Requeue_Statements); +pragma Restrictions(No_Secondary_Stack); +pragma Restrictions(No_Select_Statements); +pragma Restrictions(No_Specific_Termination_Handlers); +pragma Restrictions(No_Standard_Allocators_After_Elaboration); +pragma Restrictions(No_Stream_Optimizations); +pragma Restrictions(No_Streams); +pragma Restrictions(No_Task_Allocators); +pragma Restrictions(No_Task_At_Interrupt_Priority); +pragma Restrictions(No_Task_Attributes_Package); +pragma Restrictions(No_Task_Hierarchy); +pragma Restrictions(No_Tasking); +pragma Restrictions(No_Task_Termination); +pragma Restrictions(No_Terminate_Alternatives); +pragma Restrictions(No_Unchecked_Access); +pragma Restrictions(No_Unchecked_Conversion); +pragma Restrictions(No_Unchecked_Deallocation); +pragma Restrictions(No_Wide_Characters); +pragma Restrictions(Pure_Barriers); +pragma Restrictions(Simple_Barriers); +pragma Restrictions(Static_Priorities); +pragma Restrictions(Static_Storage_Size); +pragma Validity_Checks(ALL_CHECKS); diff -uNr a/eucrypt/crc32/tests/obj/README b/eucrypt/crc32/tests/obj/README --- a/eucrypt/crc32/tests/obj/README false +++ b/eucrypt/crc32/tests/obj/README 50f9b127e6ae2019779520d8998bea7f559496b1847c7c66b6ce6a6f3fc20db67d45f1fbf7a9318c86ebba0694db73de168f409d8328a751f3104c1474a83a0d @@ -0,0 +1 @@ +obj diff -uNr a/eucrypt/crc32/tests/test_crc32.adb b/eucrypt/crc32/tests/test_crc32.adb --- a/eucrypt/crc32/tests/test_crc32.adb false +++ b/eucrypt/crc32/tests/test_crc32.adb 517c943163381e304ec2fba2bf3fee8c7e7ebebbdec618db613f94f9abd3deb6df1ccf061e2fb55ddba367ad34924ccb53eed35a1e2240fdb6a1003ed6023f98 @@ -0,0 +1,39 @@ +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- This file is part of 'CRC32' -- +-- -- +-- You do not have, nor can you ever acquire the right to use, copy or -- +-- distribute this software ; Should you use this software for any purpose, -- +-- or copy and distribute it to anyone or in any manner, you are breaking -- +-- the laws of whatever soi-disant jurisdiction, and you promise to -- +-- continue doing so for the indefinite future. In any case, please -- +-- always : read and understand any software ; verify any PGP signatures -- +-- that you use - for any purpose. -- +-- -- +-- See also http://trilema.com/2015/a-new-software-licensing-paradigm . -- +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + -- Basic test for the CRC32 implementation + -- S.MG, 2018 + +with Ada.Text_IO; use Ada.Text_IO; +with Interfaces; use Interfaces; +with CRC32; + +procedure Test_CRC32 is + Input : constant String := "123456789"; + Expected : constant Unsigned_32 := 16#CBF4_3926#; + Output : Unsigned_32; +begin + Output := CRC32.CRC(Input); + if Output /= Expected then + Put_Line("FAIL: CRC32(" & Input & ") returned " & + Unsigned_32'Image(Output) & " instead of " & + Unsigned_32'Image(Expected)); + else + Put_Line("PASS: CRC32(" & Input & ") returned " & + Unsigned_32'Image(Output) & " as expected."); + end if; + +end Test_CRC32; diff -uNr a/eucrypt/crc32/tests/test_crc32_edge.adb b/eucrypt/crc32/tests/test_crc32_edge.adb --- a/eucrypt/crc32/tests/test_crc32_edge.adb false +++ b/eucrypt/crc32/tests/test_crc32_edge.adb c4b3ee6ba2ca9f80d36d2e5c04b75a1ece625a24a4782a76521e07de7dd8803e3bcdb0380c9ea723b4a5801856298a47cf691088c05b903e6cffa2a53b2edd38 @@ -0,0 +1,67 @@ +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ +-- This file is part of 'CRC32' -- +-- -- +-- You do not have, nor can you ever acquire the right to use, copy or -- +-- distribute this software ; Should you use this software for any purpose, -- +-- or copy and distribute it to anyone or in any manner, you are breaking -- +-- the laws of whatever soi-disant jurisdiction, and you promise to -- +-- continue doing so for the indefinite future. In any case, please -- +-- always : read and understand any software ; verify any PGP signatures -- +-- that you use - for any purpose. -- +-- -- +-- See also http://trilema.com/2015/a-new-software-licensing-paradigm . -- +------------------------------------------------------------------------------ +------------------------------------------------------------------------------ + + -- Edge testing for the CRC32 implementation + -- S.MG, 2018 + +with Ada.Text_IO; use Ada.Text_IO; +with Interfaces; use Interfaces; +with CRC32; + + +procedure Test_CRC32_Edge is + Empty : constant Character := Character'Val(0); + Full : constant Character := Character'Val(16#FF#); + + S0 : String := Empty & Empty & Empty & Empty; + S255 : String := Full & Full & Full & Full; + + S0F : String := Character'Val(16#0F#) & Character'Val(16#0F#); + SF0 : String := Character'Val(16#F0#) & Character'Val(16#F0#); + + C : CRC32.CRC32 := 0; +begin + -- First some tests, independent of the bit order + C := CRC32.CRC(S0); + pragma Assert(C = 558161692, + "Test_CRC32_Edge - assert 1 - C is " & CRC32.CRC32'Image(C) + & " should be 558161692"); + C := CRC32.CRC(S255); + pragma Assert(C = 16#FFFFFFFF#, + "Test_CRC32_Edge - assert 2 - C is " & CRC32.CRC32'Image(C) + & " should be 4294967295"); + C := CRC32.CRC(S0(1 .. 1)); + pragma Assert(C = 3523407757, + "Test_CRC32_Edge - assert 3 - C is " & CRC32.CRC32'Image(C) + & " should be 3523407757"); + C := CRC32.CRC(S0(1 .. 2)); + pragma Assert(C = 1104745215, + "Test_CRC32_Edge - assert 4 - C is " & CRC32.CRC32'Image(C) + & " should be 1104745215"); + + -- The bitorder in CRC32 is reversed, check if implemented correctly + C := CRC32.CRC(S0F); + pragma Assert(C = 1459491745, + "Test_CRC32_Edge - assert 5 - C is " & CRC32.CRC32'Image(C) + & " should be 1459491745"); + + C := CRC32.CRC(SF0); + pragma Assert(C = 3906470238, + "Test_CRC32_Edge - assert 6 - C is " & CRC32.CRC32'Image(C) + & " should be 3906470238"); + + +end Test_CRC32_Edge; diff -uNr a/eucrypt/crc32/tests/tests.gpr b/eucrypt/crc32/tests/tests.gpr --- a/eucrypt/crc32/tests/tests.gpr false +++ b/eucrypt/crc32/tests/tests.gpr b84e3e12c1c108ef129e9890a345695daeec14639f57f493a033ee23c62fb1fe7b9bb6eeb08016fd2de63d44e062df167fcaa4367c5870b6f0e7348917a9c16b @@ -0,0 +1,24 @@ + -- Tests project for CRC32 lib + -- S.MG, 2018 + +with "../crc32.gpr"; + +project Tests is + + for Object_Dir use "obj"; + + for Languages use ("Ada"); + for Source_Dirs use ("."); + for Exec_Dir use "."; + + for Main use ("test_crc32.adb", "test_crc32_edge.adb"); + + package Compiler is + for Switches ("Ada") + use ("-O2", "-fdump-scos", "-gnata", "-fstack-check", + "-gnatyd", "-gnatym", + "-fdata-sections", "-ffunction-sections", "-gnatwr", "-gnatw.d", + "-gnatec=" & CRC32'Project_Dir & "restrict.adc"); + end Compiler; + +end Tests; diff -uNr a/eucrypt/eucrypt.gpr b/eucrypt/eucrypt.gpr --- a/eucrypt/eucrypt.gpr 94d4fb2c29f384693f39a994b26a95276ea949c1bfcca5d438581dd8ee609e400606b3fa59a413a5e330bd7781ca82f668d8c4db2eac6eecd67bc4529067d786 +++ b/eucrypt/eucrypt.gpr 67129dd316e51707e7b681281ca0b6be6bfb8f6838e7b64f7a590463148100b316999cc0b6d7e8fcea723de70dee5efa88952094287646cfe6d2c15e600401ec @@ -6,7 +6,8 @@ "smg_bit_keccak/smg_bit_keccak.gpr", "smg_keccak/smg_keccak.gpr", "smg_rsa/smg_rsa.gpr", - "smg_serpent/smg_serpent.gpr"); + "smg_serpent/smg_serpent.gpr", + "crc32/crc32.gpr"); for Library_Name use "EuCrypt"; for Library_Kind use "static"; diff -uNr a/eucrypt/manifest b/eucrypt/manifest --- a/eucrypt/manifest 36dd3853f41604790d69b6db28d86933a068b0f5d64cf2224e7fd3371497e21a92b0dbb84e4367b112c55f57f35a6ec076a8e04729ea7fd8f87bbd79d846c95d +++ b/eucrypt/manifest 2a4614fc51ea98bbbb2615f7854637f84c278724ffb6468aa0d140c7b4ebec5d8c590ad3f5540690c7916e52b0c914ebe627e6e4b0b6a1b237cd47702d9cb2d1 @@ -18,4 +18,4 @@ 521090 eucrypt_ch13_smg_rng diana_coman Adds methods for obtaining random values directly from bits obtained from the entropy source. Following specific types are supported: unsigned int on 32 bits, unsigned int on 64 bits, dirty float between 0 and 1, float IEEE 754/1985 between 1 and 2. 527560 eucrypt_manifest diana_coman Adds this manifest file that should be modified each time a new patch is added to EuCrypt. 543780 eucrypt_fix_256 diana_coman Fix the error in smg_oaep.adb that used 255 instead of 256 when calculating/retrieving length stored on 2 octets. - +545451 eucrypt_crc32_div ave1 An alternative simple implementation of the CRC32 checsum using modulo 2 division (XOR).