Commit4fe327ae by developer4

0.1-pre-alpha

Bug-fix: various bugs during alpha testing. Added Linux build configurations.
09af1cd4
language.settings.xml
*.o
/win32_debug/
/win32_release/src/
/win64_debug/
/win32_release/src/
/win64_release/src/
/linux32_release/src/
/linux64_release/src/
\ No newline at end of file
... ... @@ -5,6 +5,18 @@ environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.mingw.exe.debug.
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.debug.592954317/C_INCLUDE_PATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.debug.592954317/append=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.debug.592954317/appendContributed=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679.1429706606/CPATH/delimiter=\:
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679.1429706606/CPATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679.1429706606/C_INCLUDE_PATH/delimiter=\:
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679.1429706606/C_INCLUDE_PATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679.1429706606/append=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679.1429706606/appendContributed=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679/CPATH/delimiter=\:
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679/CPATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679/C_INCLUDE_PATH/delimiter=\:
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679/C_INCLUDE_PATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679/append=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1681765679/appendContributed=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1927850329/CPATH/delimiter=;
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1927850329/CPATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1927850329/C_INCLUDE_PATH/delimiter=;
... ... @@ -15,6 +27,14 @@ environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.592954317/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.592954317/append=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.debug.592954317/appendContributed=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1681765679.1429706606/LIBRARY_PATH/delimiter=\:
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1681765679.1429706606/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1681765679.1429706606/append=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1681765679.1429706606/appendContributed=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1681765679/LIBRARY_PATH/delimiter=\:
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1681765679/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1681765679/append=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1681765679/appendContributed=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1927850329/LIBRARY_PATH/delimiter=;
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1927850329/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1927850329/append=true
... ...
... ... @@ -6,6 +6,7 @@
#include
#include
#include
#include
#include "ini.h"
#include "f_utils.h"
... ... @@ -70,110 +71,150 @@ void mrtd_fileread_write_image_to_file(const uint8_t *file_content, const int fi
}
}
voidmrtd_fileread_get_datagroup_name(constuint8_tdg,char*name){
voidget_dg_name(constuint8_tdg,char*name){
switch(dg){
case(0x60):
sprintf(name,"EF_COM");
sprintf(name,"EF.COM");
break;
case(0x61):
sprintf(name,"EF_DG1");
sprintf(name,"EF.DG1");
break;
case(0x75):
sprintf(name,"EF_DG2");
sprintf(name,"EF.DG2");
break;
case(0x63):
sprintf(name,"EF_DG3");
sprintf(name,"EF.DG3");
break;
case(0x76):
sprintf(name,"EF_DG4");
sprintf(name,"EF.DG4");
break;
case(0x65):
sprintf(name,"EF_DG5");
sprintf(name,"EF.DG5");
break;
case(0x66):
sprintf(name,"EF_DG6");
sprintf(name,"EF.DG6");
break;
case(0x67):
sprintf(name,"EF_DG7");
sprintf(name,"EF.DG7");
break;
case(0x68):
sprintf(name,"EF_DG8");
sprintf(name,"EF.DG8");
break;
case(0x69):
sprintf(name,"EF_DG9");
sprintf(name,"EF.DG9");
break;
case(0x6a):
sprintf(name,"EF_DG10");
sprintf(name,"EF.DG10");
break;
case(0x6b):
sprintf(name,"EF_DG11");
sprintf(name,"EF.DG11");
break;
case(0x6c):
sprintf(name,"EF_DG12");
sprintf(name,"EF.DG12");
break;
case(0x6d):
sprintf(name,"EF_DG13");
sprintf(name,"EF.DG13");
break;
case(0x6e):
sprintf(name,"EF_DG14");
sprintf(name,"EF.DG14");
break;
case(0x6f):
sprintf(name,"EF_DG15");
sprintf(name,"EF.DG15");
break;
case(0x70):
sprintf(name,"EF_DG16");
sprintf(name,"EF.DG16");
break;
case(0 x77):
sprintf(name,"EF_SOD");
sprintf(name,"EF.SOD");
break;
default:
sprintf(name,"not defined");
sprintf(name,"not defined, tag = 0x%02X",dg);
break;
}
return;
}
voidmrtd_fileread_decode_ef_com(constuint8_t*file_content,constintfile_size,uint8_t*datagroups,int*numdatagroups){
inti;
intcurrentlength;
intinterncounter;
inttotallength;
charlonger=0;
charcurrentkeys=0;
currentlength=0;
*numdatagroups=0;
for(i=0;i<file_size;i++){
if(i==1){
totallength=file_content[i];
interncounter=0;
}elseif(longer==1){
longer=2;
}elseif(longer==2){
longer=0;
currentlength=file_content[i];
interncounter=0;
}elseif(interncounter==currentlength&&file_content[i]==0x5f){
currentkeys=0;
longer=1;
}elseif(interncounter==currentlength){
longer=2;
if(file_content[i]==0x5c)
currentkeys=1;
else
currentkeys=0;
}else{
if(currentkeys){
datagroups[interncounter]=file_content[i];
charbuffer[30];
mrtd_fileread_get_datagroup_name(datagroups[interncounter],buffer);
printf("Found: %s\n",buffer);
(*numdatagroups)++;
}
interncounter++;
}
voidshow_files_tag_list(constuint8_t*files_tag_list,constinttag_list_size){
printf(" Existing data groups list:\n");
for(inti=0;i<tag_list_size;i++){
charbuffer[30];
get_dg_name(files_tag_list[i],buffer);
printf(" Found: %s\n",buffer);
}
printf("\n");
}
boolisBigEndian(void){
uint32_tui=1;
uint8_t*ptr=(uint8_t*)&ui;
if(ptr[0]==1)
returnfalse;
else
returntrue;
}
#define MAX_TLV_LEN_FIELD 3
#if MAX_TLV_LEN_FIELD > 5
# error MAX_TLV_LEN_FIELD == 5 is implemented
#endif
boolget_ber_tlv_len(constuint8_t*length_ptr,uint8_t*field_len,uint32_t*decoded_len){
if(length_ptr[0]<0x80){
*decoded_len=length_ptr[0];
*field_len=1;
}
#if MAX_TLV_LEN_FIELD >= 2
elseif(length_ptr[0]==0x81){
*decoded_len=length_ptr[1];
*field_len=2;
}
#endif
#if MAX_TLV_LEN_FIELD >= 3
elseif(length_ptr[0]==0x82){
if(isBigEndian()){
*(((uint8_t*)decoded_len)+0)=length_ptr[1];
*(((uint8_t*)decoded_len)+1)=length_ptr[2];
}else{
*(((uint8_t*)decoded_len)+1)=length_ptr[1];
*(((uint8_t*)decoded_len)+0)=length_ptr[2];
}
*field_len=3;
}
#endif
#if MAX_TLV_LEN_FIELD >= 4
elseif(length_ptr[0]==0x83){
if(endianness()){
*(((uint8_t*)decoded_len)+0)=length_ptr[1];
*(((uint8_t*)decoded_len)+1)=length_ptr[2];
*(((uint8_t*)decoded_len)+2)=length_ptr[3];
}else{
*(((uint8_t*)decoded_len)+2)=length_ptr[1];
*(((uint8_t*)decoded_len)+1)=length_ptr[2];
*(((uint8_t*)decoded_len)+0)=length_ptr[3];
}
*field_len=4;
}
#endif
#if MAX_TLV_LEN_FIELD >= 5
elseif(length_ptr[0]==0x84){
if(endianness()){
*(((uint8_t*)decoded_len)+0)=length_ptr[1];
*(((uint8_t*)decoded_len)+1)=length_ptr[2];
*(((uint8_t*)decoded_len)+2)=length_ptr[3];
*(((uint8_t*)decoded_len)+3)=length_ptr[4];
}else{
*(((uint8_t*)decoded_len)+3)=length_ptr[1];
*(((uint8_t*)decoded_len)+2)=length_ptr[2];
*(((uint8_t*)decoded_len)+1)=length_ptr[3];
*(((uint8_t*)decoded_len)+0)=length_ptr[4];
}
*field_len=5;
}
#endif
else
returnfalse;
returntrue;
}
... ... @@ -6,7 +6,9 @@
#define F_UTILS_H_
voidmrtd_fileread_write_image_to_file(constuint8_t*file_content,constintfile_size,constchar*filename);
voidmrtd_fileread_get_datagroup_name(constuint8_tdg,char*name);
voidmrtd_fileread_decode_ef_com(constuint8_t*file_content,constintfile_size,uint8_t*datagroups,int*numdatagroups);
voidget_dg_name(constuint8_tdg,char*name);
voidshow_files_tag_list(constuint8_t*files_tag_list,constinttag_list_size);
boolisBigEndian(void);
boolget_ber_tlv_len(constuint8_t*length_ptr,uint8_t*field_len,uint32_t*decoded_len);
#endif/* F_UTILS_H_ */
... ... @@ -91,57 +91,3 @@ bool CheckDependencies(void) {
returntrue;
}
//------------------------------------------------------------------------------
#if __WIN32 || __WIN64
doubletime_difference_s(LARGE_INTEGERstart,LARGE_INTEGERend){
staticLARGE_INTEGERfrequency;
doubleres;
if(frequency.QuadPart==0){
QueryPerformanceFrequency(&frequency);
}
res=(double)(end.QuadPart-start.QuadPart)/frequency.QuadPart;
returnres;
}
doubletime_difference_ms(LARGE_INTEGERstart,LARGE_INTEGERend){
doubleres=time_difference_s(start,end)*1000.0;
returnres;
}
#elif linux || __linux__ || __APPLE__
timespectime_difference(timespecstart,timespecend)
{
timespecres;
if((end.tv_nsec-start.tv_nsec)<0){
res.tv_sec=end.tv_sec-start.tv_sec-1;
res.tv_nsec=1000000000L+end.tv_nsec-start.tv_nsec;
}else{
res.tv_sec=end.tv_sec-start.tv_sec;
res.tv_nsec=end.tv_nsec-start.tv_nsec;
}
returnres;
}
doubletime_difference_s(timespecstart,timespecend)
{
timespecdiff=time_difference();
doubleres=diff.tv_sec+(0.000000001*diff.tv_nsec);
returnres;
}
doubletime_difference_ms(timespecstart,timespecend)
{
timespecdiff=time_difference();
doubleres=diff.tv_sec+(0.000001*diff.tv_nsec);
returnres;
}
#endif
... ... @@ -21,9 +21,6 @@ bool CheckDependencies(void);
doubletime_difference_s(LARGE_INTEGERstart,LARGE_INTEGERend);
doubletime_difference_ms(LARGE_INTEGERstart,LARGE_INTEGERend);
#elif linux || __linux__ || __APPLE__
timespectime_difference(timespecstart,timespecend);
doubletime_difference_s(timespecstart,timespecend);
doubletime_difference_ms(timespecstart,timespecend);
#endif
//------------------------------------------------------------------------------
... ...
... ... @@ -2,7 +2,7 @@
============================================================================
Name : ePassport, MRTD uFR NFC reader example
Author : Digital Logic Ltd.
Version : 0.0-pre-alpha
Version : 0.1-pre-alpha
Copyright : 2009-2019. Digital Logic Ltd.
Description : "ePassport, MRTD uFR NFC reader example" in C, Ansi-style
============================================================================
... ... @@ -17,10 +17,10 @@
# include
# include < windows.h >
#elif linux || __linux__ || __APPLE__
# define __USE_MISC
//# define __USE_MISC
# include
# include
# undef __USE_MISC
//# undef __USE_MISC
# include "conio_gnu.h"
#else
# error "Unknown build platform."
... ... @@ -29,6 +29,7 @@
#include "ini.h"
#include "hw_utils.h"
#include "p_utils.h"
#include "f_utils.h"
//------------------------------------------------------------------------------
#define READER_RESET
//------------------------------------------------------------------------------
... ... @@ -67,6 +68,7 @@ int main(void) {
printf(" --------------------------------------------------\n");
status=ReaderOpen();
// status = ReaderOpenEx(1, "/dev/ttyS7", 1, "-"); // LSW test
if(status!=UFR_OK){
printf(" Error while opening device, status is: 0x%08X\n",status);
getchar();
... ... @@ -237,10 +239,10 @@ UFR_STATUS NewCardInField(uint8_t sak, uint8_t *uid, uint8_t uid_size) {
boolCheckMRZ(void){
if(!mrz_proto_key_defined){
printf("You have not entered MRZ (machine readable zone) data necessary for MRTD authentication.\n"
"Please press 'M' if you want to enter entire subjacent MRZ row\n"
"or press 'P' if you want to enter doc. number, date of birth\n"
"and date of expiry separately. Dates format have to be YYMMDD.\n");
printf("You have not entered MRZ (machine readable zone) data necessary for MRTD authentication.\n"
"Please press 'M' if you want to enter entire subjacent MRZ row\n"
"or press 'P' if you want to enter doc. number, date of birth\n"
"and date of expiry separately. Dates format have to be YYMMDD.\n");
returnfalse;
}
returntrue;
... ... @@ -248,15 +250,15 @@ bool CheckMRZ(void) {
//------------------------------------------------------------------------------
voidEnterMRZSubjacentRow(void){
UFR_STATUSstatus;
charmrz[44+1];// +1 for zero termination
uint8_tmrz[44+1];// +1 for zero termination
printf("You have chose to enter subjacent MRZ row located under\n"
"'P\n\n");
printf("Enter subjacent MRZ row. Subjacent MRZ row have to be 44 characters long.\n");
printf("You have chose to enter subjacent MRZ row located under\n"
"'P\n\n");
printf("Enter subjacent MRZ row. Subjacent MRZ row have to be 44 characters long.\n");
scanf("%44s",mrz);
if(strlen(mrz)!=44){
printf(“错误:在底下的MRZrow have to be 44 characters long.\n");
if(strlen((char*)mrz)!=44){
printf("Error: subjacent MRZ row have to be 44 characters long.\n");
}
status=MRTD_MRZSubjacentToMRZProtoKey(mrz,mrz_proto_key);
... ... @@ -265,6 +267,8 @@ void EnterMRZSubjacentRow(void) {
return;
}
mrz_proto_key_defined=true;
printf("\nMRZ proto-key has been set successfully.\n");
printf(" -------------------------------------------------------------------\n");
}
//------------------------------------------------------------------------------
voidEnterMRZData(void){
... ... @@ -273,18 +277,18 @@ void EnterMRZData(void) {
chardate_of_birth[6+1];// +1 for zero termination
chardate_of_expiry[6+1];// +1 for zero termination
printf("You have chose to enter doc. number, date of birth and date of expiry separately:\n\n");
printf("Enter the document number. The document number should be 9 characters long.\n");
printf("You have chose to enter doc. number, date of birth and date of expiry separately:\n\n");
printf("Enter the document number. The document number should be 9 characters long.\n");
scanf("%9s",doc_number);
printf("Enter date of birth. Date format have to be YYMMDD.\n");
printf("Enter date of birth. Date format have to be YYMMDD.\n");
scanf("%6s",date_of_birth);
if(strlen(date_of_birth)!=6){
printf("Error: date format have to be YYMMDD.\n");
}
printf("Enter date of expiry. Date format have to be YYMMDD.\n");
printf("Enter date of expiry. Date format have to be YYMMDD.\n");
scanf("%6s",date_of_expiry);
if(strlen(date_of_expiry)!=6){
printf("Error: date format have to be YYMMDD.\n");
printf("Error: date format have to be YYMMDD.\n");
}
status=MRTD_MRZDataToMRZProtoKey(doc_number,date_of_birth,date_of_expiry,mrz_proto_key);
... ... @@ -293,11 +297,13 @@ void EnterMRZData(void) {
return;
}
mrz_proto_key_defined=true;
printf("\nMRZ proto-key has been set successfully.\n");
printf(" -------------------------------------------------------------------\n");
}
//------------------------------------------------------------------------------
voidReadCOM(void){
UFR_STATUSstatus;
uint8_t*file_content=NULL;
uint8_t*file_content;
uint32_tfile_len;
if(!CheckMRZ())
... ... @@ -306,6 +312,7 @@ void ReadCOM(void) {
status=SetISO14443_4_Mode();
if(status!=UFR_OK){
printf(" Error while switching into ISO 14443-4 mode, uFR status is: 0x%08X\n",status);
printf(" -------------------------------------------------------------------\n");
return;
}
... ... @@ -313,19 +320,93 @@ void ReadCOM(void) {
status=MRTDAppSelectAndAuthenticate(mrz_proto_key,ksenc,ksmac,&send_sequence_cnt);
if(status!=UFR_OK){
printf(" Errorwhile switching into ISO 14443-4 mode, uFR status is: 0x%08X\n",status);
return;
printf(" Errorduring selection and authentication, uFR status is: 0x%08X\n",status);
break;
}
status=MRTDFileRead((constuint8_t*)"\x01\x1E",file_content,&file_len,ksenc,ksmac,&send_sequence_cnt);
status=MRTDFileReadToHeap((constuint8_t*)"\x01\x1E",&file_content,&file_len,ksenc,ksmac,&send_sequence_cnt);
if(status!=UFR_OK){
printf(" Error while switching into ISO 14443-4 mode, uFR status is: 0x%08X\n",status);
return;
printf(" Error while reading file from tag, uFR status is: 0x%08X\n",status);
break;
}
printf("\nEF.COM has been successfully read. File length is %d bytes\n",file_len);
printf(" Raw data: ");
print_hex_ln(file_content,file_len," ");
printf(" Parsing the EF.COM raw data:\n");
charvmajor[3],vminor[3],uver[3];
uint8_tfield_len;
uint8_ttag;
uint8_t*raw;
uint32_traw_pos=0;
uint32_traw_len;
uint32_tlen;
if(file_content[0]!=0x60)
printf(" Error: unknown COM tag 0x%02X and should be 0x60\n",file_content[0]);
if(!get_ber_tlv_len(file_content+1,&field_len,&raw_len)){
printf(" Error: unknown TLV length coding\n");
break;
}
raw=file_content+field_len+1;// +1 for tag
raw_pos=0;
vmajor[2]=vminor[2]=uver[2]='\0';
while(raw_pos<raw_len){
if(raw[raw_pos]==0x5F){
++raw_pos;
tag=raw[raw_pos];
++raw_pos;
if(!get_ber_tlv_len(raw+raw_pos,&field_len,&len)){
printf(" Error: unknown TLV length coding\n");
// No need for exit_loop = true; (last loop in do {} while(0);)
break;
}
raw_pos+=field_len;
if(tag==1){
if(len!=4)
printf(" Error: wrong LDS version length (%d bytes and should be 4).\n",len);
else{
memcpy(vmajor,&raw[raw_pos],2);
memcpy(vminor,&raw[raw_pos+2],2);
printf(" LDS version is %2s.%2s\n",vmajor,vminor);
}
}elseif(tag==0x36&&len==6){
if(len!=6)
printf(" Error: wrong UNICODE version length (%d bytes and should be 6).\n",len);
else{
memcpy(vmajor,&raw[raw_pos],2);
memcpy(vminor,&raw[raw_pos+2],2);
memcpy(uver,&raw[raw_pos+4],2);
printf(" UNICODE version is %2s.%2s.%2s\n",vmajor,vminor,uver);
}
}
raw_pos+=len;
}elseif(*(raw+raw_pos)==0x5C){
++raw_pos;
if(!get_ber_tlv_len(raw+raw_pos,&field_len,&len)){
printf(" Error: unknown TLV length coding\n");
// No need for exit_loop = true; (last loop in do {} while(0);)
break;
}
raw_pos+=field_len;
show_files_tag_list(&raw[raw_pos],len);
raw_pos+=len;
}
}
}while(0);// <== finally
if(file_content)
free(file_content);
s_block_deselect(100);
printf(" -------------------------------------------------------------------\n");
}
//------------------------------------------------------------------------------
voidReadSOD(void){
... ...
    Markdownis supported
    0%or
    You are about to add0peopleto the discussion. Proceed with caution.
    Finish editing this message first!
    Pleaseregisterorto comment
    Baidu
    map