Skip to content

Commit

Permalink
Merge pull request #105 from McEloff/full_byte_anticol
Browse files Browse the repository at this point in the history
Full-byte anticollision frame support (ARC122U 7-bytes UID Mifare Classic)
  • Loading branch information
iceman1001 committed Jul 28, 2019
2 parents badb625 + b79418a commit a6653dc
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 24 deletions.
19 changes: 17 additions & 2 deletions Firmware/Chameleon-Mini/Application/ISO14443-3A.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,23 @@ bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t S
return false;
}
default:
/* TODO: No anticollision supported */
*BitCount = 0;
uint8_t CollisionBitCount = NVB & 0x0f;
if (CollisionBitCount == 0) {
/* Full-byte anticollision frame supports */
uint8_t CollisionByteCount = ((NVB >> 4) & 0x0f) - 2;
/* Check for our UID is selecting */
if (memcmp(UidCL, &DataPtr[2], CollisionByteCount) != 0) {
*BitCount = 0;
return false;
}
memcpy(DataPtr, &UidCL[CollisionByteCount], 4 - CollisionByteCount);
/* Calc original BCC */
DataPtr[4 - CollisionByteCount] = ISO14443A_CALC_BCC(UidCL);
*BitCount = (5 - CollisionByteCount) * BITS_PER_BYTE;
} else {
/* Partial-byte anticollision frame not supported */
*BitCount = 0;
}
return false;
}
}
Expand Down
36 changes: 14 additions & 22 deletions Firmware/Chameleon-Mini/Application/ISO14443-3A.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,33 +93,25 @@ bool ISO14443ASelect(void* Buffer, uint16_t* BitCount, uint8_t* UidCL, uint8_t S
}
default:
{
uint8_t CollisionByteCount = ((NVB >> 4) & 0x0f) - 2;
uint8_t CollisionBitCount = (NVB >> 0) & 0x0f;
uint8_t mask = 0xFF >> (8 - CollisionBitCount);
// Since the UidCL does not contain the BCC, we have to distinguish here
if (
((CollisionByteCount == 5 || (CollisionByteCount == 4 && CollisionBitCount > 0)) && memcmp(UidCL, &DataPtr[2], 4) == 0 && (ISO14443A_CALC_BCC(UidCL) & mask) == (DataPtr[6] & mask))
||
(CollisionByteCount == 4 && CollisionBitCount == 0 && memcmp(UidCL, &DataPtr[2], 4) == 0)
||
(CollisionByteCount < 4 && memcmp(UidCL, &DataPtr[2], CollisionByteCount) == 0 && (UidCL[CollisionByteCount] & mask) == (DataPtr[CollisionByteCount + 2] & mask))
)
{
DataPtr[0] = UidCL[0];
DataPtr[1] = UidCL[1];
DataPtr[2] = UidCL[2];
DataPtr[3] = UidCL[3];
DataPtr[4] = ISO14443A_CALC_BCC(DataPtr);

*BitCount = ISO14443A_CL_FRAME_SIZE;
uint8_t CollisionBitCount = NVB & 0x0f;
if (CollisionBitCount == 0) {
/* Full-byte anticollision frame supports */
uint8_t CollisionByteCount = ((NVB >> 4) & 0x0f) - 2;
/* Check for our UID is selecting */
if (memcmp(UidCL, &DataPtr[2], CollisionByteCount) != 0) {
*BitCount = 0;
return false;
}
memcpy(DataPtr, &UidCL[CollisionByteCount], 4 - CollisionByteCount);
/* Calc original BCC */
DataPtr[4 - CollisionByteCount] = ISO14443A_CALC_BCC(UidCL);
*BitCount = (5 - CollisionByteCount) * BITS_PER_BYTE;
} else {
/* Partial-byte anticollision frame not supported */
*BitCount = 0;
}
return false;
}
/* TODO: No anticollision supported */
*BitCount = 0;
return false;
}
}

Expand Down

0 comments on commit a6653dc

Please sign in to comment.