diff -uNr a/smg_comms/manifest b/smg_comms/manifest --- a/smg_comms/manifest 32a691949af3fb21eaf17c73269d01a30cb9f940ee5662772eb2c5e67a8352aedc07b8a7cba6a6d7f7be1e42559e003b82bbeb97fb059ffb579bcc33a9ab2693 +++ b/smg_comms/manifest 74ec120b48cc4434d960af06970594e47c843327fb3c12314cf1c68b7c5fd0899bf402e431398d0c5ff1f12b9151a9eb87915cbe4746e537fdc3376948f596af @@ -6,3 +6,4 @@ 548433 smg_comms_packing_rsa diana_coman Packing/Unpacking RSA messages <-> RSA packets of Eulora's communication protocol. 548894 smg_comms_80cols diana_coman Changes tests for RSA to read the key from a file in order to avoid lines > 80 columns in the code itself. 549511 smg_comms_skeys_smsgs diana_coman Defines data structures and message types as well as methods for reading/writing Serpent keysets to/from Serpent messages. +549785 smg_comms_io_rsa_tests_only diana_coman Small refactoring of tests extracting the reading of RSA key into package of its own so it can be used throughout tests and thus get rid of the too long lines in test_packing.adb. diff -uNr a/smg_comms/tests/io_rsa.adb b/smg_comms/tests/io_rsa.adb --- a/smg_comms/tests/io_rsa.adb false +++ b/smg_comms/tests/io_rsa.adb 85d8ee9e1b9365bc2288699f301bf3d7109bddbdb804f930ee855aae7674806a57261dd216b816c2b5ecb6c8e8d62111065f6ab4ad9cd95ac8fa419f5fccbc40 @@ -0,0 +1,91 @@ + -- S.MG, 2018 + +with Ada.Sequential_IO; +with Raw_Types; use Raw_Types; +with Ada.Text_IO; use Ada.Text_IO; +with Interfaces; use Interfaces; + +package body IO_RSA is + + procedure ReadRSAKey( Filename: in String; Key: out RSA_OAEP.RSA_skey ) is + package Char_IO is new Ada.Sequential_IO(Character); + use Char_IO; + Full : String(1..RSA_len'Length*2) := (others => '0'); + Half : String(1..RSA_half'Length*2) := (others => '0'); + F : Char_IO.File_Type; + C : Character; + begin + Open( File => F, Mode => In_File, Name => Filename ); + + -- read n + for I in Full'Range loop + Read(F, Full(I)); + end loop; + -- read new line character and convert to hex + Read(F, C); + Hex2Octets(Full, Key.n); + + -- read e + for I in Half'Range loop + Read(F, Half(I)); + end loop; + -- read new line character and convert to hex + Read(F, C); + Hex2Octets(Half, Key.e); + + -- read d + for I in Full'Range loop + Read(F, Full(I)); + end loop; + -- read new line character and convert to hex + Read(F, C); + Hex2Octets(Full, Key.d); + + -- read p + for I in Half'Range loop + Read(F, Half(I)); + end loop; + -- read new line character and convert to hex + Read(F, C); + Hex2Octets(Half, Key.p); + + -- read q + for I in Half'Range loop + Read(F, Half(I)); + end loop; + -- read new line character and convert to hex + Read(F, C); + Hex2Octets(Half, Key.q); + + -- read u + for I in Half'Range loop + Read(F, Half(I)); + end loop; + Hex2Octets(Half, Key.u); + + -- Close file + Close( F ); + + exception + when Char_IO.End_Error => + Put_Line("ReadRSAKey ERROR: Unexpected end of file in " & Filename); + when others => + Put_Line("ReadRSAKey ERROR: can not open file " & Filename); + + end ReadRSAKey; + + procedure Hex2Octets( Hex: in String; O: out Raw_Types.Octets ) is + S : String := "16#AA#"; + -- to make sure that input String has EVEN number of chars (ie full octets) + H : String(1..Hex'Length+Hex'Length mod 2) := (others=>'0'); + begin + -- first char is 0 if needed to cover full octet... + H(H'Length-Hex'Length+1..H'Length) := Hex; + O := (others => 0); + for I in 0 .. H'Length/2-1 loop + S := "16#" & H(H'First + I*2 .. H'First + I*2 + 1) & "#"; + O(O'Last - H'Length/2 + 1 + I) := Unsigned_8'Value(S); + end loop; + end Hex2Octets; + +end IO_RSA; diff -uNr a/smg_comms/tests/io_rsa.ads b/smg_comms/tests/io_rsa.ads --- a/smg_comms/tests/io_rsa.ads false +++ b/smg_comms/tests/io_rsa.ads 57ad398331bf9b99c93592fca3bdeff7ca8ebfd630ec3fc142706498eb4a7dcb05f21520670d5945c26046237c7de2c93e021801157b5bf8bf99308fb004d8e4 @@ -0,0 +1,21 @@ + -- reading a RSA key pair from a file + -- NB: this is for TESTING purposes only, NOT a production IO package! + -- S.MG, 2018 + +with Raw_Types; +with RSA_OAEP; + +package IO_RSA is + + -- reads a full private key from specified file, in Hex format + -- one component per line, in order: n, e, d, p, q, u + -- NB: length of each component has to match *precisely* the expected length + -- specifically, using Raw_Types: + -- n, d are RSA_len'Length*2; + -- e, p, q, u are RSA_half'Length*2 + procedure ReadRSAKey( Filename: in String; Key: out RSA_OAEP.RSA_skey ); + + -- convert hexadecimal strings to octets representation + procedure Hex2Octets( Hex: in String; O: out Raw_Types.Octets ); + +end IO_RSA; diff -uNr a/smg_comms/tests/test_packing.adb b/smg_comms/tests/test_packing.adb --- a/smg_comms/tests/test_packing.adb aa23a7dca5d7db80c185ab5c81d4e3645d3a32ce795559dc6c057806ba4928d1c56b0528fc45578dfb0ae69152b290abc591eb86931b59e1a862adf7ad480ae5 +++ b/smg_comms/tests/test_packing.adb eafef048291aff4715a31fe02b0ba62cab5d4b2d5d1e904b4a25dba9b08584b198c4bab46ca115b4809dd8506875719d6f30c506797cd0b399a2077c22ba1882 @@ -6,6 +6,7 @@ with RSA_OAEP; use RSA_OAEP; with Serpent; use Serpent; with RNG; use RNG; +with IO_RSA; with Interfaces; use Interfaces; with Ada.Text_IO; use Ada.Text_IO; @@ -71,20 +72,10 @@ SKey : RSA_skey; Success : Boolean; Pkt : RSA_Pkt; - n: String := "C6579F8646180EED0DC1F02E0DDD2B43EABB3F702D79D9928E2CDA5E1D42DF5D9ED7773F80B1F8D9B0DB7D4D00F55647640D70768F63D3CED56A39C681D08D6191F318BB79DC969B470A7364D53335C8318EF35E39D5DF706AB6F2393C6DD2128C142DBAB1806EB35E26C908F0A48419313D2D0F33DD430655DBFEC722899EC21C238E8DB7003430BBC39BAD990F9887F6B03E1344F537EC97389B78DBC656718ACD7B0FDC13DD24534F417BC7A18F077A0C4227354CEA19670331B6CAA3DFC17BBA7E70C14510D9EB3B63F3014994EC87BD23E868C0AE6E9EC55027577F62C0280B2D7DD1135001844923E5455C4566E066B3FDE968C6BC4DC672F229FCE366440403D7A4F4A8BFBA5679B7D0844BA1231277D13A77C9E2B5A1CB138C1B7AB5B4D4832448723A3DE70ED2E86D5FC5174F949A02DE8E404304BEB95F9BF40F3AA3CA15622D2776294BE7E19233406FF563CB8C25A1CB5AADBC1899DA3F2AE38533931FE032EE3232C2CD4F219FADF95B91635C0762A476A4DE5013F4384093F0FB715028D97F93B2E6F057B99EE344D83ADF2686FD5C9C793928BEF3182E568C4339C36C744C8E9CA7D4B9A16AA039CBF6F38CC97B12D87644E94C9DBD6BC93A93A03ED61ECC5874586E3A310E958F858735E30019D345C62E5127B80652C8A970A14B31F03B3A157CD5"; - e: String := "F74D78E382FC19B064411C6C20E0FDB2985F843007A54C7D8400BB459468624126E7D175F397E55C57AF25858EAE2D2952FB7998C119A6103606733EB5E1D27FCA1FACF14ADE94101D383D1B25DA511805569BC344EAD384EDBF3F3A541B34887FE199D99D7F62E6E9D516F88D6F5AD3E020DF04D402A02CC628A0064362FE8516CF7CD6040E9521407AB90EE6B5AFFF9EA9EBB16A7D3407CE81FD3844F519880556AB94AB349C1F3BBB6FDB4C4B377FE4C091EBDC2C3A1BD3AA56382D8D80E7742B5C751008FD6ECDD2EC3B2E3B6C566F698ED672000B403766DD63C3ACBDE16A14FB02E83A2EB6AA018BFC0020401E790DEE24E9"; - d: String := "698DA05DA25B230211EEF0CBA12083A1457B749A11937AC9993859F69A3BF38D575E5166AF2EC88D77F1DF04E68AEA358EACF7659FD4722A4F5A1C8BA7676DA97A9FBA75451152F8F68887D3451A9CCFFFE9EB80979786E37495B17687A6212F77FA616E4C0CD8A8EB7AEB88EA6CCABB7F3E854FB94B35394A09F95F0D6F997947E865CC0606F437C30FE8C48D96FBF5E2F52807BC9E9ED7BBEB23D5C45EDDCD16FE2BF410A9A1E5EF879E71C0D41FAE270C0C5D442860103F8C3944E802F33DB38432F11F763A7AF593656108E4A98A44A8549913CE5DCEC1A6500F280E3190991B2B938561CFACD8BC5183AAC9A4914BFE52C3BE39BB83688E1DE52479107EF8E087DCDB409432FC954C6349407E81DDFB11AE92BABB32A31868597958C9C76E0B4156F380955F0E09C1F3B98BB4CDD59E1B5C7D8CC2AA7491B0D319D219CF459A527CE1AA2729DEC53269653BF0ED3E0253F4451168437E3B069E48350CA4C3EC82134E87135624C768D1330B0D70C6E447FD9945BF06FCB91AA334C0FD8EEF1ADBC15928B3DB62077B537F7E9F468CC95CD5AAFEAE1F760A863B48D07B163F670E2E5B550BB3E960230BA9FDAED9903AE2E669A7F3C4D1F1E25B8E8EDB8CC6E6FD2164E66F4E64ED77BEF1EC9E6CEA5624FD84C0680248746DC1C8187145F3CD2411659DAEAD11D"; - p: String := "CDD6F7673A501FB24C44D56CA1D434F6CB3334E193E02F8E906241906BCB7412DD2159825B24C22002F373E647C2DA62A854F3841C00FD5985D03227CA9B54A69380BA9D63BE738BDF9E65C247E43E1220EEDD9281DCA78B32A4E1B786B7697ED0C3195D5AF2990881B11D6FC9EC9F940067B2DEA2A516FAA5F269C98F0B67628A6D2708515A4A58041AA17A93E4C4DD95C85BC38351DDA1DCF3DFD91C505B22383132649CF9F9233852C7207075BCF43C71038F043F1EC53E9787FB051B7927D020903233C16897B993C8089D8464451F086E756CF20E46CE6ED4A6AC5C327A0AAFBECBAAFD177969E7C952C76A4F4E7C85BF7F63"; - q: String := "F6ACF0790A250802C8D45DAC549CDBEF7806D5877A5DF0069136A458FAC4F0B0858060A873DA6355A965A064A0BC1BBB874872CD7ED89674AD407533041E74BCA317EC73597D335115523F61A05071E5ED81EE2A05331F65D4DC7A25AD7938B124CF03F49154B6693FB0B598B33ABDEF85C599A57A9B7347EAFF82638E1CBC28FCDFFF1FF04A18C2DBF3938395C2F8D1782B43D3A25EF7633B5DDAC89EFD3BAA64D976425A0891E00B876E9DE9FE4B6492B0EA8DFC7C8DEEC61721356EC816295B1BD9CD9DA3E30D2D90DC9CB3987F4BE042104900E036F3044A016749EF910CCFB9F377A90849B4CCCF4471A74E67EF6C814C9467"; - u: String := "854B89ED10F52258D00D6B3FA7F1FD22752804668F51FF7806DB82E22CB8B3AA8448D9B8E9DB14D31A36AEC2BCFA89E341B7334D494E97ED8051244136192233332C4612D963E7B6AF2535FDB7FE97E28DDFEBDFB3E1AFC29D05DBDF37106A817D3AB1864C7F7F247982897EDA6A92BED47D9C68305CD170C7301ACEB05F8A6382E73CC7614B2D8D758669B3A99AB64114809254B0BE21F40341A5B48B9B032603B14875B87EB5E16603FD16552E146A0FC6964958DFC25AA9FFCCD1ED1F4DEAF9FBAA0D7357F5FF0803FEB9BA78E74AC6B3070F417CEC6CFC7A3CF1E305FC7B76B7ED71893999AF797B2EBDE41FE90F076CCEDBFB"; begin - -- initialize RSA key with values previously obtained from EuCrypt - Hex2Octets( n, SKey.n ); - Hex2Octets( e, SKey.e ); - Hex2Octets( d, SKey.d ); - Hex2Octets( p, SKey.p ); - Hex2Octets( q, SKey.q ); - Hex2Octets( u, SKey.u ); + -- initialize with RSA pair previously generated + IO_RSA.ReadRSAKey( "keys_rsa.txt", SKey ); + -- copy n and e for public key PKey.n := SKey.n; PKey.e := SKey.e; @@ -113,20 +104,4 @@ end Test_Pack_Unpack_RSA; --- helper methods - procedure Hex2Octets( Hex: in String; O: out Raw_Types.Octets ) is - S : String := "16#AA#"; - -- to make sure that input String has EVEN number of chars (ie full octets) - H : String(1..Hex'Length+Hex'Length mod 2) := (others=>'0'); - begin - -- first char is 0 if needed to cover full octet... - H(H'Length-Hex'Length+1..H'Length) := Hex; - O := (others => 0); - for I in 0 .. H'Length/2-1 loop - S := "16#" & H(H'First + I*2 .. H'First + I*2 + 1) & "#"; - O(O'Last - H'Length/2 + 1 + I) := Unsigned_8'Value(S); - end loop; - end Hex2Octets; - - end Test_Packing; diff -uNr a/smg_comms/tests/test_packing.ads b/smg_comms/tests/test_packing.ads --- a/smg_comms/tests/test_packing.ads 0b774f9947b49ec87836a030ba9ae0b8ad0c802df3faa23a00d1019ba4cef610765f36cd7e36212ebdb80ee32691e39277a42c11f88e9b3fa949e1cab6fa676f +++ b/smg_comms/tests/test_packing.ads f3c2249dba0e03e0ffbec136b9a7cb0193c9da04530e64852e358a3f9e4212464c60d9b3b85e6209622f37cc9d9c52c6722511719f05e38eee5e5ac50ca4885b @@ -15,7 +15,4 @@ -- testing pack/unpack for RSA procedure Test_Pack_Unpack_RSA; --- helper methods - procedure Hex2Octets( Hex: in String; O: out Raw_Types.Octets ); - end Test_Packing; diff -uNr a/smg_comms/tests/test_rsa_oaep.adb b/smg_comms/tests/test_rsa_oaep.adb --- a/smg_comms/tests/test_rsa_oaep.adb d8fb2b62b07a71de0b2269325308207b9b2cfa850195d64339f7d35b33de572bcc01121cfe6eec977a2b12097ea34c39f12e27bc651e26e47f5a7dad74ae27f1 +++ b/smg_comms/tests/test_rsa_oaep.adb 6d2a795035290c00e290240a4d93260acdc2d7253ce4742bee41515920fdfb6ee78c4154753ef5f0fff15ded3d28fc69ca0aa90ef417fac0e914f3e4d4eb4a10 @@ -3,12 +3,12 @@ with Interfaces; use Interfaces; with Interfaces.C; use Interfaces.C; with Ada.Text_IO; use Ada.Text_IO; -with Ada.Sequential_IO; with RSA_OAEP; use RSA_OAEP; with OAEP; use OAEP; with Raw_Types; use Raw_Types; with RNG; use RNG; with Keccak; use Keccak; +with IO_RSA; package body Test_RSA_OAEP is @@ -104,7 +104,7 @@ skey: RSA_skey; begin -- initialize with RSA pair previously generated - ReadRSAKey( "keys_rsa.txt", skey ); + IO_RSA.ReadRSAKey( "keys_rsa.txt", skey ); -- copy n and e for public key pkey.n := skey.n; @@ -140,7 +140,7 @@ Len : Natural; begin -- initialize with RSA pair previously generated - ReadRSAKey( "keys_rsa.txt", skey ); + IO_RSA.ReadRSAKey( "keys_rsa.txt", skey ); -- copy n and e for public key pkey.n := skey.n; pkey.e := skey.e; @@ -180,19 +180,6 @@ end test_rsa_oaep; -- helper methods - procedure Hex2Octets( Hex: in String; O: out Raw_Types.Octets ) is - S : String := "16#AA#"; - -- to make sure that input String has EVEN number of chars (ie full octets) - H : String(1..Hex'Length+Hex'Length mod 2) := (others=>'0'); - begin - -- first char is 0 if needed to cover full octet... - H(H'Length-Hex'Length+1..H'Length) := Hex; - O := (others => 0); - for I in 0 .. H'Length/2-1 loop - S := "16#" & H(H'First + I*2 .. H'First + I*2 + 1) & "#"; - O(O'Last - H'Length/2 + 1 + I) := Unsigned_8'Value(S); - end loop; - end Hex2Octets; procedure PrintOctets( O: in Raw_Types.Octets; Title: in String ) is begin @@ -203,71 +190,4 @@ New_Line; end PrintOctets; - procedure ReadRSAKey( Filename: in String; Key: out RSA_OAEP.RSA_skey ) is - package Char_IO is new Ada.Sequential_IO(Character); - use Char_IO; - Full : String(1..RSA_len'Length*2) := (others => '0'); - Half : String(1..RSA_half'Length*2) := (others => '0'); - F : Char_IO.File_Type; - C : Character; - begin - Open( File => F, Mode => In_File, Name => Filename ); - - -- read n - for I in Full'Range loop - Read(F, Full(I)); - end loop; - -- read new line character and convert to hex - Read(F, C); - Hex2Octets(Full, Key.n); - - -- read e - for I in Half'Range loop - Read(F, Half(I)); - end loop; - -- read new line character and convert to hex - Read(F, C); - Hex2Octets(Half, Key.e); - - -- read d - for I in Full'Range loop - Read(F, Full(I)); - end loop; - -- read new line character and convert to hex - Read(F, C); - Hex2Octets(Full, Key.d); - - -- read p - for I in Half'Range loop - Read(F, Half(I)); - end loop; - -- read new line character and convert to hex - Read(F, C); - Hex2Octets(Half, Key.p); - - -- read q - for I in Half'Range loop - Read(F, Half(I)); - end loop; - -- read new line character and convert to hex - Read(F, C); - Hex2Octets(Half, Key.q); - - -- read u - for I in Half'Range loop - Read(F, Half(I)); - end loop; - Hex2Octets(Half, Key.u); - - -- Close file - Close( F ); - - exception - when Char_IO.End_Error => - Put_Line("ReadRSAKey ERROR: Unexpected end of file in " & Filename); - when others => - Put_Line("ReadRSAKey ERROR: can not open file " & Filename); - - end ReadRSAKey; - end Test_RSA_OAEP; diff -uNr a/smg_comms/tests/test_rsa_oaep.ads b/smg_comms/tests/test_rsa_oaep.ads --- a/smg_comms/tests/test_rsa_oaep.ads 88b6d8984df53bcbc6d173d67b4ba34e0f25ef40d204c3787daae8bd38c8b633ad4ef8ff39f10bc5d541423774386ba0c671fb49218df1a89a48a0ddcdfbd324 +++ b/smg_comms/tests/test_rsa_oaep.ads 30c188e997945f1e93be60c3d4c9d19f96c316252ca5fd8e538bce871d6e67c0538ee113ea9456b37e0e91572d2b218e70b139a5bdb8d79b64eed2d5e7afc71b @@ -9,13 +9,5 @@ procedure test_rsa; -- test rsa only procedure test_rsa_oaep; -- test rsa+oaep - procedure Hex2Octets( Hex: in String; O: out Raw_Types.Octets ); procedure PrintOctets( O: in Raw_Types.Octets; Title: in String ); - -- reads a full private key from specified file, in Hex format - -- one component per line, in order: n, e, d, p, q, u - -- NB: length of each component has to match *precisely* the expected length - -- specifically, using Raw_Types: - -- n, d are RSA_len'Length*2; - -- e, p, q, u are RSA_half'Length*2 - procedure ReadRSAKey( Filename: in String; Key: out RSA_OAEP.RSA_skey ); end Test_RSA_OAEP;