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

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

			// Terminal Authentication
			// Pass result pushed in a_terminalAuthentication
			
			// Communication 
			if(not(match(vc_simu.isFailVerdicts, superset(enum2int(e_aisCommunication))))) {
        		f_pushPassResult(enum2int(e_aisCommunication));
			if(not(match(vc_simu.isFailVerdicts, superset(e_aisCommunication)))) {
        		f_pushPassResult(e_aisCommunication);
        	} 
        	
        	if(match(vc_simu.isFailVerdicts, p_expectedFailResults)
        		and match(vc_simu.isPassVerdicts, p_expectedPassResults)) {
        	// Fail verdicts
        	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 ****");
        		setverdict(pass);
        	}
@@ -152,27 +162,42 @@

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

	group externalFunctions {

		group mgmtExternalFunctions {
		group managementExternalFunctions {

			/**
			 * @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
			 */
            external function fx_deactivateProbe();
		}
		} // end managementExternalFunctions

		group securityExternalFunctions {

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

        function f_activateProbe() {
            fx_activateProbe();            
        }

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

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

			// FIXME: Force initialization of vc_simu.securityStatus - Mandatory because it's used in altstep
			vc_simu.securityStatus := e_noApplication;
@@ -616,49 +627,34 @@
        //function for initializing the system and start the ePassport procedure
        function f_initializeIS() runs on MRTD
        {
        // import certicate configuration from TA ext function
        // get certificate to IS
            // Activate antenna
            f_activateProbe();
            
        mgmtport.send(m_start);
        	
        	/*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.");
			}
			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 initializationFunctions
	
	group postambleFunctions {
	    
	    function f_cleanUp() {
	    	
	    	// Dectivate antenna
            f_deactivateProbe();
	        
	    } // end f_cleanUp
	    
	} // end postambleFunctions

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

	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;
	    } // 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;
	    } // end f_pushPassResult
		
@@ -796,6 +792,103 @@
			
		} // 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 ePassport_Functions
+33 −66
Original line number Diff line number Diff line
@@ -18,61 +18,49 @@ module ePassport_Templates {

	group automaticTestInterface {
		
    	// fake variable need to be declared later with the test mode
        // 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 := {
		template CommandPutDataWith mw_report(template Oct2 v_failCode) := {
    	   	class := mw_class_01,	
    		ins := e_getData,	
    	  	ins := e_putDataWithDataBytes, //'da'O,		
    	  	params := {
				p1 := '00000001'B,   		// values for Certificate reference ID
	  			p2 := '11110001'B
				p1 := '00001111'B,    		
	  			p2 := ?
	  		},
    		lengthC := ?,
  			lengthC := *,
  			payload := {
  				genericData := {
  					data := omit
  					data := v_failCode
  				}	
  			},
  			lengthE := 0
  			lengthE := omit	
    	}
		
    	// TEMPLATES m_get_data_MRZ
        template CommandGeneric mw_getdata_mrz := {
    	template CommandGetData mw_getData_cert := {
    		class := mw_class_01,		
    		ins := e_getData,	
			params := {
	  			p1 := '00000001'B,   		
	  			p2 := '11110010'B
				p1 := c_aisGetDataP1,
	  			p2 := c_aisGetDataP2CertificateRef
    		},
  			lengthC := *,
  			payload := *,
  			lengthE := 0			
    	}
    	
    	// 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 // ???
    		lengthC := omit,
  			payload := omit, 
  			lengthE := 256 
    	}    	

    	// TEMPLATES m_start
        template (value) Response m_setdata_mrz := {
           	responseData := m_responseData(char2oct("bleu")),   // to be change later by providing real data !!!
        	w1w2 := c_w1w2NormalProcessing
        template CommandGetData mw_getData_mrz := {
            class := mw_class_01,		
            ins := e_getData,
            params := {
	  			p1 := c_aisGetDataP1,   		
	  			p2 := c_aisGetDataP2OpticalMrz
            },
  			lengthC := omit,
  			payload := omit,
  			lengthE := 256			
    	}
    	
        template (value) ResponseData m_responseData(
			template (value) PlainTextResponseData p_responseData) := {
			plainText := p_responseData	
		}
    	template (value) PlainTextResponseData m_opticalMrz(in octetstring p_mrzLine1, in octetstring p_mrzLine2) 
    		:= c_aisMrzLine1Tag & int2oct(lengthof(p_mrzLine1), 1) & p_mrzLine1
    		& c_aisMrzLine2Tag & int2oct(lengthof(p_mrzLine2), 1) & p_mrzLine2;
     
	} // 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 {
    	
		//SELECT TEMPLATES : Send APDU to the passport 00 a4 04 0c 07 a0 00 00 02 47 10 01                      
+2 −1
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ module ePassport_TestSystem {
		Chr	dst optional,	
		Chr at optional,
		octetstring challenge optional,
		octetstring mrz optional,
		octetstring documentNumber optional,
		octetstring isDhPublicKeyHash optional,
		
@@ -127,7 +128,7 @@ group portDefs {
	};
	
	type port MgmtPort message {
		in CommandGeneric;
		in CommandGetData, CommandPutDataWith;
		out Response;
	};
	
+108 −72

File changed.

Preview size limit exceeded, changes collapsed.

Loading