-
Notifications
You must be signed in to change notification settings - Fork 1
/
ISO7816_send_recieve.c
160 lines (116 loc) · 3.74 KB
/
ISO7816_send_recieve.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <stdint.h>
#include "nrf.h"
#include "Universal.h"
#include "ISO7816.h"
void SC_Send_Message(uint8_t Lenght) {
//Segger_write_string("Sending Message to SC!\n");
SC_Send_Count=Lenght;
for(uint8_t i=0; i<Lenght; i++) {
Send_UART(SC_APDU[i]);
}
//Segger_write_string("\n");
//Card_wait_ETU_cycles(2);
//NRF_UART0->EVENTS_RXDRDY=0;
//UART_prepare_for_recieve();
}
void Correct_First_False_Byte(uint8_t* count, uint8_t *Message) {
//uint8_t value = *count;
if((*count)>=1) {
for(uint8_t i=1; i<(*count); i++) {
Message[i-1]=Message[i];
}
(*count)=(*count)-1;
}
}
uint8_t Recieve_Response(void) {
//Card_wait_ETU_cycles(10);
//UART_prepare_for_recieve();
uint8_t Recieve_Count=0;
//!!!!Segger_write_string("\tRecieving response!\n\t");
while(true) {
uint8_t success=0;
SC_Response[Recieve_Count]=Recieve_UART_timeout(ISO_WAIT_TIME, &success);
if(!success) {
break;
}
//!!!!Segger_write_one_hex_value(SC_Response[Recieve_Count]);
Recieve_Count++;
}
Segger_write_string("\n");
//Segger_write_string_value("\tRecieved count=", Recieve_Count);
//!!!!Correct_First_False_Byte(&Recieve_Count, SC_Response);
//!!!!SC_Response_Count=Recieve_Count;
//!!!!Print_Array(SC_Response_Count, SC_Response);
return Recieve_Count;
}
uint8_t Recieve_And_Check_Response() {
uint8_t Recieve_Count = Recieve_Response();
if(Recieve_Count<2) {
SC_Response_Count=0;
return 0;
}
if(Is_Valid_Message(1, Recieve_Count, SC_Response)) {
Analyze_Message(Recieve_Count, SC_Response);
SC_Response_Count=Recieve_Count;
return Recieve_Count;
}
SC_Response_Count=0;
return 0;
}
uint8_t Send_Message_Recieve_Response(uint8_t * Payload, uint8_t send_count, uint8_t * Message_Recieved) {
Segger_write_string("Send-recieve!\n");
uint8_t APDU_Length = Prepare_Standard_APDU(send_count, Payload);
SC_Send_Message(APDU_Length);
UART_prepare_for_recieve();
uint8_t recieved_count = Recieve_And_Check_Response();
return recieved_count;
}
void Send_Negotiate_Block_Protocol_Alone() { // Should negotiate protocl T=0
Segger_write_string("Negotiating T!\n");
// Negotiating new protocol via PTS
SC_APDU[0] = 0xFF; //PTS request
SC_APDU[1] = SC_ATR_Get_Protocol_Type(); //PTS0 as TA1 0(RFU) 000(PTS 1 2 3 ) Protocol type 4 1
//SC_APDU[2] = 0x00; //PTS1
//SC_APDU[3] = 0x00; //PTS2
//SC_APDU[4] = 0x00; //PTS3
SC_APDU[2] = Calc_XOR_Checksum(0, 0, 2, SC_APDU);
SC_Send_Message(3);
// TODO SC_ATR_Set_Protocol_Type(0x00);
}
void Send_Negotiate_Block_Protocol_APDU() { // Should negotiate protocl T=0
Segger_write_string("Negotiating T=0!\n");
// Negotiating new protocol via PTS
SC_APDU[0] = 0xFF; //PTS request
SC_APDU[1] = 0x00; //PTS0 as TA1 0(RFU) 000(PTS 1 2 3 ) Protocol type 4 1
SC_APDU[2] = 0xFF; //Calc_XOR_Checksum(0, 2, SC_APDU);
uint8_t value = Prepare_Standard_APDU(3, SC_APDU);
SC_Send_Message(value);
}
void Send_Negotiate_Block_Protocol_Block() { // Should negotiate protocl T=0
Segger_write_string("Negotiating T=0!\n");
// Negotiating new protocol via PTS
SC_APDU[0] = 0xFF; //PTS request
SC_APDU[1] = 0x00; //PTS0 as TA1 0(RFU) 000(PTS 1 2 3 ) Protocol type 4 1
SC_APDU[2] = 0xFF; //Calc_XOR_Checksum(0, 2, SC_APDU);
uint8_t value = Prepare_Standard_Block(3, SC_APDU);
SC_Send_Message(value);
}
void Print_Sent() {
Print_Array(SC_Send_Count, SC_APDU);
}
void Print_Recieved() {
Print_Array(SC_Response_Count, SC_Response);
}
void Print_Touple_Send_Recieve() {
Segger_write_string("-->");
Print_Sent();
Segger_write_string("\t<--");
Print_Recieved();
}
uint8_t Send_And_Recieve(uint8_t count) {
Segger_write_string("Sending && recieving response!\n");
SC_Send_Message(count);
uint8_t value = Recieve_And_Check_Response();
Print_Touple_Send_Recieve();
return value;
}