diff -uNr a/eucrypt/README b/eucrypt/README --- a/eucrypt/README a976f2c32be38e652bca4baa0963329a25131672730379a949ea701e3e34d0cf6c48aabb42ad61a2741fddf2c5e24b8f878f63ad23672bdc9f0d4b7ba164e07d +++ b/eucrypt/README 82f1271903c039ffba8620c425beb86cb3e0b585d1b6ec61ff2ecb79f60eb7700093eee06760b24745710036a541381a33fd262f05d1d4f561851044a6d39cdb @@ -1,5 +1,11 @@ This is the EuCrypt library that Eulora server (S.MG) uses for its communication needs. +To compile the whole EuCrypt library, simply run in the eucrypt folder (the -O3 switch is needed for specifying optimisation level for Serpent - if you don't care about that, you can skip this switch): +gprbuild -O3 + +To cleanup (recursively), simply run in the eucrypt folder: +gprclean -r + To understand EuCrypt, start from http://www.dianacoman.com/2017/12/07/introducing-eucrypt/ Components: @@ -23,6 +29,3 @@ RSA implementation using TMSR specification. Implemented in C. -6. smg_comm - Communications for Eulora (server <-> client). Relies on all the other components. - diff -uNr a/eucrypt/eucrypt.gpr b/eucrypt/eucrypt.gpr --- a/eucrypt/eucrypt.gpr false +++ b/eucrypt/eucrypt.gpr 94d4fb2c29f384693f39a994b26a95276ea949c1bfcca5d438581dd8ee609e400606b3fa59a413a5e330bd7781ca82f668d8c4db2eac6eecd67bc4529067d786 @@ -0,0 +1,16 @@ + -- S.MG, 2018 + +aggregate library project EuCrypt is + for Project_Files use ( + "mpi/mpi.gpr", + "smg_bit_keccak/smg_bit_keccak.gpr", + "smg_keccak/smg_keccak.gpr", + "smg_rsa/smg_rsa.gpr", + "smg_serpent/smg_serpent.gpr"); + + for Library_Name use "EuCrypt"; + for Library_Kind use "static"; + + for Library_Dir use "lib"; +end EuCrypt; + diff -uNr a/eucrypt/lib/README b/eucrypt/lib/README --- a/eucrypt/lib/README false +++ b/eucrypt/lib/README f829705d787e0de60b165ccd6be182b11c11bc80e43b3b536a2062a7247b102a9ec8906e3d48c0d7ec71d6757678fd573728d12ef3fd3ae2da9924b7593bc581 @@ -0,0 +1 @@ +S.MG, 2018 diff -uNr a/eucrypt/mpi/Makefile b/eucrypt/mpi/Makefile --- a/eucrypt/mpi/Makefile 602e3b72a508c925a7c892db33a87a5183755d4e1413c8237dc368f49cf21e92728f65ec419b50245693588fd73f72e8f74632ada327390533b6c02523172402 +++ b/eucrypt/mpi/Makefile false @@ -1,26 +0,0 @@ -PROGRAM = mpi.a - -BUILD=obj -DIST=bin - -CXX = gcc -OBJECTS = $(addprefix $(BUILD)/, $(patsubst %.c,%.o,$(wildcard *.c))) -FLAGS = -g -Wall -INCLUDE = -I include - -.SUFFIXES: .o .c - -$(BUILD)/%.o: - $(CXX) $(FLAGS) $(INCLUDE) -c $*.c -o $@ - -all: $(PROGRAM) - -$(PROGRAM): $(OBJECTS) - ar rcs $(DIST)/$(PROGRAM) $(OBJECTS) - #ld -o $(DIST)/$(PROGRAM).o $(OBJECTS) -lc - -clean : - rm -rf nul core *flymake* $(BUILD)/*.o $(DIST)/$(PROGRAM) *~ bin/* - -check-syntax: - $(CXX) -c $(FLAGS) $(INCLUDE) -o nul -Wall -S $(CHK_SOURCES) diff -uNr a/eucrypt/mpi/README b/eucrypt/mpi/README --- a/eucrypt/mpi/README 9e9083c3afa2a9b5528ace65cfd5ab71dcf1b6ff27c4a6cb72fd3ecebd1ae1f88133ea40ab6bef2438375e8b93452afd01e831bb628d7576ca21854650d1e5ef +++ b/eucrypt/mpi/README 65a8797e0181e25a392820473f105126ffd8c5dd0fa57011d04ff984e852f7e338ee6fbda3c5fa176f1021b404e4712005aa9fc4d25041d924611f09d539074a @@ -8,11 +8,12 @@ SHA512(gnupg-1.4.10.tar.gz) : d037041d2e6882fd3b999500b5a7b42be2c224836afc358e1f8a2465c1b74473d518f185b7c324b2c8dec4ffb70e9e34a03c94d1a54cc55d297f40c9745f6e1b -DEMO: +Recommended compilation: +1) gprbuild mpi.gpr -1) make +Tests: 2) cd tests -3) make +3) gprbuild 4) ./test_mpi 5) output is: 37A063D056817668C7AA3418F29 diff -uNr a/eucrypt/mpi/bin/README b/eucrypt/mpi/bin/README --- a/eucrypt/mpi/bin/README 15f92b08b27c8218ff3311087efb3cfde38a237f153b1708f4011fa1e14c0a21543720156b24e037bde2e43b02e8f3962a17689b6ca9e7ada38f84b40584eb59 +++ b/eucrypt/mpi/bin/README f829705d787e0de60b165ccd6be182b11c11bc80e43b3b536a2062a7247b102a9ec8906e3d48c0d7ec71d6757678fd573728d12ef3fd3ae2da9924b7593bc581 @@ -1 +1 @@ -bin folder for mpi lib +S.MG, 2018 diff -uNr a/eucrypt/mpi/mpi.gpr b/eucrypt/mpi/mpi.gpr --- a/eucrypt/mpi/mpi.gpr false +++ b/eucrypt/mpi/mpi.gpr 9f5e8e039129a65969e8e89ed17dfa033676d406e8e872fd9f47fac0bc207acce55201d257671b39e46dc90909109588398005f5db9b1fda3cdf3a97cf434f99 @@ -0,0 +1,13 @@ +-- S.MG, 2018 + +project MPI is + for Languages use ("C"); + for Library_Name use "MPI"; + for Library_Kind use "static"; + + for Source_Dirs use (".", "include"); + for Object_Dir use "obj"; + for Library_Dir use "bin"; + +end MPI; + diff -uNr a/eucrypt/mpi/obj/README b/eucrypt/mpi/obj/README --- a/eucrypt/mpi/obj/README a2dfde45e25a7451ba7b26d345c4a422883a52d65b3f54d5890cd3e5b5d57e50c74f87ae20831d160f9e061500acd8775f61c5984e8d9370c308c7a3c34c2145 +++ b/eucrypt/mpi/obj/README f829705d787e0de60b165ccd6be182b11c11bc80e43b3b536a2062a7247b102a9ec8906e3d48c0d7ec71d6757678fd573728d12ef3fd3ae2da9924b7593bc581 @@ -1 +1 @@ -obj \ No newline at end of file +S.MG, 2018 diff -uNr a/eucrypt/mpi/tests/Makefile b/eucrypt/mpi/tests/Makefile --- a/eucrypt/mpi/tests/Makefile e613a174af5f4db157c16d4e5780b5ee563d8dda28821af7459162a1c01f0a6f12d18c23da54bf6f2a3a6287b174e6c28cc321aa5e167087617cb5fbd8462e8c +++ b/eucrypt/mpi/tests/Makefile false @@ -1,24 +0,0 @@ -PROGRAM = test_mpi - -CXX = gcc -OBJECTS := $(patsubst %.c,%.o,$(wildcard *.c)) -FLAGS = -g -Wall -INCLUDE = -I ../include -MPI = ../bin/mpi.a -LIBS := $(MPI) - -.SUFFIXES: .o .c - -.c.o: - $(CXX) $(FLAGS) $(INCLUDE) -c $< -o $@ - -all: $(PROGRAM) - -$(PROGRAM): $(OBJECTS) - $(CXX) $(FLAGS) $(INCLUDE) -o $(PROGRAM) $(OBJECTS) $(LIBS) - -clean : - rm -rf nul core *flymake* *.o $(PROGRAM) *~ bin obj - -check-syntax: - $(CXX) -c $(FLAGS) $(INCLUDE) -o nul -Wall -S $(CHK_SOURCES) diff -uNr a/eucrypt/mpi/tests/README b/eucrypt/mpi/tests/README --- a/eucrypt/mpi/tests/README false +++ b/eucrypt/mpi/tests/README 0c71b67054a6b49a19c3f8c03751bd4d537843986814b8b970f6a127251e78042bb8da1af5f33d335e69322a7878d33d2a8c50da2956e629eb0a32846258de4e @@ -0,0 +1,8 @@ + S.MG, 2018 + +Building: +gprbuild + +Cleaning: +gprclean + diff -uNr a/eucrypt/mpi/tests/obj/README b/eucrypt/mpi/tests/obj/README --- a/eucrypt/mpi/tests/obj/README false +++ b/eucrypt/mpi/tests/obj/README f829705d787e0de60b165ccd6be182b11c11bc80e43b3b536a2062a7247b102a9ec8906e3d48c0d7ec71d6757678fd573728d12ef3fd3ae2da9924b7593bc581 @@ -0,0 +1 @@ +S.MG, 2018 diff -uNr a/eucrypt/mpi/tests/test_mpi.gpr b/eucrypt/mpi/tests/test_mpi.gpr --- a/eucrypt/mpi/tests/test_mpi.gpr false +++ b/eucrypt/mpi/tests/test_mpi.gpr a29b3f2a6d20f115e9150134305105fb5a21567355ece0ddc3e3cfbd3b752d6d6fbfdbb97533f568e75898f04a01cbb555df566b1117b1fee5711a7912e0b29d @@ -0,0 +1,14 @@ +-- S.MG, 2018 + +with "../mpi.gpr"; + +project test_MPI is + for Languages use ("C"); + + for Source_Dirs use ("."); + for Object_Dir use "obj"; + for Exec_Dir use "."; + + for Main use ("test_mpi.c"); +end test_MPI; + diff -uNr a/eucrypt/smg_bit_keccak/tests/smg_bit_keccak_test.gpr b/eucrypt/smg_bit_keccak/tests/smg_bit_keccak_test.gpr --- a/eucrypt/smg_bit_keccak/tests/smg_bit_keccak_test.gpr 112b5599ee6c96f9a6c2cbc3d4d84c3aff5470794b0560d2c59820cb83b5d20f33f030a4b328fd7c5dbceab7adebdfc08c66ffdf722e097040deb2ac3bd95618 +++ b/eucrypt/smg_bit_keccak/tests/smg_bit_keccak_test.gpr aea2f74ec396ac47169e21dce960128bc544aa7be733be29a7932b17c22c80d4ce7cae2806c9e451abfd7fe880e27682355d006940a757149a62acec56839980 @@ -1,9 +1,10 @@ -- Tests for SMG_Bit_Keccak (part of EuCrypt) -- S.MG, 2018 +with "../smg_bit_keccak.gpr"; project SMG_Bit_Keccak_Test is - for Source_Dirs use (".", "../"); + for Source_Dirs use ("."); for Object_Dir use "obj"; for Exec_Dir use "."; diff -uNr a/eucrypt/smg_comm/README b/eucrypt/smg_comm/README --- a/eucrypt/smg_comm/README fe2917ef90a8e9deb4d9f7450cbbc20fdf3ca9f76630b6956137b4648916e143c89f857e0bf0fde968fd241f3049050ef7f146254a9e8daead54fc0b720c7620 +++ b/eucrypt/smg_comm/README false @@ -1,2 +0,0 @@ -S.MG, 2017 - diff -uNr a/eucrypt/smg_keccak/smg_oaep.adb b/eucrypt/smg_keccak/smg_oaep.adb --- a/eucrypt/smg_keccak/smg_oaep.adb 6f76c1a956f79131d310ec0ac023f10febd27376c54d01332ee47b623904816f6469e483b575b86a8f0b568ee224e9812a8ff3d665d891512d2c8bfa3124bac4 +++ b/eucrypt/smg_keccak/smg_oaep.adb fa02cb033ad63404d8e721c3eeabcf7775e42b1553cfd3e07d6f91fc67e307ac2dd754fb4009f56ce7c38b62aa32564ec309dfd69c4ecf09cf8db46742390c00 @@ -2,6 +2,37 @@ package body SMG_OAEP is + -- This copies first Len characters from A to the first Len positions in S + -- NB: this does NOT allocate /check memory! + -- Caller has to ensure that: + -- S has space for at least Len characters + -- A has at least Len characters + procedure Char_Array_To_String( A : in Interfaces.C.char_array; + Len : in Natural; + S : out String) is + begin + for Index in 0 .. Len - 1 loop + S( S'First + Index ) := Character( A( Interfaces.C.size_t( Index ))); + end loop; + end Char_Array_To_String; + + -- This copies first Len characters from S to the first Len positions in A + -- NB: there are NO checks or memory allocations here! + -- Caller has to make sure that: + -- S'Length >= Len + -- A has allocated space for at least Len characters + procedure String_To_Char_Array( S : in String; + Len : in Natural; + A : out Interfaces.C.char_array) is + C : Character; + begin + for Index in 0 .. Len - 1 loop + C := S( S'First + Index ); + A( Interfaces.C.size_t( Index )) := Interfaces.C.Char( C ); + end loop; + end String_To_Char_Array; + + procedure HashKeccak( Input : in String; Output : out String; Block_Len : in Keccak_Rate := Default_Bitrate) is @@ -13,23 +44,21 @@ ToString( BOut, Output ); end HashKeccak; - function Hash( Input : Interfaces.C.Char_Array; - LenIn : Interfaces.C.size_t; - LenOut : Interfaces.C.size_t; - Block_Len : Interfaces.C.int := Default_Bitrate) - return Interfaces.C.Char_Array is - AdaLenIn : Natural := Natural(LenIn); - AdaLenOut : Natural := Natural(LenOut); - InStr : String( 0 .. AdaLenIn-1 ) := (others => '0'); - OutStr : String( 0 .. AdaLenOut-1 ) := (others => '0'); - COut : Interfaces.C.Char_Array( 0 .. LenOut-1 ); - Count : Natural := AdaLenOut; - CCount : Interfaces.C.size_t := LenOut; - begin - Interfaces.C.To_Ada( Input, InStr, AdaLenIn ); - HashKeccak( InStr, OutStr, Keccak_Rate(Block_Len) ); - Interfaces.C.To_C( OutStr, COut, CCount ); - return COut; + procedure Hash( Input : in Interfaces.C.Char_Array; + LenIn : in Interfaces.C.size_t; + LenOut : in Interfaces.C.size_t; + Output : out Interfaces.C.Char_Array) is + AdaLenIn : Natural := Natural( LenIn ); + AdaLenOut : Natural := Natural( LenOut ); + InStr : String( 1 .. AdaLenIn ) := (others => '0'); + OutStr : String( 1 .. AdaLenOut ) := (others => '0'); + Block_Len : Keccak_Rate := Default_Bitrate; + begin +-- Interfaces.C.To_Ada( Input, InStr, AdaLenIn ); + Char_Array_To_String( Input, AdaLenIn, InStr ); + HashKeccak( InStr, OutStr, Block_Len ); + String_To_Char_Array( OutStr, AdaLenOut, Output ); +-- Interfaces.C.To_C( OutStr, COut, CCount ); end Hash; -- conversion between types @@ -146,6 +175,78 @@ end OAEP_Encrypt; + procedure OAEP_Encrypt_C( Msg : in Interfaces.C.char_array; + MsgLen : in Interfaces.C.size_t; + Entropy : in Interfaces.C.char_array; + EntLen : in Interfaces.C.size_t; + Encr : out Interfaces.C.char_array; + EncrLen : in Interfaces.C.size_t; + Success : out Interfaces.C.Int) is + AdaMsgLen : Natural := Natural( MsgLen ); + AdaEntLen : Natural := Natural( EntLen ); + AdaEncrLen : Natural := Natural( EncrLen ); + AdaMsg : String( 1 .. AdaMsgLen ); + AdaEntBlock: OAEP_Block; + AdaResult : OAEP_Block := ( others => '0' ); + begin + Success := 0; + -- check there is enough entropy and enoug output space, fail otherwise + if AdaEntLen /= AdaEntBlock'Length or AdaEncrLen < AdaResult'Length then + return; + end if; + -- translate to Ada + --Interfaces.C.To_Ada( Msg, AdaMsg, AdaMsgLen ); + Char_Array_To_String( Msg, AdaMsgLen, AdaMsg ); + --Interfaces.C.To_Ada( Entropy, AdaEntropy, AdaEntLen ); + Char_Array_To_String( Entropy, AdaEntLen, AdaEntBlock ); + + -- call the actual oaep encrypt + OAEP_Encrypt( AdaMsg, AdaEntBlock, AdaResult ); + + -- translate back to C, set success flag and return + --Interfaces.C.To_C( AdaResult, CEncr, CEncrLen, False ); + -- EncrLen has already been tested to be at least AdaResult'Length + String_To_Char_Array( AdaResult, AdaEncrLen, Encr ); + Success := 1; + + end OAEP_Encrypt_C; + + procedure oaep_decrypt_c( Encr : in Interfaces.C.Char_Array; + EncrLen : in Interfaces.C.Int; + Decr : out Interfaces.C.Char_Array; + DecrLen : in out Interfaces.C.Int; + Success : out Interfaces.C.Int) is + AdaDecr : OAEP_HALF := ( others => '0' ); + AdaEncr : OAEP_Block:= ( others => '0' ); + AdaEncrLen : Natural := Natural( EncrLen ); + AdaDecrLen : Natural := 0; + AdaFlag : Boolean; + begin + -- check and set success flag/exit if needed + Success := 0; + if EncrLen /= OAEP_Block'Length then + return; + end if; + + -- translate to Ada: copy octet by octet as C.To_Ada is problematic + -- Interfaces.C.To_Ada( Encr, AdaEncr, AdaEncrLen, False ); + Char_Array_To_String( Encr, AdaEncrLen, AdaEncr ); + + -- actual decrypt + OAEP_Decrypt( AdaEncr, AdaDecrLen, AdaDecr, AdaFlag ); + + -- translate back to C + AdaDecrLen := AdaDecrLen / 8; -- from bits to octets + if AdaFlag and + Natural( DecrLen ) >= AdaDecrLen and + AdaDecr'Length >= AdaDecrLen then + Success := 1; + DecrLen := Interfaces.C.Int( AdaDecrLen ); + -- Interfaces.C.To_C( AdaDecr, Decr, AdaDecrLen ); + String_To_Char_Array( AdaDecr, AdaDecrLen, Decr ); + end if; + end oaep_decrypt_c; + procedure OAEP_Decrypt( Encr : in OAEP_Block; Len : out Natural; Output : out OAEP_HALF; diff -uNr a/eucrypt/smg_keccak/smg_oaep.ads b/eucrypt/smg_keccak/smg_oaep.ads --- a/eucrypt/smg_keccak/smg_oaep.ads 64e606c3f54ee3585735c6b2050a7c2262af782632635616eb363a9dd6a48e4c43afead5370da655644b4194e2f974d936af97f4425c568ec382e23d747d40f3 +++ b/eucrypt/smg_keccak/smg_oaep.ads ec569ae6ee3890ad5acef443ceac290fe43c084515ff09f60a65ad07dfc147bd858b2e2aea5f0c687673f6ede25ac6ea8eef145cedac6359f227d2225d808965 @@ -14,12 +14,33 @@ OAEP_LENGTH_OCTETS : constant := 512; OAEP_HALF_OCTETS : constant := OAEP_LENGTH_OCTETS / 2; TMSR : constant String := "TMSR-RSA"; - MAX_LEN_MSG : constant := OAEP_HALF_OCTETS - TMSR'Length - 3; + MAX_LEN_MSG : constant Natural := OAEP_HALF_OCTETS - TMSR'Length - 3; + pragma Export( C, MAX_LEN_MSG, "max_len_msg"); -- to be accessed from rsa.c -- subtypes used by the OAEP encrypt/decrypt subtype OAEP_Block is String( 1 .. OAEP_LENGTH_OCTETS ); subtype OAEP_HALF is String( 1 .. OAEP_HALF_OCTETS ); + -- copy from Ada String to C char array and back, octet by octet + + -- This copies first Len characters from A to the first Len positions in S + -- NB: this does NOT allocate /check memory! + -- Caller has to ensure that: + -- S has space for at least Len characters + -- A has at least Len characters + procedure Char_Array_To_String( A : in Interfaces.C.char_array; + Len : in Natural; + S : out String); + + -- This copies first Len characters from S to the first Len positions in A + -- NB: there are NO checks or memory allocations here! + -- Caller has to make sure that: + -- S'Length >= Len + -- A has allocated space for at least Len characters + procedure String_To_Char_Array( S : in String; + Len : in Natural; + A : out Interfaces.C.char_array); + -- padding & formatting of maximum 1960 bits of the given String -- uses TMSR's OAEP schema: -- 1.format M00 as: [random octet][sz1][sz2]"TMSR-RSA"[random]*Message @@ -32,9 +53,25 @@ -- NB: the Entropy parameter should be random octets from which this method -- will use as many as required for the OAEP encryption of given Msg -- NB: at MOST MAX_LEN_MSG octets of Msg! (Msg at most 1960 bits) - procedure OAEP_Encrypt( Msg : in String; - Entropy : in OAEP_Block; - Output : out OAEP_Block); + procedure OAEP_Encrypt( Msg : in String; + Entropy : in OAEP_Block; + Output : out OAEP_Block); + + + -- wrapper of oaep_encrypt for direct use from C + -- NB: caller HAS TO provide the length of the Message (parameter LenMsg) + -- NB: caller HAS TO provide the length of the Entropy (parameter LenEnt) + -- NB: caller HAS TO provide the allocated space for result (LenEncr) + -- NB: LenEncr HAS TO be at least OAEP_LENGTH_OCTETS! + -- NB: LenEnt HAS TO be at least OAEP_LENGTH_OCTETS or this will FAIL! + procedure OAEP_Encrypt_C( Msg : in Interfaces.C.char_array; + MsgLen : in Interfaces.C.size_t; + Entropy : in Interfaces.C.char_array; + EntLen : in Interfaces.C.size_t; + Encr : out Interfaces.C.char_array; + EncrLen : in Interfaces.C.size_t; + Success : out Interfaces.C.Int); + pragma Export( C, OAEP_Encrypt_C, "oaep_encrypt_c" ); -- This is the opposite of OAEP_Encrypt above. -- @param Encr - an OAEP block previously obtained from OAEP_Encrypt @@ -47,6 +84,14 @@ Output : out OAEP_HALF; Success : out Boolean); + -- wrapper for use from C + procedure oaep_decrypt_c( Encr : in Interfaces.C.Char_Array; + EncrLen : in Interfaces.C.Int; + Decr : out Interfaces.C.Char_Array; + DecrLen : in out Interfaces.C.Int; + Success : out Interfaces.C.Int); + pragma Export( C, oaep_decrypt_c, "oaep_decrypt_c"); + -- helper method, xor on strings -- NB: only Output'Length bits will be considered from S1 and S2 -- NB: caller is responsible for S1 and S2 being long enough! @@ -73,20 +118,17 @@ Output : out String; Block_Len : in Keccak_Rate := Default_Bitrate); - -- wrapper for calling from C + -- wrapper for calling Keccak hashing from C, with DEFAULT bitrate -- @param Input the input string, as array of characters (C style) - -- @param LenIn the length of the input string (as number of BITS) - -- @param LenOut the desired number of bits to be returned as output - -- @param Block_Len the bitrate used by the Keccak sponge (number of BITS) - -- @return an array of characters with first LenOut bits set to Keccak output - + -- @param LenIn the length of the input string (as number of OCTETS) + -- @param LenOut the desired number of OCTETS to be returned as output + -- @param Output array of at least LenOut characters; will contain the hash -- NB: caller HAS TO provide the length of the Input (parameter LenIn) -- NB: caller HAS TO provide the length of the Output (parameter LenOut) - function Hash( Input : Interfaces.C.Char_Array; - LenIn : Interfaces.C.size_t; - LenOut : Interfaces.C.size_t; - Block_Len : Interfaces.C.int := Default_Bitrate) - return Interfaces.C.Char_Array; + procedure Hash( Input : in Interfaces.C.Char_Array; + LenIn : in Interfaces.C.size_t; + LenOut : in Interfaces.C.size_t; + Output : out Interfaces.C.Char_Array); pragma Export( C, Hash, "hash" ); end SMG_OAEP; diff -uNr a/eucrypt/smg_keccak/tests/smg_keccak_test.gpr b/eucrypt/smg_keccak/tests/smg_keccak_test.gpr --- a/eucrypt/smg_keccak/tests/smg_keccak_test.gpr e6f6edb899b7070b7bd14ef2e76daab49ac6e098aad88d9fae8adb63c4153361f3cda7e98261a87b0cc12e5dcc6c44eea5b6226a917f724526d5696102397a4b +++ b/eucrypt/smg_keccak/tests/smg_keccak_test.gpr 599135ac2e7cdf4489f38017d97a89aae83df9d4849e8c78430a46b830a75e93b9fb01c3f802208abf85a492d060b770205ff02136371a08de55d7d351ed2b3e @@ -1,9 +1,10 @@ -- Tests for SMG_Keccak (part of EuCrypt) -- S.MG, 2018 +with "../smg_keccak.gpr"; project SMG_Keccak_Test is - for Source_Dirs use (".", "../"); + for Source_Dirs use ("."); for Object_Dir use "obj"; for Exec_Dir use "."; diff -uNr a/eucrypt/smg_rsa/Makefile b/eucrypt/smg_rsa/Makefile --- a/eucrypt/smg_rsa/Makefile 8ebd567a5f4b3c1a8aabcca0501ed2d4eb3c4eadb593f99ce07c8fe7c1dfb9879ec8457c7125d99cbda9ceb9d8e3eab7931f0a4879e33344df6e0904e489faea +++ b/eucrypt/smg_rsa/Makefile false @@ -1,27 +0,0 @@ -PROGRAM = smg_rsa.a - -BUILD=obj -DIST=bin - -CXX = gcc -OBJECTS = $(addprefix $(BUILD)/, $(patsubst %.c,%.o,$(wildcard *.c))) -MPI = ../mpi -FLAGS = -g -Wall -INCLUDE = -I include -I $(MPI)/include - -.SUFFIXES: .o .c - -$(BUILD)/%.o: - $(CXX) $(FLAGS) $(INCLUDE) -c $*.c -o $@ - -all: $(PROGRAM) - -$(PROGRAM): $(OBJECTS) - ar rcs $(DIST)/$(PROGRAM) $(OBJECTS) - #ld -o $(DIST)/$(PROGRAM).o $(OBJECTS) -lc - -clean : - rm -rf nul core *flymake* $(BUILD)/*.o $(DIST)/$(PROGRAM) *~ bin/* - -check-syntax: - $(CXX) -c $(FLAGS) $(INCLUDE) -o nul -Wall -S $(CHK_SOURCES) diff -uNr a/eucrypt/smg_rsa/README b/eucrypt/smg_rsa/README --- a/eucrypt/smg_rsa/README abc69adfa42130e5269734f91c5f3f61f4c42055e27e9ea4b8b664801f2dc83b8a5ed6c6e339982805b4ffdda8548cc61d8fd6cf3fdfeeeec77324f6d95c54d0 +++ b/eucrypt/smg_rsa/README c4e10d617469ed871477b2ef41af5dfe7830f97a85b8a5034d2e2c9806202462a566ee6a0412c8a5245cf17fde5e84ca7f6b1ac864adfcb0843e6f4d8f26f571 @@ -3,3 +3,10 @@ This is the S.MG implementation of RSA, used by the Eulora server. NB: this lib is part of EuCrypt and as such, it relies on other EuCrypt components (most notably: mpi). + +Compilation: +gprbuild + +Tests: +cd tests +gprbuild diff -uNr a/eucrypt/smg_rsa/include/smg_rsa.h b/eucrypt/smg_rsa/include/smg_rsa.h --- a/eucrypt/smg_rsa/include/smg_rsa.h f0d2ac0848e2e2b0ef2826f5e5d747a4e9a8fc20b79c2fccdb02b390c14f2b1b59902024f294e28710844f6b3512537c23f9b46b887015f4556c8c31262ccff4 +++ b/eucrypt/smg_rsa/include/smg_rsa.h 8ce351dc40192ae3425d230be59b8b487b9a206d2ae0747f87b09e00ccdf14898876877c68a6ea9e2c382b90220401b1ec4925f59906e77895c4a499827751f1 @@ -15,6 +15,27 @@ */ static const int KEY_LENGTH_OCTETS = 512; +/* + * This is the maximum length of a plain-text message (in octets) that can be + * oeap+rsa encrypted in a single block. Its value is defined in smg_oaep.ads + */ +extern int max_len_msg; + +/* + * ada-exported oaep encrypt + */ +extern void oaep_encrypt_c( char* msg, int msglen, + char* entropy, int entlen, + char* encr, int encrlen, + int* success); + +/* + * ada-exported oaep decrypt + */ +extern void oaep_decrypt_c( char* encr, int encrlen, + char* decr, int* decrlen, + int* success); + typedef struct { MPI n; /* modulus */ MPI e; /* public exponent */ @@ -163,6 +184,34 @@ */ void secret_rsa( MPI output, MPI input, RSA_secret_key *sk ); +/********* + * @param output - an MPI with KEY_LENGTH_OCTETS octets allocated space; + it will hold the result: (rsa(oaep(input), pk)) + @param input - the plain-text message to be encrypted; maximum length is + 245 octets (1960 bits) + @param pk - public key with which to encrypt + NB: this method does NOT allocate memory for output! + preconditions: + - output IS different from input! + - output has at least KEY_LENGTH_OCTETS octets allocated space + - input is AT MOST max_len_msg octets long (ct defined in smg_oaep.ads) + */ +void rsa_oaep_encrypt( MPI output, MPI input, RSA_public_key *pk); + +/* + * Opposite operation to rsa_oaep_encrypt. + * Attempts oaep_decrypt(rsa_decrypt(input)) + * @param output - an MPI to hold the result; allocated >= max_len_msg octets + * @param input - an MPI previously obtained with rsa_oaep_encrypt + * @param sk - the secret key with which to decrypt + * @param success - this will be set to -1 if there is an error + * + * preconditions: + * - output IS different from input! + * - output has at least KEY_LENGTH_OCTETS octets allocated space + * - input is precisely KEY_LENGTH_OCTETS + */ +void rsa_oaep_decrypt( MPI output, MPI input, RSA_secret_key *sk, int *success); #endif /*SMG_RSA*/ diff -uNr a/eucrypt/smg_rsa/rsa.c b/eucrypt/smg_rsa/rsa.c --- a/eucrypt/smg_rsa/rsa.c 99e516c7c6b48c92437207404d2605637575722df4d49f11c35d9b9e90a93c26ee6eb0dd5472eeaf364eccc49f66f48a6c966fb8ddf3cd1dae459450d573efa9 +++ b/eucrypt/smg_rsa/rsa.c c506f05a540f43ff34059cc5398431aa58b1f4f2294c38a1a793b19d9ccdc9b21c21a06577c95623401ef4154009e77301b640fd323fdea9e3570c1407368bd6 @@ -69,7 +69,9 @@ /* mpi_powm can't handle output and input being same */ assert (output != input); + /* the actual rsa op */ mpi_powm( output, input, pk->e, pk->n ); + } void secret_rsa( MPI output, MPI input, RSA_secret_key *skey ) { @@ -136,3 +138,94 @@ } +void rsa_oaep_encrypt( MPI output, MPI input, RSA_public_key *pk) { + /* precondition: output is different from input */ + assert( output != input ); + + /* precondition: output has enough memory allocated */ + unsigned int nlimbs_n = mpi_nlimb_hint_from_nbytes( KEY_LENGTH_OCTETS); + assert( mpi_get_alloced( output ) >= nlimbs_n); + + /* precondition: input is at most max_len_msg octets long */ + unsigned int nlimbs_msg = mpi_nlimb_hint_from_nbytes( max_len_msg ); + assert( mpi_get_nlimbs( input ) <= nlimbs_msg); + + /* Step 1: oaep padding */ + /* get message char array and length */ + int msglen = 0; + int sign; + unsigned char * msg = mpi_get_buffer( input, &msglen, &sign); + /* allocate memory for result */ + int encrlen = KEY_LENGTH_OCTETS; + unsigned char * encr = xmalloc( encrlen ); + int entlen = KEY_LENGTH_OCTETS; + unsigned char * entropy = xmalloc( entlen ); + int success = -10; + /* call oaep until result is strictly < N of the rsa key to use */ + MPI oaep = mpi_alloc( nlimbs_n ); /* result of oaep encrypt/pad */ + + int nread; + do { + /* get random bits */ + do { + nread = get_random_octets( entlen, entropy ); + } while (nread != entlen); + + oaep_encrypt_c( msg, msglen, entropy, entlen, encr, encrlen, &success); + if (success > 0) { + /* set the obtained oaep to output mpi and compare to N of the rsa key */ + /* NB: 0-led encr WILL GET TRUNCATED!! */ + mpi_set_buffer( oaep, encr, encrlen, 0); + } + printf("."); + } + while ( success <=0 || mpi_cmp( oaep, pk->n ) >= 0 ); + + printf("\n"); + /* Step2 : call rsa for final result */ + public_rsa( output, oaep, pk ); + + /* clear up */ + xfree( msg ); + xfree( encr ); + xfree( entropy ); + mpi_free( oaep ); +} + +void rsa_oaep_decrypt( MPI output, MPI input, RSA_secret_key *sk, int *success) +{ + *success = -1; + unsigned int nlimbs_n = mpi_nlimb_hint_from_nbytes( KEY_LENGTH_OCTETS); + unsigned int nlimbs_msg = mpi_nlimb_hint_from_nbytes( max_len_msg ); + + /* preconditions */ + assert( output != input ); + assert( mpi_get_alloced( output ) >= nlimbs_msg); + assert( mpi_get_nlimbs( input ) == nlimbs_n); + + /* rsa */ + MPI rsa_decr = mpi_alloc( nlimbs_n ); + secret_rsa( rsa_decr, input, sk ); + + /* oaep */ + unsigned encr_len, decr_len; + int sign, flag; + char *oaep_encr = mpi_get_buffer( rsa_decr, &encr_len, &sign ); + char *oaep_decr = xmalloc( encr_len ); + decr_len = encr_len; + oaep_decrypt_c( oaep_encr, encr_len, oaep_decr, &decr_len, &flag ); + + /* check status */ + if ( flag > 0 ) { + *success = 1; + mpi_set_buffer( output, oaep_decr, decr_len, 0 ); + } + else + *success = -1; + + /* cleanup */ + mpi_free( rsa_decr ); + xfree( oaep_encr ); + xfree( oaep_decr ); +} + diff -uNr a/eucrypt/smg_rsa/smg_rsa.gpr b/eucrypt/smg_rsa/smg_rsa.gpr --- a/eucrypt/smg_rsa/smg_rsa.gpr false +++ b/eucrypt/smg_rsa/smg_rsa.gpr cec4808088d27c48b317382cf4e0082b21376b146da65896ba7d9f6e6859944e637621d36ce64f7a1835307baff66080ab52746ea02c5ce0e834f666650198a6 @@ -0,0 +1,16 @@ + -- S.MG, 2018 + +with "../mpi/mpi.gpr"; +with "../smg_keccak/smg_keccak.gpr"; + +project SMG_RSA is + for Languages use ("C"); + for Library_Name use "SMG_RSA"; + for Library_Kind use "static"; + + for Source_Dirs use (".", "include"); + for Object_Dir use "obj"; + for Library_Dir use "bin"; + +end SMG_RSA; + diff -uNr a/eucrypt/smg_rsa/tests/Makefile b/eucrypt/smg_rsa/tests/Makefile --- a/eucrypt/smg_rsa/tests/Makefile e426fdca88edc45327759e751831fa6cb81f88d9c65a1da25ae513e391cfdc69a99027ccddef4d02aa8893ebbac32cc60a853101962b51f4269dc86ee41f311d +++ b/eucrypt/smg_rsa/tests/Makefile false @@ -1,25 +0,0 @@ -PROGRAM = tests - -CXX = gcc -OBJECTS := $(patsubst %.c,%.o,$(wildcard *.c)) -FLAGS = -g -Wall -INCLUDE = -I ../include -I ../../mpi/include -SMG_RSA = ../bin/smg_rsa.a -MPI = ../../mpi/bin/mpi.a -LIBS := $(SMG_RSA) $(MPI) - -.SUFFIXES: .o .c - -.c.o: - $(CXX) $(FLAGS) $(INCLUDE) -c $< -o $@ - -all: $(PROGRAM) - -$(PROGRAM): $(OBJECTS) - $(CXX) $(FLAGS) $(INCLUDE) -o $(PROGRAM) $(OBJECTS) $(LIBS) - -clean : - rm -rf nul core *flymake* *.o $(PROGRAM) *~ bin obj - -check-syntax: - $(CXX) -c $(FLAGS) $(INCLUDE) -o nul -Wall -S $(CHK_SOURCES) diff -uNr a/eucrypt/smg_rsa/tests/obj/README b/eucrypt/smg_rsa/tests/obj/README --- a/eucrypt/smg_rsa/tests/obj/README false +++ b/eucrypt/smg_rsa/tests/obj/README a2eb4b7afc8afe95836f6cf05b0eb589977606525747a45776a1409a65ccd52edb062ef150226ca65e91f66acebec828b050c1a2e946c542eb86d7830323daf3 @@ -0,0 +1 @@ +obj folder for smg_rsa diff -uNr a/eucrypt/smg_rsa/tests/smg_rsa_tests.gpr b/eucrypt/smg_rsa/tests/smg_rsa_tests.gpr --- a/eucrypt/smg_rsa/tests/smg_rsa_tests.gpr false +++ b/eucrypt/smg_rsa/tests/smg_rsa_tests.gpr 658150d9cc3ff5f1d4a6d134c57d9ea6740be6aef571ef9c2bd553a3e4931a541ccf755bf51dc5349a4dbaecf04dc11e0d4faff4d4745e322cf22231241570f5 @@ -0,0 +1,13 @@ + -- Tests for SMG_RSA (part of EuCrypt) + -- S.MG, 2018 + +with "../smg_rsa.gpr"; + +project SMG_RSA_Tests is + for Languages use("C"); + for Source_Dirs use ("."); + for Object_Dir use "obj"; + for Exec_Dir use "."; + + for Main use ("tests.c"); +end SMG_RSA_Tests; diff -uNr a/eucrypt/smg_rsa/tests/tests.c b/eucrypt/smg_rsa/tests/tests.c --- a/eucrypt/smg_rsa/tests/tests.c 8293de5fe325f0499d3fc0b882e94b3e8e297911d2c9aa83ecdcbcaa13914273db14ed6a077ca24f75b34d9258224e72806f917def17d5cf7762b06d5a54f008 +++ b/eucrypt/smg_rsa/tests/tests.c 01945e4cad02ccc3811194a69cb62904b862f6a07e6ef4c7801e4d702a9c076ab3ce0056349e7121d64212b73511400c5d28580c400ffad7e71014f753e4295a @@ -6,6 +6,9 @@ #include #include +extern void adainit(void); +extern void adafinal(void); + void err(char *msg) { fprintf(stderr, "%s\n", msg); @@ -406,6 +409,198 @@ mpi_free(sk.u); } +void test_oaep_encr_decr( int nruns ) { + /* a set of RSA keys previously generated with eucrypt */ + RSA_public_key pk; + pk.n = mpi_alloc(0); + pk.e = mpi_alloc(0); + + RSA_secret_key sk; + sk.n = mpi_alloc(0); + sk.e = mpi_alloc(0); + sk.d = mpi_alloc(0); + sk.p = mpi_alloc(0); + sk.q = mpi_alloc(0); + sk.u = mpi_alloc(0); + + mpi_fromstr(sk.n, "0x\ +CD2C025323BEA46FFF2FA8D7A9D39817EA713421F4AE03FA8120641193892A70BFECF5\ +83101635A432110D3DDE6339E3CC7ECC0AD91C026FCACE832DD3888A6FCA7BCE56C390\ +5A5AC8C7BC921DA675E4B62489B254EB34659D547D71165BC998983A81937BD251AEE1\ +2D985EC387D5376F5DCC5EF7EC530FBD6FD2AA7285EE1AF3335EA73163F0954F30402E\ +D7B374EE84A97B1849B0674B0DA0A2050BD79B71ABB1559F3A9CFDB8557DED7BC90CF2\ +09E8A847E9C226140845B7D03842162E7DA5DD16326CB1F71A248D841FE9076A09911F\ +2F4F5E3EA44EA8DE40332BF00406990BCCF61C322A03C456EF3A98B341E0BDBC1088CE\ +683E78510E76B72C2BCC1EE9AEDD80FFF18ABFC5923B2F36B581C25114AB2DF9F6C2B1\ +9481703FD19E313DCD7ACE15FA11B27D25BCE5388C180A7E21167FB87750599E1ED7C7\ +50F4A844E1DC2270C62D19671CF8F4C25B81E366B09FC850AE642136D204A9160AEECE\ +575B57378AA439E9DD46DC990288CD54BAA35EEE1C02456CD39458A6F1CBF012DCEDF4\ +27CCF3F3F53645658FC49C9C9D7F2856DB571D92B967AB5845514E0054DDB49099F5DD\ +04A6F6F5C5CE642276834B932881AEB648D1F25E9223971F56E249EF40CF7D80F22621\ +CDD0260E9E7D23746960ADB52CF2987584FB1DE95A69A39E5CB12B76E0F5C1A0529C0C\ +065D2E35720810F7C7983180B9A9EA0E00C11B79DC3D"); + + mpi_fromstr(sk.e, "0x\ +DD4856B4EE3D099A8604AE392D8EFEC094CDF01546A28BE87CB484F999E8E75CDFCD01\ +D04D455A6A9254C60BD28C0B03611FC3E751CC27EF768C0B401C4FD2B27C092834A6F2\ +49A145C4EDC47A3B3D363EC352462C945334D160AF9AA72202862912493AC6190AA3A6\ +149D4D8B9996BA7927D3D0D2AD00D30FD630CF464E6CAF9CF49355B9A70E05DB7AE915\ +F9F602772F8D11E5FCDFC7709210F248052615967090CC1F43D410C83724AA5912B2F0\ +52E6B39449A89A97C79C92DC8CB8DEEFCF248C1E1D2FC5BFE85165ECA31839CAA9CEB3\ +3A92EBDC0EB3BAC0F810938BB173C7DA21DCBB2220D44CBA0FD40A2C868FC93AC5243E\ +C137C27B0A76D65634EBB3"); + + mpi_fromstr(sk.d, "0x\ +7C8A6FA1199D99DCA45E9BDF567CA49D02B237340D7E999150BC4883AE29DEC5158521\ +B338F35DC883792356BDDBB3C8B3030A6DD4C6522599A3254E751F9BA1CB1061C5633C\ +81BBFACF6FCD64502614102DFED3F3FA284066C342D5E00953B415915331E30812E5FB\ +CD6680ADCCDEE40B8376A3A225F2E160EA59C7566804526D73BB660A648A3EF9802313\ +B2F841E8458B2AAACE7AACF31083E8F3F630298138393BC88BBD7D4AA4334949651D25\ +365B10DBF4A4A08E20A6CC74BFDD37C1C38E2ADC2A283DF06590DF06B46F67F6ACA67F\ +AC464C795261659A2F9558802D0BBAA05FD1E1AF2CDC70654723DF7EFAEA148B8CDBEB\ +C89EA2320AB9BBB1BC4311475DF3D91446F02EF192368DFEBAC598CCFD4407DEC58FDC\ +1A94CCDD6E5FBA9C52164ACEA8AEE633E557BCCEACB7A1AF656C379482D784A120A725\ +32F9B2B35173D505F21D5AD4CB9511BC836DC923730B70291B70290A216CA3B21CFF79\ +E895C35F4F7AF80E1BD9ED2773BD26919A76E4298D169160593E0335BE2A2A2D2E8516\ +948F657E1B1260E18808A9D463C108535FB60B3B28F711C81E5DE24F40214134A53CE5\ +9A952C8970A1D771EBEFFA2F4359DCF157995B3F1950DE3C6EC41B7FF837148F55F323\ +372AF3F20CE8B8038E750C23D8F5041FA951327859B0E47483F0A47103EF808C72C251\ +006FA526245291C8C84C12D2EF63FB2301EA3EEDA42B"); + + mpi_fromstr(sk.p, "0x\ +E236732452039C14EC1D3B8095BDDCFB7625CE27B1EA5394CF4ED09D3CEECAA4FC0BF6\ +2F7CE975E0C8929CE84B0259D773EA038396479BF15DA065BA70E549B248D77B4B23ED\ +A267308510DBEE2FD44E35D880EE7CFB81E0646AA8630165BD8988C3A8776D9E704C20\ +AA25CA0A3C32F27F592D5FD363B04DD57D8C61FFDCDFCCC59E2913DE0EE47769180340\ +E1EA5A803AA2301A010FF553A380F002601F0853FCACDB82D76FE2FACBCD6E5F294439\ +0799EA5AE9D7880D4E1D4AE146DC1D4E8495B9DD30E57E883923C5FC26682B7142D35C\ +D8A0FC561FE725A6CF419B15341F40FE0C31132CBD81DD8E50697BD1EBFFA16B522E16\ +F5B49A03B707218C7DA60B"); + + mpi_fromstr(sk.q, "0x\ +E830482A3C4F5C3A7E59C10FF8BA760DB1C6D55880B796FFDA4A82E0B60E974E81D04B\ +2A4AD417823EBFB4E8EFB13782943562B19B6C4A680E3BA0C8E37B5023470F4F1AC1F8\ +A0B10672EF75CD58BCD45E6B14503B8A6A70AFE79F6201AF56E7364A1C742BE1453FD2\ +24FDC9D66522EAF4466A084BCB9E46D455A2946E94CBF028770F38D0B741C2CC59308F\ +71D8C2B4B9C928E0AE8D68DEB48A3E9EFD84A10301EBD55F8221CA32FC567B306B2A8E\ +116350AFB995859FDF4378C5CFD06901494E8CFA5D8FAC564D6531FA8A2E4761F5EFBA\ +F78750B6F4662BE9EA4C2FAD67AF73EEB36B41FC15CB678810C19A51DF23555695C4C1\ +546F3FACA39CAA7BB8DBD7"); + + mpi_fromstr(sk.u, "0x\ +846232322775C1CD7D5569DC59E2F3E61A885AE2E9C4A4F8CB3ACBE8C3A5441E5FE348\ +A2A8AC9C2998FBF282222BF508AA1ECF66A76AEDD2D9C97028BFD3F6CA0542E38A5312\ +603C70B95650CE73F80FDD729988FBDB5595A5BF8A007EA34E54994A697906CE56354C\ +E00DF10EB711DEC274A62494E3D350D88736CF67A477FB600AC9F1D6580727585092BF\ +5EBC092CC4D6CF75769051033A1197103BE269942F372168A53771746FBA18ED6972D5\ +0B935A9B1D6B5B3DD50CD89A27FE93C10924E9103FACF7B4C5724A046C3D3B50CC1C78\ +5F5C8E00DBE1D6561F120F5294C170914BC10F978ED4356EED67A9F3A60D70AFE540FC\ +5373CBAE3D0A7FD1C87273"); + + /* copy the public key components */ + pk.n = mpi_copy( sk.n ); + pk.e = mpi_copy( sk.e ); + + /* some plain text message */ + MPI msg = mpi_alloc(0); + mpi_fromstr(msg, "0x\ +5B6A8A0ACF4F4DB3F82EAC2D20255E4DF3E4B7C799603210766F26EF87C8980E737579\ +EC08E6505A51D19654C26D806BAF1B62F9C032E0B13D02AF99F7313BFCFD68DA46836E\ +CA529D7360948550F982C6476C054A97FD01635AB44BFBDBE2A90BE06F7984AC8534C3\ +28097EF92F6E78CAE0CB97"); + + /* actual testing */ + printf("TEST verify oaep_encr_decr on message: \n"); + mpi_print( stdout, msg, 1); + printf("\n"); + + int nlimbs_n = mpi_nlimb_hint_from_nbytes( KEY_LENGTH_OCTETS); + MPI encr = mpi_alloc( nlimbs_n ); + MPI decr = mpi_alloc( nlimbs_n ); + int success; + + adainit(); + rsa_oaep_encrypt( encr, msg, &pk ); + rsa_oaep_decrypt( decr, encr, &sk, &success ); + + if (success <= 0 || + mpi_cmp(encr, msg) == 0 || + mpi_cmp(msg, decr) != 0) + printf("FAILED: success flag is %d\n", success); + else + printf("PASSED\n"); + + /* attempt to decrypt corrupted block */ + mpi_clear( decr ); + rsa_oaep_decrypt( decr, pk.n, &sk, &success); + if (success > 0) + printf("FAILED: attempt to decrypt non-/corrupted oaep block\n"); + else + printf("PASSED: attempt to decrypt non-/corrupted oaep block\n"); + adafinal(); + + /* clean up */ + mpi_free( sk.n ); + mpi_free( sk.e ); + mpi_free( sk.d ); + mpi_free( sk.p ); + mpi_free( sk.q ); + mpi_free( sk.u ); + + mpi_free( pk.n ); + mpi_free( pk.e ); + + mpi_free( msg ); + mpi_free( encr ); + mpi_free( decr ); +} + +void test_mpi_buffer() { + unsigned int noctets = 10; + int nlimbs = mpi_nlimb_hint_from_nbytes( noctets ); + MPI m = mpi_alloc( nlimbs ); + unsigned char *setbuffer = xmalloc( noctets ); + unsigned char *getbuffer; + unsigned int i, sign, mpilen, nerrors; + + for (i=0; i< noctets; i++) + setbuffer[i] = i; + + mpi_set_buffer( m, setbuffer, noctets, 0); + + getbuffer = mpi_get_buffer( m, &mpilen, &sign ); + + if (mpilen == noctets -1 ) { + nerrors = 0; + for (i=0;i0) + printf("FAIL: got %d different values!\n", nerrors); + else printf("PASSED: mpi_get/set_buffer\n"); + } + + mpi_free(m); + xfree(setbuffer); + xfree(getbuffer); +} + int main(int ac, char **av) { int nruns; @@ -479,6 +674,12 @@ case 8: time_rsa_gen(nruns); break; + case 9: + test_oaep_encr_decr(nruns); + break; + case 10: + test_mpi_buffer(); + break; default: printf("Current test ids:\n"); printf("0 for timing entropy source\n"); @@ -491,6 +692,8 @@ writes to keys.asc and check_keys.asc\n"); printf("7 for testing rsa exponentiation (fixed data)\n"); printf("8 for timing rsa key pair generator\n"); + printf("9 for oaep encrypt/decrypt\n"); + printf("10 for testing mpi_set/get_buffer\n"); } return 0; diff -uNr a/eucrypt/smg_serpent/tests/smg_serpent_tests.gpr b/eucrypt/smg_serpent/tests/smg_serpent_tests.gpr --- a/eucrypt/smg_serpent/tests/smg_serpent_tests.gpr e0f2fd60a9e3eceab2d5bfeba67a8c7dfb0017c72f9992da3e6499cfef2d000f614fb9a86e6979a672b20b42a6991e4bc6ef8eb26b61d489d9f7bddcdbfb85ed +++ b/eucrypt/smg_serpent/tests/smg_serpent_tests.gpr 0a22dcac40ac496f7cc1899b27b9ecfa2b3ccb8b9dfa331ae8e1b5c0ab1db7632eb5367ce8560e5e637c9e75b32e70dd39f635fefb83a49b0ade74c381ebf84c @@ -1,8 +1,10 @@ -- Tests for SMG_Serpent (part of EuCrypt) -- S.MG, 2018 +with "../smg_serpent.gpr"; + project SMG_Serpent_Tests is - for Source_Dirs use (".", "../src"); + for Source_Dirs use ("."); for Object_Dir use "obj"; for Exec_Dir use ".";