ESAM接口函数源代码_第1页
ESAM接口函数源代码_第2页
ESAM接口函数源代码_第3页
ESAM接口函数源代码_第4页
ESAM接口函数源代码_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ESAM接口函数源代码在DSP程序中共设计了 12个ESAM接I I函数,用來实现安全保护策略所岛的全部指 令功能,其源代码分别介绍如2一、ESAM接口函数源代码:/車*車*車*車*存*車車*車*車*車*/函数名:Reset_EsamO/*功能:对ESAN1卡复位,并取得返1叫的复位丿"答信息/参数:*/DataPtr指向存放序列号的数组的指针*/返回值:*/*返冋 imsigiied short int 型的 16bits 整数/如果正确,返回值等于9000*/*車*專*車*車*車*律*專*車*車*車*專*車專*車*/extern Unit 16 Reset_Esam(Uint 1

2、6 *DataPtr)Unit 16 i,Feedalue;/*初始化接收ESAM卡应答信号的数据结构/fbr(i=O; KDATALENGTH; i+)ReplyDatai = 0;/* RST信号变为低电平/SYSCNTL2 = 0x00;Delay_Time(200);/*将ESAM k的I/O端设为输出,准备从ESAM K接收复位应答信兮*/SYSCNTL1 = 0x20;Delay_Time(200);/*让复位信号等待一段时间,满足复位时序要求/Delay_Tnne(RSTTIME);/*让ESAM脱离复位状态,从而实现ESAM U位*/SYSCNTL2 = 0x08;/*读复位应

3、答信号日Read_Esam(ReplyData J 3);/*从复位应答信号中分离出序列号/ fdr(i=O; i<8; 1+)*DataPtr+ = ReplyDatai+5;/*获取状态字/FeedXalue = 0x9000; retiuii FeedAalue;*/函数名:Get_Response()*/功能:取冋ESANI反馈的数据和MAC码*/参数:*/DataPtr-一指向存放返回数据指针数组的指针/DataLen.欲取冋的数据和MAC码总长度(以16进制*/表示,单字节长度)*/返回值:*/返冋 unsigned short int 型的 16bits 整数/*如杲正确,

4、返回值等于9000/extern Unit 16 Get_Response(Umt 16* DataPti; Umtl6 DataLen) Uintl6 1,State;/*消空命令缓冲区和接收数据缓冲区/ fbr(i=0; KDATALENGTH; i卄)Cominandi = 0;/*填写接收返冋数据的命令报文/C omiiiandLength = 5;ConmiandfO = 0x00;Command 1 = OxCO;Comniand2 = 0x00;Command3 = 0x00;Command4 = DataLen;/*将ESAM卡的I/O端设为输入推备向ESAKI k发接收返回数

5、据命令/SYSCNTL1 = 0x60;Delay_Tmie(200);/*向ESANI卡发接收返【叫数据命令/Wnte_EsamO;/将ESAM卡的I/O端设为输出,准备从ES心I卡接收返冋信息/ SYSCNTL1 = 0x20;Delay_Time(200);/先清除接收缓冲区/1 = UART_RGET(URRBR);/取出ESAM反馈的命令报文屮的第二个字节,丢弃*/while(»UART_FGET(URLSR,DR);1 = UART_RGET(URRBR);/*获取返回信息*/Read_Esam(ReplyData,DataLen+2);/从返回信息中分离出数据和MAC码

6、/fdr(i=0; i<DataLen; i卄)*DataPti+ = ReplyDatafi;/获取状态字*/State = (ReplyDataDataLen«8)|ReplyDataDataLen-l;return State;/*律*車*車*車*車*/函数名:Del_DuectO*/功能:删矗以前建立的Fl录文件(不包括MF文件)*/*参数:*/无*/返回值:/返冋 unsigned short uit 型的 16bits 整数*/如果正确,返回值等于9000*/*/extern Unit 16 Del Direct(void)Uintl6 instate;/清空命令缓

7、冲区*/for(i=0; KDATALENGTH; 1-H-)Commandi = 0;/*填写删除H录的命令报文/ConunandLength = 5;Command0 = 0x80;Command 1 = OxOE;Command2 = 0x00;Command3 = 0x00;Command4 = 0x00;/将ESAKI卡的ro端设为输入,准备向ESAM卡发删除冃录命令/SYSCNTL1 = 0x60;Delay_Tune(200);/向ESANI卡发删除冃录命令/WnteEsaniO;/将ESAM卡的DO端设为输出,准备从ESAKI卡接收返冋信息/SYSCNTL1 = 0x20;De

8、lay_Tune(200);/先清除接收缓冲区/1 = UART_RGET(URRBR);/*获取返回信息*/Read_Esam(ReplyData,2);/*获取状态字/State = (ReplyData0«8) ReplyDatal;return State;/函数名:CreateKeyfileO*/功能:建立密钥文件/* 参数:/FilelD2字节长度的文件标识符*/FileLen-2字节长度的文件空间人小*/*IncRiglit-增加密钥权限/*返回值:*/*返回 unsigned short int 型的 16bits 整数/如果正确,返回值等于9000*/extern

9、Uintl6 Create_Keyfile(Uint 16 FilelD. Uintl6 FileLen, Uintl6 IiicRight) Uintl6 i,State;/*清空命令缓冲区和接收返回信息的数据结构*/for(i=0; KDATALENGTH, 1+)ReplyDatai = 0;Commandi = 0;/*第一次发送创建Key文件的命令头,如果止确,应该返冋OxEO */ CommandLength = 5;Command。 = 0x80;/填写命令报文的头域Command 1 = OxEO;Command2 = (FilelD&0 xFF00)»8;C

10、ommand3 = FileED&OxOOFF;Conmiand4 = 0x07;/*将ESAKI匸的I/O端设为输入推备向ESAM K发创建Key文件命令*/SYSCNTLl = 0x60;Delay_Time(200);/*发送创建Key文件命令的命令头域/WriteEsamO;/*将ESAM卡的I/O端设为输出,准备从ESA1KI卡接收返回状态/SYSCNTLl = 0x20;Delay_Tune(200);/*读空接收缓冲区*/1 = UART_RGET(URRBR);/*读返冋的状态信号,以确定创建Key文件操作是否正确/Read_Esam(ReplyData, 1);/*第

11、二次发送创建Key文件命令的数据域,如果正确E该返冋状态9000 / CommandLength = 7;Command0 = Ox3F;/填写命令报文的数据域Commandl = (FileLen &0 xFF00)»8;Comiiiand2 = FileLen &OkOOFF;Comniand3 = OxFF;Cominand4 = IncRight;Command5 = OxFF;Comiiiand6 = OxFF;/*将ESAM卡的I/O端设为输入,准备向ESAM卡发送创建Key文件命令的数据域*/SYSCNTL1 = 0x60;Delay_Time(200)

12、;/向ESAM卡发创建Key文件命令的数据域/Wnte_EsamO;/*将ESAM卡的g端设为输出,准备从ESA1KI卡接收返冋状态/SYSCNTL1 = 0x20;Delay_Tnne(200);/读空接收缓冲区*/1 = UART_RGET(URRBR);/读返冋的状态信匕,以确定创建Key文件操作是否正确/Read_Esam(ReplyData,2);/获取状态字/State = (ReplyData0«8)ReplyDatal;return State;/*車*/函数名:Increase_Key()/功能:建立(39-外部认证/主控或36-线路保护)密傅*/参数:*/*Key

13、lD-密钥标识符/KeyType-密钥类型(0x39 或 0x36)/UseRight密钥使用权*/AltRight密钥更改权限/NextState-后续状态(如果密钥类型0x36保阳为OxFF)/*/EnCount-错谋计数器*/Keys指向存放欲建立密钥的数组的指针/Mode加解密密钥方式(如果是8字节密钥选/*DES8=O;竹则为16字节密钥选DES16=1)+/返回值:/extern Umtl6 Increase_Key(Umt 16 KeylD, Umtl6 KeyType, Umtl6 UseRight, Uintl6 AltRight, Umtl6 NextState, Umtl

14、6 ErrCount, Uintl6 *Keys,Umtl6 Mode)Uintl6 i,State,KeyLen;/*淸空命令缓冲区和接收返回信息的数据结构*/ fbr(i=O; KDATALENGTH; i+)ReplyDatai = 0;Commandi = 0; if(Mode = DES8)KeyLen = 8; elseKeyLen = 16;/*第-次发送创建Key的命令头,如來正确,应该返回0xD4”ConiinandLength = 5;CoinmandfO = 0x80;/填写命令报文的头域Commandl = 0xD4;Conimand2 = 0x01;Conmiand3

15、 = KeylD;Command4 = KeyLen+5;/*将ESAM卡的I/O端设为输入,准备向ESANI卡发创建Key命令*/SYSCNTL1 = 0x60;Delay_Tune(200);/*发送创建Key命令的命令头域/Wnte_Esam0;/*将ESAM卡的I/O端设为输出,准备从ESAM卡接收返冋状态/SYSCNTL1 = 0x20;Delay_Time(200);/读空接收缓冲区*/i = UART_RGET(URRBR);/*读返冋的状态信出以确定创建Key操作是否正确/填写命令报文的数据域Read_Esam(ReplyData, 1);Command。 = KeyType;

16、Comniandfl = UseRight;Command2 = AltRight;/如果是外部认证密钥,仃后续状态/如果是线路保护密钥,该域保留为OxFFif(KeyType = 0x39)Conuiiand3 = NextState; elseCommand3 = OxFF,Cominand4 = ErrCoxmt; fbr(i=O; i<KeyLen; i+)Command5+i = *Keys+;/*将ESAM卡的I/O端设为输入,准备向ESAM k发送创建Key命令的数据域/SYSCNTL1 = 0x60;Delay_Time(200);/*向ESAM卡发创建Key命令的数据域

17、/Wnte_EsamO;/*将ESANI K的I/O端设为输出,准备从ESAKI K接收返回状态*/SYSCNTL1 = 0x20;Delay_Time(200);/读空接收缓冲区*/1 = UART_RGET(URRBR);/*读返冋的状态信号,以确定创建Key操作是否正确*/Read_Esam(ReplyData,2);/*获取状态字/State = (ReplyData0«8):ReplyData 1 ;return State;*/函数名:CreateB inaryfileO/功能:建立带线路加密和NIAC保护的二进制文件/参数:/*FilelD-2字节长度的文件标识符*/F

18、ileLen-2字节长度的文件空间人小/RrRight-读权限WrRight 写权限/*/*SafeKeylD-线路保护密钥标 U 1(0x00,0x01,0x02,0x03)*/返回值:/返 I1 '1 unsigned short uit 型的 16bits 整数 如呆正确,返回值等T- 9000/*/*/extern Unit 16 Create_Binaryfile(Umt 16 FilelD, Uintl6 FileLen. Uintl6 RrRight, Uintl6 WrRight, Umtl6 SafeKeylD)Umtl6 1,State;/*淸空命令缓冲区和接收返回

19、信息的数据结构*/ fbr(i=O; KDATALENGTH; i+)ReplyDatai = 0;Commandi = 0;/第-次发送创建线路保护二进制文件的命令头:如果1E确,应该返回OxEO / C omniandLength = 5;/填写命令报文的头域Conmiand0 = 0x80;Commandfl = OxEO;Comiiiand2 = (FileLD&0 xFF00)»8;Conunand3 = FilelD&OxOOFF;Comiiiand4 = 0x07;/*将ESAM卡的I/O端设为输入,准备向ESAM K发创建线路保护二进制文件命令*/SY

20、SCNTL1 = 0x60;Delay_Tune(200);/*发送创建线路保护二进制文件命令的命令头域/WnteEsamO;/*将ESAM匸的I/O端设为输出,准备从ESAM匸接收返回状态/SYSCNTL1 = 0x20;Delay_Time(200);/*读空接收缓冲区*/1 = UART_RGET(URRBR);/*读返阿的状态信兮,以确定创建线路保护二进制文件操作是否正确*/Read_Esam(ReplyData. 1);/*第二次发送创建线路保护二进制文件命令的数据域,如果正确,应该返冋状态9000 /ConunandLength = 7;Command0 = 0xE8;/填写命令报

21、文的数据域Command 1 = (FileLen &0xFF00)»8;Command2 = FileLen&0x00FF;Command3 = Ri'Right;Command4 = WrRight;Conimandf 习=OxFF;switch(SafeKeylD)case 0x00:Conmiand6 = 0x7F; break;case 0x02:Coinmaiid6 = 0x75; break;case 0x03:Conmiand6 = 0x70; break;default:Commaiid6 = 0x7A; break,/将ESAM K的I/O

22、瑞设为输入准备向ESAM卡发送创建线路保护二进制文件命令的 数据域/SYSCNTL1 = 0x60;Delay_Time(200);/*向ESAM卡发创建线路保护二进制文件命令的数据域/Wnte_Esam0;/将ESAM匸的I/O端设为输出,准备从ESAM匸接收返回状态/SYSCNTL1 = 0x20;Delay_Time(200);/*读空接收缓冲区*/1 = UART_RGET(URRBR);严读返凹的状态信汛以确立创建线路保护二进制文件操作是否止确*/Read_Esam(ReplyData、2);/*获取状态字/State = (ReplyData0«8) ReplyDatal

23、; return State;/函数名:Wnte_Bmaryfile()*/功能:将数据加密并写入带线路加密和MAC保护的二进制文件勺/参数:*/*InputPtr指向存放欲写入数据数纽的指针*/DataLen欲写入数据的实际长度(不人MAXDATA) /Offset-写入数据相对文件的2字节偏移量*/Keys指向存放线路保护密钥数组的指针*/Mode加解帑方式(如果是8字节密钥选DES8-0;/否则为16字节密钥选DES16=1)*/返回值:/返冋 unsigned short int 型的 16bits 整数*/如果正确,返回值等于9000/extern Umtl6 Wnte_Binary

24、file(Unitl6 *InputPtr5Uintl6 DataLen, Unit 16 Offset, Unit 16 *Keys, Umtl6 Mode)Unit 16 1 j ,BlockNmn.ModNiun. State;Umtl6 ImtValue8 = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;Unit 16 MAC4 = 0x00.0x00,0x00,0x00;Uintl6 PlainTextDATALENGTH;Unit 16 Des alueDATALENGTH,Uintl6 *TempPtr;/*清空命令缓冲区和接收返回信息的数据结

25、构/ for(i=0; KDATALENGTH, i+)ReplyDatai = 0;Cominandi = 0;PlamTexti = 0;DesA aluei = 0;/*计算输入的数据一共町以分成多少个数据块*/BlockNiun = (DataLen+1 )/8+1;ModNum = (DataLen 亠 1)%8;/*构造数据块,让它为8字节的倍数/ PlainTextO = DataLen;fbr(i=l; i<=DataLen; i+)PlamTexti = *InputPtrT;lffModNum != 0)PlamTextDataLen+1 = 0x80;j = 7-M

26、odNum;fbr(i=l; i<=j; i-H-)PlainTextDataLen+1 +i = 0x00;/先保存一 F,因为2次用到Keys /TempPti- = Keys;/如果输入不是8字节的整数倍/ 添 0x80;/如果在添0x80后还不足8字节,在英后补0/*调用DES加密算法,用线路保护密钥将欲输入的数据加密勺if(Mode = DES 16)/如果线路保护密钥为16个字节,采用3DES算法Des 16(PlamText,TempPtr,Desalue,EN031ockNuni);else/如果线路保护密钥为8个字节,采用单DES算法Des8(PlainText,Tem

27、pPtr5Desalue,EN0,BlockNum);/*首先取4字节随机数,构成初始报文/ State = Get_Random(Init"alue, 0x04);Command0 = 0x04;Comiiiandl = 0xD6;Comiiiand2 = (Offset&OxFFOO)»8;Comiiiand3 = Offset&OxOOFF;Coinniand4 = BlockNum*8+4;j = BlockNum*8;/ 8 *BlockNxun字节密文数据fdr(i=O; Kj; i+)Command5+i = Desaluei;j = 5+Bl

28、ockNum*8;/计算MAC算法的输入数据长度/*调用MAC算法,计算命令报文的4字节MAC码/if(Mode = DES 16)MAC 16_Algonthin(Iiut alue. Command j Keys, MAC); elseMAC8_Algontlim(Initalue? Command, j, Keys,、IAC);/*清空除命令头以外的数据/fbr(i=5; KDATALENGTH, i卄)Commandi = 0;/第一次发送写二进制文件明令报文的头域,长度为5字节,如果结果正确,返回值是0xD6 /C ommandLength = 5;/*将ESAM卡的I/O端设为输入

29、,准备向ESAM卡发写一进制文件命令*/SYSCNTL1 = 0x60;Delay_Time(200);/*发送写二进制文件命令的命令头域/WnteEsamO;严将ESAM卡的I/O端设为输出,准备从ESAM K接收返回状态/SYSCNTL1 = 0x20;Delay_Time(200);/*读空接收缓冲区/1 = UART_RGET(URRBR);/*读返回的状态信沆以确定写二进制文件操作是否止确/ ReadEsamCReplyDataJ);/*第次发送选择文件命令的数据域,如果止确3该返冋状态9000j = BlockNum*8;ConimandLength = j+4;for(i=0;

30、Kj; 1+)Conmiandi = DesAaluei; fbr(i=O; i<4; i+)/ 8*BlockNuin字肖密文数据/填写的密文数据/填写MAC码Coniniand|j+i = NIACi;/将ESAM卡的I/O端设为输入,准备向ESAM卡发送写进制文件命令的数据域/SYSCNTL1 = 0x60;Delay_Tune(200);/向ESAN1卡发写二进制文件命令的数据域/Wnte_Esam();/将ESAM卡的PO端设为输出,准备从ESAKI卡接收返冋状态/SYSCNTL1 = 0x20;Delay_Tune(200);/读空接收缓冲区*/1 = UART RGET0J

31、RRBR);/*读返冋的状态信号,以确定写二进制文件操作是否正确/Read_Esam(ReplyData.2);/*获取状态字/State = (ReplyData0«8)ReplyDatal;return State;严 *卄*卄*卄*卄*卄*車*卄卄*卄卄*/函数名:Read_Bmaryfile()*/功能:从带线路加密和MAC保护的二进制文件读出密文数据*/参数:*/*/Offset-读出数据相対文件的2字节偏移员DataLen欲读出的数据长度(16进制表示)/*/Keys指向存放线路保护密钥数组的指针OiitputPtr-fiT向存放解密后数据数组的指针*/*/*Mode加解

32、密方式(如果是8字节密钥选DES8=0;*/否则为16字节密钥选DES16=1)*/返回值:返冋 imsigiied short mt 型的 16bits 整数/*/*如杲正确,返冋值等于9000*/extern Uintl6 Read_Binaiyfile(Uint 16 Offset, Unit 16 DataLen, Unit 16 "Keys, Umtl6 *OutputPtr, Uintl6 Mode)Uintl6 ij,State;Unit 16 DataField8;Uintl6 Ininalue8 = 0x00,0x00,0x00,0x00,0x00,0x00,0x0

33、0,0x00;Umtl6 DesAalue8 = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;Unit 16 PlainTextDATALENGTH;Uintl6 CipherTextDATALENGTH;Uintl6 MAC4 = 0x00,0x00,0x00.0x00;Unit 16 *TempPtr;/*清空命令缓冲区和接收返冋信息的数据结构*/for(i=0; KDATALENGTH, i+)ReplyDatai = 0;Conimandi = 0;PlamTexti = 0;CiplierTexti = 0;严先保存一下,因为3次用到Keys /T

34、empPtr = Keys;/*计算应该反馈回的密文数据块/TBlockNuni = (DataLen*l )/8+1;/*填写读二进制文件的原始数据域/DataFieldO = DataLen;DataFieldl = 0x80;for(i=0; i<6; i-H-)/最后6个字节域补0DataField2+i = 0x00;/*调用DES加密算法,用线路保护密钥将欲输入的数据加密/if(Mode = DES8)Des8(DataField5TempPtiDesralue5EN0,1);elseDes 16(DataField.TempPtr,Desalue,EN0,l);/*首先取4

35、字节随机数,构成初始报文/State = Get_Random(Init力lue, 0x04);PlainTextO = 0x04;PlamTextl = OxBO;PlamText2 = (Offset&OxFFOO)»8;PlainText3 = Offset&OxOOFF;PlauiText4 = OxOC;/ 8字节密文数据加4字节的N1AC码fdr(i=O; i<8; i+)PlamText5-i = Desaluei;/*先保存一下,因为3次用到Keys /TempPtr = Keys;/*调用MAC算法,i|算命令报文的4字节IAC码/if(Mod

36、e = DES8)IAC8_Algo门thm(InitValue, PlamText, 13, TempPtr. MAC);elseMAC 16_Algonthin(Iiut alue, PlamText, 13, TempPti; NIAC);/第一次发送读二进制文件明命令报文的头域,长度为5字节,如果结果正确,返冋值是OxBO */CommandLength = 5;CommandfO = 0x04;Commandfl = OxBO;Command2 = (Offset&0 xFF00)»8;Conmiand3 = Offset&0 xOOFF;Cominand4

37、 = OxOC;/*将ESAM卡的I/O端设为输入,准备向ESAKI卡发读二进制文件命令/SYSCNTL1 = 0x60;Delay_Time(200);/*发送读二进制文件命令的命令头域/Wnte_EsamO;/将ESANI K的"O端设为输出,准备从ESAM K接收返回状态/SYSCNTL1 = 0x20;Delay_Time(200);/读空接收缓冲区/1 = UART_RGET(URRBR);/*读返冋的状态信号,以确定读二进制文件操作是否止确*/ReadEsamCReplyData, 1);/淸空命令缓冲区和接收返阿信息的数据结构*/fbr(i=O; KDATALENGTH

38、; 1+)ReplyDatai = 0;Conmiandi = 0;/*第二次发送读二进制文件命令的数据域,如來正确,应该返回状态9000 /ConmiandLength = 12;for(i=0; i<8; i+)/填写的密文数据Conmiandi = Desaluei;fbr(i=O; i<4; 1-H-)填写 MAC 码Coniniand8+i = NIACi;/*将ESAKI匸的I/O端设为输入,准备向ESAM K发送写二进制文件命令的数据域*/SYSCNTL1 = 0x60;Delay_Tune(200);/*向ESAM卡发写二进制文件命令的数据域/Wnte_EsamO;

39、/将ESAKI k的I/O端设为输出,准备从ESAM匸接收返回状态/SYSCNTL1 = 0x20;Delay_Time(200);/*读空接收缓冲区*/i = UART_RGET(URRBR);/* 1RIUI ESAM卡反馈冋的信息*/Read_Esam(ReplyData,2);/*取回8字节密文,4字节MAC码,2字节状态域/J = ReplyDatal; /该字节指明ESAM返回加密数据与4字节N1AC码总长度 State = Get_Response(ReplyData, j);/*如果取数据和MAC码成功则执行卜列操作/if( State =0x9000)/*首先分离出加密的数据

40、*/for(i=0; i<j-4; i-H-)CipherTexti = ReplyDatai;if(Mode = DES8)Des8(CipherText,Keys,PlauiText,DE 1 ,j/8);elseDesl 6(CiplierText.Keys.PlainText.DE 1 j/8);for(i=0; KDataLen; i+)/从解密后的数据屮取出源数据OutputPtr+* = PlauiTextl+i;因为解密后的数据第一个字D衣示数据长/度,所以屏蔽掉/*返回状态字/return State;/<c* * 車*車*車* 車 *車*車*專*車*/函数名:S

41、electFileQ*/功能:选择文件/参数:/FilelD-2字节长度的文件标识符/返回值:/*返冋 unsigned short int 型的 16bits 整数/如果正确,返回值等于9000*/*車*車*律*車*車*車*車*車*/extern Uintl6 Select_File(Umtl6 FilelD) Uintl6 instate;/*清空命令缓冲区和接收返回信息的数据结构*/ for(i=0; KDATALENGTH; 1+)ReplyDatai = 0;Conunandi = 0;/第次发送选择文件的命令头,如果止确,应该返回0xA4 /ConmiandLength = 5;C

42、omniand0 = 0x00;Commandl = 0xA4;Conimand2 = 0x00;Comniand3 = 0x00;Comniand4 = 0x02;/填写命令报文的头域/*将ESAM匸的I/O端设为输入准备向ESAM匸发选择文件命令/SYSCNTL1 = 0x60;Delay_Time(200);/*发送选择文件命令的命令头域/WriteEsamO;/*将ESAM卡的I/O端设为输出,准备从ESANI卡接收返回状态/SYSCNTL1 = 0x20;Delay_Time(200);/*读空接收缓冲区*/1 = UART_RGET(URRBR);/*读返何的状态信号,以确定选择文

43、件操作是否正确/Read_Esam(ReplyData, 1);/*第一次发送选择文件命令的数据域,如果正确,应该返冋状态9000 /CominandLength = 2;Command0 = (FilelD&0xFF00)»8; / 填写命令报文的数据域Command 1 = FilelD&OxOOFF;/*将ESAM卡的I/O端设为输入,准备向ESAM K发送选择文件命令的数据域/SYSCNTL1 = 0x60;Delay_Time(200);/*向ESAM K发选择文件命令的数据域*/WriteEsamO;/*将ESAM卡的I/O端设为输出,准备从ESAM卡接收

44、返冋状态/SYSCNTL1 = 0x20;Delay_Tune(200);/*读空接收缓冲区*/1 = UART_RGET(URRBR);/*读返冋的状态信号,以确定选择文件操作是否正确*/Read_Esam(ReplyData,2);/*获取状态字/State = (ReplyData0«8) ReplyDatal; return State;/*車*車*車*車*車*車*車*車*車*車*車*車*/函数名:Get_RandomO*/功能:向ESAM发収随机数命令,并取得8字节或4字节随机数勺参数:/OiitputPtr-fiT向存放返回随机数的数组的拆针/Length随机数长度,16

45、进制表示(0x0&或0x04)/返回值:/返回 unsigned short mt 型的 16bits 整数/如果正确,返回值等于9000/严*卄*/extern Unit 16 Get_Random(Uint 16 *OiitputPtr Umtl6 Length) Umtl6 1,State;/*初始化接收ESAM khy;答信兮的数据结构,并消空命令缓冲区/ for(i=0; KDATALENGTH, i-H-)ReplyDatai = 0;Commandi = 0;/*填写取随机数的命令报文*/CommandLength = 5;Conimand0 = 0x00;Conmian

46、dl = 0x84;Command2 = 0x00;Command3 = 0x00;Command4 = Lengtli;/*将ESANI匸的I/O端设为输入,准备向ESAM匸发取随机数命令/SYSCNTL1 = 0x60;DelayT ime(200);/*向ESAM忖发取随机数命令/Wnte_EsamO;/*将ESAM卡的I/O端设为输出,准备从ESANI卡接收随机数*/ SYSCNTL1 = 0x20;Delay_Time(200);/*先清除接收缓冲区/1 = UARTRGETOJRRBR);/*取til ESAKI反馈的命令报文屮的第二个字节,去弃/ while(»UART

47、_FGET(URLSR,DR);1 = UARTRGETOJRRBR);/*读返回的随机数信号日if(Length=OxO8)/如果是取8字节随机数Read_Esam(ReplyData, 10);/*从取随机数命令的应答信号屮分离出8字节随机数*/ fbr(i=O ; i<8; 1+)OutputPtr-i-* = ReplyDatai;/*获取状态字*/State = (ReplyData8«8)|ReplyData9J;else取4字节随机数ReadJEsain(ReplyData,6);/从取随机数命令的应答信号屮分离出4字节随机数*/ foi*(i=0 ; 1<

48、4; 1-H-)*OutputPtr+ = ReplyDatai;/获取状态字*/State = (ReplyData 4«8 )|ReplyData 习;return State;/函数名:Exteni_Autlien()*/*功能:发送外部认证命令,进行外部认证*/参数:*/Input指向存放随机数数组的指针*/KeylD外部认证密钥标识号*/*Key-.指向存放外部认证密钥数组的指针*/Mode加解密方式(如果是8字节密钥选DES8=0;+/否则为16字节密钥选DES16=1)*/*返回值:*/返回 unsigned short int 型的 16bits 整数*/如果正确,返

49、回值等T 9000/*卄*卄*卄*卄*卄*卄*/extern Uintl6 Exteni_Authen(Umt 16 Input, Umtl6 K己yID. Uintl6 *Key, Umtl6 Mode) Uintl6 i,State;/泄义一个用來暂存随机数与外部认证密钥加密后的认证码的数据结构/该认证码构成了外部认证命令报文的数据域/Uintl6 Temp8 = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;/*初始化接收ESANI代屁答信号的数据结构,并消空命令缓冲区勺for(i=0; KDATALENGTH, i卄)ReplyDatai = 0;Commandi = 0;/对获取的随机数用外部认证密钥进行加密运算/if(NIode = DES 16

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论