Skip to content

Commit 4aaef3d

Browse files
committed
Dry up seader_send_t1 and use malloc
1 parent 61724f9 commit 4aaef3d

File tree

1 file changed

+27
-39
lines changed

1 file changed

+27
-39
lines changed

t_1.c

+27-39
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,27 @@ void seader_t_1_send_ack(Seader* seader) {
6969
BitBuffer* seader_t_1_tx_buffer;
7070
size_t seader_t_1_tx_buffer_offset = 0;
7171

72-
void seader_send_t1(SeaderUartBridge* seader_uart, uint8_t* apdu, size_t len) {
73-
uint8_t frame[SEADER_UART_RX_BUF_SIZE];
72+
void seader_send_t1_chunk(SeaderUartBridge* seader_uart, uint8_t PCB, uint8_t* chunk, size_t len) {
73+
uint8_t* frame = malloc(3 + len + 1);
7474
uint8_t frame_len = 0;
7575

76+
frame[0] = NAD;
77+
frame[1] = PCB;
78+
frame[2] = len;
79+
frame_len = 3;
80+
81+
if(len > 0) {
82+
memcpy(frame + frame_len, chunk, len);
83+
frame_len += len;
84+
}
85+
86+
frame_len = seader_add_lrc(frame, frame_len);
87+
88+
seader_ccid_XfrBlock(seader_uart, frame, frame_len);
89+
free(frame);
90+
}
91+
92+
void seader_send_t1(SeaderUartBridge* seader_uart, uint8_t* apdu, size_t len) {
7693
if(len > IFSC_VALUE) {
7794
if(seader_t_1_tx_buffer == NULL) {
7895
seader_t_1_tx_buffer = bit_buffer_alloc(768);
@@ -82,33 +99,16 @@ void seader_send_t1(SeaderUartBridge* seader_uart, uint8_t* apdu, size_t len) {
8299
(bit_buffer_get_size_bytes(seader_t_1_tx_buffer) - seader_t_1_tx_buffer_offset);
83100
size_t copy_length = remaining > IFSC_VALUE ? IFSC_VALUE : remaining;
84101

85-
frame[0] = NAD;
102+
uint8_t* chunk =
103+
(uint8_t*)bit_buffer_get_data(seader_t_1_tx_buffer) + seader_t_1_tx_buffer_offset;
104+
86105
if(remaining > IFSC_VALUE) {
87-
frame[1] = seader_next_dpcb() | MORE_BIT;
106+
uint8_t PCB = seader_next_dpcb() | MORE_BIT;
107+
seader_send_t1_chunk(seader_uart, PCB, chunk, copy_length);
88108
} else {
89-
frame[1] = seader_next_dpcb();
109+
uint8_t PCB = seader_next_dpcb();
110+
seader_send_t1_chunk(seader_uart, PCB, chunk, copy_length);
90111
}
91-
frame[2] = copy_length;
92-
frame_len = 3;
93-
94-
memcpy(
95-
frame + frame_len,
96-
bit_buffer_get_data(seader_t_1_tx_buffer) + seader_t_1_tx_buffer_offset,
97-
copy_length);
98-
frame_len += copy_length;
99-
100-
frame_len = seader_add_lrc(frame, frame_len);
101-
102-
/*
103-
FURI_LOG_D(
104-
TAG,
105-
"Sending T=1 frame %s more bit set. Remaining: %d, Copy Length: %d",
106-
(remaining > IFSC_VALUE) ? "with" : "without",
107-
remaining,
108-
copy_length);
109-
*/
110-
111-
seader_ccid_XfrBlock(seader_uart, frame, frame_len);
112112

113113
seader_t_1_tx_buffer_offset += copy_length;
114114
if(seader_t_1_tx_buffer_offset >= bit_buffer_get_size_bytes(seader_t_1_tx_buffer)) {
@@ -119,19 +119,7 @@ void seader_send_t1(SeaderUartBridge* seader_uart, uint8_t* apdu, size_t len) {
119119
return;
120120
}
121121

122-
frame[0] = NAD;
123-
frame[1] = seader_next_dpcb();
124-
frame[2] = len;
125-
frame_len = 3;
126-
127-
if(len > 0) {
128-
memcpy(frame + frame_len, apdu, len);
129-
frame_len += len;
130-
}
131-
132-
frame_len = seader_add_lrc(frame, frame_len);
133-
134-
seader_ccid_XfrBlock(seader_uart, frame, frame_len);
122+
seader_send_t1_chunk(seader_uart, seader_next_dpcb(), apdu, len);
135123
}
136124

137125
BitBuffer* seader_t_1_rx_buffer;

0 commit comments

Comments
 (0)