Commit 86429aa5 authored by garciay's avatar garciay
Browse files

Add support of 'EncryptMessage' & 'DecryptMessage' methods

parent 680ebf6b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@
            /**
			 * @desc	Encrypt an octetstring using specified algorithm 
			 * @param	p_algorithm Algorithm to be used for encryption
			 * @param	p_key encryption key
			 * @param	p_key encryption key (private key)
			 * @param	p_data Data block to be encrypted
			 * @return 	Encrypted data
			 */	            	
@@ -81,7 +81,7 @@
            /**
			 * @desc	Decrypt an octetstring using specified algorithm 
			 * @param	p_algorithm Algorithm to be used for decryption
			 * @param	p_key decryption key
			 * @param	p_key decryption key (public key)
			 * @param	p_data Data block to be encrypted
			 * @return 	Encrypted data
			 */	            	
+1 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ module ePassport_MainModule {
    	execute(TC_LDS_F04());    
    	execute(TC_LDS_H37());        	
    	execute(TC_Fake_For_Test()); 
    	execute(TC_Traveller_Jane()); 
    	execute(TC_checkBac());       	
    }
}
+114 −16
Original line number Diff line number Diff line
@@ -439,17 +439,18 @@ module ePassport_Testcases {
            var octetstring v_S := null;
            var octetstring v_encryptedIfd := null;
            var octetstring v_cmdData := null;
            var octetstring v_efid := null;
            var octetstring v_ksmac := null;
            var octetstring v_cksum := null;
            var octetstring v_result := null;

            template octetstring mw_kEnc := 'AB94FDECF2674FDFB9B391F85D7F76F2'O;
            template octetstring mw_kMac := '7962D9ECE03D1ACD4C76089DCE131543'O;
//            template octetstring mw_cksum1 := 'BF8B92D635FF24F8'O;
            var octetstring v_retailMac := null;
			var octetstring v_encrypt := null;

			var octetstring v_RSAprivateKey_pk8 := '30820278020100300d06092a864886f70d0101010500048202623082025e02010002818100c29185aaffca8a03a5e341c2b947e7bd029ec3b01512b6f68c96a0a8b2fb98c33856bc40c6abeb407c0c1adf0528528acaccf868a9e9c729b56df5a44c0165b93569fe31d7a4bdd578ebafafd0def56e2777ffbdd0fc6d85f62c15481fd058fe70ec3ec562cb5af3bc67964129fd23fc8a8c1e8e9118cedd5714cce465f417cd0203010001028181009cb5bab474db7bf7de37c132862acd12a6369ba48a048dcadc8741953ebb7859dc59b7bc7087edadfd7b7e751c6152c228ff98202ca277603799fe1c3b7f709ea667b1094df6addbd4894c8c4a6a23205f7a3d92431e615397a8da6c46f40e9c69db929983f92f70afeb3b58002847b34a304f60ea7e396919b5ae9f65858641024100fd576d03834a89a3120375c077a349a2d7ceea8b033f7637325193d9ffb40b0282b01d7d73217b1192e560dda7752b97055540938e40bf43302bec32d05676f1024100c49c357c11652e142804b1d0db8fb633136e91a8753e9393427db1805aaf828040820d9850a5d16bf95e895a6ef0f100ab02e0f153992ed56d2a74b8875b869d02410083c778333d96062646f679c7d5f3a0180ebdd90eda6fa6646bce37644c383109eb4504f1fe7349fb08383cbccfa0893e134e173b29e1d01b78f13ff9e699336102403772e2b6a9e54238970cb3e57676b268f73b00c364c5903340d658201df34fb7c1f9abc1e044d3aa42fb017bcabc130c202ec0a7eeeecdc18d7722d20402b115024100e69fb2a929bf37c410bca5668d913fef23439ab4d68a30c3ab5381339da55a8b7f0f4f461f1049474306982a1e0d28dcdb88910c66f14b97d276c21af86a99c1'O;
			var octetstring v_RSApublibKey_pem := '2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d4947664d413047435371475349623344514542415155414134474e4144434269514b42675144436b5957712f38714b4136586a51634b35522b6539417037440a734255537476614d6c71436f73767559777a685776454447712b7441664177613377556f556f724b7a50686f71656e484b6256743961524d415757354e576e2b0a4d64656b7664563436362b76304e3731626964332f3733512f4732463969775653422f515750357737443746597374613837786e6c6b45702f535038696f77650a6a7045597a743158464d7a6b5a6651587a514944415141420a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a'O;

            template octetstring mw_kEnc := 'AB94FDECF2674FDFB9B391F85D7F76F2'O; // Used for CFG.DFLT.PLAIN
            template octetstring mw_kMac := '7962D9ECE03D1ACD4C76089DCE131543'O; // Used for CFG.DFLT.PLAIN
            
            template octetstring mw_S := '781723860C06C2264608F919887022120B795240CB7049B01C19B33E32804F0B'O;
            template octetstring mw_encryptedIfd := '72C29C2371CC9BDB65B779B8E8D37B29ECC154AA56A8799FAE2F498F76ED92F2'O;
            template octetstring mw_cksum := '5F1448EEA8AD90A7'O;
            template octetstring mw_retailMac := '5F1448EEA8AD90A7'O;
            template octetstring mw_cmdData := '72C29C2371CC9BDB65B779B8E8D37B29ECC154AA56A8799FAE2F498F76ED92F25F1448EEA8AD90A7'O;

            t_guard.start;
@@ -470,8 +471,6 @@ module ePassport_Testcases {
				stop;
			}

			f_setKeysForSecureMessaging(vc_simu.kEnc & vc_simu.kMac);

			// Request an 8 byte random number from the MRTD’s chip
			v_rndIcc := '4608F91988702212'O;
			// Generate an 8 byte random and a 16 byte random
@@ -498,18 +497,27 @@ module ePassport_Testcases {
				stop;
			}
			// Compute MAC over EIFD with TDES key KMAC as calculated in Annex E.2
			v_cksum := fx_cryptographicChecksum(vc_simu.kMac, v_encryptedIfd);
			log ("cksum: ", v_cksum);
			if (match(v_cksum, mw_cksum) == false) {
			v_retailMac := fx_cryptographicChecksum(vc_simu.kMac, v_encryptedIfd);
			log ("cksum: ", v_retailMac);
			if (match(v_retailMac, mw_retailMac) == false) {
				setverdict(fail);
				stop;
			}
			v_cmdData := v_encryptedIfd & v_cksum;
			v_cmdData := v_encryptedIfd & v_retailMac;
			log ("cmdData: ", v_cmdData);
			if (match(v_cmdData, mw_cmdData) == false) {
				setverdict(fail);
				stop;
			}
			v_encrypt := fx_encrypt(e_rsa, v_RSAprivateKey_pk8, v_cmdData);
			log ("encrypt cmdData: ", v_encrypt);
			v_cmdData := fx_decrypt(e_rsa, v_RSApublibKey_pem, v_encrypt);
			log ("cmdData: ", v_cmdData);
			if (match(v_cmdData, mw_cmdData) == false) {
				setverdict(fail);
				stop;
			}

			setverdict(pass);

//        	t_wait.start;
@@ -524,6 +532,96 @@ module ePassport_Testcases {
			t_guard.stop;
        }

		function f_adjustParityBits(in octetstring buffer) runs on MRTD return octetstring{
			var integer ByteCounts[256] := {
        		0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
        		1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
        		1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
        		2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
        		1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
        		2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
        		2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
        		3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
        		1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
        		2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
        		2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
        		3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
        		2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
        		3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
        		3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
        		4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
        	};

    		for (var integer i := 0; i < lengthof(buffer); i := i + 1) {
    		    var integer index := oct2int(buffer[i]);
    			if ((ByteCounts[index] mod 2) == 0) {
    				buffer[i] := buffer[i] xor4b '01'O;
    			}
    		}
    		
    		return buffer;
		}

        testcase TC_Traveller_Jane() runs on MRTD system MRTD_System {

			var octetstring v_rndIcc := 'd97920492edeb66c'O;
			var octetstring v_rndIfd := '822c4d3c6d0d073a'O;
			var octetstring v_kIfd := '822c4d3c6d0d073a28fb217fe17bded2'O;

			var octetstring v_S := null;
			var octetstring v_encryptedIfd := null;
			var octetstring v_cmdData := '3b21ce09bbf691c2368d8bcf78a299cbd567eff7783dcb19960384b8e6c288105ae2008107b84714'O;
			var octetstring v_retailMac := null;
			var octetstring v_encrypt := null;
			var octetstring v_cmdDataEnc := null;

			var octetstring v_RSAprivateKey_pk8 := '30820278020100300d06092a864886f70d0101010500048202623082025e02010002818100c29185aaffca8a03a5e341c2b947e7bd029ec3b01512b6f68c96a0a8b2fb98c33856bc40c6abeb407c0c1adf0528528acaccf868a9e9c729b56df5a44c0165b93569fe31d7a4bdd578ebafafd0def56e2777ffbdd0fc6d85f62c15481fd058fe70ec3ec562cb5af3bc67964129fd23fc8a8c1e8e9118cedd5714cce465f417cd0203010001028181009cb5bab474db7bf7de37c132862acd12a6369ba48a048dcadc8741953ebb7859dc59b7bc7087edadfd7b7e751c6152c228ff98202ca277603799fe1c3b7f709ea667b1094df6addbd4894c8c4a6a23205f7a3d92431e615397a8da6c46f40e9c69db929983f92f70afeb3b58002847b34a304f60ea7e396919b5ae9f65858641024100fd576d03834a89a3120375c077a349a2d7ceea8b033f7637325193d9ffb40b0282b01d7d73217b1192e560dda7752b97055540938e40bf43302bec32d05676f1024100c49c357c11652e142804b1d0db8fb633136e91a8753e9393427db1805aaf828040820d9850a5d16bf95e895a6ef0f100ab02e0f153992ed56d2a74b8875b869d02410083c778333d96062646f679c7d5f3a0180ebdd90eda6fa6646bce37644c383109eb4504f1fe7349fb08383cbccfa0893e134e173b29e1d01b78f13ff9e699336102403772e2b6a9e54238970cb3e57676b268f73b00c364c5903340d658201df34fb7c1f9abc1e044d3aa42fb017bcabc130c202ec0a7eeeecdc18d7722d20402b115024100e69fb2a929bf37c410bca5668d913fef23439ab4d68a30c3ab5381339da55a8b7f0f4f461f1049474306982a1e0d28dcdb88910c66f14b97d276c21af86a99c1'O;
			var octetstring v_RSApublibKey_pem := '2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d4947664d413047435371475349623344514542415155414134474e4144434269514b42675144436b5957712f38714b4136586a51634b35522b6539417037440a734255537476614d6c71436f73767559777a685776454447712b7441664177613377556f556f724b7a50686f71656e484b6256743961524d415757354e576e2b0a4d64656b7664563436362b76304e3731626964332f3733512f4732463969775653422f515750357737443746597374613837786e6c6b45702f535038696f77650a6a7045597a743158464d7a6b5a6651587a514944415141420a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a'O;

			template octetstring mw_kEnc := f_adjustParityBits('04aa91edf656c045221516afa54d3396'O); // Used for CFG.DFLT.EAC
			template octetstring mw_kMac := f_adjustParityBits('a3c946d447c4ea306b1b75ea87fe1270'O); // Used for CFG.DFLT.EAC

			template octetstring mw_S := '822c4d3c6d0d073ad97920492edeb66c822c4d3c6d0d073a28fb217fe17bded2'O;
			template octetstring mw_encryptedIfd := '3b21ce09bbf691c2368d8bcf78a299cbd567eff7783dcb19960384b8e6c28810'O;
			template octetstring mw_retailMac := '5ae2008107b84714'O;
			template octetstring mw_cmdDataEnc := '00820000283b21ce09bbf691c2368d8bcf78a299cbd567eff7783dcb19960384b8e6c288105ae2008107b8471400'O;

			f_initializeMRTD("CFG.DFLT.EAC");
			// Validate Kenc and Kmac
			log ("Kenc: ", vc_simu.kEnc);
			if (match(vc_simu.kEnc, mw_kEnc) == false) {
				setverdict(fail);
				stop;
			}
			log ("Kmac: ", vc_simu.kMac);
			if (match(vc_simu.kMac, mw_kMac) == false) {
				setverdict(fail);
				stop;
			}
			v_S := v_rndIfd & v_rndIcc & v_kIfd;
			log ("S: ", v_S);
			if (match(v_S, mw_S) == false) {
				setverdict(fail);
				stop;
			}
			// Encrypt S with TDES key KENC as calculated in Annex E.2
			v_encryptedIfd := f_encrypt3Des(f_build3DesKey(vc_simu.kEnc), v_S);
			log ("encryptedIfd: ", v_encryptedIfd);
			if (match(v_encryptedIfd, mw_encryptedIfd) == false) {
				setverdict(fail);
				stop;
			}
			f_setKeysForSecureMessaging(vc_simu.kEnc & vc_simu.kMac);
			v_cmdDataEnc := fx_encrypt3Des(vc_simu.kEnc & vc_simu.kMac, v_cmdData);
			log ("cmdDataEnc: ", v_cmdDataEnc);
			if (match(v_cmdDataEnc, mw_cmdDataEnc) == false) {
				setverdict(fail);
				stop;
			}
			
			setverdict(pass);
		}

        testcase TC_checkBac() runs on MRTD system MRTD_System {

			var octetstring v_rndIcc := '4608F91988702212'O;