mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-02-21 06:35:04 +08:00
Update cmdlfkeri.c
This commit is contained in:
parent
c6ceeed6d5
commit
f32efd10fe
1 changed files with 39 additions and 50 deletions
|
@ -58,50 +58,42 @@ typedef enum {Scramble = 0,Descramble = 1} KeriMSScramble_t;
|
||||||
|
|
||||||
static int CmdKeriMSScramble (KeriMSScramble_t Action, uint32_t *FC, uint32_t *ID, uint32_t *CardID)
|
static int CmdKeriMSScramble (KeriMSScramble_t Action, uint32_t *FC, uint32_t *ID, uint32_t *CardID)
|
||||||
{
|
{
|
||||||
uint8_t CardToID [] = { 0xff,0xff,0xff,0xff,0x0d,0x0c,0x11,0x05,0xff,0x06,0xff,0x12,0x08,0xff,0x00,0x07,
|
// 255 = Not used/Unknown other values are the bit offset in the ID/FC values
|
||||||
0x0a,0xff,0xff,0x0b,0x04,0x01,0xff,0x13,0xff,0x14,0x02,0xff,0x03,0x09,0xff,0xff };
|
uint8_t CardToID [] = { 255,255,255,255, 13, 12, 17, 5,255, 6,255, 18, 8,255, 0, 7,
|
||||||
uint8_t CardToFC [] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
10,255,255, 11, 4, 1,255, 19,255, 20, 2,255, 3, 9,255,255 };
|
||||||
0xff,0xff,0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0xff };
|
uint8_t CardToFC [] = { 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
|
||||||
|
255,255, 2,255,255,255,255,255,255,255,255,255,255,255, 1,255 };
|
||||||
uint8_t IDToCard [] = { 0x0e,0x15,0x1a,0x1c,0x14,0x07,0x09,0x0f,0x0c,0x1d,0x10,0x13,0x05,0x04,0xff,0xff,
|
|
||||||
0xff,0x06,0x0b,0x17,0x19,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
|
|
||||||
uint8_t FCToCard [] = { 0xff,0x1e,0x12,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
|
|
||||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
|
|
||||||
|
|
||||||
uint8_t CardIdx; // 0 - 31
|
uint8_t CardIdx; // 0 - 31
|
||||||
bool BitState;
|
bool BitState;
|
||||||
int idx;
|
|
||||||
|
// Used to track known bit states - remove when all bit maps are known
|
||||||
|
char IDDecodeState[33] = {0x00};
|
||||||
|
char FCDecodeState[33] = {0x00};
|
||||||
|
memset (IDDecodeState,'-',32);
|
||||||
|
memset (FCDecodeState,'-',32);
|
||||||
|
|
||||||
if (Action == Descramble) {
|
if (Action == Descramble) {
|
||||||
char IDDecodeState[33] = {0x00};
|
|
||||||
char FCDecodeState[33] = {0x00};
|
|
||||||
|
|
||||||
memset (IDDecodeState,'-',32);
|
|
||||||
memset (FCDecodeState,'-',32);
|
|
||||||
|
|
||||||
*FC = 0;
|
*FC = 0;
|
||||||
*ID = 0;
|
*ID = 0;
|
||||||
|
|
||||||
for (CardIdx = 0; CardIdx < 32; CardIdx++) {
|
for (CardIdx = 0; CardIdx < 32; CardIdx++) {
|
||||||
// Get Bit State
|
// Get Bit State
|
||||||
BitState = (*CardID >> CardIdx) & 1;
|
BitState = (*CardID >> CardIdx) & 1;
|
||||||
//if (BitState) { // its a 1
|
// Card ID
|
||||||
idx = CardToID[CardIdx];
|
if (CardToID[CardIdx] < 32) {
|
||||||
if ((idx >= 0) && (idx <= 32)) {
|
*ID = *ID | (BitState << CardToID[CardIdx]);
|
||||||
if (BitState)
|
// Remove when all bits are known
|
||||||
*ID = *ID | (1 << idx);
|
IDDecodeState[31-CardToID[CardIdx]] = '0'+BitState;
|
||||||
IDDecodeState[31-idx] = '0'+BitState;
|
|
||||||
}
|
}
|
||||||
|
// Card FC
|
||||||
idx = CardToFC[CardIdx];
|
if (CardToFC[CardIdx] < 32) {
|
||||||
if ((idx >= 0) && (idx <= 32)) {
|
*FC = *FC | (BitState << CardToFC[CardIdx]);
|
||||||
if (BitState)
|
// Remove when all bits are known
|
||||||
*FC = *FC | (1 << idx);
|
FCDecodeState[31-CardToFC[CardIdx]] = '0'+BitState;
|
||||||
FCDecodeState[31-idx] = '0'+BitState;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Patch for bit order group unknown
|
// Patch for bit order group unknown - remove when all Keri MS Bits maps are known
|
||||||
// Reverse order for easy mapping for unknowns
|
// Reverse order for easy mapping for unknowns
|
||||||
// I know that these bit groups are a in the correct location, unknown order.
|
// I know that these bit groups are a in the correct location, unknown order.
|
||||||
if (IDDecodeState[31-17] == '1') IDDecodeState[31-17] = '?';
|
if (IDDecodeState[31-17] == '1') IDDecodeState[31-17] = '?';
|
||||||
|
@ -115,38 +107,34 @@ static int CmdKeriMSScramble (KeriMSScramble_t Action, uint32_t *FC, uint32_t *I
|
||||||
PrintAndLogEx(SUCCESS, "BitState ID : %s",IDDecodeState);
|
PrintAndLogEx(SUCCESS, "BitState ID : %s",IDDecodeState);
|
||||||
PrintAndLogEx(SUCCESS, "BitState FC : %s",FCDecodeState);
|
PrintAndLogEx(SUCCESS, "BitState FC : %s",FCDecodeState);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Action == Scramble)
|
if (Action == Scramble)
|
||||||
{
|
{
|
||||||
// PrintAndLogEx(SUCCESS, "Scramble FC : %d - ID %d",*FC,*ID);
|
|
||||||
*CardID = 0; // set to 0
|
*CardID = 0; // set to 0
|
||||||
|
|
||||||
for (CardIdx = 0; CardIdx < 32; CardIdx++)
|
for (CardIdx = 0; CardIdx < 32; CardIdx++)
|
||||||
{
|
{
|
||||||
// Card ID
|
// Card ID
|
||||||
BitState = (*ID >> CardIdx) & 1;
|
if (CardToID[CardIdx] < 32) {
|
||||||
if (BitState) {
|
if ((*ID & (1 << CardToID[CardIdx])) > 0)
|
||||||
idx = IDToCard[CardIdx];
|
*CardID |= (1 << CardIdx);
|
||||||
if ((idx >= 0) && (idx <= 32)) {
|
}
|
||||||
*CardID |= (1 << idx);
|
// Card FC
|
||||||
}
|
if (CardToFC[CardIdx] < 32) {
|
||||||
}
|
if ((*ID & (1 << CardToFC[CardIdx])) > 0)
|
||||||
// FC
|
*CardID |= (1 << CardIdx);
|
||||||
BitState = (*FC >> CardIdx) & 1;
|
}
|
||||||
if (BitState) {
|
|
||||||
idx = FCToCard[CardIdx];
|
|
||||||
if ((idx >= 0) && (idx <= 32)) {
|
|
||||||
*CardID |= (1 << idx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Fixed bits
|
|
||||||
|
// Fixed bits and parity/check bits
|
||||||
/*
|
/*
|
||||||
Add Parity and Fixed bits
|
Add Parity and Fixed bits
|
||||||
Bit 3 - Note Used/Fixed 1
|
Bit 3 - Note Used/Fixed 1 - TBC
|
||||||
Bit 31 - 1 Fixed
|
Bit 31 - 1 Fixed Not in check/parity
|
||||||
Bit 0,1 - 2 Bit Parity
|
Bit 0,1 - 2 Bit Parity
|
||||||
*/
|
*/
|
||||||
*CardID |= (1 << 3);
|
*CardID |= (1 << 3);
|
||||||
|
|
||||||
// Check/Parity Bits
|
// Check/Parity Bits
|
||||||
int Parity = 1;
|
int Parity = 1;
|
||||||
for (CardIdx = 4; CardIdx <= 31; CardIdx += 2) {
|
for (CardIdx = 4; CardIdx <= 31; CardIdx += 2) {
|
||||||
|
@ -156,7 +144,7 @@ static int CmdKeriMSScramble (KeriMSScramble_t Action, uint32_t *FC, uint32_t *I
|
||||||
|
|
||||||
// Bit 31 was fixed but not in check/parity bits
|
// Bit 31 was fixed but not in check/parity bits
|
||||||
*CardID |= (1 << 31);
|
*CardID |= (1 << 31);
|
||||||
|
|
||||||
PrintAndLogEx(SUCCESS, "Scrambled FC : %d - Card ID : %d to RAW : E0000000%08X",*FC,*ID,*CardID);
|
PrintAndLogEx(SUCCESS, "Scrambled FC : %d - Card ID : %d to RAW : E0000000%08X",*FC,*ID,*CardID);
|
||||||
}
|
}
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
|
@ -224,6 +212,7 @@ static int CmdKeriDemod(const char *Cmd) {
|
||||||
|
|
||||||
uint32_t testCard = 0;
|
uint32_t testCard = 0;
|
||||||
CmdKeriMSScramble (Scramble,&fc,&cardid,&testCard);
|
CmdKeriMSScramble (Scramble,&fc,&cardid,&testCard);
|
||||||
|
|
||||||
// End Descramble test
|
// End Descramble test
|
||||||
|
|
||||||
if (invert) {
|
if (invert) {
|
||||||
|
|
Loading…
Reference in a new issue