Commit a1d6350f authored by berge's avatar berge
Browse files

Changed EF files handling

parent 7f1f2094
Loading
Loading
Loading
Loading
+33 −21
Original line number Diff line number Diff line
@@ -29,12 +29,12 @@
			[vc_simu.passportProtection == e_plain] a_readAnyFile();

			// DG3 only accessible if terminal is authenticated
			[vc_simu.securityStatus >= e_terminalAuthenticated] a_readFile(c_longFileIdDG3);
			[vc_simu.securityStatus < e_terminalAuthenticated] a_refuseFileAccess(c_longFileIdDG3);
			[vc_simu.securityStatus >= e_terminalAuthenticated] a_readFile(c_fileDG3);
			[vc_simu.securityStatus < e_terminalAuthenticated] a_refuseFileAccess(c_fileDG3);

			// DG4 only accessible if terminal is authenticated
			[vc_simu.securityStatus >= e_terminalAuthenticated] a_readFile(c_longFileIdDG4);
			[vc_simu.securityStatus < e_terminalAuthenticated] a_refuseFileAccess(c_longFileIdDG4);
			[vc_simu.securityStatus >= e_terminalAuthenticated] a_readFile(c_fileDG4);
			[vc_simu.securityStatus < e_terminalAuthenticated] a_refuseFileAccess(c_fileDG4);
			
			// any other file accessible if BAC performed
			[vc_simu.securityStatus >= e_basicAccessControl] a_readAnyFile();
@@ -237,37 +237,42 @@
        } // end a_bac
            	
		
		altstep a_readFile(in LongFileId p_fileId) runs on MRTD {
		altstep a_readFile(in FileInfo p_file) runs on MRTD {
	
    		var Command v_command;
    		var integer v_logicalChannel;
    		var LongFileId v_longFileId;
    		var ShortFileId v_shortFileId;
    		var octetstring v_data := ''O;
    		var integer v_dataLength;
    		var integer v_offset;
    		var W1W2Status v_result;
    		
    		// SELECT Command
        	[] mrtdport.receive(mw_selectByFileID(p_fileId)) -> value v_command {
        	[] mrtdport.receive(mw_selectByFileID(p_file.longFileId)) -> value v_command {
        		
        		// set current file for logical channel
        		v_logicalChannel := f_getLogicalChannel(v_command.class);
        		vc_simu.currentFiles[v_logicalChannel] := v_command.payload.plainText.commandData;
        		v_longFileId := v_command.payload.plainText.commandData;
        		vc_simu.currentFiles[v_logicalChannel] := getFileByLongId(v_longFileId);
        				
        		mrtdport.send(m_responseOK);
        		repeat;
        	}
        		
        	// READ Command with short EF
    		[] mrtdport.receive(mw_readShortEF(f_longFileIdToShortFileId(p_fileId))) -> value v_command {
    		[] mrtdport.receive(mw_readShortEF(p_file.shortFileId)) -> value v_command {
    
    			// set current file for logical channel
        		v_logicalChannel := f_getLogicalChannel(v_command.class);
        		vc_simu.currentFiles[v_logicalChannel] := v_command.payload.plainText.commandData;
        		v_shortFileId := v_command.payload.plainText.commandData;
        		vc_simu.currentFiles[v_logicalChannel] :=  getFileByShortId(v_shortFileId);
        					
    			v_offset := bit2int(v_command.p2);
    			v_dataLength := v_command.payload.plainText.lengthE;
      		
        		v_result := f_readFileData(v_logicalChannel, v_offset, v_dataLength, v_data);
        		v_result := f_readFileData(vc_simu.currentFiles[v_logicalChannel], 
        			v_offset, v_dataLength, v_data);
        		mrtdport.send(m_responseRead(v_data, v_result));

    			repeat;
@@ -278,7 +283,7 @@
    		
    			// Check current file
    			v_logicalChannel := f_getLogicalChannel(v_command.class);
    			if(vc_simu.currentFiles[v_logicalChannel] == c_longFileIdNoFile) {
    			if(vc_simu.currentFiles[v_logicalChannel] == c_noFileInfo) {
    				log(""); //TODO
    				mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
    				repeat;
@@ -286,7 +291,8 @@
    		
    			v_offset := bit2int(v_command.p1 & v_command.p2);
    			
    			v_result := f_readFileData(v_logicalChannel, v_offset, v_dataLength, v_data);
    			v_result := f_readFileData(vc_simu.currentFiles[v_logicalChannel],
    			 	v_offset, v_dataLength, v_data);
        		mrtdport.send(m_responseRead(v_data, v_result));
    			 
    			repeat;			
@@ -302,6 +308,8 @@
	
    		var Command v_command;
    		var integer v_logicalChannel;
    		var LongFileId v_longFileId;
    		var ShortFileId v_shortFileId;
    		var octetstring v_data := ''O;
    		var integer v_dataLength;
    		var integer v_offset;
@@ -312,7 +320,8 @@
        		
        		// set current file for logical channel
        		v_logicalChannel := f_getLogicalChannel(v_command.class);
        		vc_simu.currentFiles[v_logicalChannel] := v_command.payload.plainText.commandData;
        		v_longFileId := v_command.payload.plainText.commandData;
        		vc_simu.currentFiles[v_logicalChannel] := getFileByLongId(v_longFileId);
        				
        		mrtdport.send(m_responseOK);
        		repeat;
@@ -323,12 +332,14 @@
    
    			// set current file for logical channel
        		v_logicalChannel := f_getLogicalChannel(v_command.class);
        		vc_simu.currentFiles[v_logicalChannel] := v_command.payload.plainText.commandData;
				v_shortFileId := v_command.payload.plainText.commandData;
        		vc_simu.currentFiles[v_logicalChannel] :=  getFileByShortId(v_shortFileId);
        		       					
    			v_offset := bit2int(v_command.p2);
    			v_dataLength := v_command.payload.plainText.lengthE;
      		
        		v_result := f_readFileData(v_logicalChannel, v_offset, v_dataLength, v_data);
        		v_result := f_readFileData(vc_simu.currentFiles[v_logicalChannel], 
        			v_offset, v_dataLength, v_data);
        		mrtdport.send(m_responseRead(v_data, v_result));
    			
    			repeat;
@@ -339,7 +350,7 @@
    		
    			// Check current file
    			v_logicalChannel := f_getLogicalChannel(v_command.class);
    			if(vc_simu.currentFiles[v_logicalChannel] == c_longFileIdNoFile) {
    			if(vc_simu.currentFiles[v_logicalChannel] == c_noFileInfo) {
    				log(""); //TODO
    				mrtdport.send(m_responseNOK(c_w1w2NoCurrentEF));
    				repeat;
@@ -347,7 +358,8 @@
    		
    			v_offset := bit2int(v_command.p1 & v_command.p2);
    			
    			v_result := f_readFileData(v_logicalChannel, v_offset, v_dataLength, v_data);
    			v_result := f_readFileData(vc_simu.currentFiles[v_logicalChannel], 
    				v_offset, v_dataLength, v_data);
        		mrtdport.send(m_responseRead(v_data, v_result));
    			 
    			repeat;			
@@ -357,16 +369,16 @@
    				
    	} // end of a_readAnyFile

		altstep a_refuseFileAccess(in LongFileId p_fileId) runs on MRTD {
		altstep a_refuseFileAccess(in FileInfo p_file) runs on MRTD {
		
			// SELECT Command
        	[] mrtdport.receive(mw_selectByFileID(p_fileId)) {
        	[] mrtdport.receive(mw_selectByFileID(p_file.longFileId)) {
        		mrtdport.send(m_responseNOK(c_w1w2SecurityStatusNotSatisfied));
        		repeat;
        	}
        		
        	// READ Command with short EF
    		[] mrtdport.receive(mw_readShortEF(f_longFileIdToShortFileId(p_fileId))) {
    		[] mrtdport.receive(mw_readShortEF(p_file.shortFileId)) {
        		mrtdport.send(m_responseNOK(c_w1w2SecurityStatusNotSatisfied));
        		repeat;
    		}
+32 −75
Original line number Diff line number Diff line
@@ -39,17 +39,14 @@
			external function fx_loadPassportConfiguration(in charstring p_configurationID) return charstring;
			// fx_unloadPassportConfiguration()
			
			
			 
			// The Test Adapter should have filled an array of hexstring with the content of the file
            // The TTCN requests here datalength hexstring values of the file=filename, from pointer pt 
            external function fx_findstring ( in charstring p_activefile, inout Oct2 p_offset, inout LengthE p_datalength  ) return octetstring;
    
			external function fx_readFileData(
			in charstring p_filename, 
				in integer p_offset, 
				in integer p_dataLength, 
				out octetstring p_data);
		} // end fileExternalFunctions

    

	}
	} // end externalFunctions
	
	group configurationFunctions {
	
@@ -258,80 +255,40 @@
		
		
		function f_readFileData(
			in integer v_logicalChannel, 
			in integer v_offset, 
			in integer v_dataLength, 
			out octetstring v_data)
			in FileInfo p_fileInfo, 
			in integer p_offset, 
			in integer p_dataLength, 
			out octetstring p_data)
		return W1W2Status {
			
			//TODO: error handling
			fx_readFileData(p_fileInfo.filename, p_offset, p_dataLength, p_data);
			return c_w1w2NormalProcessing;
			
		} //end f_readFileData

		// FIXME: Cleaner way ?
		function f_longFileIdToShortFileId(in LongFileId p_longFileId) return ShortFileId {
		function getFileByLongId(in LongFileId p_longFileId) return FileInfo {
			var integer i;
			
			if(p_longFileId == c_longFileIdDG1) {
				return c_shortFileIdDG1;
			}
			if(p_longFileId == c_longFileIdDG2) {
				return c_shortFileIdDG2;
			}
			if(p_longFileId == c_longFileIdDG3) {
				return c_shortFileIdDG3;
			}
			if(p_longFileId == c_longFileIdDG4) {
				return c_shortFileIdDG4;
			}
			if(p_longFileId == c_longFileIdDG5) {
				return c_shortFileIdDG5;
			}
			if(p_longFileId == c_longFileIdDG6) {
				return c_shortFileIdDG6;
			}
			if(p_longFileId == c_longFileIdDG7) {
				return c_shortFileIdDG7;
			for(i:=0; i<sizeof(c_ePassportFiles); i:=i+1) {
				if(c_ePassportFiles[i].longFileId == p_longFileId) {
					return c_ePassportFiles[i];
				}
			if(p_longFileId == c_longFileIdDG8) {
				return c_shortFileIdDG8;
			}
			if(p_longFileId == c_longFileIdDG9) {
				return c_shortFileIdDG9;
			}
			if(p_longFileId == c_longFileIdDG10) {
				return c_shortFileIdDG10;
			}
			if(p_longFileId == c_longFileIdDG11) {
				return c_shortFileIdDG11;
			}
			if(p_longFileId == c_longFileIdDG12) {
				return c_shortFileIdDG12;
			}
			if(p_longFileId == c_longFileIdDG13) {
				return c_shortFileIdDG13;
			}
			if(p_longFileId == c_longFileIdDG14) {
				return c_shortFileIdDG14;
			}
			if(p_longFileId == c_longFileIdDG15) {
				return c_shortFileIdDG15;
			}
			if(p_longFileId == c_longFileIdDG16) {
				return c_shortFileIdDG16;
			}
			if(p_longFileId == c_longFileIdCVCA) {
				return c_shortFileIdCVCA;
			}
			if(p_longFileId == c_longFileIdSOD) {
				return c_shortFileIdSOD;
			
			return c_noFileInfo;			
		} // end getFileByLongId
		
		function getFileByShortId(in ShortFileId p_shortFileId) return FileInfo {
			var integer i;
			
			for(i:=0; i<sizeof(c_ePassportFiles); i:=i+1) {
				if(c_ePassportFiles[i].shortFileId == p_shortFileId) {
					return c_ePassportFiles[i];
				}
			if(p_longFileId == c_longFileIdCOM) {
				return c_shortFileIdCOM;
			}
			
			return '00'O;
			
		} // end f_longFileIdToShortFileId
			return c_noFileInfo;			
		} // end getFileByShortId
		
	} // end fileFunctions

+0 −138
Original line number Diff line number Diff line
@@ -94,144 +94,6 @@ module ePassport_Templates {
	  	payload := mw_payload(v_failCode, 0)
	}

    group simpleFileTemplates {
    	
		// TEMPLATES EF.COM file
        template (value) EFfile m_fileCOM := {
		    filename := "EF.COM",
			shortFileId := '1e'O,
			fileID := '011e'O
		}

		// TEMPLATES EF.SOD file
        template (value) EFfile m_fileSOD := {
		    filename := "EF.SOD",
			shortFileId := '1d'O,
			fileID := '011d'O
		}

		// TEMPLATES DG1 file
        template (value) EFfile m_fileDG1 := {
		    filename := "EF.DG1",
			shortFileId := '01'O,
			fileID := '0101'O
		}

		// TEMPLATES DG2 file
        template (value) EFfile m_fileDG2 := {
		    filename := "EF.DG2",
			shortFileId := '02'O,
			fileID := '0102'O
		}

		// TEMPLATES DG3 file
        template (value) EFfile m_fileDG3 := {
		    filename := "EF.DG3",
			shortFileId := '03'O,
			fileID := '0103'O
		}

		// TEMPLATES DG4 file
        template (value) EFfile m_fileDG4 := {
		    filename := "EF.DG4",
			shortFileId := '04'O,
			fileID := '0104'O
		}

		// TEMPLATES DG14 file
        template (value) EFfile m_fileDG14 := {
		    filename := "EF.DG14",
			shortFileId := '0e'O,
			fileID := '010e'O
		 }

		// TEMPLATES DG15 file
        template (value) EFfile m_fileDG15 := {
		    filename := "EF.DG15",
			shortFileId := '0f'O,
			fileID := '010f'O
		}


		// TEMPLATES EF.CVCA file
        template (value) EFfile m_fileCVCA := {
		    filename := "EF.CVCA",
			shortFileId := '1c'O,
			fileID := '011c'O
		}
	}//group Simple_files_templates


    group ConfigSet_templates {
    	
        // TEMPLATES Configuration set
        template (value) ConfigurationSet m_cfg_plain := {
            efcom := m_fileCOM,
    		efsod := m_fileSOD,
    		dg1 := m_fileDG1,
    		dg2 := m_fileDG2,
    		dg3 := omit,
    		dg4 :=omit,
    		dg14 :=omit,
    		dg15 :=omit,
    		efcvca :=omit,
    		fileslist := "EF.COM,EF.SOD,DG1,DG2",
     		docNumber :=omit,
      		trustPoint :=omit,
        	mrz := PXT_MRZ
    	};
    
    	template (value) ConfigurationSet m_cfg_bac := {
            efcom := m_fileCOM,
    		efsod := m_fileSOD,
    		dg1 := m_fileDG1,
    		dg2 := m_fileDG2,
    		dg3 := omit,
    		dg4 := omit,
    		dg14 := omit,
    		dg15 := omit,
    		efcvca := omit,
    		fileslist := "EF.COM,EF.SOD,DG1,DG2",
     		docNumber := omit,
      		trustPoint := omit,
        	mrz := PXT_MRZ
    	};
    
    	template (value) ConfigurationSet m_cfg_eac := {
            efcom := m_fileCOM,
    		efsod := m_fileSOD,
    		dg1 := m_fileDG1,
    		dg2 := m_fileDG2,
    		dg3 := m_fileDG3,
    		dg4 := m_fileDG4,
    		dg14 := m_fileDG14,
    		dg15 := omit,
    		efcvca := omit,
    		fileslist := "EF.COM,EF.SOD,DG1,DG2,DG3,DG4,DG14",
     		docNumber := "C11T002JM4",
      		trustPoint := omit,
        	mrz := PXT_MRZ
    	};
    
    
    	template (value) ConfigurationSet m_cfg_eac_aa := {
            efcom := m_fileCOM,
    		efsod := m_fileSOD,
    		dg1 := m_fileDG1,
    		dg2 := m_fileDG2,
    		dg3 := m_fileDG3,
    		dg4 := m_fileDG4,
    		dg14 := m_fileDG14,
    		dg15 := m_fileDG15,
    		efcvca := omit,
    		fileslist := "EF.COM,EF.SOD,DG1,DG2,DG3,DG4,DG14,DG15",
     		docNumber := "C11T002JM4",
      		trustPoint := omit,
        	mrz := PXT_MRZ
    	};
    }


    group Command_templates
    {
		//SELECT TEMPLATES : Send APDU to the passport 00 a4 04 0c 07 a0 00 00 02 47 10 01                      
+1 −4
Original line number Diff line number Diff line
@@ -47,13 +47,10 @@ module ePassport_TestSystem {
	** @desc	Test Component Variables are defined here  
	*
	*/
	type LongFileId CurrentFile;
	type record of CurrentFile CurrentFiles;
	
	type record SimuParams {
		SecurityStatus securityStatus,
		PassportProtection passportProtection,
		CurrentFiles currentFiles,
		FileSet currentFiles,
		octetstring kEnc,
		octetstring kMac,
		octetstring privateKey
+5 −20
Original line number Diff line number Diff line
@@ -48,34 +48,19 @@ module ePassport_Types {
      	type Oct2 LongFileId;
      	type Oct1 ShortFileId;
      	
        type record EFfile {
        type record FileInfo {
    		charstring filename,
    		ShortFileId shortFileId,
    		LongFileId fileID
    		LongFileId longFileId
    	};
    	
        type record of FileInfo FileSet;
        	
        type enumerated MrtdConfiguration {
        	e_cfgDfltBac,
        	e_cfgDfltEac	
        }
                
        
        type record ConfigurationSet {
                
    		EFfile efcom,
    		EFfile efsod,
    		EFfile dg1,
    		EFfile dg2,
    		EFfile dg3 optional,
    		EFfile dg4 optional,
    		EFfile dg14 optional,
    		EFfile dg15 optional,
    		EFfile efcvca optional,
    		charstring fileslist,
     		charstring docNumber optional,
      		charstring trustPoint optional,
        	charstring mrz
    	};
    } // end filesGroup

	group messageTypesGroup {
Loading