#include "string.h"
#include "apps.h"
+
+
+void print_result(char *name, uint8_t *buf, size_t len) {
+ uint8_t *p = buf;
+
+ if ( len % 16 == 0 ) {
+ for(; p-buf < len; p += 16)
+ Dbprintf("[%s:%d/%d] %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
+ name,
+ p-buf,
+ len,
+ p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]
+ );
+ }
+ else {
+ for(; p-buf < len; p += 8)
+ Dbprintf("[%s:%d/%d] %02x %02x %02x %02x %02x %02x %02x %02x", name, p-buf, len, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
+ }
+}
+
size_t nbytes(size_t nbits) {
return (nbits/8)+((nbits%8)>0);
}
return num;
}
+// RotateLeft - Ultralight, Desfire
+void rol(uint8_t *data, const size_t len){
+ uint8_t first = data[0];
+ for (size_t i = 0; i < len-1; i++) {
+ data[i] = data[i+1];
+ }
+ data[len-1] = first;
+}
+void lsl (uint8_t *data, size_t len) {
+ for (size_t n = 0; n < len - 1; n++) {
+ data[n] = (data[n] << 1) | (data[n+1] >> 7);
+ }
+ data[len - 1] <<= 1;
+}
+
+int32_t le24toh (uint8_t data[3])
+{
+ return (data[2] << 16) | (data[1] << 8) | data[0];
+}
+
void LEDsoff()
{
LED_A_OFF();
{
struct version_information *v = (struct version_information*)version_information;
dst[0] = 0;
- strncat(dst, prefix, len);
+ strncat(dst, prefix, len-1);
if(v->magic != VERSION_INFORMATION_MAGIC) {
- strncat(dst, "Missing/Invalid version information", len);
+ strncat(dst, "Missing/Invalid version information", len - strlen(dst) - 1);
return;
}
if(v->versionversion != 1) {
- strncat(dst, "Version information not understood", len);
+ strncat(dst, "Version information not understood", len - strlen(dst) - 1);
return;
}
if(!v->present) {
- strncat(dst, "Version information not available", len);
+ strncat(dst, "Version information not available", len - strlen(dst) - 1);
return;
}
- strncat(dst, v->gitversion, len);
+ strncat(dst, v->gitversion, len - strlen(dst) - 1);
if(v->clean == 0) {
- strncat(dst, "-unclean", len);
+ strncat(dst, "-unclean", len - strlen(dst) - 1);
} else if(v->clean == 2) {
- strncat(dst, "-suspect", len);
+ strncat(dst, "-suspect", len - strlen(dst) - 1);
}
- strncat(dst, " ", len);
- strncat(dst, v->buildtime, len);
+ strncat(dst, " ", len - strlen(dst) - 1);
+ strncat(dst, v->buildtime, len - strlen(dst) - 1);
}
// -------------------------------------------------------------------------
}
}
+/**
+ This is a function to store traces. All protocols can use this generic tracer-function.
+ The traces produced by calling this function can be fetched on the client-side
+ by 'hf list raw', alternatively 'hf list <proto>' for protocol-specific
+ annotation of commands/responses.
+
+**/
+bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_start, uint32_t timestamp_end, uint8_t *parity, bool readerToTag)
+{
+ if (!tracing) return FALSE;
+
+ uint16_t num_paritybytes = (iLen-1)/8 + 1; // number of valid paritybytes in *parity
+ uint16_t duration = timestamp_end - timestamp_start;
+
+ // Return when trace is full
+ if (traceLen + sizeof(iLen) + sizeof(timestamp_start) + sizeof(duration) + num_paritybytes + iLen >= TRACE_SIZE) {
+ tracing = FALSE; // don't trace any more
+ return FALSE;
+ }
+
+ // Traceformat:
+ // 32 bits timestamp (little endian)
+ // 16 bits duration (little endian)
+ // 16 bits data length (little endian, Highest Bit used as readerToTag flag)
+ // y Bytes data
+ // x Bytes parity (one byte per 8 bytes data)
+
+ // timestamp (start)
+ trace[traceLen++] = ((timestamp_start >> 0) & 0xff);
+ trace[traceLen++] = ((timestamp_start >> 8) & 0xff);
+ trace[traceLen++] = ((timestamp_start >> 16) & 0xff);
+ trace[traceLen++] = ((timestamp_start >> 24) & 0xff);
+
+ // duration
+ trace[traceLen++] = ((duration >> 0) & 0xff);
+ trace[traceLen++] = ((duration >> 8) & 0xff);
+
+ // data length
+ trace[traceLen++] = ((iLen >> 0) & 0xff);
+ trace[traceLen++] = ((iLen >> 8) & 0xff);
+
+ // readerToTag flag
+ if (!readerToTag) {
+ trace[traceLen - 1] |= 0x80;
+ }
+
+ // data bytes
+ if (btBytes != NULL && iLen != 0) {
+ memcpy(trace + traceLen, btBytes, iLen);
+ }
+ traceLen += iLen;
+
+ // parity bytes
+ if (parity != NULL && iLen != 0) {
+ memcpy(trace + traceLen, parity, num_paritybytes);
+ }
+ traceLen += num_paritybytes;
+
+ return TRUE;
+}