blob: 5c6796a9f3b778a23569fcfe5bb5f70b045595a2 [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{
44
45 uint8 sak;
46 uint8 snr[8];
47
48 if(!card_request(&sak, snr))
49 {
50 if((sak & 0x20))
51 {
52 if(!card_cpu_mode())
53 {
54 Delay_ms(200);
55 if(sp_select_sfi("\x3f\x00") == 0)
56 {
57 sp_select_adf();
58 cardpcd->cardphyid[0] = snr[3];
59 cardpcd->cardphyid[1] = snr[2];
60 cardpcd->cardphyid[2] = snr[1];
61 cardpcd->cardphyid[3] = snr[0];
62 cardpcd->cardtype = TAG_TYPE_CPU;
63 return 0;
64 }
65 }
66 }
67 else
68 {
69 cardpcd->cardtype = TAG_TYPE_UNKONWN;
70 return 1;
71 }
72 }
73 return 1;
74}
75
76int8 sp_check_cpu_exist(void)
77{
78 return card_cpu_exist();
79}
80
81static uint16 sp_cpu_read(sp_card_t* card)
82{
83 uint16 ret = 0;
84 MEMCLEAR(card->citizen_cardno, sizeof(card->citizen_cardno));
85 MEMCPY(card->expiredate, "\x20\x22\x08\x02", 4);
86 return ret;
87}
88
89uint16 sp_card_read(sp_card_t* card)
90{
91 switch(card->cardtype)
92 {
93 case TAG_TYPE_CPU:
94 return sp_cpu_read(card);
95 default:
96 return 1;
97 }
98}