diff -uNr a/smg_comms/manifest b/smg_comms/manifest --- a/smg_comms/manifest 74ec120b48cc4434d960af06970594e47c843327fb3c12314cf1c68b7c5fd0899bf402e431398d0c5ff1f12b9151a9eb87915cbe4746e537fdc3376948f596af +++ b/smg_comms/manifest 8c55ef6a254359bf52a32b6d58f2a954184505ee4294b2cd1f7f6dd29911b873aba792eb6b88f9d62653ccb3d6d0fddf88146635729154848fac78be60418ba2 @@ -7,3 +7,4 @@ 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. +550310 smg_comms_keymgm diana_coman Adds read/write for Keys Management messages (both Serpent and RSA). Refactors the read/write of Serpent Keys messages so that the same core is called by RSA/Serpent specific-methods, adding also read/write of keys from/to RSA messages. diff -uNr a/smg_comms/src/data_structs.ads b/smg_comms/src/data_structs.ads --- a/smg_comms/src/data_structs.ads 50379b31ed9f6b3e63c7037db679ade8309a44c6b0510520288afc535a8ffd55e006cc20a479374e992991116253625c588278b21b0e12c254ad035a64e57258 +++ b/smg_comms/src/data_structs.ads 30b66c681c3de5ad3731a40c47760d77d58707d32b66d8a8bb987898067a631bf761adee878b08f77fe8d83df097900f8990ca75e02cb0a2aeec1a58a5209c4d @@ -5,6 +5,7 @@ with Raw_Types; -- for protocol raw types with System; -- for Bit_Order with Serpent; -- for Serpent.Key type +with Ada.Unchecked_Conversion; -- for counter_8bits to/from octet package Data_Structs is Pragma Pure(Data_Structs); @@ -65,7 +66,12 @@ ------------------------------ -- Serpent Keys Management - type Keys_Mgm (N_Burnt: Interfaces.Unsigned_8) is + subtype Counter_8bits is Natural range 0..255; + function Cast is new Ada.Unchecked_Conversion( Counter_8bits, + Raw_Types.Octets_1 ); + function Cast is new Ada.Unchecked_Conversion( Raw_Types.Octets_1, + Counter_8bits ); + type Keys_Mgm (N_Burnt: Counter_8bits := 0) is record -- count of server keys requested N_Server: Interfaces.Unsigned_8; @@ -74,7 +80,12 @@ -- ID of Serpent key preferred for further inbound Serpent msgs. Key_ID : Interfaces.Unsigned_8; -- IDs of Serpent keys burnt by this message - Burnt : SKeys_Array( 1..N_Burnt ); + case N_Burnt is + when 0 => + null; + when others => + Burnt : Raw_Types.Octets( 1..N_Burnt ); + end case; end record; end Data_Structs; diff -uNr a/smg_comms/src/messages.adb b/smg_comms/src/messages.adb --- a/smg_comms/src/messages.adb 899126526fa67b199ae8b8c17f0dcbbb68f59e0c6e88bfb21dacac13d02fc11f3c6a2af97920afd44660c7ac689b51d474e3671cddee4443eeeaa5891ca374e6 +++ b/smg_comms/src/messages.adb 796122dcf307899111d2909509460b1de5215ef1dfadb88af3f3b2654754aa225acf79ff0b50be884f184966920bcd30e236585fa46846dc36b8f58f67c726d1 @@ -7,16 +7,128 @@ package body Messages is + ---------------------- + -- Serpent Messages -- + ---------------------- + procedure Write_SKeys_SMsg( Keyset : in Serpent_Keyset; Counter : in Interfaces.Unsigned_16; Msg : out Raw_Types.Serpent_Msg) is + begin + -- call internal write on Octets with correct type id + Write_SKeys( Keyset, Counter, SKeys_S_Type, Msg ); + end Write_SKeys_SMsg; + + + -- Reads a Serpent keyset from given Serpent Message + procedure Read_SKeys_SMsg( Msg : in Raw_Types.Serpent_Msg; + Counter : out Interfaces.Unsigned_16; + Keyset : out Serpent_Keyset) is + begin + -- check type id and call internal Read_SKeys if correct + if Msg(Msg'First) /= SKeys_S_Type then + raise Invalid_Msg; + else + Read_SKeys( Msg, Counter, Keyset ); + end if; + end Read_SKeys_SMsg; + + -- writes given key mgm structure into a Serpent message + procedure Write_KMgm_SMsg( KMgm : in Keys_Mgm; + Counter : in Interfaces.Unsigned_16; + Msg : out Raw_Types.Serpent_Msg) is + begin + -- call internal write of key mgm with correct type ID + Write_KMgm( KMgm, Counter, Key_Mgm_S_Type, Msg ); + end Write_KMgm_SMsg; + + -- reads a key mgm structure from the given Serpent message + procedure Read_KMgm_SMsg( Msg : in Raw_Types.Serpent_Msg; + Counter : out Interfaces.Unsigned_16; + KMgm : out Keys_Mgm) is + begin + -- check type id and call internal Read_KMgm if correct + if Msg(Msg'First) /= Key_Mgm_S_Type then + raise Invalid_Msg; + else + Read_KMgm( Msg, Counter, KMgm ); + end if; + end Read_KMgm_SMsg; + + + ------------------ + -- RSA Messages -- + ------------------ + + procedure Write_SKeys_RMsg( Keyset : in Serpent_Keyset; + Counter : in Interfaces.Unsigned_16; + Msg : out Raw_Types.RSA_Msg) is + begin + -- call internal write of Serpent keys with correct type ID + Write_SKeys( Keyset, Counter, SKeys_R_Type, Msg ); + end Write_SKeys_RMsg; + + procedure Read_SKeys_RMsg( Msg : in Raw_Types.RSA_Msg; + Counter : out Interfaces.Unsigned_16; + Keyset : out Serpent_Keyset) is + begin + -- check type id and call internal Read_SKeys if correct + if Msg(Msg'First) /= SKeys_R_Type then + raise Invalid_Msg; + else + Read_SKeys( Msg, Counter, Keyset ); + end if; + end Read_SKeys_RMsg; + + procedure Write_KMgm_RMsg( KMgm : in Keys_Mgm; + Counter : in Interfaces.Unsigned_16; + Msg : out Raw_Types.RSA_Msg) is + begin + -- call internal write of key mgm with correct type ID + Write_KMgm( KMgm, Counter, Key_Mgm_R_Type, Msg ); + end Write_KMgm_RMsg; + + procedure Read_KMgm_RMsg( Msg : in Raw_Types.RSA_Msg; + Counter : out Interfaces.Unsigned_16; + KMgm : out Keys_Mgm) is + begin + -- check type id and call internal Read_KMgm if correct + if Msg(Msg'First) /= Key_Mgm_R_Type then + raise Invalid_Msg; + else + Read_KMgm( Msg, Counter, KMgm ); + end if; + end Read_KMgm_RMsg; + + ------------------ + -- private part -- + ------------------ + procedure Cast_LE( LE: in out Raw_Types.Octets ) is + begin + -- flip octets ONLY if native is big endian. + if System.Default_Bit_Order = System.High_Order_First then + declare + BE: constant Raw_Types.Octets := LE; + begin + for I in 1..LE'Length loop + LE(LE'First+I-1) := BE(BE'Last-I+1); + end loop; + end; + end if; + -- NOTHING to do for native little endian + end Cast_LE; + + procedure Write_SKeys( Keyset : in Serpent_Keyset; + Counter : in Interfaces.Unsigned_16; + Type_ID : in Interfaces.Unsigned_8; + Msg : out Raw_Types.Octets) is Pos : Integer := Msg'First; Check : CRC32.CRC32; PadLen: Integer; K : Serpent.Key; begin -- write Type ID - Msg(Pos) := SKeys_S_Type; + Msg(Pos) := Type_ID; Pos := Pos + 1; -- write count of keys (NB: this IS 8 bits by definition) @@ -60,17 +172,17 @@ Msg(Pos..Pos+PadLen-1) := Pad; end; end if; - end Write_SKeys_SMsg; + end Write_SKeys; - -- Reads a Serpent keyset from given Serpent Message - procedure Read_SKeys_SMsg( Msg : in Raw_Types.Serpent_Msg; - Counter : out Interfaces.Unsigned_16; - Keyset : out Serpent_Keyset) is + procedure Read_SKeys( Msg : in Raw_Types.Octets; + Counter : out Interfaces.Unsigned_16; + Keyset : out Serpent_Keyset) is Pos: Integer := Msg'First; begin -- read type and check - if Msg(Pos) = SKeys_S_Type then + if Msg(Pos) = SKeys_S_Type or + Msg(Pos) = SKeys_R_Type then Pos := Pos + 1; else raise Invalid_Msg; @@ -118,22 +230,100 @@ else raise Invalid_Msg; end if; - end Read_SKeys_SMsg; + end Read_SKeys; - -- private part - procedure Cast_LE( LE: in out Raw_Types.Octets ) is + -- writes given key management structure to the given octets array + procedure Write_KMgm( KMgm : in Keys_Mgm; + Counter : in Interfaces.Unsigned_16; + Type_ID : in Interfaces.Unsigned_8; + Msg : out Raw_Types.Octets) is + Pos : Integer := Msg'First; begin - -- flip octets ONLY if native is big endian. - if System.Default_Bit_Order = System.High_Order_First then - declare - BE: constant Raw_Types.Octets := LE; - begin - for I in 1..LE'Length loop - LE(LE'First+I-1) := BE(BE'Last-I+1); - end loop; - end; + -- write given type id + Msg(Pos) := Type_ID; + Pos := Pos + 1; + + -- write count of server keys requested + Msg(Pos) := KMgm.N_Server; + Pos := Pos + 1; + + -- write count of client keys requested + Msg(Pos) := KMgm.N_Client; + Pos := Pos + 1; + + -- write id of key preferred for further inbound Serpent messages + Msg(Pos) := KMgm.Key_ID; + Pos := Pos + 1; + + -- write count of burnt keys in this message + Msg(Pos..Pos) := Cast( KMgm.N_Burnt ); + Pos := Pos + 1; + + -- if there are any burnt keys, write their ids + if KMgm.N_Burnt > 0 then + Msg( Pos .. Pos + KMgm.Burnt'Length - 1 ) := KMgm.Burnt; + Pos := Pos + KMgm.Burnt'Length; end if; - -- NOTHING to do for native little endian - end Cast_LE; + + -- write the message count + Msg(Pos..Pos+1) := Raw_Types.Cast( Counter ); + Cast_LE( Msg(Pos..Pos+1) ); + Pos := Pos + 2; + + -- pad with random octets until the end of Msg + RNG.Get_Octets( Msg(Pos..Msg'Last) ); + + end Write_KMgm; + + -- attempts to read from the given array of octets a key management structure + procedure Read_KMgm( Msg : in Raw_Types.Octets; + Counter : out Interfaces.Unsigned_16; + KMgm : out Keys_Mgm) is + Pos : Integer := Msg'First; + Burnt_Pos : Integer := Msg'First + 4; + begin + -- read type and check + if Msg(Pos) = Key_Mgm_S_Type or + Msg(Pos) = Key_Mgm_R_Type then + Pos := Pos + 1; + else + raise Invalid_Msg; + end if; + + -- read the count of burnt keys and check + -- NB: Burnt_Pos IS in range of Counter_8bits since it's an octet + declare + N_Burnt : Counter_8bits := Counter_8bits(Msg(Burnt_Pos)); + Mgm : Keys_Mgm(N_Burnt); + O2 : Raw_Types.Octets_2; + begin + -- read count of server keys requested + Mgm.N_Server := Msg(Pos); + Pos := Pos + 1; + + -- read count of client keys requested + Mgm.N_Client := Msg(Pos); + Pos := Pos + 1; + + -- read ID of Serpent key preferred for further inbound messages + Mgm.Key_ID := Msg(Pos); + Pos := Pos + 2; --skip the count of burnt keys as it's read already + + -- read ids of burnt keys, if any + if N_Burnt > 0 then + Mgm.Burnt := Msg(Pos..Pos+N_Burnt-1); + Pos := Pos + N_Burnt; + end if; + + -- read and set message counter + O2 := Msg(Pos..Pos+1); + Cast_LE(O2); + Counter := Raw_Types.Cast(O2); + -- rest of message is padding so it's ignored + -- copy the keys mgm structure to output param + KMgm := Mgm; + end; + end Read_KMgm; + end Messages; diff -uNr a/smg_comms/src/messages.ads b/smg_comms/src/messages.ads --- a/smg_comms/src/messages.ads 1190fb877b7956b9b38f1d817858fe872f6e93b7e4fac674bf3c82d664acb11204fc88de2563b33298a2a9ad547343cdf03f2cf068b3b1208db0b1ee0b3c246c +++ b/smg_comms/src/messages.ads 32cd2279d2e7501f1c713a414424c1bb37d4c54fd279b14221ed6409431c47f469dccffe0b5ed303b1e3b2c77b2d7bb81e7902a4facd4d96b8e28522a71bb69f @@ -21,7 +21,11 @@ -- exception raised when given message to read fails sanity checks Invalid_Msg: exception; - ------------------------------------------------ + ---------------------- + -- Serpent Messages -- + ---------------------- + + -------------------------Keys---------------------------------------- -- Writes a Serpent Keyset to the given Serpent Message -- -- Keyset - the set of keys to write to message @@ -37,6 +41,61 @@ Counter : out Interfaces.Unsigned_16; Keyset : out Serpent_Keyset); + ------------------------Keys Management------------------------------ + -- Writes a Key Management structure to the given Serpent Message + -- + -- KMgm - the keys management structure to write to message + -- Counter - the message count + procedure Write_KMgm_SMsg( KMgm : in Keys_Mgm; + Counter : in Interfaces.Unsigned_16; + Msg : out Raw_Types.Serpent_Msg); + + -- Reads a Key management structure from the given Serpent Message + -- The opposite of Write_KMgm_SMsg above + -- Raises Invalid_Message exception if given message fails sanity checks + procedure Read_KMgm_SMsg( Msg : in Raw_Types.Serpent_Msg; + Counter : out Interfaces.Unsigned_16; + KMgm : out Keys_Mgm); + + + + ------------------ + -- RSA Messages -- + ------------------ + + -------------------------Keys---------------------------------------- + -- Writes a Serpent Keyset to the given RSA Message + -- + -- Keyset - the set of keys to write to message + -- Counter - the message count + procedure Write_SKeys_RMsg( Keyset : in Serpent_Keyset; + Counter : in Interfaces.Unsigned_16; + Msg : out Raw_Types.RSA_Msg); + + -- Reads a Serpent Keyset from the given RSA Message + -- The opposite of Write_SKeys_RMsg above + -- Raises Invalid_Message exception if given message fails sanity checks + procedure Read_SKeys_RMsg( Msg : in Raw_Types.RSA_Msg; + Counter : out Interfaces.Unsigned_16; + Keyset : out Serpent_Keyset); + + ------------------------Keys Management------------------------------ + -- Writes a Key Management structure to the given RSA Message + -- + -- KMgm - the keys management structure to write to message + -- Counter - the message count + procedure Write_KMgm_RMsg( KMgm : in Keys_Mgm; + Counter : in Interfaces.Unsigned_16; + Msg : out Raw_Types.RSA_Msg); + + -- Reads a Key management structure from the given RSA Message + -- The opposite of Write_KMgm_SMsg above + -- Raises Invalid_Message exception if given message fails sanity checks + procedure Read_KMgm_RMsg( Msg : in Raw_Types.RSA_Msg; + Counter : out Interfaces.Unsigned_16; + KMgm : out Keys_Mgm); + + private -- if native is little endian, does nothing; @@ -74,4 +133,35 @@ Move_A_Type : constant Interfaces.Unsigned_8 := 6; Train_A_Type : constant Interfaces.Unsigned_8 := 7; + -- internal read/write of Serpent Keys + -- those are called by both interface methods for RSA and Serpent messages + + -- NB: caller HAS TO provide ENOUGH space in Msg AND valid Type_ID + -- Msg will be padded with random octets until full length. + procedure Write_SKeys( Keyset : in Serpent_Keyset; + Counter : in Interfaces.Unsigned_16; + Type_ID : in Interfaces.Unsigned_8; + Msg : out Raw_Types.Octets); + + -- NB: caller has to ensure that Msg is a valid RSA or Serpent message + procedure Read_SKeys( Msg : in Raw_Types.Octets; + Counter : out Interfaces.Unsigned_16; + Keyset : out Serpent_Keyset); + + + -- internal read/write of Key Management structures + -- those are called by both interface methods for RSA and Serpent messages + + -- NB: caller HAS TO provide ENOUGH space in Msg AND valid Type_ID + -- Msg will be padded with random octets until full length. + procedure Write_KMgm( KMgm : in Keys_Mgm; + Counter : in Interfaces.Unsigned_16; + Type_ID : in Interfaces.Unsigned_8; + Msg : out Raw_Types.Octets); + + -- NB: caller has to ensure that Msg is a valid RSA or Serpent message + procedure Read_KMgm( Msg : in Raw_Types.Octets; + Counter : out Interfaces.Unsigned_16; + KMgm : out Keys_Mgm); + end Messages; diff -uNr a/smg_comms/tests/test_serializing.adb b/smg_comms/tests/test_serializing.adb --- a/smg_comms/tests/test_serializing.adb 0b7d9c9ba8094d32022cafc676276ddf492fc26965ddae35cb67dddfc906b95b5d9025896bae70ed46a1c6ffd8999d87c707a1edb5577e5751fc48272108c8dd +++ b/smg_comms/tests/test_serializing.adb 108527aa9877fd1aa76fdf913c50760854260b8406db12a4c7b1a1a052d593eacc2d59d8f36f7bf70bdc6ac21a3a28e80930c89a64020ae597b67976100f61e2 @@ -12,14 +12,17 @@ package body Test_Serializing is procedure Serialize_Keyset_SS is - Msg : Serpent_Msg; - KSet : Serpent_Keyset(5); - LSB : Interfaces.Unsigned_8 := 16#01#; - MSB : Interfaces.Unsigned_8 := 16#80#; - LMSB: Interfaces.Unsigned_8 := 16#81#; - Counter : Interfaces.Unsigned_16 := 101; - NewSet: Serpent_Keyset; - NewCounter: Interfaces.Unsigned_16:=0; + Msg : Serpent_Msg; + RMsg : RSA_Msg; + KSet : Serpent_Keyset(5); + LSB : Interfaces.Unsigned_8 := 16#01#; + MSB : Interfaces.Unsigned_8 := 16#80#; + LMSB : Interfaces.Unsigned_8 := 16#81#; + Counter : Interfaces.Unsigned_16 := 101; + NewSetS : Serpent_Keyset; + NewSetR : Serpent_Keyset; + NewCounterR: Interfaces.Unsigned_16:=0; + NewCounterS: Interfaces.Unsigned_16:=0; begin Put_Line("Generating the Serpent Keys..."); -- fill a set of Serpent Keys @@ -28,17 +31,20 @@ end loop; KSet.Flag := LSB; - Put_Line("Writing the keys to message..."); - -- write keyset to serpent message + Put_Line("Writing the keys to messages..."); + -- write keyset to serpent & rsa messages Write_SKeys_SMsg( KSet, Counter, Msg ); + Write_SKeys_RMsg( KSet, Counter, RMsg ); - Put_Line("Reading keys back from message..."); - -- read keyset from message - Read_SKeys_SMsg( Msg, Counter, NewSet ); + Put_Line("Reading keys back from messages..."); + -- read keyset from serpent and rsa messages + Read_SKeys_SMsg( Msg, NewCounterS, NewSetS ); + Read_SKeys_RMsg( RMsg, NewCounterR, NewSetR ); Put_Line("Comparing the keysets..."); -- compare the two keysets - if NewSet /= KSet then + if NewCounterS /= Counter or NewCounterS /= Counter or + NewSetS /= KSet or NewSetR /= KSet then Put_Line("FAIL: keysets are different!"); else Put_Line("PASS: keysets are the same!"); @@ -47,7 +53,7 @@ Put_Line("Attempting to read from mangled message"); begin Msg(Msg'First) := Msg(Msg'First)+25; - Read_SKeys_SMsg( Msg, Counter, NewSet); + Read_SKeys_SMsg( Msg, Counter, NewSetS); Put_Line("FAIL: read failed to raise invalid message exception!"); exception when Invalid_Msg => @@ -55,5 +61,74 @@ end; end Serialize_Keyset_SS; + procedure Serialize_Keys_Mgm is + N_Burnt : Counter_8bits; + Counter : Interfaces.Unsigned_16 := 16#EDA9#; + Mgm_S : Keys_Mgm; + Mgm_R : Keys_Mgm; + Cnt_S : Interfaces.Unsigned_16:=0; + Cnt_R : Interfaces.Unsigned_16:=0; + O1 : Octets_1; + SMsg : Serpent_Msg; + RMsg : RSA_Msg; + begin + -- fill the struct with random stuff + RNG.Get_Octets( O1 ); + N_Burnt := Cast(O1); + declare + Mgm: Keys_Mgm(N_Burnt); + begin + RNG.Get_Octets( O1 ); + Mgm.N_Server := O1(O1'First); + RNG.Get_Octets( O1 ); + Mgm.N_Client := O1(O1'First); + RNG.Get_Octets( O1 ); + Mgm.Key_ID := O1(O1'First); + if N_Burnt > 0 then + RNG.Get_Octets( Mgm.Burnt ); + end if; + -- write it to Serpent and RSA messages + Write_KMgm_SMsg(Mgm, Counter, SMsg); + Write_KMgm_RMsg(Mgm, Counter, RMsg); + + -- read it back from Serpent and RSA messages + Read_KMgm_SMsg( SMsg, Cnt_S, Mgm_S ); + Read_KMgm_RMsg( RMsg, Cnt_R, Mgm_R ); + + -- check results + if Cnt_S /= Counter or + Mgm_S.N_Burnt /= Mgm.N_Burnt or + Mgm_S /= Mgm then + Put_Line("FAIL: read/write key management struct to S msg."); + else + Put_Line("PASS: read/write key management struct to S msg."); + end if; + + if Cnt_R /= Counter or + Mgm_R.N_Burnt /= Mgm.N_Burnt or + Mgm_R /= Mgm then + Put_Line("FAIL: read/write key management struct to R msg."); + Put_Line("Cnt_R is " & Unsigned_16'Image(Cnt_R)); + Put_Line("Counter is " & Unsigned_16'Image(Counter)); + Put_Line("Mgm_R.N_Burnt is " & Counter_8bits'Image(Mgm_R.N_Burnt)); + Put_Line("Mgm.N_Burnt is " & Counter_8bits'Image(Mgm.N_Burnt)); + else + Put_Line("PASS: read/write key management struct to R msg."); + end if; + + -- attempt mangled call - should raise exception + begin + SMsg(SMsg'First) := SMsg(SMsg'First) + 1; + Read_KMgm_SMsg( SMsg, Cnt_S, Mgm_S); + Put_Line("FAIL: Read_KMgm_SMsg failed to raise exception!"); + exception + when Invalid_Msg => + Put_Line("PASS: Read_KMgm_SMsg correctly raised exception."); + end; + + end; + + end Serialize_Keys_Mgm; + end Test_Serializing; diff -uNr a/smg_comms/tests/test_serializing.ads b/smg_comms/tests/test_serializing.ads --- a/smg_comms/tests/test_serializing.ads 0571dd3ea06e4684efb6ca56739fe9ff7f56befef87c107aa38f356772338418afb8562f989c615ff9d9b10cfa95cdb57bf88a395524adb6194e62bd66812637 +++ b/smg_comms/tests/test_serializing.ads e6f805434755b87ed7e265a405c3a505498ab7d154c47206dc3a7ec980ee58fd3df2af9df762ea764f82dd59c7ac90f99f61e48b1b99a88d38762c497f816572 @@ -6,6 +6,7 @@ package Test_Serializing is procedure Serialize_Keyset_SS; + procedure Serialize_Keys_Mgm; private diff -uNr a/smg_comms/tests/testall.adb b/smg_comms/tests/testall.adb --- a/smg_comms/tests/testall.adb c0a18fd4b745715568d7ef048d6d39f9e161b859d781cdaf1ba656cd327407f11ca302b1e1f58bc6a5d17de14b871f577c151bfd17c6ba560b1a6f111f4021fc +++ b/smg_comms/tests/testall.adb 117663918d15b926acf72a7ae5e3736aab93b06a12148422d9a74de147fb6e6f66961282cec214a9f946e778db1129bfdf14b184e63b84df86e54a07312df35a @@ -15,4 +15,5 @@ Test_Packing.Test_Pack_Unpack_Serpent; Test_Packing.Test_Pack_Unpack_RSA; Test_Serializing.Serialize_Keyset_SS; + Test_Serializing.Serialize_Keys_Mgm; end testall;