mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-05-12 11:18:11 -07:00
remove spurious spaces & tabs at end of lines
This commit is contained in:
+6
-6
@@ -19,7 +19,7 @@ static uint32_t BigBuf[BIGBUF_SIZE/sizeof(uint32_t)];
|
||||
Pointer to highest available memory: BigBuf_hi
|
||||
|
||||
high BIGBUF_SIZE
|
||||
reserved = BigBuf_malloc() subtracts amount from BigBuf_hi,
|
||||
reserved = BigBuf_malloc() subtracts amount from BigBuf_hi,
|
||||
low 0x00
|
||||
*/
|
||||
|
||||
@@ -43,7 +43,7 @@ uint8_t *BigBuf_get_EM_addr(void) {
|
||||
// not yet allocated
|
||||
if (emulator_memory == NULL)
|
||||
emulator_memory = BigBuf_malloc(CARD_MEMORY_SIZE);
|
||||
|
||||
|
||||
return emulator_memory;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ void BigBuf_Clear(void) {
|
||||
// clear ALL of BigBuf
|
||||
void BigBuf_Clear_ext(bool verbose) {
|
||||
memset(BigBuf, 0, BIGBUF_SIZE);
|
||||
if (verbose)
|
||||
if (verbose)
|
||||
Dbprintf("Buffer cleared (%i bytes)", BIGBUF_SIZE);
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ uint8_t *BigBuf_malloc(uint16_t chunksize) {
|
||||
return NULL; // no memory left
|
||||
|
||||
chunksize = (chunksize + 3) & 0xfffc; // round to next multiple of 4
|
||||
BigBuf_hi -= chunksize; // aligned to 4 Byte boundary
|
||||
BigBuf_hi -= chunksize; // aligned to 4 Byte boundary
|
||||
return (uint8_t *)BigBuf + BigBuf_hi;
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ void BigBuf_free_keep_EM(void) {
|
||||
BigBuf_hi = emulator_memory - (uint8_t *)BigBuf;
|
||||
else
|
||||
BigBuf_hi = BIGBUF_SIZE;
|
||||
|
||||
|
||||
// shouldn't this empty BigBuf also?
|
||||
}
|
||||
|
||||
@@ -242,7 +242,7 @@ uint8_t emlSet(uint8_t *data, uint32_t offset, uint32_t length){
|
||||
if (offset + length < CARD_MEMORY_SIZE) {
|
||||
memcpy(mem+offset, data, length);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
Dbprintf("Error, trying to set memory outside of bounds! %d > %d", (offset + length), CARD_MEMORY_SIZE);
|
||||
return 1;
|
||||
}
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@
|
||||
#define MAX_PARITY_SIZE ((MAX_FRAME_SIZE + 7) / 8)
|
||||
#define MAX_MIFARE_FRAME_SIZE 18 // biggest Mifare frame is answer to a read (one block = 16 Bytes) + 2 Bytes CRC
|
||||
#define MAX_MIFARE_PARITY_SIZE 3 // need 18 parity bits for the 18 Byte above. 3 Bytes are enough to store these
|
||||
#define CARD_MEMORY_SIZE 4096
|
||||
#define CARD_MEMORY_SIZE 4096
|
||||
#define DMA_BUFFER_SIZE 256 //128 (how big is the dma?!?
|
||||
|
||||
extern uint8_t *BigBuf_get_addr(void);
|
||||
|
||||
+2
-2
@@ -125,7 +125,7 @@ void LCDInit(void)
|
||||
LCDSend(PRAMWR); // Write to display
|
||||
i=LCD_XRES*LCD_YRES;
|
||||
while(i--) LCDSend(WHITE);
|
||||
|
||||
|
||||
// test text on different colored backgrounds
|
||||
LCDString(" The quick brown fox ", (char *)&FONT6x8,1,1+8*0,WHITE ,BLACK );
|
||||
LCDString(" jumped over the ", (char *)&FONT6x8,1,1+8*1,BLACK ,WHITE );
|
||||
@@ -135,7 +135,7 @@ void LCDInit(void)
|
||||
LCDString("UuVvWwXxYyZz0123456789", (char *)&FONT6x8,1,1+8*5,BLUE ,YELLOW);
|
||||
LCDString("`-=[]_;',./~!@#$%^&*()", (char *)&FONT6x8,1,1+8*6,BLACK ,CYAN );
|
||||
LCDString(" _+{}|:\\\"<>? ",(char *)&FONT6x8,1,1+8*7,BLUE ,MAGENTA);
|
||||
|
||||
|
||||
// color bands
|
||||
LCDFill(0, 1+8* 8, 132, 8, BLACK);
|
||||
LCDFill(0, 1+8* 9, 132, 8, WHITE);
|
||||
|
||||
+57
-57
@@ -8,20 +8,20 @@
|
||||
|
||||
/*
|
||||
This can actually be used in two separate ways.
|
||||
It can either be used to just HF 14a sniff on the go and/or grab the
|
||||
It can either be used to just HF 14a sniff on the go and/or grab the
|
||||
authentication attempts for ULC/NTAG/ULEV1 into the flash mem (RDV4).
|
||||
|
||||
The retrieved sniffing session can be acquired by connecting the device
|
||||
to a client that supports the reconnect capability and issue 'hf 14a list'.
|
||||
|
||||
In order to view the grabbed authentication attempts in the flash mem,
|
||||
you can simply run 'script run read_pwd_mem' or just 'mem read l 256'
|
||||
you can simply run 'script run read_pwd_mem' or just 'mem read l 256'
|
||||
from the client to view the stored quadlets.
|
||||
*/
|
||||
|
||||
#include "hf_bog.h"
|
||||
|
||||
#define DELAY_READER_AIR2ARM_AS_SNIFFER (2 + 3 + 8)
|
||||
#define DELAY_READER_AIR2ARM_AS_SNIFFER (2 + 3 + 8)
|
||||
#define DELAY_TAG_AIR2ARM_AS_SNIFFER (3 + 14 + 8)
|
||||
|
||||
// Maximum number of auth attempts per standalone session
|
||||
@@ -31,7 +31,7 @@ uint8_t FindOffsetInFlash() {
|
||||
uint8_t mem[4] = { 0x00, 0x00, 0x00, 0x00 };
|
||||
uint8_t eom[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
uint8_t memcnt = 0;
|
||||
|
||||
|
||||
while (memcnt < 0xFF)
|
||||
{
|
||||
Flash_ReadData(memcnt, mem, 4);
|
||||
@@ -40,7 +40,7 @@ uint8_t FindOffsetInFlash() {
|
||||
}
|
||||
memcnt += 4;
|
||||
}
|
||||
|
||||
|
||||
return 0; // wrap-around
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ void EraseMemory() {
|
||||
if (!FlashInit()){
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Flash_CheckBusy(BUSY_TIMEOUT);
|
||||
Flash_WriteEnable();
|
||||
Flash_Erase4k(0,0);
|
||||
@@ -60,26 +60,26 @@ void EraseMemory() {
|
||||
|
||||
// This is actually copied from SniffIso14443a
|
||||
void RAMFUNC SniffAndStore(uint8_t param) {
|
||||
|
||||
|
||||
iso14443a_setup(FPGA_HF_ISO14443A_SNIFFER);
|
||||
|
||||
|
||||
// Allocate memory from BigBuf for some buffers
|
||||
// free all previous allocations first
|
||||
BigBuf_free(); BigBuf_Clear_ext(false);
|
||||
clear_trace();
|
||||
set_tracing(true);
|
||||
|
||||
|
||||
// Array to store the authpwds
|
||||
uint8_t *capturedPwds = BigBuf_malloc(4 * MAX_PWDS_PER_SESSION);
|
||||
|
||||
|
||||
// The command (reader -> tag) that we're receiving.
|
||||
uint8_t *receivedCmd = BigBuf_malloc(MAX_FRAME_SIZE);
|
||||
uint8_t *receivedCmdPar = BigBuf_malloc(MAX_PARITY_SIZE);
|
||||
|
||||
|
||||
// The response (tag -> reader) that we're receiving.
|
||||
uint8_t *receivedResp = BigBuf_malloc(MAX_FRAME_SIZE);
|
||||
uint8_t *receivedRespPar = BigBuf_malloc(MAX_PARITY_SIZE);
|
||||
|
||||
|
||||
// The DMA buffer, used to stream samples from the FPGA
|
||||
uint8_t *dmaBuf = BigBuf_malloc(DMA_BUFFER_SIZE);
|
||||
uint8_t *data = dmaBuf;
|
||||
@@ -88,47 +88,47 @@ void RAMFUNC SniffAndStore(uint8_t param) {
|
||||
int dataLen = 0;
|
||||
bool TagIsActive = false;
|
||||
bool ReaderIsActive = false;
|
||||
|
||||
|
||||
// Set up the demodulator for tag -> reader responses.
|
||||
DemodInit(receivedResp, receivedRespPar);
|
||||
|
||||
|
||||
// Set up the demodulator for the reader -> tag commands
|
||||
UartInit(receivedCmd, receivedCmdPar);
|
||||
|
||||
|
||||
// Setup and start DMA.
|
||||
if ( !FpgaSetupSscDma((uint8_t*) dmaBuf, DMA_BUFFER_SIZE) ){
|
||||
if (MF_DBGLEVEL > 1) Dbprintf("FpgaSetupSscDma failed. Exiting");
|
||||
if (MF_DBGLEVEL > 1) Dbprintf("FpgaSetupSscDma failed. Exiting");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
tUart* uart = GetUart();
|
||||
tDemod* demod = GetDemod();
|
||||
|
||||
|
||||
// We won't start recording the frames that we acquire until we trigger;
|
||||
// a good trigger condition to get started is probably when we see a
|
||||
// response from the tag.
|
||||
// triggered == false -- to wait first for card
|
||||
bool triggered = !(param & 0x03);
|
||||
|
||||
bool triggered = !(param & 0x03);
|
||||
|
||||
uint32_t rsamples = 0;
|
||||
|
||||
|
||||
// Current captured passwords counter
|
||||
uint8_t auth_attempts = 0;
|
||||
|
||||
SpinDelay(50);
|
||||
|
||||
|
||||
// loop and listen
|
||||
while (!BUTTON_PRESS()) {
|
||||
WDT_HIT();
|
||||
LED_A_ON();
|
||||
|
||||
|
||||
int register readBufDataP = data - dmaBuf;
|
||||
int register dmaBufDataP = DMA_BUFFER_SIZE - AT91C_BASE_PDC_SSC->PDC_RCR;
|
||||
if (readBufDataP <= dmaBufDataP)
|
||||
dataLen = dmaBufDataP - readBufDataP;
|
||||
else
|
||||
dataLen = DMA_BUFFER_SIZE - readBufDataP + dmaBufDataP;
|
||||
|
||||
|
||||
// test for length of buffer
|
||||
if (dataLen > DMA_BUFFER_SIZE) { // TODO: Check if this works properly
|
||||
Dbprintf("[!] blew circular buffer! | datalen %u", dataLen);
|
||||
@@ -149,7 +149,7 @@ void RAMFUNC SniffAndStore(uint8_t param) {
|
||||
}
|
||||
|
||||
LED_A_OFF();
|
||||
|
||||
|
||||
// Need two samples to feed Miller and Manchester-Decoder
|
||||
if (rsamples & 0x01) {
|
||||
|
||||
@@ -164,17 +164,17 @@ void RAMFUNC SniffAndStore(uint8_t param) {
|
||||
if (triggered) {
|
||||
if ((receivedCmd) && ((receivedCmd[0] == MIFARE_ULEV1_AUTH) || (receivedCmd[0] == MIFARE_ULC_AUTH_1))) {
|
||||
if (MF_DBGLEVEL > 1) Dbprintf("PWD-AUTH KEY: 0x%02x%02x%02x%02x", receivedCmd[1], receivedCmd[2], receivedCmd[3], receivedCmd[4]);
|
||||
|
||||
|
||||
// temporarily save the captured pwd in our array
|
||||
memcpy(&capturedPwds[4 * auth_attempts], receivedCmd+1, 4);
|
||||
auth_attempts++;
|
||||
}
|
||||
|
||||
if (!LogTrace(receivedCmd,
|
||||
uart->len,
|
||||
|
||||
if (!LogTrace(receivedCmd,
|
||||
uart->len,
|
||||
uart->startTime*16 - DELAY_READER_AIR2ARM_AS_SNIFFER,
|
||||
uart->endTime*16 - DELAY_READER_AIR2ARM_AS_SNIFFER,
|
||||
uart->parity,
|
||||
uart->parity,
|
||||
true)) break;
|
||||
}
|
||||
/* ready to receive another command. */
|
||||
@@ -188,14 +188,14 @@ void RAMFUNC SniffAndStore(uint8_t param) {
|
||||
}
|
||||
|
||||
// no need to try decoding tag data if the reader is sending - and we cannot afford the time
|
||||
if (!ReaderIsActive) {
|
||||
if (!ReaderIsActive) {
|
||||
uint8_t tagdata = (previous_data << 4) | (*data & 0x0F);
|
||||
if (ManchesterDecoding(tagdata, 0, (rsamples-1)*4)) {
|
||||
LED_B_ON();
|
||||
|
||||
if (!LogTrace(receivedResp,
|
||||
demod->len,
|
||||
demod->startTime*16 - DELAY_TAG_AIR2ARM_AS_SNIFFER,
|
||||
if (!LogTrace(receivedResp,
|
||||
demod->len,
|
||||
demod->startTime*16 - DELAY_TAG_AIR2ARM_AS_SNIFFER,
|
||||
demod->endTime*16 - DELAY_TAG_AIR2ARM_AS_SNIFFER,
|
||||
demod->parity,
|
||||
false)) break;
|
||||
@@ -208,7 +208,7 @@ void RAMFUNC SniffAndStore(uint8_t param) {
|
||||
UartReset();
|
||||
//UartInit(receivedCmd, receivedCmdPar);
|
||||
LED_C_OFF();
|
||||
}
|
||||
}
|
||||
TagIsActive = (demod->state != DEMOD_UNSYNCD);
|
||||
}
|
||||
}
|
||||
@@ -223,29 +223,29 @@ void RAMFUNC SniffAndStore(uint8_t param) {
|
||||
|
||||
FpgaDisableSscDma();
|
||||
set_tracing(false);
|
||||
|
||||
|
||||
Dbprintf("Stopped sniffing");
|
||||
|
||||
|
||||
SpinDelay(200);
|
||||
|
||||
|
||||
// Write stuff to flash
|
||||
if (auth_attempts > 0) {
|
||||
if (MF_DBGLEVEL > 1) Dbprintf("[!] Authentication attempts = %u", auth_attempts);
|
||||
|
||||
|
||||
// Setting the SPI Baudrate to 48MHz to avoid the bit-flip issue (https://github.com/RfidResearchGroup/proxmark3/issues/34)
|
||||
FlashmemSetSpiBaudrate(48000000);
|
||||
|
||||
|
||||
// Find the offset in flash mem to continue writing the auth attempts
|
||||
uint8_t memoffset = FindOffsetInFlash();
|
||||
if (MF_DBGLEVEL > 1) Dbprintf("[!] Memory offset = %u", memoffset);
|
||||
|
||||
|
||||
if ((memoffset + 4 * auth_attempts) > 0xFF)
|
||||
{
|
||||
// We opt to keep the new data only
|
||||
memoffset = 0;
|
||||
if (MF_DBGLEVEL > 1) Dbprintf("[!] Size of total data > 256 bytes. Discarding the old data.");
|
||||
}
|
||||
|
||||
|
||||
// Get previous data from flash mem
|
||||
uint8_t *previousdata = BigBuf_malloc(memoffset);
|
||||
if (memoffset > 0)
|
||||
@@ -253,49 +253,49 @@ void RAMFUNC SniffAndStore(uint8_t param) {
|
||||
uint16_t readlen = Flash_ReadData(0, previousdata, memoffset);
|
||||
if (MF_DBGLEVEL > 1) Dbprintf("[!] Read %u bytes from flash mem", readlen);
|
||||
}
|
||||
|
||||
|
||||
// create new bigbuf to hold all data
|
||||
size_t total_size = memoffset + 4 * auth_attempts;
|
||||
uint8_t *total_data = BigBuf_malloc(total_size);
|
||||
|
||||
|
||||
// Add the previousdata array into total_data array
|
||||
memcpy(total_data, previousdata, memoffset);
|
||||
|
||||
|
||||
// Copy bytes of capturedPwds immediately following bytes of previousdata
|
||||
memcpy(total_data + memoffset, capturedPwds, 4 * auth_attempts);
|
||||
|
||||
|
||||
// Erase first page of flash mem
|
||||
EraseMemory();
|
||||
|
||||
|
||||
// Write total data to flash mem
|
||||
uint16_t writelen = Flash_WriteData(0, total_data, memoffset + 4 * auth_attempts);
|
||||
if (MF_DBGLEVEL > 1) Dbprintf("[!] Wrote %u bytes into flash mem", writelen);
|
||||
|
||||
|
||||
// If pwd saved successfully, blink led A three times
|
||||
if (writelen > 0) {
|
||||
SpinErr(0, 200, 5); // blink led A
|
||||
}
|
||||
|
||||
|
||||
SpinDelay(100);
|
||||
|
||||
|
||||
// Reset the SPI Baudrate to the default value (24MHz)
|
||||
FlashmemSetSpiBaudrate(24000000);
|
||||
}
|
||||
}
|
||||
|
||||
void RunMod() {
|
||||
|
||||
|
||||
StandAloneMode();
|
||||
|
||||
|
||||
Dbprintf(">> Bogiton 14a Sniff UL/UL-EV1/NTAG a.k.a BogitoRun Started <<");
|
||||
Dbprintf("Starting to sniff");
|
||||
|
||||
|
||||
// param:
|
||||
// bit 0 - trigger from first card answer
|
||||
// bit 1 - trigger from first reader 7-bit request
|
||||
SniffAndStore(0);
|
||||
LEDsoff();
|
||||
// bit 1 - trigger from first reader 7-bit request
|
||||
SniffAndStore(0);
|
||||
LEDsoff();
|
||||
SpinDelay(300);
|
||||
Dbprintf("- [ End ] -> You can take shell back ...");
|
||||
Dbprintf("- [ ! ] -> use 'script run read_pwd_mem' to print passwords");
|
||||
Dbprintf("- [ ! ] -> use 'script run read_pwd_mem' to print passwords");
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ void WriteTagToFlash(uint8_t index, size_t size)
|
||||
if (!FlashInit()){
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Flash_CheckBusy(BUSY_TIMEOUT);
|
||||
Flash_WriteEnable();
|
||||
Flash_Erase4k(0,0);
|
||||
@@ -212,7 +212,7 @@ void RunMod()
|
||||
{
|
||||
StandAloneMode();
|
||||
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
|
||||
|
||||
|
||||
currline = 20;
|
||||
curlline = 20;
|
||||
currfline = 24;
|
||||
@@ -328,7 +328,7 @@ ACCBITS : 796788[00]+VALUE
|
||||
foundKey[t][sectorNo][2] = 0xFF;
|
||||
foundKey[t][sectorNo][3] = 0xFF;
|
||||
foundKey[t][sectorNo][4] = 0xFF;
|
||||
foundKey[t][sectorNo][5] = 0xFF;
|
||||
foundKey[t][sectorNo][5] = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
I've personally recoded the image of the ARM in order to automate
|
||||
the attack and simulation on Mifare cards. I've moved some of the
|
||||
implementation on the client side to the ARM such as *chk*, *ecfill*, *sim*
|
||||
and *clone* commands.
|
||||
and *clone* commands.
|
||||
|
||||
### What it does now:
|
||||
It will check if the keys from the attacked tag are a subset from
|
||||
@@ -218,7 +218,7 @@ void RunMod() {
|
||||
StandAloneMode();
|
||||
Dbprintf(">> Matty mifare chk/dump/sim a.k.a MattyRun Started <<");
|
||||
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
|
||||
|
||||
|
||||
/*
|
||||
It will check if the keys from the attacked tag are a subset from
|
||||
the hardcoded set of keys inside of the ARM. If this is the case
|
||||
@@ -232,9 +232,9 @@ void RunMod() {
|
||||
If you're using the proxmark connected to a device that has an OS, and you're not using the proxmark3 client to see the debug
|
||||
messages, you MUST uncomment usb_disable().
|
||||
*/
|
||||
|
||||
|
||||
// Comment this line below if you want to see debug messages.
|
||||
// usb_disable();
|
||||
// usb_disable();
|
||||
|
||||
/*
|
||||
Pseudo-configuration block.
|
||||
@@ -323,7 +323,7 @@ void RunMod() {
|
||||
bool err = 0;
|
||||
bool allKeysFound = true;
|
||||
uint32_t size = mfKeysCnt;
|
||||
|
||||
|
||||
for (int type = !keyType; type < 2 && !err; keyType == 2 ? (type++) : (type = 2)) {
|
||||
block = blockNo;
|
||||
for (int sec = 0; sec < sectorsCnt && !err; ++sec) {
|
||||
@@ -341,18 +341,18 @@ void RunMod() {
|
||||
num_to_bytes(key64, 6, foundKey[type][sec]);
|
||||
validKey[type][sec] = true;
|
||||
keyFound = true;
|
||||
Dbprintf("\t✓ Found valid key: [%02x%02x%02x%02x%02x%02x]\n",
|
||||
Dbprintf("\t✓ Found valid key: [%02x%02x%02x%02x%02x%02x]\n",
|
||||
(keyBlock + 6*key)[0], (keyBlock + 6*key)[1], (keyBlock + 6*key)[2],
|
||||
(keyBlock + 6*key)[3], (keyBlock + 6*key)[4], (keyBlock + 6*key)[5]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
block < 127 ? (block += 4) : (block += 16);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
TODO:
|
||||
TODO:
|
||||
- Get UID from tag and set accordingly in emulator memory and call mifare1ksim with right flags (iceman)
|
||||
*/
|
||||
if (!allKeysFound && keyFound) {
|
||||
@@ -371,9 +371,9 @@ void RunMod() {
|
||||
If enabled, transfers found keys to memory and loads target content in emulator memory. Then it simulates to be the tag it has basically cloned.
|
||||
*/
|
||||
if ((transferToEml) && (allKeysFound)) {
|
||||
|
||||
|
||||
emlClearMem();
|
||||
|
||||
|
||||
uint8_t mblock[16];
|
||||
for (uint16_t sectorNo = 0; sectorNo < sectorsCnt; sectorNo++) {
|
||||
if (validKey[0][sectorNo] || validKey[1][sectorNo]) {
|
||||
@@ -388,25 +388,25 @@ void RunMod() {
|
||||
}
|
||||
Dbprintf("\t✓ Found keys have been transferred to the emulator memory.");
|
||||
if (ecfill) {
|
||||
|
||||
|
||||
Dbprintf("\tFilling in with key A.");
|
||||
MifareECardLoad(sectorsCnt, 0, 0, &filled);
|
||||
MifareECardLoad(sectorsCnt, 0, 0, &filled);
|
||||
if (filled != 1) {
|
||||
Dbprintf("\t✕ Failed filling with A.");
|
||||
}
|
||||
|
||||
|
||||
Dbprintf("\tFilling in with key B.");
|
||||
MifareECardLoad(sectorsCnt, 1, 0, &filled);
|
||||
if (filled != 1) {
|
||||
Dbprintf("\t✕ Failed filling with B.");
|
||||
}
|
||||
|
||||
|
||||
if ((filled == 1) && simulation) {
|
||||
Dbprintf("\t✓ Filled, simulation started.");
|
||||
|
||||
|
||||
// This will tell the fpga to emulate using previous keys and current target tag content.
|
||||
Dbprintf("\t Press button to abort simulation at anytime.");
|
||||
|
||||
|
||||
LED_B_ON(); // green
|
||||
// assuming arg0==0, use hardcoded uid 0xdeadbeaf
|
||||
Mifare1ksim( FLAG_4B_UID_IN_DATA | FLAG_UID_IN_EMUL, 0, 0, uid);
|
||||
@@ -454,5 +454,5 @@ void RunMod() {
|
||||
LED_C_ON();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ void RunMod() {
|
||||
card_clone_t uids[OPTS];
|
||||
iso14a_card_select_t card[OPTS];
|
||||
uint8_t params = (MAGIC_SINGLE | MAGIC_DATAIN);
|
||||
|
||||
|
||||
LED(selected + 1, 0);
|
||||
|
||||
for (;;) {
|
||||
@@ -54,7 +54,7 @@ void RunMod() {
|
||||
for (;;) {
|
||||
// exit from Standalone Mode, send a usbcommand.
|
||||
if (usb_poll_validate_length()) return;
|
||||
|
||||
|
||||
if (BUTTON_PRESS()) {
|
||||
if (cardRead[selected]) {
|
||||
Dbprintf("Button press detected -- replaying card in bank[%d]", selected);
|
||||
@@ -68,21 +68,21 @@ void RunMod() {
|
||||
SpinDelay(300);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!iso14443a_select_card(NULL, &card[selected], NULL, true, 0, true)) {
|
||||
continue;
|
||||
} else {
|
||||
Dbprintf("Read UID:");
|
||||
Dbprintf("Read UID:");
|
||||
Dbhexdump(card[selected].uidlen, card[selected].uid, 0);
|
||||
|
||||
|
||||
if (memcmp(uids[(selected+1)%OPTS].uid, card[selected].uid, card[selected].uidlen ) == 0 ) {
|
||||
Dbprintf("Card selected has same UID as what is stored in the other bank. Skipping.");
|
||||
} else {
|
||||
} else {
|
||||
uids[selected].sak = card[selected].sak;
|
||||
uids[selected].uidlen = card[selected].uidlen;
|
||||
memcpy(uids[selected].uid , card[selected].uid, uids[selected].uidlen);
|
||||
uids[selected].uidlen = card[selected].uidlen;
|
||||
memcpy(uids[selected].uid , card[selected].uid, uids[selected].uidlen);
|
||||
memcpy(uids[selected].atqa, card[selected].atqa, 2);
|
||||
|
||||
|
||||
if (uids[selected].uidlen > 4)
|
||||
Dbprintf("Bank[%d] received a 7-byte UID", selected);
|
||||
else
|
||||
@@ -91,7 +91,7 @@ void RunMod() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Dbprintf("ATQA = %02X%02X", uids[selected].atqa[0], uids[selected].atqa[1]);
|
||||
Dbprintf("SAK = %02X", uids[selected].sak);
|
||||
LEDsoff();
|
||||
@@ -108,7 +108,7 @@ void RunMod() {
|
||||
|
||||
cardRead[selected] = 1;
|
||||
}
|
||||
|
||||
|
||||
/* MF Classic UID clone */
|
||||
else if (iGotoClone==1) {
|
||||
iGotoClone=0;
|
||||
@@ -118,7 +118,7 @@ void RunMod() {
|
||||
|
||||
// magiccards holds 4bytes uid. *usually*
|
||||
uint32_t tmpuid = bytes_to_num(uids[selected].uid, 4);
|
||||
|
||||
|
||||
// record
|
||||
Dbprintf("Preparing to Clone card [Bank: %d]; uid: %08x", selected, tmpuid);
|
||||
|
||||
@@ -175,7 +175,7 @@ void RunMod() {
|
||||
// arg0 = workFlags, arg1 = blockNo, datain
|
||||
MifareCSetBlock(params, 0, newBlock0);
|
||||
MifareCGetBlock(params, 0, testBlock0);
|
||||
|
||||
|
||||
if (memcmp(testBlock0, newBlock0, 16)==0) {
|
||||
DbpString("Cloned successfull!");
|
||||
cardRead[selected] = 0; // Only if the card was cloned successfully should we clear it
|
||||
@@ -190,9 +190,9 @@ void RunMod() {
|
||||
LEDsoff();
|
||||
LED(selected + 1, 0);
|
||||
}
|
||||
|
||||
|
||||
// Change where to record (or begin playing)
|
||||
// button_pressed == BUTTON_SINGLE_CLICK && cardRead[selected])
|
||||
// button_pressed == BUTTON_SINGLE_CLICK && cardRead[selected])
|
||||
else if (playing==1) {
|
||||
LEDsoff();
|
||||
LED(selected + 1, 0);
|
||||
@@ -203,7 +203,7 @@ void RunMod() {
|
||||
for ( ; ; ) {
|
||||
// exit from Standalone Mode, send a usbcommand.
|
||||
if (usb_poll_validate_length()) return;
|
||||
|
||||
|
||||
int button_action = BUTTON_HELD(1000);
|
||||
if ( button_action == 0) { // No button action, proceed with sim
|
||||
|
||||
@@ -211,16 +211,16 @@ void RunMod() {
|
||||
uint8_t data[USB_CMD_DATA_SIZE] = {0}; // in case there is a read command received we shouldn't break
|
||||
|
||||
memcpy(data, uids[selected].uid, uids[selected].uidlen);
|
||||
|
||||
|
||||
uint64_t tmpuid = bytes_to_num(uids[selected].uid, uids[selected].uidlen);
|
||||
|
||||
|
||||
if ( uids[selected].uidlen == 7 ) {
|
||||
flags = FLAG_7B_UID_IN_DATA;
|
||||
Dbprintf("Simulating ISO14443a tag with uid: %014" PRIx64 " [Bank: %d]", tmpuid, selected);
|
||||
} else {
|
||||
Dbprintf("Simulating ISO14443a tag with uid: %08" PRIx64 " [Bank: %d]", tmpuid, selected);
|
||||
}
|
||||
|
||||
|
||||
if (uids[selected].sak == 0x08 && uids[selected].atqa[0] == 0x04 && uids[selected].atqa[1] == 0) {
|
||||
DbpString("Mifare Classic 1k");
|
||||
SimulateIso14443aTag(1, flags, data);
|
||||
@@ -240,7 +240,7 @@ void RunMod() {
|
||||
Dbprintf("Unrecognized tag type -- defaulting to Mifare Classic emulation");
|
||||
SimulateIso14443aTag(1, flags, data);
|
||||
}
|
||||
|
||||
|
||||
} else if (button_action == BUTTON_SINGLE_CLICK) {
|
||||
selected = (selected + 1) % OPTS;
|
||||
Dbprintf("Done playing. Switching to record mode on bank %d", selected);
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "standalone.h" // standalone definitions
|
||||
#include "iso14443a.h"
|
||||
#include "protocols.h"
|
||||
|
||||
|
||||
#define OPTS 2
|
||||
|
||||
#endif /* __HF_YOUNG_H */
|
||||
@@ -9,16 +9,16 @@
|
||||
// the license.
|
||||
//
|
||||
// PROXMARK3 - HID CORPORATE 1000 BRUTEFORCER (STAND-ALONE MODE)
|
||||
//
|
||||
//
|
||||
// This version of Proxmark3 firmware adds one extra stand-alone mode to proxmark3 firmware.
|
||||
// The new stand-alone mode allows to execute a bruteforce on HID Corporate 1000 readers, by
|
||||
// reading a specific badge and bruteforcing the Card Number (incrementing and decrementing it),
|
||||
// mainteining the same Facility Code of the original badge.
|
||||
//
|
||||
// Based on an idea of Brad Antoniewicz of McAfee® Foundstone® Professional Services (ProxBrute),
|
||||
// Based on an idea of Brad Antoniewicz of McAfee® Foundstone® Professional Services (ProxBrute),
|
||||
// the stand-alone mode has been rewritten in order to overcome some limitations of ProxBrute firmware,
|
||||
// that does not consider parity bits.
|
||||
//
|
||||
//
|
||||
// https://github.com/federicodotta/proxmark3
|
||||
//
|
||||
//-----------------------------------------------------------------------------------
|
||||
@@ -29,7 +29,7 @@
|
||||
// samy's sniff and repeat routine for LF
|
||||
void RunMod() {
|
||||
StandAloneMode();
|
||||
Dbprintf(">> LF HID corporate bruteforce a.k.a CorporateBrute Started <<");
|
||||
Dbprintf(">> LF HID corporate bruteforce a.k.a CorporateBrute Started <<");
|
||||
FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
|
||||
|
||||
uint32_t high[OPTS], low[OPTS];
|
||||
@@ -40,9 +40,9 @@ void RunMod() {
|
||||
// Turn on selected LED
|
||||
LED(selected + 1, 0);
|
||||
|
||||
for (;;) {
|
||||
for (;;) {
|
||||
WDT_HIT();
|
||||
|
||||
|
||||
// exit from SamyRun, send a usbcommand.
|
||||
if (usb_poll_validate_length()) break;
|
||||
|
||||
@@ -74,8 +74,8 @@ void RunMod() {
|
||||
// Finished recording
|
||||
// If we were previously playing, set playing off
|
||||
// so next button push begins playing what we recorded
|
||||
playing = 0;
|
||||
cardRead = 1;
|
||||
playing = 0;
|
||||
cardRead = 1;
|
||||
}
|
||||
else if (button_pressed > 0 && cardRead == 1) {
|
||||
LEDsoff();
|
||||
@@ -101,8 +101,8 @@ void RunMod() {
|
||||
|
||||
// If we were previously playing, set playing off
|
||||
// so next button push begins playing what we recorded
|
||||
playing = 0;
|
||||
cardRead = 0;
|
||||
playing = 0;
|
||||
cardRead = 0;
|
||||
}
|
||||
|
||||
// Change where to record (or begin playing)
|
||||
@@ -110,7 +110,7 @@ void RunMod() {
|
||||
// Next option if we were previously playing
|
||||
if (playing)
|
||||
selected = (selected + 1) % OPTS;
|
||||
|
||||
|
||||
playing = !playing;
|
||||
|
||||
LEDsoff();
|
||||
@@ -121,15 +121,15 @@ void RunMod() {
|
||||
|
||||
LED(LED_GREEN, 0);
|
||||
DbpString("[=] playing");
|
||||
|
||||
|
||||
// wait for button to be released
|
||||
while (BUTTON_PRESS())
|
||||
WDT_HIT();
|
||||
|
||||
|
||||
Dbprintf("[=] %x %x %08x", selected, high[selected], low[selected]);
|
||||
CmdHIDsimTAG(high[selected], low[selected], 0);
|
||||
CmdHIDsimTAG(high[selected], low[selected], 0);
|
||||
DbpString("[=] done playing");
|
||||
|
||||
|
||||
if (BUTTON_HELD(1000) > 0)
|
||||
goto out;
|
||||
|
||||
@@ -144,9 +144,9 @@ void RunMod() {
|
||||
}
|
||||
else if (playing && selected == 2)
|
||||
{
|
||||
// Now it work only with HID Corporate 1000 (35bit), but is easily extensible to others RFID.
|
||||
// It is necessary only to calculate the correct parity.
|
||||
|
||||
// Now it work only with HID Corporate 1000 (35bit), but is easily extensible to others RFID.
|
||||
// It is necessary only to calculate the correct parity.
|
||||
|
||||
// Brute force code
|
||||
// Check if the badge is an HID Corporate 1000
|
||||
if( (high[selected] & 0xFFFFFFF8) != 0x28 ) {
|
||||
@@ -159,7 +159,7 @@ void RunMod() {
|
||||
// wait for button to be released
|
||||
while (BUTTON_PRESS())
|
||||
WDT_HIT();
|
||||
|
||||
|
||||
// Calculate Facility Code and Card Number from high and low
|
||||
uint32_t cardnum = (low[selected] >> 1) & 0xFFFFF;
|
||||
uint32_t fc = ((high[selected] & 1 ) << 11 ) | (low[selected] >> 21);
|
||||
@@ -168,13 +168,13 @@ void RunMod() {
|
||||
Dbprintf("[=] Proxbrute - starting decrementing card number");
|
||||
|
||||
while (cardnum >= 0) {
|
||||
|
||||
|
||||
// Needed for exiting from proxbrute when button is pressed
|
||||
if (BUTTON_PRESS()) {
|
||||
if (BUTTON_HELD(1000) > 0) {
|
||||
goto out;
|
||||
goto out;
|
||||
} else {
|
||||
while (BUTTON_PRESS()) {
|
||||
while (BUTTON_PRESS()) {
|
||||
WDT_HIT();
|
||||
}
|
||||
break;
|
||||
@@ -189,7 +189,7 @@ void RunMod() {
|
||||
|
||||
// Print actual code to brute
|
||||
Dbprintf("[=] TAG ID: %x%08x (%d) - FC: %u - Card: %u", high[selected], low[selected], (low[selected] >> 1) & 0xFFFF, fc, cardnum);
|
||||
|
||||
|
||||
CmdHIDsimTAGEx(high[selected], low[selected], 1, 50000);
|
||||
}
|
||||
|
||||
@@ -198,12 +198,12 @@ void RunMod() {
|
||||
Dbprintf("[=] Proxbrute - starting incrementing card number");
|
||||
|
||||
while (cardnum <= 0xFFFFF) {
|
||||
|
||||
|
||||
// Needed for exiting from proxbrute when button is pressed
|
||||
if (BUTTON_PRESS()) {
|
||||
if (BUTTON_HELD(1000) > 0) {
|
||||
goto out;
|
||||
} else {
|
||||
} else {
|
||||
while (BUTTON_PRESS()) { WDT_HIT(); }
|
||||
break;
|
||||
}
|
||||
@@ -233,32 +233,32 @@ void RunMod() {
|
||||
playing = !playing;
|
||||
LEDsoff();
|
||||
LED(selected + 1, 0);
|
||||
|
||||
|
||||
} else {
|
||||
while(BUTTON_PRESS())
|
||||
WDT_HIT();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
out:
|
||||
DbpString("[=] exiting");
|
||||
LEDsoff();
|
||||
LEDsoff();
|
||||
}
|
||||
|
||||
// Function that calculate next value for the brutforce of HID corporate 1000
|
||||
void hid_corporate_1000_calculate_checksum_and_set( uint32_t *high, uint32_t *low, uint32_t cardnum, uint32_t fc) {
|
||||
|
||||
uint32_t new_high = 0;
|
||||
uint32_t new_low = 0;
|
||||
uint32_t new_low = 0;
|
||||
|
||||
// Calculate new high and low base value from card number and facility code, without parity
|
||||
new_low = (fc << 21) | (cardnum << 1);
|
||||
new_low = (fc << 21) | (cardnum << 1);
|
||||
new_high = 0x28 | ((fc >> 11) & 1); // 0x28 is 101000
|
||||
|
||||
int n_ones;
|
||||
uint32_t i;
|
||||
|
||||
|
||||
// Calculating and setting parity bit 34
|
||||
// Select only bit used for parity bit 34 in low number (10110110110110110110110110110110)
|
||||
uint32_t parity_bit_34_low = new_low & 0xB6DB6DB6;
|
||||
@@ -271,7 +271,7 @@ void hid_corporate_1000_calculate_checksum_and_set( uint32_t *high, uint32_t *lo
|
||||
// Calculate number of ones in high number
|
||||
if (new_high & 1)
|
||||
n_ones++;
|
||||
|
||||
|
||||
// Set parity bit (Even parity)
|
||||
if (n_ones % 2)
|
||||
new_high = new_high | 0x2;
|
||||
@@ -289,14 +289,14 @@ void hid_corporate_1000_calculate_checksum_and_set( uint32_t *high, uint32_t *lo
|
||||
// Calculate number of ones in high number
|
||||
if ( new_high & 0x1)
|
||||
n_ones++;
|
||||
|
||||
|
||||
if ( new_high & 0x2)
|
||||
n_ones++;
|
||||
|
||||
|
||||
// Set parity bit (Odd parity)
|
||||
if (!(n_ones % 2))
|
||||
new_low = new_low | 0x1;
|
||||
|
||||
|
||||
// Calculating and setting parity bit 35
|
||||
n_ones = 0;
|
||||
// Calculate number of ones in low number (all bit of low, bitmask unnecessary)
|
||||
@@ -307,7 +307,7 @@ void hid_corporate_1000_calculate_checksum_and_set( uint32_t *high, uint32_t *lo
|
||||
// Calculate number of ones in high number
|
||||
if ( new_high & 0x1)
|
||||
n_ones++;
|
||||
|
||||
|
||||
if ( new_high & 0x2)
|
||||
n_ones++;
|
||||
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
// at your option, any later version. See the LICENSE.txt file for the text of
|
||||
// the license.
|
||||
//-----------------------------------------------------------------------------
|
||||
// main code for LF aka Proxbrute by Brad antoniewicz
|
||||
// main code for LF aka Proxbrute by Brad antoniewicz
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "lf_proxbrute.h"
|
||||
|
||||
// samy's sniff and repeat routine for LF
|
||||
void RunMod() {
|
||||
StandAloneMode();
|
||||
Dbprintf(">> LF HID proxII bruteforce a.k.a ProxBrute Started (Brad Antoniewicz) <<");
|
||||
Dbprintf(">> LF HID proxII bruteforce a.k.a ProxBrute Started (Brad Antoniewicz) <<");
|
||||
FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
|
||||
|
||||
uint32_t high[OPTS], low[OPTS];
|
||||
@@ -25,9 +25,9 @@ void RunMod() {
|
||||
// Turn on selected LED
|
||||
LED(selected + 1, 0);
|
||||
|
||||
for (;;) {
|
||||
for (;;) {
|
||||
WDT_HIT();
|
||||
|
||||
|
||||
// exit from SamyRun, send a usbcommand.
|
||||
if (usb_poll_validate_length()) break;
|
||||
|
||||
@@ -59,8 +59,8 @@ void RunMod() {
|
||||
// Finished recording
|
||||
// If we were previously playing, set playing off
|
||||
// so next button push begins playing what we recorded
|
||||
playing = 0;
|
||||
cardRead = 1;
|
||||
playing = 0;
|
||||
cardRead = 1;
|
||||
}
|
||||
else if (button_pressed > 0 && cardRead == 1) {
|
||||
LEDsoff();
|
||||
@@ -86,8 +86,8 @@ void RunMod() {
|
||||
|
||||
// If we were previously playing, set playing off
|
||||
// so next button push begins playing what we recorded
|
||||
playing = 0;
|
||||
cardRead = 0;
|
||||
playing = 0;
|
||||
cardRead = 0;
|
||||
}
|
||||
|
||||
// Change where to record (or begin playing)
|
||||
@@ -107,7 +107,7 @@ void RunMod() {
|
||||
// wait for button to be released
|
||||
while (BUTTON_PRESS())
|
||||
WDT_HIT();
|
||||
|
||||
|
||||
/* START PROXBRUTE */
|
||||
|
||||
/*
|
||||
@@ -144,7 +144,7 @@ void RunMod() {
|
||||
|
||||
/* END PROXBRUTE */
|
||||
|
||||
|
||||
|
||||
if (BUTTON_HELD(1000) > 0)
|
||||
goto out;
|
||||
|
||||
@@ -163,7 +163,7 @@ void RunMod() {
|
||||
}
|
||||
}
|
||||
}
|
||||
out:
|
||||
out:
|
||||
DbpString("[=] exiting");
|
||||
LEDsoff();
|
||||
LEDsoff();
|
||||
}
|
||||
@@ -6,14 +6,14 @@
|
||||
// at your option, any later version. See the LICENSE.txt file for the text of
|
||||
// the license.
|
||||
//-----------------------------------------------------------------------------
|
||||
// main code for LF aka SamyRun by Samy Kamkar
|
||||
// main code for LF aka SamyRun by Samy Kamkar
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "lf_samyrun.h"
|
||||
|
||||
// samy's sniff and repeat routine for LF
|
||||
void RunMod() {
|
||||
StandAloneMode();
|
||||
Dbprintf(">> LF HID Read/Clone/Sim a.k.a SamyRun Started <<");
|
||||
Dbprintf(">> LF HID Read/Clone/Sim a.k.a SamyRun Started <<");
|
||||
FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
|
||||
|
||||
uint32_t high[OPTS], low[OPTS];
|
||||
@@ -24,15 +24,15 @@ void RunMod() {
|
||||
// Turn on selected LED
|
||||
LED(selected + 1, 0);
|
||||
|
||||
for (;;) {
|
||||
for (;;) {
|
||||
WDT_HIT();
|
||||
|
||||
|
||||
// exit from SamyRun, send a usbcommand.
|
||||
if (usb_poll_validate_length()) break;
|
||||
|
||||
// Was our button held down or pressed?
|
||||
int button_pressed = BUTTON_HELD(1000);
|
||||
|
||||
|
||||
Dbprintf("button %d", button_pressed);
|
||||
SpinDelay(300);
|
||||
|
||||
@@ -60,7 +60,7 @@ void RunMod() {
|
||||
// Finished recording
|
||||
// If we were previously playing, set playing off
|
||||
// so next button push begins playing what we recorded
|
||||
playing = 0;
|
||||
playing = 0;
|
||||
cardRead = 1;
|
||||
|
||||
gotCard = true;
|
||||
@@ -89,8 +89,8 @@ void RunMod() {
|
||||
|
||||
// If we were previously playing, set playing off
|
||||
// so next button push begins playing what we recorded
|
||||
playing = 0;
|
||||
cardRead = 0;
|
||||
playing = 0;
|
||||
cardRead = 0;
|
||||
}
|
||||
|
||||
// Change where to record (or begin playing)
|
||||
@@ -98,7 +98,7 @@ void RunMod() {
|
||||
// Next option if we were previously playing
|
||||
if (playing)
|
||||
selected = (selected + 1) % OPTS;
|
||||
|
||||
|
||||
playing = !playing;
|
||||
|
||||
LEDsoff();
|
||||
@@ -106,18 +106,18 @@ void RunMod() {
|
||||
|
||||
// Begin transmitting
|
||||
if (playing) {
|
||||
|
||||
|
||||
LED(LED_GREEN, 0);
|
||||
DbpString("[=] playing");
|
||||
|
||||
|
||||
// wait for button to be released
|
||||
while (BUTTON_PRESS())
|
||||
WDT_HIT();
|
||||
|
||||
|
||||
Dbprintf("[=] %x %x %08x", selected, high[selected], low[selected]);
|
||||
CmdHIDsimTAG(high[selected], low[selected], false);
|
||||
CmdHIDsimTAG(high[selected], low[selected], false);
|
||||
DbpString("[=] done playing");
|
||||
|
||||
|
||||
if (BUTTON_HELD(1000) > 0)
|
||||
goto out;
|
||||
|
||||
@@ -137,7 +137,7 @@ void RunMod() {
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
out:
|
||||
DbpString("[=] exiting");
|
||||
LEDsoff();
|
||||
}
|
||||
+137
-137
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -174,7 +174,7 @@ void ReaderMifare(bool first_try, uint8_t block, uint8_t keytype );
|
||||
|
||||
//desfire
|
||||
void Mifare_DES_Auth1(uint8_t arg0,uint8_t *datain);
|
||||
void Mifare_DES_Auth2(uint32_t arg0, uint8_t *datain);
|
||||
void Mifare_DES_Auth2(uint32_t arg0, uint8_t *datain);
|
||||
|
||||
// mifaredesfire.h
|
||||
bool InitDesfireCard();
|
||||
@@ -205,7 +205,7 @@ void AcquireRawAdcSamplesIso15693(void);
|
||||
void ReaderIso15693(uint32_t parameter); // Simulate an ISO15693 reader - greg
|
||||
void SimTagIso15693(uint32_t parameter, uint8_t *uid); // simulate an ISO15693 tag - greg
|
||||
void BruteforceIso15693Afi(uint32_t speed); // find an AFI of a tag - atrox
|
||||
void DirectTag15693Command(uint32_t datalen,uint32_t speed, uint32_t recv, uint8_t *data); // send arbitrary commands from CLI - atrox
|
||||
void DirectTag15693Command(uint32_t datalen,uint32_t speed, uint32_t recv, uint8_t *data); // send arbitrary commands from CLI - atrox
|
||||
void Iso15693InitReader(void);
|
||||
|
||||
// iclass.h
|
||||
|
||||
+10
-10
@@ -1,6 +1,6 @@
|
||||
#include "buzzer.h"
|
||||
|
||||
void Ring_BEE_ONCE(uint16_t music_note) {
|
||||
void Ring_BEE_ONCE(uint16_t music_note) {
|
||||
BEE_ON();
|
||||
SpinDelayUs(music_note);
|
||||
BEE_OFF();
|
||||
@@ -12,7 +12,7 @@ void ring_2_7khz(uint16_t count) {
|
||||
}
|
||||
|
||||
void Ring_BEE_TIME(uint16_t music_note,uint16_t count) {
|
||||
for(uint16_t i=0 ; i < count; i++)
|
||||
for(uint16_t i=0 ; i < count; i++)
|
||||
Ring_BEE_ONCE(music_note);
|
||||
SpinDelay(9);
|
||||
}
|
||||
@@ -28,15 +28,15 @@ void Ring_ALL(uint16_t count) {
|
||||
SpinDelay(10);
|
||||
}
|
||||
|
||||
void Ring_Little_Star(uint16_t count) {
|
||||
Ring_BEE_TIME(note_1,count);
|
||||
Ring_BEE_TIME(note_1,count);
|
||||
void Ring_Little_Star(uint16_t count) {
|
||||
Ring_BEE_TIME(note_1,count);
|
||||
Ring_BEE_TIME(note_1,count);
|
||||
Ring_BEE_TIME(note_5,count);
|
||||
Ring_BEE_TIME(note_5,count);
|
||||
Ring_BEE_TIME(note_6,count);
|
||||
Ring_BEE_TIME(note_6,count);
|
||||
Ring_BEE_TIME(note_5,2*count);
|
||||
LED_A_ON();
|
||||
LED_A_ON();
|
||||
/*
|
||||
Ring_BEE_TIME(note_4,count);
|
||||
Ring_BEE_TIME(note_4,count);
|
||||
@@ -45,7 +45,7 @@ void Ring_Little_Star(uint16_t count) {
|
||||
Ring_BEE_TIME(note_2,count);
|
||||
Ring_BEE_TIME(note_2,count);
|
||||
Ring_BEE_TIME(note_1,2*count);
|
||||
LED_A_OFF();
|
||||
LED_A_OFF();
|
||||
|
||||
Ring_BEE_TIME(note_5,count);
|
||||
Ring_BEE_TIME(note_5,count);
|
||||
@@ -54,7 +54,7 @@ void Ring_Little_Star(uint16_t count) {
|
||||
Ring_BEE_TIME(note_3,count);
|
||||
Ring_BEE_TIME(note_3,count);
|
||||
Ring_BEE_TIME(note_2,2*count);
|
||||
LED_A_ON();
|
||||
LED_A_ON();
|
||||
|
||||
Ring_BEE_TIME(note_5,count);
|
||||
Ring_BEE_TIME(note_5,count);
|
||||
@@ -63,7 +63,7 @@ void Ring_Little_Star(uint16_t count) {
|
||||
Ring_BEE_TIME(note_3,count);
|
||||
Ring_BEE_TIME(note_3,count);
|
||||
Ring_BEE_TIME(note_2,2*count);
|
||||
LED_A_OFF();
|
||||
LED_A_OFF();
|
||||
|
||||
Ring_BEE_TIME(note_1,count);
|
||||
Ring_BEE_TIME(note_1,count);
|
||||
@@ -72,7 +72,7 @@ void Ring_Little_Star(uint16_t count) {
|
||||
Ring_BEE_TIME(note_6,count);
|
||||
Ring_BEE_TIME(note_6,count);
|
||||
Ring_BEE_TIME(note_5,2*count);
|
||||
LED_A_ON();
|
||||
LED_A_ON();
|
||||
|
||||
Ring_BEE_TIME(note_4,count);
|
||||
Ring_BEE_TIME(note_4,count);
|
||||
|
||||
+44
-44
@@ -23,7 +23,7 @@
|
||||
* \date 2007-06-16
|
||||
* \brief DES and EDE-DES implementation
|
||||
* \license GPLv3 or later
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "des.h"
|
||||
@@ -145,25 +145,25 @@ const uint8_t pc2_permtab[] ={
|
||||
|
||||
const uint8_t splitin6bitword_permtab[] = {
|
||||
8, 8, /* 64 bit -> 64 bit */
|
||||
64, 64, 1, 6, 2, 3, 4, 5,
|
||||
64, 64, 7, 12, 8, 9, 10, 11,
|
||||
64, 64, 13, 18, 14, 15, 16, 17,
|
||||
64, 64, 19, 24, 20, 21, 22, 23,
|
||||
64, 64, 25, 30, 26, 27, 28, 29,
|
||||
64, 64, 31, 36, 32, 33, 34, 35,
|
||||
64, 64, 37, 42, 38, 39, 40, 41,
|
||||
64, 64, 43, 48, 44, 45, 46, 47
|
||||
64, 64, 1, 6, 2, 3, 4, 5,
|
||||
64, 64, 7, 12, 8, 9, 10, 11,
|
||||
64, 64, 13, 18, 14, 15, 16, 17,
|
||||
64, 64, 19, 24, 20, 21, 22, 23,
|
||||
64, 64, 25, 30, 26, 27, 28, 29,
|
||||
64, 64, 31, 36, 32, 33, 34, 35,
|
||||
64, 64, 37, 42, 38, 39, 40, 41,
|
||||
64, 64, 43, 48, 44, 45, 46, 47
|
||||
};
|
||||
|
||||
const uint8_t shiftkey_permtab[] = {
|
||||
7, 7, /* 56 bit -> 56 bit */
|
||||
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, 1,
|
||||
30, 31, 32, 33, 34, 35, 36, 37,
|
||||
38, 39, 40, 41, 42, 43, 44, 45,
|
||||
46, 47, 48, 49, 50, 51, 52, 53,
|
||||
18, 19, 20, 21, 22, 23, 24, 25,
|
||||
26, 27, 28, 1,
|
||||
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, 29
|
||||
};
|
||||
|
||||
@@ -173,9 +173,9 @@ const uint8_t shiftkeyinv_permtab[] = {
|
||||
8, 9, 10, 11, 12, 13, 14, 15,
|
||||
16, 17, 18, 19, 20, 21, 22, 23,
|
||||
24, 25, 26, 27,
|
||||
56, 29, 30, 31, 32, 33, 34, 35,
|
||||
36, 37, 38, 39, 40, 41, 42, 43,
|
||||
44, 45, 46, 47, 48, 49, 50, 51,
|
||||
56, 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
|
||||
};
|
||||
|
||||
@@ -198,7 +198,7 @@ const uint8_t shiftkeyinv_permtab[] = {
|
||||
2 1
|
||||
1 0
|
||||
*/
|
||||
#define ROTTABLE 0x7EFC
|
||||
#define ROTTABLE 0x7EFC
|
||||
#define ROTTABLE_INV 0x3F7E
|
||||
/******************************************************************************/
|
||||
|
||||
@@ -234,7 +234,7 @@ static inline
|
||||
void shiftkey(uint8_t *key){
|
||||
uint8_t k[7];
|
||||
memcpy(k, key, 7);
|
||||
permute((uint8_t*)shiftkey_permtab, k, key);
|
||||
permute((uint8_t*)shiftkey_permtab, k, key);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -243,7 +243,7 @@ void shiftkey_inv(uint8_t *key){
|
||||
uint8_t k[7];
|
||||
memcpy(k, key, 7);
|
||||
permute((uint8_t*)shiftkeyinv_permtab, k, key);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -251,7 +251,7 @@ static inline
|
||||
uint64_t splitin6bitwords(uint64_t a){
|
||||
uint64_t ret=0;
|
||||
a &= 0x0000ffffffffffffLL;
|
||||
permute((uint8_t*)splitin6bitword_permtab, (uint8_t*)&a, (uint8_t*)&ret);
|
||||
permute((uint8_t*)splitin6bitword_permtab, (uint8_t*)&a, (uint8_t*)&ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -259,11 +259,11 @@ uint64_t splitin6bitwords(uint64_t a){
|
||||
|
||||
static inline
|
||||
uint8_t substitute(uint8_t a, uint8_t * sbp){
|
||||
uint8_t x;
|
||||
uint8_t x;
|
||||
x = sbp[a>>1];
|
||||
x = (a&1)?x&0x0F:x>>4;
|
||||
return x;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -272,11 +272,11 @@ uint32_t des_f(uint32_t r, uint8_t* kr){
|
||||
uint8_t i;
|
||||
uint32_t t=0,ret;
|
||||
uint64_t data;
|
||||
uint8_t *sbp; /* sboxpointer */
|
||||
uint8_t *sbp; /* sboxpointer */
|
||||
permute((uint8_t*)e_permtab, (uint8_t*)&r, (uint8_t*)&data);
|
||||
for(i=0; i<6; ++i)
|
||||
((uint8_t*)&data)[i] ^= kr[i];
|
||||
|
||||
|
||||
/* Sbox substitution */
|
||||
data = splitin6bitwords(data);
|
||||
sbp=(uint8_t*)sbox;
|
||||
@@ -288,7 +288,7 @@ uint32_t des_f(uint32_t r, uint8_t* kr){
|
||||
sbp += 32;
|
||||
}
|
||||
changeendian32(&t);
|
||||
|
||||
|
||||
permute((uint8_t*)p_permtab,(uint8_t*)&t, (uint8_t*)&ret);
|
||||
|
||||
return ret;
|
||||
@@ -310,7 +310,7 @@ void des_enc(void* out, const void* in, const void* key){
|
||||
uint8_t kr[6], k[7];
|
||||
uint8_t i;
|
||||
data_t data;
|
||||
|
||||
|
||||
permute((uint8_t*)ip_permtab, (uint8_t*)in, data.d.v8);
|
||||
permute((uint8_t*)pc1_permtab, (const uint8_t*)key, k);
|
||||
|
||||
@@ -320,7 +320,7 @@ void des_enc(void* out, const void* in, const void* key){
|
||||
shiftkey(k);
|
||||
permute((uint8_t*)pc2_permtab, k, kr);
|
||||
L ^= des_f(R, kr);
|
||||
|
||||
|
||||
shiftkey(k);
|
||||
if(ROTTABLE&((1<<((i<<1)+1))) )
|
||||
shiftkey(k);
|
||||
@@ -332,7 +332,7 @@ void des_enc(void* out, const void* in, const void* key){
|
||||
R ^= L;
|
||||
L ^= R;
|
||||
R ^= L;
|
||||
|
||||
|
||||
permute((uint8_t*)inv_ip_permtab, data.d.v8, (uint8_t*)out);
|
||||
}
|
||||
|
||||
@@ -343,11 +343,11 @@ void des_dec(void* out, const void* in, const uint8_t* key){
|
||||
uint8_t kr[6],k[7];
|
||||
int8_t i;
|
||||
data_t data;
|
||||
|
||||
|
||||
permute((uint8_t*)ip_permtab, (uint8_t*)in, data.d.v8);
|
||||
permute((uint8_t*)pc1_permtab, (const uint8_t*)key, k);
|
||||
for(i=7; i>=0; --i){
|
||||
|
||||
|
||||
permute((uint8_t*)pc2_permtab, k, kr);
|
||||
L ^= des_f(R, kr);
|
||||
shiftkey_inv(k);
|
||||
@@ -367,7 +367,7 @@ void des_dec(void* out, const void* in, const uint8_t* key){
|
||||
R ^= L;
|
||||
L ^= R;
|
||||
R ^= L;
|
||||
|
||||
|
||||
permute((uint8_t*)inv_ip_permtab, data.d.v8, (uint8_t*)out);
|
||||
}
|
||||
|
||||
@@ -389,51 +389,51 @@ void tdes_dec(void* out, void* in, const uint8_t* key){
|
||||
|
||||
void tdes_2key_enc(void* out, const void* in, size_t length, const void* key, unsigned char iv[8]){
|
||||
|
||||
if( length % 8 ) return;
|
||||
if( length % 8 ) return;
|
||||
|
||||
uint8_t i;
|
||||
uint8_t* tin = (uint8_t*) in;
|
||||
uint8_t* tout = (uint8_t*) out;
|
||||
|
||||
|
||||
while( length > 0 )
|
||||
{
|
||||
for( i = 0; i < 8; i++ )
|
||||
tout[i] = (unsigned char)( tin[i] ^ iv[i] );
|
||||
|
||||
|
||||
des_enc(tout, tin, (uint8_t*)key + 0);
|
||||
des_dec(tout, tout, (uint8_t*)key + 8);
|
||||
des_enc(tout, tout, (uint8_t*)key + 0);
|
||||
|
||||
|
||||
memcpy( iv, tout, 8 );
|
||||
|
||||
|
||||
tin += 8;
|
||||
tout += 8;
|
||||
length -= 8;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void tdes_2key_dec(void* out, const void* in, size_t length, const void* key, unsigned char iv[8]){
|
||||
|
||||
if( length % 8 ) return;
|
||||
|
||||
if( length % 8 ) return;
|
||||
|
||||
uint8_t i;
|
||||
unsigned char temp[8];
|
||||
uint8_t* tin = (uint8_t*) in;
|
||||
uint8_t* tout = (uint8_t*) out;
|
||||
|
||||
|
||||
while( length > 0 )
|
||||
{
|
||||
memcpy( temp, tin, 8 );
|
||||
|
||||
|
||||
des_dec(tout, tin, (uint8_t*)key + 0);
|
||||
des_enc(tout, tout, (uint8_t*)key + 8);
|
||||
des_dec(tout, tout, (uint8_t*)key + 0);
|
||||
des_dec(tout, tout, (uint8_t*)key + 0);
|
||||
|
||||
for( i = 0; i < 8; i++ )
|
||||
tout[i] = (unsigned char)( tout[i] ^ iv[i] );
|
||||
|
||||
memcpy( iv, temp, 8 );
|
||||
|
||||
|
||||
tin += 8;
|
||||
tout += 8;
|
||||
length -= 8;
|
||||
|
||||
+11
-11
@@ -18,11 +18,11 @@
|
||||
*/
|
||||
/**
|
||||
* \file des.h
|
||||
* \author Daniel Otte
|
||||
* \author Daniel Otte
|
||||
* \date 2007-06-16
|
||||
* \brief des and tdes declarations
|
||||
* \license GPLv3 or later
|
||||
*
|
||||
*
|
||||
*/
|
||||
#ifndef __DES_H_
|
||||
#define __DES_H_
|
||||
@@ -46,12 +46,12 @@
|
||||
|
||||
/** \fn void des_enc(void* out, const void* in, const void* key)
|
||||
* \brief encrypt a block with DES
|
||||
*
|
||||
*
|
||||
* This function encrypts a block of 64 bits (8 bytes) with the DES algorithm.
|
||||
* Key expansion is done automatically. The key is 64 bits long, but note that
|
||||
* only 56 bits are used (the LSB of each byte is dropped). The input and output
|
||||
* blocks may overlap.
|
||||
*
|
||||
*
|
||||
* \param out pointer to the block (64 bit = 8 byte) where the ciphertext is written to
|
||||
* \param in pointer to the block (64 bit = 8 byte) where the plaintext is read from
|
||||
* \param key pointer to the key (64 bit = 8 byte)
|
||||
@@ -60,12 +60,12 @@ void des_enc(void* out, const void* in, const void* key);
|
||||
|
||||
/** \fn void des_dec(void* out, const void* in, const void* key)
|
||||
* \brief decrypt a block with DES
|
||||
*
|
||||
*
|
||||
* This function decrypts a block of 64 bits (8 bytes) with the DES algorithm.
|
||||
* Key expansion is done automatically. The key is 64 bits long, but note that
|
||||
* only 56 bits are used (the LSB of each byte is dropped). The input and output
|
||||
* blocks may overlap.
|
||||
*
|
||||
*
|
||||
* \param out pointer to the block (64 bit = 8 byte) where the plaintext is written to
|
||||
* \param in pointer to the block (64 bit = 8 byte) where the ciphertext is read from
|
||||
* \param key pointer to the key (64 bit = 8 byte)
|
||||
@@ -75,12 +75,12 @@ void des_dec(void* out, const void* in, const uint8_t* key);
|
||||
|
||||
/** \fn void tdes_enc(void* out, const void* in, const void* key)
|
||||
* \brief encrypt a block with Tripple-DES
|
||||
*
|
||||
*
|
||||
* This function encrypts a block of 64 bits (8 bytes) with the Tripple-DES (EDE)
|
||||
* algorithm. Key expansion is done automatically. The key is 192 bits long, but
|
||||
* note that only 178 bits are used (the LSB of each byte is dropped). The input
|
||||
* and output blocks may overlap.
|
||||
*
|
||||
*
|
||||
* \param out pointer to the block (64 bit = 8 byte) where the ciphertext is written to
|
||||
* \param in pointer to the block (64 bit = 8 byte) where the plaintext is read from
|
||||
* \param key pointer to the key (192 bit = 24 byte)
|
||||
@@ -90,19 +90,19 @@ void tdes_enc(void* out, void* in, const void* key);
|
||||
|
||||
/** \fn void tdes_dec(void* out, const void* in, const void* key)
|
||||
* \brief decrypt a block with Tripple-DES
|
||||
*
|
||||
*
|
||||
* This function decrypts a block of 64 bits (8 bytes) with the Tripple-DES (EDE)
|
||||
* algorithm. Key expansion is done automatically. The key is 192 bits long, but
|
||||
* note that only 178 bits are used (the LSB of each byte is dropped). The input
|
||||
* and output blocks may overlap.
|
||||
*
|
||||
*
|
||||
* \param out pointer to the block (64 bit = 8 byte) where the plaintext is written to
|
||||
* \param in pointer to the block (64 bit = 8 byte) where the ciphertext is read from
|
||||
* \param key pointer to the key (192 bit = 24 byte)
|
||||
*/
|
||||
//void tdes_dec(void* out, const void* in, const void* key);
|
||||
void tdes_dec(void* out, void* in, const uint8_t* key);
|
||||
|
||||
|
||||
void tdes_2key_enc(void* out, const void* in, size_t length, const void* key, unsigned char iv[8]);
|
||||
void tdes_2key_dec(void* out, const void* in, size_t length, const void* key, unsigned char iv[8]);
|
||||
|
||||
|
||||
+12
-12
@@ -1,11 +1,11 @@
|
||||
/*-
|
||||
* Copyright (C) 2010, Romain Tartiere.
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
@@ -13,7 +13,7 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
@@ -447,10 +447,10 @@ void* mifare_cryto_postprocess_data (desfiretag_t tag, void *data, size_t *nbyte
|
||||
switch (DESFIRE (tag)->authentication_scheme) {
|
||||
case AS_LEGACY:
|
||||
AddCrc14A( (uint8_t*)res, end_crc_pos);
|
||||
end_crc_pos = crc_pos + 2;
|
||||
//
|
||||
|
||||
|
||||
end_crc_pos = crc_pos + 2;
|
||||
//
|
||||
|
||||
|
||||
crc = crc16;
|
||||
break;
|
||||
case AS_NEW:
|
||||
@@ -539,7 +539,7 @@ void mifare_cypher_single_block (desfirekey_t key, uint8_t *data, uint8_t *ivect
|
||||
break;
|
||||
case T_3DES:
|
||||
switch (operation) {
|
||||
case MCO_ENCYPHER:
|
||||
case MCO_ENCYPHER:
|
||||
// DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks1), DES_ENCRYPT);
|
||||
// DES_ecb_encrypt ((DES_cblock *) edata, (DES_cblock *) data, &(key->ks2), DES_DECRYPT);
|
||||
// DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks1), DES_ENCRYPT);
|
||||
@@ -562,7 +562,7 @@ void mifare_cypher_single_block (desfirekey_t key, uint8_t *data, uint8_t *ivect
|
||||
// DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks3), DES_ENCRYPT);
|
||||
break;
|
||||
case MCO_DECYPHER:
|
||||
tdes_dec(data, edata, key->data);
|
||||
tdes_dec(data, edata, key->data);
|
||||
// DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks3), DES_DECRYPT);
|
||||
// DES_ecb_encrypt ((DES_cblock *) edata, (DES_cblock *) data, &(key->ks2), DES_ENCRYPT);
|
||||
// DES_ecb_encrypt ((DES_cblock *) data, (DES_cblock *) edata, &(key->ks1), DES_DECRYPT);
|
||||
@@ -570,19 +570,19 @@ void mifare_cypher_single_block (desfirekey_t key, uint8_t *data, uint8_t *ivect
|
||||
}
|
||||
break;
|
||||
case T_AES:
|
||||
switch (operation)
|
||||
switch (operation)
|
||||
{
|
||||
case MCO_ENCYPHER:
|
||||
{
|
||||
AesCtx ctx;
|
||||
AesCtxIni(&ctx, ivect, key->data, KEY128,CBC);
|
||||
AesCtxIni(&ctx, ivect, key->data, KEY128,CBC);
|
||||
AesEncrypt(&ctx, data, edata, sizeof(edata) );
|
||||
break;
|
||||
}
|
||||
case MCO_DECYPHER:
|
||||
{
|
||||
AesCtx ctx;
|
||||
AesCtxIni(&ctx, ivect, key->data, KEY128,CBC);
|
||||
AesCtxIni(&ctx, ivect, key->data, KEY128,CBC);
|
||||
AesDecrypt(&ctx, edata, data, sizeof(edata));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/*-
|
||||
* Copyright (C) 2010, Romain Tartiere.
|
||||
*
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published by the
|
||||
* Free Software Foundation, either version 3 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
@@ -13,7 +13,7 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
|
||||
+1
-1
@@ -289,7 +289,7 @@ void EPA_PACE_Collect_Nonce(UsbCommand *c)
|
||||
|
||||
// set up communication
|
||||
func_return = EPA_Setup();
|
||||
if (func_return != 0) {
|
||||
if (func_return != 0) {
|
||||
EPA_PACE_Collect_Nonce_Abort(1, func_return);
|
||||
return;
|
||||
}
|
||||
|
||||
+113
-113
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user