tosend into bigbuff

This commit is contained in:
iceman1001 2020-07-13 18:14:34 +02:00
commit d6f65f8578
2 changed files with 129 additions and 106 deletions

View file

@ -729,62 +729,61 @@ void RAMFUNC SniffIso14443a(uint8_t param) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static void CodeIso14443aAsTagPar(const uint8_t *cmd, uint16_t len, uint8_t *par, bool collision) { static void CodeIso14443aAsTagPar(const uint8_t *cmd, uint16_t len, uint8_t *par, bool collision) {
//uint8_t localCol = 0; tosend_reset();
ToSendReset();
tosend_t *ts = get_tosend();
// Correction bit, might be removed when not needed // Correction bit, might be removed when not needed
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(1); // <----- tosend_stuffbit(1); // <-----
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(0); tosend_stuffbit(0);
// Send startbit // Send startbit
ToSend[++ToSendMax] = SEC_D; ts->buf[++ts->max] = SEC_D;
LastProxToAirDuration = 8 * ToSendMax - 4; LastProxToAirDuration = 8 * ts->max - 4;
for (uint16_t i = 0; i < len; i++) { for (uint16_t i = 0; i < len; i++) {
uint8_t b = cmd[i]; uint8_t b = cmd[i];
// Data bits // Data bits
for (uint16_t j = 0; j < 8; j++) { for (uint16_t j = 0; j < 8; j++) {
//if (collision && (localCol >= colpos)){
if (collision) { if (collision) {
ToSend[++ToSendMax] = SEC_COLL; ts->buf[++ts->max] = SEC_COLL;
//localCol++;
} else { } else {
if (b & 1) { if (b & 1) {
ToSend[++ToSendMax] = SEC_D; ts->buf[++ts->max] = SEC_D;
} else { } else {
ToSend[++ToSendMax] = SEC_E; ts->buf[++ts->max] = SEC_E;
} }
b >>= 1; b >>= 1;
} }
} }
if (collision) { if (collision) {
ToSend[++ToSendMax] = SEC_COLL; ts->buf[++ts->max] = SEC_COLL;
LastProxToAirDuration = 8 * ToSendMax; LastProxToAirDuration = 8 * ts->max;
} else { } else {
// Get the parity bit // Get the parity bit
if (par[i >> 3] & (0x80 >> (i & 0x0007))) { if (par[i >> 3] & (0x80 >> (i & 0x0007))) {
ToSend[++ToSendMax] = SEC_D; ts->buf[++ts->max] = SEC_D;
LastProxToAirDuration = 8 * ToSendMax - 4; LastProxToAirDuration = 8 * ts->max - 4;
} else { } else {
ToSend[++ToSendMax] = SEC_E; ts->buf[++ts->max] = SEC_E;
LastProxToAirDuration = 8 * ToSendMax; LastProxToAirDuration = 8 * ts->max;
} }
} }
} }
// Send stopbit // Send stopbit
ToSend[++ToSendMax] = SEC_F; ts->buf[++ts->max] = SEC_F;
// Convert from last byte pos to length // Convert from last byte pos to length
ToSendMax++; ts->max++;
} }
static void CodeIso14443aAsTagEx(const uint8_t *cmd, uint16_t len, bool collision) { static void CodeIso14443aAsTagEx(const uint8_t *cmd, uint16_t len, bool collision) {
@ -799,37 +798,39 @@ static void CodeIso14443aAsTag(const uint8_t *cmd, uint16_t len) {
static void Code4bitAnswerAsTag(uint8_t cmd) { static void Code4bitAnswerAsTag(uint8_t cmd) {
uint8_t b = cmd; uint8_t b = cmd;
ToSendReset(); tosend_reset();
tosend_t *ts = get_tosend();
// Correction bit, might be removed when not needed // Correction bit, might be removed when not needed
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(1); // 1 tosend_stuffbit(1); // 1
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(0); tosend_stuffbit(0);
ToSendStuffBit(0); tosend_stuffbit(0);
// Send startbit // Send startbit
ToSend[++ToSendMax] = SEC_D; ts->buf[++ts->max] = SEC_D;
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < 4; i++) {
if (b & 1) { if (b & 1) {
ToSend[++ToSendMax] = SEC_D; ts->buf[++ts->max] = SEC_D;
LastProxToAirDuration = 8 * ToSendMax - 4; LastProxToAirDuration = 8 * ts->max - 4;
} else { } else {
ToSend[++ToSendMax] = SEC_E; ts->buf[++ts->max] = SEC_E;
LastProxToAirDuration = 8 * ToSendMax; LastProxToAirDuration = 8 * ts->max;
} }
b >>= 1; b >>= 1;
} }
// Send stopbit // Send stopbit
ToSend[++ToSendMax] = SEC_F; ts->buf[++ts->max] = SEC_F;
// Convert from last byte pos to length // Convert from last byte pos to length
ToSendMax++; ts->max++;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -887,32 +888,36 @@ bool prepare_tag_modulation(tag_response_info_t *response_info, size_t max_buffe
// Prepare the tag modulation bits from the message // Prepare the tag modulation bits from the message
CodeIso14443aAsTag(response_info->response, response_info->response_n); CodeIso14443aAsTag(response_info->response, response_info->response_n);
tosend_t *ts = get_tosend();
// Make sure we do not exceed the free buffer space // Make sure we do not exceed the free buffer space
if (ToSendMax > max_buffer_size) { if (ts->max > max_buffer_size) {
Dbprintf("ToSend buffer, Out-of-bound, when modulating bits for tag answer:"); Dbprintf("ToSend buffer, Out-of-bound, when modulating bits for tag answer:");
Dbhexdump(response_info->response_n, response_info->response, false); Dbhexdump(response_info->response_n, response_info->response, false);
return false; return false;
} }
// Copy the byte array, used for this modulation to the buffer position // Copy the byte array, used for this modulation to the buffer position
memcpy(response_info->modulation, ToSend, ToSendMax); memcpy(response_info->modulation, ts->buf, ts->max);
// Store the number of bytes that were used for encoding/modulation and the time needed to transfer them // Store the number of bytes that were used for encoding/modulation and the time needed to transfer them
response_info->modulation_n = ToSendMax; response_info->modulation_n = ts->max;
response_info->ProxToAirDuration = LastProxToAirDuration; response_info->ProxToAirDuration = LastProxToAirDuration;
return true; return true;
} }
bool prepare_allocated_tag_modulation(tag_response_info_t *response_info, uint8_t **buffer, size_t *max_buffer_size) { bool prepare_allocated_tag_modulation(tag_response_info_t *response_info, uint8_t **buffer, size_t *max_buffer_size) {
tosend_t *ts = get_tosend();
// Retrieve and store the current buffer index // Retrieve and store the current buffer index
response_info->modulation = *buffer; response_info->modulation = *buffer;
// Forward the prepare tag modulation function to the inner function // Forward the prepare tag modulation function to the inner function
if (prepare_tag_modulation(response_info, *max_buffer_size)) { if (prepare_tag_modulation(response_info, *max_buffer_size)) {
// Update the free buffer offset and the remaining buffer size // Update the free buffer offset and the remaining buffer size
*buffer += ToSendMax; *buffer += ts->max;
*max_buffer_size -= ToSendMax; *max_buffer_size -= ts->max;
return true; return true;
} else { } else {
return false; return false;
@ -1638,12 +1643,14 @@ static void PrepareDelayedTransfer(uint16_t delay) {
for (uint16_t i = 0; i < delay; i++) for (uint16_t i = 0; i < delay; i++)
bitmask |= (0x01 << i); bitmask |= (0x01 << i);
ToSend[ToSendMax++] = 0x00; tosend_t *ts = get_tosend();
for (uint16_t i = 0; i < ToSendMax; i++) { ts->buf[ts->max++] = 0x00;
uint8_t bits_to_shift = ToSend[i] & bitmask;
ToSend[i] = ToSend[i] >> delay; for (uint16_t i = 0; i < ts->max; i++) {
ToSend[i] = ToSend[i] | (bits_shifted << (8 - delay)); uint8_t bits_to_shift = ts->buf[i] & bitmask;
ts->buf[i] = ts->buf[i] >> delay;
ts->buf[i] = ts->buf[i] | (bits_shifted << (8 - delay));
bits_shifted = bits_to_shift; bits_shifted = bits_to_shift;
} }
} }
@ -1701,11 +1708,12 @@ static void TransmitFor14443a(const uint8_t *cmd, uint16_t len, uint32_t *timing
static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8_t *par) { static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8_t *par) {
int last = 0; int last = 0;
ToSendReset(); tosend_reset();
tosend_t *ts = get_tosend();
// Start of Communication (Seq. Z) // Start of Communication (Seq. Z)
ToSend[++ToSendMax] = SEC_Z; ts->buf[++ts->max] = SEC_Z;
LastProxToAirDuration = 8 * (ToSendMax + 1) - 6; LastProxToAirDuration = 8 * (ts->max + 1) - 6;
size_t bytecount = nbytes(bits); size_t bytecount = nbytes(bits);
// Generate send structure for the data bits // Generate send structure for the data bits
@ -1717,17 +1725,17 @@ static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, cons
for (j = 0; j < bitsleft; j++) { for (j = 0; j < bitsleft; j++) {
if (b & 1) { if (b & 1) {
// Sequence X // Sequence X
ToSend[++ToSendMax] = SEC_X; ts->buf[++ts->max] = SEC_X;
LastProxToAirDuration = 8 * (ToSendMax + 1) - 2; LastProxToAirDuration = 8 * (ts->max + 1) - 2;
last = 1; last = 1;
} else { } else {
if (last == 0) { if (last == 0) {
// Sequence Z // Sequence Z
ToSend[++ToSendMax] = SEC_Z; ts->buf[++ts->max] = SEC_Z;
LastProxToAirDuration = 8 * (ToSendMax + 1) - 6; LastProxToAirDuration = 8 * (ts->max + 1) - 6;
} else { } else {
// Sequence Y // Sequence Y
ToSend[++ToSendMax] = SEC_Y; ts->buf[++ts->max] = SEC_Y;
last = 0; last = 0;
} }
} }
@ -1739,17 +1747,17 @@ static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, cons
// Get the parity bit // Get the parity bit
if (par[i >> 3] & (0x80 >> (i & 0x0007))) { if (par[i >> 3] & (0x80 >> (i & 0x0007))) {
// Sequence X // Sequence X
ToSend[++ToSendMax] = SEC_X; ts->buf[++ts->max] = SEC_X;
LastProxToAirDuration = 8 * (ToSendMax + 1) - 2; LastProxToAirDuration = 8 * (ts->max + 1) - 2;
last = 1; last = 1;
} else { } else {
if (last == 0) { if (last == 0) {
// Sequence Z // Sequence Z
ToSend[++ToSendMax] = SEC_Z; ts->buf[++ts->max] = SEC_Z;
LastProxToAirDuration = 8 * (ToSendMax + 1) - 6; LastProxToAirDuration = 8 * (ts->max + 1) - 6;
} else { } else {
// Sequence Y // Sequence Y
ToSend[++ToSendMax] = SEC_Y; ts->buf[++ts->max] = SEC_Y;
last = 0; last = 0;
} }
} }
@ -1759,16 +1767,16 @@ static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, cons
// End of Communication: Logic 0 followed by Sequence Y // End of Communication: Logic 0 followed by Sequence Y
if (last == 0) { if (last == 0) {
// Sequence Z // Sequence Z
ToSend[++ToSendMax] = SEC_Z; ts->buf[++ts->max] = SEC_Z;
LastProxToAirDuration = 8 * (ToSendMax + 1) - 6; LastProxToAirDuration = 8 * (ts->max + 1) - 6;
} else { } else {
// Sequence Y // Sequence Y
ToSend[++ToSendMax] = SEC_Y; ts->buf[++ts->max] = SEC_Y;
} }
ToSend[++ToSendMax] = SEC_Y; ts->buf[++ts->max] = SEC_Y;
// Convert to length of command: // Convert to length of command:
ToSendMax++; ts->max++;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -1970,7 +1978,8 @@ int EmSendCmd14443aRaw(uint8_t *resp, uint16_t respLen) {
int EmSend4bit(uint8_t resp) { int EmSend4bit(uint8_t resp) {
Code4bitAnswerAsTag(resp); Code4bitAnswerAsTag(resp);
int res = EmSendCmd14443aRaw(ToSend, ToSendMax); tosend_t *ts = get_tosend();
int res = EmSendCmd14443aRaw(ts->buf, ts->max);
// do the tracing for the previous reader request and this tag answer: // do the tracing for the previous reader request and this tag answer:
uint8_t par[1] = {0x00}; uint8_t par[1] = {0x00};
GetParity(&resp, 1, par); GetParity(&resp, 1, par);
@ -1991,7 +2000,9 @@ int EmSendCmdPar(uint8_t *resp, uint16_t respLen, uint8_t *par) {
} }
int EmSendCmdParEx(uint8_t *resp, uint16_t respLen, uint8_t *par, bool collision) { int EmSendCmdParEx(uint8_t *resp, uint16_t respLen, uint8_t *par, bool collision) {
CodeIso14443aAsTagPar(resp, respLen, par, collision); CodeIso14443aAsTagPar(resp, respLen, par, collision);
int res = EmSendCmd14443aRaw(ToSend, ToSendMax); tosend_t *ts = get_tosend();
int res = EmSendCmd14443aRaw(ts->buf, ts->max);
// do the tracing for the previous reader request and this tag answer: // do the tracing for the previous reader request and this tag answer:
EmLogTrace(Uart.output, EmLogTrace(Uart.output,
Uart.len, Uart.len,
@ -2152,7 +2163,8 @@ void ReaderTransmitBitsPar(uint8_t *frame, uint16_t bits, uint8_t *par, uint32_t
CodeIso14443aBitsAsReaderPar(frame, bits, par); CodeIso14443aBitsAsReaderPar(frame, bits, par);
// Send command to tag // Send command to tag
TransmitFor14443a(ToSend, ToSendMax, timing); tosend_t *ts = get_tosend();
TransmitFor14443a(ts->buf, ts->max, timing);
if (g_trigger) LED_A_ON(); if (g_trigger) LED_A_ON();
LogTrace(frame, nbytes(bits), (LastTimeProxToAirStart << 4) + DELAY_ARM2AIR_AS_READER, ((LastTimeProxToAirStart + LastProxToAirDuration) << 4) + DELAY_ARM2AIR_AS_READER, par, true); LogTrace(frame, nbytes(bits), (LastTimeProxToAirStart << 4) + DELAY_ARM2AIR_AS_READER, ((LastTimeProxToAirStart + LastProxToAirDuration) << 4) + DELAY_ARM2AIR_AS_READER, par, true);

View file

@ -50,7 +50,7 @@
#endif #endif
// 4sample // 4sample
#define SEND4STUFFBIT(x) ToSendStuffBit(x);ToSendStuffBit(x);ToSendStuffBit(x);ToSendStuffBit(x); #define SEND4STUFFBIT(x) tosend_stuffbit(x);tosend_stuffbit(x);tosend_stuffbit(x);tosend_stuffbit(x);
static void iso14b_set_timeout(uint32_t timeout); static void iso14b_set_timeout(uint32_t timeout);
static void iso14b_set_maxframesize(uint16_t size); static void iso14b_set_maxframesize(uint16_t size);
@ -140,7 +140,7 @@ static uint32_t iso14b_timeout = TR0;
static void CodeIso14443bAsTag(const uint8_t *cmd, int len) { static void CodeIso14443bAsTag(const uint8_t *cmd, int len) {
int i; int i;
ToSendReset(); tosend_reset();
// Transmit a burst of ones, as the initial thing that lets the // Transmit a burst of ones, as the initial thing that lets the
// reader get phase sync. // reader get phase sync.
@ -199,8 +199,9 @@ static void CodeIso14443bAsTag(const uint8_t *cmd, int len) {
SEND4STUFFBIT(1); SEND4STUFFBIT(1);
} }
tosend_t *ts = get_tosend();
// Convert from last byte pos to length // Convert from last byte pos to length
ToSendMax++; ts->max++;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -543,24 +544,32 @@ void SimulateIso14443bTag(uint32_t pupi) {
uint16_t len, cmdsReceived = 0; uint16_t len, cmdsReceived = 0;
int cardSTATE = SIM_NOFIELD; int cardSTATE = SIM_NOFIELD;
int vHf = 0; // in mV int vHf = 0; // in mV
tosend_t *ts = get_tosend();
uint8_t *receivedCmd = BigBuf_malloc(MAX_FRAME_SIZE); uint8_t *receivedCmd = BigBuf_malloc(MAX_FRAME_SIZE);
// prepare "ATQB" tag answer (encoded): // prepare "ATQB" tag answer (encoded):
CodeIso14443bAsTag(respATQB, sizeof(respATQB)); CodeIso14443bAsTag(respATQB, sizeof(respATQB));
uint8_t *encodedATQB = BigBuf_malloc(ToSendMax); uint8_t *encodedATQB = BigBuf_malloc(ts->max);
uint16_t encodedATQBLen = ToSendMax; uint16_t encodedATQBLen = ts->max;
memcpy(encodedATQB, ToSend, ToSendMax); memcpy(encodedATQB, ts->buf, ts->max);
// prepare "OK" tag answer (encoded): // prepare "OK" tag answer (encoded):
CodeIso14443bAsTag(respOK, sizeof(respOK)); CodeIso14443bAsTag(respOK, sizeof(respOK));
uint8_t *encodedOK = BigBuf_malloc(ToSendMax); uint8_t *encodedOK = BigBuf_malloc(ts->max);
uint16_t encodedOKLen = ToSendMax; uint16_t encodedOKLen = ts->max;
memcpy(encodedOK, ToSend, ToSendMax); memcpy(encodedOK, ts->buf, ts->max);
// Simulation loop // Simulation loop
while (!BUTTON_PRESS() && !data_available()) { while (BUTTON_PRESS() == false) {
WDT_HIT(); WDT_HIT();
//iceman: limit with 2000 times..
if (data_available()) {
break;
}
// find reader field // find reader field
if (cardSTATE == SIM_NOFIELD) { if (cardSTATE == SIM_NOFIELD) {
@ -669,7 +678,7 @@ void SimulateIso14443bTag(uint32_t pupi) {
if (DBGLEVEL >= DBG_DEBUG) if (DBGLEVEL >= DBG_DEBUG)
Dbprintf("Emulator stopped. Trace length: %d ", BigBuf_get_traceLen()); Dbprintf("Emulator stopped. Trace length: %d ", BigBuf_get_traceLen());
switch_off(); //simulate switch_off(); //simulate
} }
//============================================================================= //=============================================================================
@ -967,9 +976,10 @@ static void TransmitFor14443b_AsReader(void) {
FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD); FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD);
LED_B_ON(); LED_B_ON();
tosend_t *ts = get_tosend();
for (int c = 0; c < ToSendMax; c++) {
uint8_t data = ToSend[c]; for (int c = 0; c < ts->max; c++) {
uint8_t data = ts->buf[c];
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
uint16_t send_word = (data & 0x80) ? 0x0000 : 0xffff; uint16_t send_word = (data & 0x80) ? 0x0000 : 0xffff;
@ -1006,48 +1016,48 @@ static void CodeIso14443bAsReader(const uint8_t *cmd, int len) {
* 1 "stuffbit" = 1ETU (9us) * 1 "stuffbit" = 1ETU (9us)
*/ */
ToSendReset(); tosend_reset();
// Send SOF // Send SOF
// 10-11 ETUs of ZERO // 10-11 ETUs of ZERO
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
ToSendStuffBit(0); tosend_stuffbit(0);
// 2-3 ETUs of ONE // 2-3 ETUs of ONE
ToSendStuffBit(1); tosend_stuffbit(1);
ToSendStuffBit(1); tosend_stuffbit(1);
// Sending cmd, LSB // Sending cmd, LSB
// from here we add BITS // from here we add BITS
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
// Start bit // Start bit
ToSendStuffBit(0); tosend_stuffbit(0);
// Data bits // Data bits
uint8_t b = cmd[i]; uint8_t b = cmd[i];
ToSendStuffBit(b & 1); tosend_stuffbit(b & 1);
ToSendStuffBit((b >> 1) & 1); tosend_stuffbit((b >> 1) & 1);
ToSendStuffBit((b >> 2) & 1); tosend_stuffbit((b >> 2) & 1);
ToSendStuffBit((b >> 3) & 1); tosend_stuffbit((b >> 3) & 1);
ToSendStuffBit((b >> 4) & 1); tosend_stuffbit((b >> 4) & 1);
ToSendStuffBit((b >> 5) & 1); tosend_stuffbit((b >> 5) & 1);
ToSendStuffBit((b >> 6) & 1); tosend_stuffbit((b >> 6) & 1);
ToSendStuffBit((b >> 7) & 1); tosend_stuffbit((b >> 7) & 1);
// Stop bit // Stop bit
ToSendStuffBit(1); tosend_stuffbit(1);
// EGT extra guard time // EGT extra guard time
// For PCD it ranges 0-57us (1etu = 9us) // For PCD it ranges 0-57us (1etu = 9us)
// ToSendStuffBit(1); // tosend_stuffbit(1);
// ToSendStuffBit(1); // tosend_stuffbit(1);
// ToSendStuffBit(1); // tosend_stuffbit(1);
} }
// Send EOF // Send EOF
// 10-11 ETUs of ZERO // 10-11 ETUs of ZERO
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
ToSendStuffBit(0); tosend_stuffbit(0);
// Transition time. TR0 - guard time // Transition time. TR0 - guard time
// 8ETUS minum? // 8ETUS minum?
@ -1056,11 +1066,12 @@ static void CodeIso14443bAsReader(const uint8_t *cmd, int len) {
// ensure that last byte is filled up // ensure that last byte is filled up
for (int i = 0; i < 8 ; ++i) for (int i = 0; i < 8 ; ++i)
ToSendStuffBit(1); tosend_stuffbit(1);
// TR1 - Synchronization time // TR1 - Synchronization time
// Convert from last character reference to length // Convert from last character reference to length
ToSendMax++; tosend_t *ts = get_tosend();
ts->max++;
} }
/* /*