Commit 03e7ae2c authored by berge's avatar berge
Browse files

Bug fixes (Ispra#2)

parent 05130921
Loading
Loading
Loading
Loading
+5 −8
Original line number Original line Diff line number Diff line
@@ -219,7 +219,6 @@
                // Check current file
                // Check current file
                v_logicalChannel := f_getLogicalChannel(v_readCommand.class);
                v_logicalChannel := f_getLogicalChannel(v_readCommand.class);
                if(vc_simu.currentFiles[v_logicalChannel] == c_noFileInfo) {
                if(vc_simu.currentFiles[v_logicalChannel] == c_noFileInfo) {
                    //TODO
                    mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
                    mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
                    t_ac.start;
                    t_ac.start;
                    repeat;
                    repeat;
@@ -362,6 +361,7 @@
    		var CommandManageSecurityEnvironment v_command;
    		var CommandManageSecurityEnvironment v_command;
    		var octetstring v_publicKeyPcd;
    		var octetstring v_publicKeyPcd;
    		var octetstring v_keyReference := ''O;
    		var octetstring v_keyReference := ''O;
    		var W1W2Status v_chipAuthenticationResult;
    		
    		
			[] mrtdport.receive(mw_mseSetKAT_chipAuthentication) -> value v_command {
			[] mrtdport.receive(mw_mseSetKAT_chipAuthentication) -> value v_command {
				v_publicKeyPcd := v_command.payload
				v_publicKeyPcd := v_command.payload
@@ -371,14 +371,15 @@
    			if(ispresent(v_command.payload.manageSecurityEnvironmentData.crtKAT.crtReferenceOfSessionOrPrivateKey)) {
    			if(ispresent(v_command.payload.manageSecurityEnvironmentData.crtKAT.crtReferenceOfSessionOrPrivateKey)) {
    			    v_keyReference := v_command.payload.manageSecurityEnvironmentData.crtKAT.crtReferenceOfSessionOrPrivateKey.tlvValue;
    			    v_keyReference := v_command.payload.manageSecurityEnvironmentData.crtKAT.crtReferenceOfSessionOrPrivateKey.tlvValue;
    			}			
    			}			
				if(f_chipAuthentication(v_publicKeyPcd, v_keyReference)) {
				v_chipAuthenticationResult := f_chipAuthentication(v_publicKeyPcd, v_keyReference);
				if(v_chipAuthenticationResult == c_w1w2NormalProcessing) {
				    mrtdport.send(m_responseOK);
				    mrtdport.send(m_responseOK);
                    vc_simu.securityStatus := e_chipAuthenticated;
                    vc_simu.securityStatus := e_chipAuthenticated;
                    f_setKeysForSecureMessaging(vc_simu.kEnc & vc_simu.kMac);
                    f_setKeysForSecureMessaging(vc_simu.kEnc & vc_simu.kMac);
                    f_setInitialSscForMessageAuthentication(c_8ZeroBytes);  
                    f_setInitialSscForMessageAuthentication(c_8ZeroBytes);  
				}
				}
				else {
				else {
				    mrtdport.send(m_responseNOK(c_w1w2SecurityRelatedIssues));       
				    mrtdport.send(m_responseNOK(v_chipAuthenticationResult));       
				}				
				}				
				t_ac.start;			
				t_ac.start;			
				repeat;
				repeat;
@@ -561,7 +562,6 @@
    			// Check current file
    			// Check current file
    			v_logicalChannel := f_getLogicalChannel(v_readCommand.class);
    			v_logicalChannel := f_getLogicalChannel(v_readCommand.class);
    			if(vc_simu.currentFiles[v_logicalChannel] == c_noFileInfo) {
    			if(vc_simu.currentFiles[v_logicalChannel] == c_noFileInfo) {
    				//TODO
    				mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
    				mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
    				t_ac.start;
    				t_ac.start;
    				repeat;
    				repeat;
@@ -617,7 +617,6 @@
                // Check current file
                // Check current file
                v_logicalChannel := f_getLogicalChannel(v_readB1Command.class);
                v_logicalChannel := f_getLogicalChannel(v_readB1Command.class);
                if(match(vc_simu.currentFiles[v_logicalChannel], c_noFileInfo)) {
                if(match(vc_simu.currentFiles[v_logicalChannel], c_noFileInfo)) {
                    //TODO
                    mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
                    mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
                    t_ac.start;
                    t_ac.start;
                    repeat;
                    repeat;
@@ -680,7 +679,6 @@
    			// Check current file
    			// Check current file
    			v_logicalChannel := f_getLogicalChannel(v_readCommand.class);
    			v_logicalChannel := f_getLogicalChannel(v_readCommand.class);
    			if(match(vc_simu.currentFiles[v_logicalChannel], c_noFileInfo)) {
    			if(match(vc_simu.currentFiles[v_logicalChannel], c_noFileInfo)) {
    			    //TODO
    				mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
    				mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
    				t_ac.start;
    				t_ac.start;
    				repeat;
    				repeat;
@@ -745,7 +743,6 @@
    		    // Check current file
    		    // Check current file
                v_logicalChannel := f_getLogicalChannel(v_readB1Command.class);
                v_logicalChannel := f_getLogicalChannel(v_readB1Command.class);
                if(match(vc_simu.currentFiles[v_logicalChannel], c_noFileInfo)) {
                if(match(vc_simu.currentFiles[v_logicalChannel], c_noFileInfo)) {
                    //TODO
                    mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
                    mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
                    t_ac.start;
                    t_ac.start;
                    repeat;
                    repeat;
+26 −19
Original line number Original line Diff line number Diff line
@@ -504,7 +504,7 @@
    	
    	
    	function f_chipAuthentication(in octetstring p_publicKeyPcd, in octetstring p_keyReference) 
    	function f_chipAuthentication(in octetstring p_publicKeyPcd, in octetstring p_keyReference) 
    	runs on MRTD 
    	runs on MRTD 
    	return boolean {
    	return W1W2Status {
			
			
			var octetstring v_k := ''O;
			var octetstring v_k := ''O;
			var octetstring v_h;
			var octetstring v_h;
@@ -520,13 +520,14 @@
                v_dg14PrFileInfo.filename := v_dg14PrFileInfo.filename & "." & oct2str(p_keyReference);                   
                v_dg14PrFileInfo.filename := v_dg14PrFileInfo.filename & "." & oct2str(p_keyReference);                   
			}			
			}			
			log(v_dg14PrFileInfo);
			log(v_dg14PrFileInfo);
			f_readFileData(v_dg14PrFileInfo, 0, -1, v_dg14PrivateKey);
			if(f_readFileData(v_dg14PrFileInfo, 0, -1, v_dg14PrivateKey) == c_w1w2FileOrApplicationNotFound) {
			// FIXME: check read file result and send 6A80 if file not found (means bad reference)
			    return c_w1w2ReferencedDataOrReferenceDataNotFound;
			}
			v_algo := f_computeSharedSecret(v_dg14PrivateKey, p_publicKeyPcd, v_k);
			v_algo := f_computeSharedSecret(v_dg14PrivateKey, p_publicKeyPcd, v_k);
			
			
            if(v_algo == e_invalid) {
            if(v_algo == e_invalid) {
                log("**** f_chipAuthentication: ERROR: Invalid key agreement algorithm ****"); 
                log("**** f_chipAuthentication: ERROR: Invalid key agreement algorithm ****"); 
                return false;       
                return c_w1w2SecurityRelatedIssues;       
            }
            }
								
								
			// b) The session keys KMAC and KEnc derived from K for Secure Messaging.
			// b) The session keys KMAC and KEnc derived from K for Secure Messaging.
@@ -545,7 +546,7 @@
			    vc_simu.isDhPublicKeyHash := f_extractXcoordinateFromEcPublicKey(p_publicKeyPcd);
			    vc_simu.isDhPublicKeyHash := f_extractXcoordinateFromEcPublicKey(p_publicKeyPcd);
			} 
			} 
			
			
			return true;
			return c_w1w2NormalProcessing;
			
			
    	} // end f_chipAuthentication
    	} // end f_chipAuthentication
    	
    	
@@ -624,6 +625,17 @@
		    return v_chrs;		    
		    return v_chrs;		    
		}
		}


	    function f_extractMrzFromDg1(in octetstring p_dg1) return octetstring {
	        var integer i;
	        var integer v_start := lengthof(p_dg1) - 88;
			var octetstring v_mrz := ''O;
	
			for(i:=v_start; i < 88 + v_start; i:=i+1) {
			    v_mrz := v_mrz & p_dg1[i];
			}
			return v_mrz;
	    }
		
	} // end fileFunctions
	} // end fileFunctions
	
	
	
	
@@ -647,16 +659,19 @@
    		var octetstring v_csvCertRefIds;
    		var octetstring v_csvCertRefIds;
    		var CvCertificate v_cvcaCvCertificate;
    		var CvCertificate v_cvcaCvCertificate;
    		var integer v_decodeResult;
    		var integer v_decodeResult;
    		var octetstring v_dg1 := ''O;
    		
    		
    		// Load filesystem
    		// Load filesystem
    		f_loadPassportConfiguration(p_configurationId);
    		f_loadPassportConfiguration(p_configurationId);
    		
    		
    		// Prepare basic access keys
    		// Prepare basic access keys
    		// FIXME: Read DG1 instead of optical MRZ
    		// FIXME: Read DG1 instead of optical MRZ
    		f_readFileData(c_fileMRZ, 0, -1, vc_simu.mrz);
    		f_readFileData(c_fileDG1, 0, -1, v_dg1);
            vc_simu.mrz := f_extractMrzFromDg1(v_dg1);
            log("DG1 MRZ: ", oct2char(vc_simu.mrz));
    		f_deriveKeys(f_extractKseedFromMrz(vc_simu.mrz), vc_simu.kEnc, vc_simu.kMac);
    		f_deriveKeys(f_extractKseedFromMrz(vc_simu.mrz), vc_simu.kEnc, vc_simu.kMac);
    		vc_simu.documentNumber := f_extractDocumentNumberFromMrz(vc_simu.mrz);
    		vc_simu.documentNumber := f_extractDocumentNumberFromMrz(vc_simu.mrz);

            log("documentNumber: ", oct2char(vc_simu.documentNumber));
			vc_simu.securityStatus := e_noApplication;
			vc_simu.securityStatus := e_noApplication;
			vc_simu.passportProtection := e_bac;
			vc_simu.passportProtection := e_bac;
			vc_simu.activeAuthenticationPerformed := false;
			vc_simu.activeAuthenticationPerformed := false;
@@ -685,6 +700,8 @@
                log("**** f_initializeMRTD: WARNING: " & c_fileCVCA.filename & " is empty ****");
                log("**** f_initializeMRTD: WARNING: " & c_fileCVCA.filename & " is empty ****");
            }
            }


	        	f_readFileData(c_fileMRZ, 0, -1, vc_simu.opticalMrz);

			// FIXME read c_fileCertRefIds
			// FIXME read c_fileCertRefIds
			f_readFileData(c_fileCertRefIds, 0, -1, v_csvCertRefIds);
			f_readFileData(c_fileCertRefIds, 0, -1, v_csvCertRefIds);
			vc_simu.aisCertRefIds := f_parseCertRefIds(v_csvCertRefIds);
			vc_simu.aisCertRefIds := f_parseCertRefIds(v_csvCertRefIds);
@@ -699,8 +716,8 @@
        //function for initializing the system and start the ePassport procedure
        //function for initializing the system and start the ePassport procedure
        function f_initializeIS(in charstring p_specialOperatorMessage) runs on MRTD {
        function f_initializeIS(in charstring p_specialOperatorMessage) runs on MRTD {
            
            
            var charstring v_opticalMrzLine1 := oct2char(substr(vc_simu.mrz, 0, lengthof(vc_simu.mrz)/2));            
            var charstring v_opticalMrzLine1 := oct2char(substr(vc_simu.opticalMrz, 0, lengthof(vc_simu.opticalMrz)/2));            
            var charstring v_opticalMrzLine2 := oct2char(substr(vc_simu.mrz, lengthof(vc_simu.mrz)/2, lengthof(vc_simu.mrz)/2));
            var charstring v_opticalMrzLine2 := oct2char(substr(vc_simu.opticalMrz, lengthof(vc_simu.opticalMrz)/2, lengthof(vc_simu.opticalMrz)/2));


            // Activate antenna
            // Activate antenna
            f_activateProbe();
            f_activateProbe();
@@ -748,16 +765,6 @@
	    
	    
	} // end postambleFunctions
	} // end postambleFunctions


	function f_getCertificate(in octetstring p_data) return octetstring {
		// TODO: refine...
		return ''O;
	} // end f_getCertificate

	function f_getSignature(in octetstring p_data) return octetstring {
		// TODO: refine...
		return ''O;					
	} // end f_getCertificate

	group simuParamsFunctions {
	group simuParamsFunctions {
		
		
		function f_pushFailResult(in AisFailureClass p_resultId) runs on MRTD {
		function f_pushFailResult(in AisFailureClass p_resultId) runs on MRTD {
+1 −0
Original line number Original line Diff line number Diff line
@@ -63,6 +63,7 @@ module ePassport_TestSystem {
		Chr at optional,
		Chr at optional,
		octetstring challenge optional,
		octetstring challenge optional,
		octetstring mrz optional,
		octetstring mrz optional,
		octetstring opticalMrz optional,   
		octetstring documentNumber optional,
		octetstring documentNumber optional,
		octetstring isDhPublicKeyHash optional,
		octetstring isDhPublicKeyHash optional,
		
		
+1 −0
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@ module ePassport_Values {
		const W1W2Status c_w1w2SecurityStatusNotSatisfied := '6982'O;
		const W1W2Status c_w1w2SecurityStatusNotSatisfied := '6982'O;
		const W1W2Status c_w1w2ConditionsOfUseNotSatisfied := '6985'O;
		const W1W2Status c_w1w2ConditionsOfUseNotSatisfied := '6985'O;
		const W1W2Status c_w1w2NoCurrentEF := '6986'O;
		const W1W2Status c_w1w2NoCurrentEF := '6986'O;
		const W1W2Status c_w1w2FileOrApplicationNotFound := '6A82'O;
		const W1W2Status c_w1w2ReferencedDataOrReferenceDataNotFound := '6A88'O;
		const W1W2Status c_w1w2ReferencedDataOrReferenceDataNotFound := '6A88'O;
		const W1W2Status c_w1w2WrongParametersP1P2 := '6B00'O;
		const W1W2Status c_w1w2WrongParametersP1P2 := '6B00'O;
		const W1W2Status c_w1w2InstructionCodeNotSupportedOrInvalid := '6D00'O;
		const W1W2Status c_w1w2InstructionCodeNotSupportedOrInvalid := '6D00'O;