blob: 4fcbd658f09804ec93d163f42b0a26cbfcdeb74e [file] [log] [blame]
zongqiang.zhang0c6a0882019-08-07 14:48:21 +08001#include "../nec_apdu.h"
2#include "sp_des.h"
3#include "sp_constant.h"
4#include "sp_util.h"
5#include "sp_card.h"
6
7static uint8* prcv_buff = NULL;
8static uint8 rcv_len = 0;
9
10uint16 sp_select_sfi(uint8 sfi[2])
11{
12 uint16 ret;
13 uint8 cmd_buff[10];
14
15 cmd_buff[0] = 0x00; //CLA
16 cmd_buff[1] = 0xA4; //INS
17 cmd_buff[2] = 0x00; //P1
18 cmd_buff[3] = 0x00; //P2
19 cmd_buff[4] = 0x02; //Lc
20 memcpy(cmd_buff + 5, sfi, 2);
21
22 ret = card_cpu_exchange(cmd_buff, 2 + 5, 0, &prcv_buff, &rcv_len);
23 if(ret != RETCODE_OK)
24 {
25 return ret;
26 }
27 return 0;
28}
29
30uint16 sp_select_adf(void)
31{
32 uint16 ret;
33 uint8 cmd_buff[] = {"\x00\xA4\x04\x00\x0F\xD1\x56\x00\x00\x01\xBD\xF0\xCA\xCB\xB4\xEF\xD6\xA7\xB8\xB6"};
34 ret = card_cpu_exchange(cmd_buff, sizeof(cmd_buff) - 1, 0, &prcv_buff, &rcv_len);
35 if(ret != RETCODE_OK)
36 {
37 return ret;
38 }
39 return 0;
40}
41
42uint8 sp_card_request(sp_card_t* cardpcd)
43{
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080044 uint8 sak;
45 uint8 snr[8];
46
47 if(!card_request(&sak, snr))
48 {
49 if((sak & 0x20))
50 {
51 if(!card_cpu_mode())
52 {
53 Delay_ms(200);
guangcheng.qin0b456a32019-08-08 16:53:12 +080054 if(sp_select_sfi("\x3f\x00") == 0)
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080055 {
56 sp_select_adf();
guangcheng.qin323c1b12019-09-23 10:06:08 +080057 cardpcd->cardphyid[0] = snr[0];
58 cardpcd->cardphyid[1] = snr[1];
59 cardpcd->cardphyid[2] = snr[2];
60 cardpcd->cardphyid[3] = snr[3];
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080061 cardpcd->cardtype = TAG_TYPE_CPU;
62 return 0;
63 }
64 }
65 }
66 else
67 {
68 cardpcd->cardtype = TAG_TYPE_UNKONWN;
guangcheng.qin0b456a32019-08-08 16:53:12 +080069 return 1;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +080070 }
71 }
72 return 1;
73}
74
75int8 sp_check_cpu_exist(void)
76{
77 return card_cpu_exist();
78}
79
guangcheng.qin0b456a32019-08-08 16:53:12 +080080static uint16 sp_select_adf15()
81{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +080082 uint16 ret;
guangcheng.qin0b456a32019-08-08 16:53:12 +080083 uint8* temp_buff = NULL;
84 uint8 buff_len = 0;
85 uint8 cmd_buff[] = {"\x00\xA4\x00\x00\x02\x3F\x00"};
86 ret = card_cpu_exchange(cmd_buff, sizeof(cmd_buff)-1, 0, &temp_buff, &buff_len);
87 if(ret != RETCODE_OK)
88 {
89 return ret;
90 }
91 return 0;
92}
93
94static uint16 sp_read_binary_file(uint8 out[])
95{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +080096 uint16 ret;
guangcheng.qin0b456a32019-08-08 16:53:12 +080097 uint8* temp_buff = NULL;
98 uint8 buff_len = 0;
99 uint8 cmd_buff[5] = {"\x00\xB0\x95\x00\x47"};
100 ret = card_cpu_exchange(cmd_buff, sizeof(cmd_buff), 0, &temp_buff, &buff_len);
101 if(ret != RETCODE_OK)
102 {
103 return ret;
104 }
105 MEMCPY(out, temp_buff, buff_len);
106 return 0;
107}
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800108static uint16 sp_cpu_read(sp_card_t* card)
109{
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800110 uint16 ret;
guangcheng.qin0b456a32019-08-08 16:53:12 +0800111 uint8 buff[72];
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800112 uint8 offset;
guangcheng.qin0b456a32019-08-08 16:53:12 +0800113 MEMCLEAR(buff, sizeof(buff));
114 ret = sp_select_adf15();
115 if(ret)
116 {
117 return ret;
118
119 }
120 ret = sp_read_binary_file(buff);
121 if(ret)
122 {
123 return ret;
124 }
zongqiang.zhangdc02e6b2019-11-25 17:36:08 +0800125 offset = 0;
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800126 MEMCLEAR(card->citizen_cardno, sizeof(card->citizen_cardno));
guangcheng.qin0b456a32019-08-08 16:53:12 +0800127 offset += 31;
128 MEMCPY(card->citizen_cardno, buff+offset, sizeof(card->citizen_cardno));
129 offset += 12;
130 offset += 18;
131 MEMCPY(card->expiredate, buff+offset, 4);
zongqiang.zhang0c6a0882019-08-07 14:48:21 +0800132 return ret;
133}
134
135uint16 sp_card_read(sp_card_t* card)
136{
137 switch(card->cardtype)
138 {
139 case TAG_TYPE_CPU:
140 return sp_cpu_read(card);
141 default:
142 return 1;
143 }
144}