Commit dd920a17 authored by berge's avatar berge
Browse files

Various changes related to automatic test interface

parent eb5881a2
Loading
Loading
Loading
Loading
+48 −23
Original line number Original line Diff line number Diff line
@@ -42,7 +42,7 @@
	    	
	    	
	    	t_wait.start;	    	
	    	t_wait.start;	    	
	    	alt {
	    	alt {
	    	    [] a_isReports();
	    	    [] a_aisReports();
	    	    
	    	    
	    	    [] t_wait.timeout {
	    	    [] t_wait.timeout {
	    	     	// do nothing   
	    	     	// do nothing   
@@ -60,43 +60,53 @@
			in template IsVerdictList p_expectedPassResults
			in template IsVerdictList p_expectedPassResults
		) runs on MRTD {
		) runs on MRTD {
        	
        	
        	var boolean v_checkFailVerdicts, v_checkPassVerdicts;
        	
        	if(not(PXT_AUTOMATIC_TEST_INTERFACE)) {
        	if(not(PXT_AUTOMATIC_TEST_INTERFACE)) {
        	 	f_waitForManualVerdict();   
        	 	f_waitForManualVerdict();   
        	}
        	}
        	        	
        	        	
        	// Basic Access Control
        	// Basic Access Control
			if(vc_simu.securityStatus >= e_basicAccessControl 
			if(vc_simu.securityStatus >= e_basicAccessControl 
        		and not(match(vc_simu.isFailVerdicts, superset(enum2int(e_aisBacAuthentication))))) {
        		and not(match(vc_simu.isFailVerdicts, superset(e_aisBacAuthentication)))) {
        		f_pushPassResult(enum2int(e_aisBacAuthentication));
        		f_pushPassResult(e_aisBacAuthentication);
        	} 
        	} 
        	
        	
        	// Passive Authentication
        	// Passive Authentication
        	if(not(match(vc_simu.isFailVerdicts, superset(enum2int(e_aisPassiveAuthentication))))) {
        	if(not(match(vc_simu.isFailVerdicts, superset(e_aisPassiveAuthentication)))) {
        		f_pushPassResult(enum2int(e_aisPassiveAuthentication));
        		f_pushPassResult(e_aisPassiveAuthentication);
        	} 
        	} 
        	
        	
        	// Active Authentication
        	// Active Authentication
        	if(vc_simu.activeAuthenticationPerformed 
        	if(vc_simu.activeAuthenticationPerformed 
        		and not(match(vc_simu.isFailVerdicts, superset(enum2int(e_aisActiveAuthentication))))) {
        		and not(match(vc_simu.isFailVerdicts, superset(e_aisActiveAuthentication)))) {
        		f_pushPassResult(enum2int(e_aisActiveAuthentication));
        		f_pushPassResult(e_aisActiveAuthentication);
        	} 
        	} 


			// Terminal Authentication
			// Terminal Authentication
			if(vc_simu.securityStatus >= e_chipAuthenticated 
			if(vc_simu.securityStatus >= e_chipAuthenticated 
        		and not(match(vc_simu.isFailVerdicts, superset(enum2int(e_aisChipAuthentication))))) {
        		and not(match(vc_simu.isFailVerdicts, superset(e_aisChipAuthentication)))) {
        		f_pushPassResult(enum2int(e_aisChipAuthentication));
        		f_pushPassResult(e_aisChipAuthentication);
        	} 
        	} 


			// Terminal Authentication
			// Terminal Authentication
			// Pass result pushed in a_terminalAuthentication
			// Pass result pushed in a_terminalAuthentication
			
			
			// Communication 
			// Communication 
			if(not(match(vc_simu.isFailVerdicts, superset(enum2int(e_aisCommunication))))) {
			if(not(match(vc_simu.isFailVerdicts, superset(e_aisCommunication)))) {
        		f_pushPassResult(enum2int(e_aisCommunication));
        		f_pushPassResult(e_aisCommunication);
        	} 
        	} 
        	
        	
        	if(match(vc_simu.isFailVerdicts, p_expectedFailResults)
        	// Fail verdicts
        		and match(vc_simu.isPassVerdicts, p_expectedPassResults)) {
        	log("**** Checking Failure verdicts... ****");
        	v_checkFailVerdicts := match(vc_simu.isFailVerdicts, p_expectedFailResults);
        	
        	// Pass verdicts
        	log("**** Checking Pass verdicts... ****");
        	v_checkPassVerdicts := match(vc_simu.isPassVerdicts, p_expectedPassResults);
        	
        	// Take decision and assign testcase verdict
        	if(v_checkFailVerdicts and v_checkPassVerdicts) {
        	    log("**** ", p_testcaseId, ": Pass: Inspection System produced expected result ****");
        	    log("**** ", p_testcaseId, ": Pass: Inspection System produced expected result ****");
        		setverdict(pass);
        		setverdict(pass);
        	}
        	}
@@ -152,27 +162,42 @@


	} // end defaults
	} // end defaults
	
	
	group isReports {
	group automaticInterfaceSpecificationAltsteps {
	    
	    
	    altstep a_isReports() runs on MRTD {
	    altstep a_aisReports() runs on MRTD {
	        
	        
	        var CommandGeneric v_report;
	        var CommandGeneric v_report;
	        
	        
	        [] mgmtport.receive(mw_report(int2oct(enum2int(e_aisNoFailure), 2))) {
	        [] mgmtport.receive(mw_report(int2oct(enum2int(e_aisNoFailure), 2))) {
	            log("**** Success reported ****");
	            log("**** Success reported ****");
				f_pushPassResult(enum2int(e_aisNoFailure));   
				f_pushPassResult(e_aisNoFailure);   
				mgmtport.send(m_responseOK);    	    
				mgmtport.send(m_responseOK);    	    
	        }    
	        }    
	        [] mgmtport.receive(mw_report(?)) -> value v_report {
	        [] mgmtport.receive(mw_report(?)) -> value v_report {
	            log("**** Failure reported: ", v_report.payload.genericData.data[0], " ****");
	            log("**** Failure reported: ", f_aisOctResultToEnum(v_report.payload.genericData.data[0]), " ****");
	            f_pushFailResult(oct2int(v_report.payload.genericData.data[0]));
	            f_pushFailResult(f_aisOctResultToEnum(v_report.payload.genericData.data[0]));
	            mgmtport.send(m_responseOK);
	            mgmtport.send(m_responseOK);
	            if((v_report.params.p2 == c_aisFirstOrNextCommand) or PXT_AUTOMATIC_TEST_INTERFACE) {	            
	        		repeat;
	        		repeat;
	            }    
	            }    
	        }	        	
			       		
			       		
	    } // end a_isReports
	    } // end a_isReports
	    
	    
	} // end isReports
	    altstep a_aisConfiguration() runs on MRTD {
	    	
  			[] mgmtport.receive(mw_getData_mrz) {
        		mgmtport.send(m_responseRead(m_opticalMrz(
        			substr(vc_simu.mrz, 0, lengthof(vc_simu.mrz)/2 ),
        			substr(vc_simu.mrz, lengthof(vc_simu.mrz)/2, lengthof(vc_simu.mrz)/2))));	    
        			    
  			}
   			[] mgmtport.receive(mw_getData_cert) {
   			    
   			}
	    } // end a_aisConfiguration 
	       
	} // end automaticInterfaceSpecificationAltsteps
	
	
	group inspectionProcedures {
	group inspectionProcedures {
		
		
@@ -338,7 +363,7 @@
				log("v_cleartextChallenge", v_cleartextChallenge);
				log("v_cleartextChallenge", v_cleartextChallenge);
				 		
				 		
				if(f_verifySignature(v_cleartextChallenge, v_signature, f_getAtPublickey())) {
				if(f_verifySignature(v_cleartextChallenge, v_signature, f_getAtPublickey())) {
					f_pushPassResult(enum2int(e_aisTerminalAuthentication));
					f_pushPassResult(e_aisTerminalAuthentication);
					vc_simu.securityStatus := e_terminalAuthenticated;
					vc_simu.securityStatus := e_terminalAuthenticated;
					mrtdport.send(m_responseOK);
					mrtdport.send(m_responseOK);
				}
				}
+137 −44
Original line number Original line Diff line number Diff line
@@ -21,7 +21,7 @@


	group externalFunctions {
	group externalFunctions {


		group mgmtExternalFunctions {
		group managementExternalFunctions {


			/**
			/**
			 * @desc	Activate the probe of the ePassport reader simulator
			 * @desc	Activate the probe of the ePassport reader simulator
@@ -34,7 +34,7 @@
			 * @see		Automatic Interfaces Specification (Version 1.0) - Clause 2. Automatic Interface Proposal
			 * @see		Automatic Interfaces Specification (Version 1.0) - Clause 2. Automatic Interface Proposal
			 */
			 */
            external function fx_deactivateProbe();
            external function fx_deactivateProbe();
		}
		} // end managementExternalFunctions


		group securityExternalFunctions {
		group securityExternalFunctions {


@@ -567,11 +567,22 @@
		
		
	} // end fileFunctions
	} // end fileFunctions
	
	
	
	group managementFunctions {

        function f_activateProbe() {
            fx_activateProbe();            
        }

        function f_deactivateProbe() {
            fx_deactivateProbe();
        }
	} // end managementFunctions

	group initializationFunctions {
	group initializationFunctions {
		
		
    	function f_initializeMRTD(in charstring p_configurationId) runs on MRTD {
    	function f_initializeMRTD(in charstring p_configurationId) runs on MRTD {
    		
    		
    		var octetstring v_mrz;
    		var octetstring v_cvcaData;
    		var octetstring v_cvcaData;
    		var CvCertificate v_cvcaCvCertificate;
    		var CvCertificate v_cvcaCvCertificate;
    		var integer v_decodeResult;
    		var integer v_decodeResult;
@@ -580,9 +591,9 @@
    		f_loadPassportConfiguration(p_configurationId);
    		f_loadPassportConfiguration(p_configurationId);
    		
    		
    		// Prepare basic access keys
    		// Prepare basic access keys
    		f_readFileData(c_fileMRZ, 0, -1, v_mrz);
    		f_readFileData(c_fileMRZ, 0, -1, vc_simu.mrz);
    		f_deriveKeys(f_extractKseedFromMrz(v_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(v_mrz);
    		vc_simu.documentNumber := f_extractDocumentNumberFromMrz(vc_simu.mrz);


			// FIXME: Force initialization of vc_simu.securityStatus - Mandatory because it's used in altstep
			// FIXME: Force initialization of vc_simu.securityStatus - Mandatory because it's used in altstep
			vc_simu.securityStatus := e_noApplication;
			vc_simu.securityStatus := e_noApplication;
@@ -616,49 +627,34 @@
        //function for initializing the system and start the ePassport procedure
        //function for initializing the system and start the ePassport procedure
        function f_initializeIS() runs on MRTD
        function f_initializeIS() runs on MRTD
        {
        {
        // import certicate configuration from TA ext function
            // Activate antenna
        // get certificate to IS
            f_activateProbe();
            
            
        mgmtport.send(m_start);
            if(not(PXT_AUTOMATIC_TEST_INTERFACE)) {
        	
				action("Please ensure that IS starts inspection procedure.");
        	/*alt{
        			[] mgmtport.receive(mw_getdata_mrz) 
        					{
        					mgmtport.send(m_setdata_mrz);
        					}
        			[] mgmtport.receive(mw_getdata_cert) 
        					{
        					mgmtport.send(m_setdata_cert);
        					}
        			[] mgmtport.receive
        					{
        					mgmtport.send(m_setdata_cert);  // to change to ERROR
        					}
			}
			}
			else {
				       	


        	alt{
        			[] mgmtport.receive(mw_getdata_mrz) 
        					{
        					mgmtport.send(m_setdata_mrz);
        					}
        			[] mgmtport.receive(mw_getdata_cert) 
        					{
        					mgmtport.send(m_setdata_cert);
        					}
        			[] mgmtport.receive
        					{
        					mgmtport.send(m_setdata_cert);  // to change to ERROR
        					}
        		}*/
                	        	
                	        	
        	if(not(PXT_AUTOMATIC_TEST_INTERFACE)) {
				action("Please ensure that IS starts inspection procedure.");
        	}
        	}
        	
        	
        	
        } // end f_initializeIS
        } // end f_initializeIS
			
			
	} // end initializationFunctions
	} // end initializationFunctions
	
	
	group postambleFunctions {
	    
	    function f_cleanUp() {
	    	
	    	// Dectivate antenna
            f_deactivateProbe();
	        
	    } // end f_cleanUp
	    
	} // end postambleFunctions

	function f_getCertificate(in octetstring p_data) return octetstring {
	function f_getCertificate(in octetstring p_data) return octetstring {
		// TODO: refine...
		// TODO: refine...
		return ''O;
		return ''O;
@@ -671,11 +667,11 @@


	group simuParamsFunctions {
	group simuParamsFunctions {
		
		
		function f_pushFailResult(in integer p_resultId) runs on MRTD {
		function f_pushFailResult(in AisFailureClass p_resultId) runs on MRTD {
	        vc_simu.isFailVerdicts[sizeof(vc_simu.isFailVerdicts)] := p_resultId;
	        vc_simu.isFailVerdicts[sizeof(vc_simu.isFailVerdicts)] := p_resultId;
	    } // end f_pushFailResult
	    } // end f_pushFailResult
	    
	    
	    function f_pushPassResult(in integer p_resultId) runs on MRTD {
	    function f_pushPassResult(in AisFailureClass p_resultId) runs on MRTD {
	        vc_simu.isPassVerdicts[sizeof(vc_simu.isPassVerdicts)] := p_resultId;
	        vc_simu.isPassVerdicts[sizeof(vc_simu.isPassVerdicts)] := p_resultId;
	    } // end f_pushPassResult
	    } // end f_pushPassResult
		
		
@@ -796,6 +792,103 @@
			
			
		} // end f_addTrustedCertificate
		} // end f_addTrustedCertificate
		
		
		function f_aisOctResultToEnum(in Oct1 p_octCode) 
		return AisFailureClass {
	
			if(p_octCode == '00'O) {
		     	return e_aisNoFailure;
			}
    		if(p_octCode == '01'O) {
    		     return e_aisOpticalReading;
			}
    		if(p_octCode == '02'O) {
    		     return e_aisCommunication;
			}
    		if(p_octCode == '03'O) {
    		     return e_aisApplication;
			}
    		if(p_octCode == '04'O) {
    		     return e_aisBacAuthentication;
			}
    		if(p_octCode == '05'O) {
    		     return e_aisSecureMessaging;
			}
    		if(p_octCode == '06'O) {
    		     return e_aisDgRead;
			}
    		if(p_octCode == '07'O) {
    		     return e_aisChipAuthentication;
			}
    		if(p_octCode == '08'O) {
    		     return e_aisTerminalAuthentication;
			}
    		if(p_octCode == '09'O) {
    		     return e_aisActiveAuthentication;
			}
    		if(p_octCode == '0A'O) {
    		     return e_aisPassiveAuthentication;
			}
    		if(p_octCode == '10'O) {
    		     return e_aisEfCom;
			}
    		if(p_octCode == '11'O) {
    		     return e_aisEfSod;
			}
    		if(p_octCode == '12'O) {
    		     return e_aisDg1;
			}
    		if(p_octCode == '13'O) {
    		     return e_aisDg2;
			}
    		if(p_octCode == '14'O) {
    		     return e_aisDg3;
			}
    		if(p_octCode == '15'O) {
    		     return e_aisDg4;
			}
    		if(p_octCode == '16'O) {
    		     return e_aisDg5;
			}
    		if(p_octCode == '17'O) {
    		     return e_aisDg6;
			}
    		if(p_octCode == '18'O) {
    		     return e_aisDg7;
			}
    		if(p_octCode == '19'O) {
    		     return e_aisDg8;
			}
    		if(p_octCode == '1A'O) {
    		     return e_aisDg9;
			}
    		if(p_octCode == '1B'O) {
    		     return e_aisDg10;
			}
    		if(p_octCode == '1C'O) {
    		     return e_aisDg11;
			}
    		if(p_octCode == '1D'O) {
    		     return e_aisDg12;
			}
    		if(p_octCode == '1E'O) {
    		     return e_aisDg13;
			}
    		if(p_octCode == '1F'O) {
    		     return e_aisDg14;
			}
    		if(p_octCode == '20'O) {
    		     return e_aisDg15;
			}
    		if(p_octCode == '21'O) {
    		     return e_aisDg16;
			}
    		if(p_octCode == '22'O) {
    		     return e_aisEfCvca;
			}
			
			return e_aisNoFailure;
		} // end f_aisOctResultToEnum
		
	} // end simuParamsFunctions
	} // end simuParamsFunctions


} // end ePassport_Functions
} // end ePassport_Functions
+33 −66
Original line number Original line Diff line number Diff line
@@ -18,61 +18,49 @@ module ePassport_Templates {


	group automaticTestInterface {
	group automaticTestInterface {
		
		
    	// fake variable need to be declared later with the test mode
		template CommandPutDataWith mw_report(template Oct2 v_failCode) := {
        // The type is WRONG, copied from the EFfile type
        // It may contain the certificate for the IS 
        // TEMPLATES m_start
    	template (value) Response m_start := {
    	   	responseData := omit,
    		w1w2 := '9999'O // ???
    	}	
    	
    	// TEMPLATES m_get_data_certificate see Automatic Interface Proposal
    	template CommandGeneric mw_getdata_cert := {
    	   	class := mw_class_01,	
    	   	class := mw_class_01,	
    		ins := e_getData,	
    	  	ins := e_putDataWithDataBytes, //'da'O,		
    	  	params := {
    	  	params := {
				p1 := '00000001'B,   		// values for Certificate reference ID
				p1 := '00001111'B,    		
	  			p2 := '11110001'B
	  			p2 := ?
	  		},
	  		},
    		lengthC := ?,
  			lengthC := *,
  			payload := {
  			payload := {
  				genericData := {
  				genericData := {
  					data := omit
  					data := v_failCode
  				}	
  				}	
  			},
  			},
  			lengthE := 0
  			lengthE := omit	
    	}
    	}
		
		
    	// TEMPLATES m_get_data_MRZ
    	template CommandGetData mw_getData_cert := {
        template CommandGeneric mw_getdata_mrz := {
    		class := mw_class_01,		
    		class := mw_class_01,		
    		ins := e_getData,	
    		ins := e_getData,	
			params := {
			params := {
	  			p1 := '00000001'B,   		
				p1 := c_aisGetDataP1,
	  			p2 := '11110010'B
	  			p2 := c_aisGetDataP2CertificateRef
    		},
    		},
  			lengthC := *,
    		lengthC := omit,
  			payload := *,
  			payload := omit, 
  			lengthE := 0			
  			lengthE := 256 
    	}
    	
    	// TEMPLATES m_setdata_cert
    	template (value) Response m_setdata_cert := {   // to be change later by defining a real function to provide certificate to the IS !!!
            responseData := omit,
            w1w2 := '9999'O // ???
    	}    	
    	}    	


    	// TEMPLATES m_start
        template CommandGetData mw_getData_mrz := {
        template (value) Response m_setdata_mrz := {
            class := mw_class_01,		
           	responseData := m_responseData(char2oct("bleu")),   // to be change later by providing real data !!!
            ins := e_getData,
        	w1w2 := c_w1w2NormalProcessing
            params := {
	  			p1 := c_aisGetDataP1,   		
	  			p2 := c_aisGetDataP2OpticalMrz
            },
  			lengthC := omit,
  			payload := omit,
  			lengthE := 256			
    	}
    	}
    	
    	
        template (value) ResponseData m_responseData(
    	template (value) PlainTextResponseData m_opticalMrz(in octetstring p_mrzLine1, in octetstring p_mrzLine2) 
			template (value) PlainTextResponseData p_responseData) := {
    		:= c_aisMrzLine1Tag & int2oct(lengthof(p_mrzLine1), 1) & p_mrzLine1
			plainText := p_responseData	
    		& c_aisMrzLine2Tag & int2oct(lengthof(p_mrzLine2), 1) & p_mrzLine2;
		}
     
     
	} // end automaticTestInterface
	} // end automaticTestInterface


@@ -104,27 +92,6 @@ module ePassport_Templates {
		}
		}
	}
	}


	group managementTemplates {

    	// TEMPLATES mw_report
        template CommandGeneric mw_report(template Oct2 v_failCode) := {
    	   	class := mw_class_01,	
    	  	ins := e_putDataWithDataBytes, //'da'O,		
    	  	params := {
				p1 := '00001111'B,    		
	  			p2 := ?
	  		},
  			lengthC := *,
  			payload := {
  				genericData := {
  					data := v_failCode
  				}	
  			},
  			lengthE := omit	
    	}
    	    	    	
	} // end managementTemplates

    group commandTemplates {
    group commandTemplates {
    	
    	
		//SELECT TEMPLATES : Send APDU to the passport 00 a4 04 0c 07 a0 00 00 02 47 10 01                      
		//SELECT TEMPLATES : Send APDU to the passport 00 a4 04 0c 07 a0 00 00 02 47 10 01                      
+2 −1
Original line number Original line Diff line number Diff line
@@ -62,6 +62,7 @@ module ePassport_TestSystem {
		Chr	dst optional,	
		Chr	dst optional,	
		Chr at optional,
		Chr at optional,
		octetstring challenge optional,
		octetstring challenge optional,
		octetstring mrz optional,
		octetstring documentNumber optional,
		octetstring documentNumber optional,
		octetstring isDhPublicKeyHash optional,
		octetstring isDhPublicKeyHash optional,
		
		
@@ -127,7 +128,7 @@ group portDefs {
	};
	};
	
	
	type port MgmtPort message {
	type port MgmtPort message {
		in CommandGeneric;
		in CommandGetData, CommandPutDataWith;
		out Response;
		out Response;
	};
	};
	
	
+108 −72

File changed.

Preview size limit exceeded, changes collapsed.

Loading