mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-07-13 00:33:01 -07:00
Added the changes to armsrc for milfare ultralight C and Desfire commands
This commit is contained in:
parent
a88dc6ab3b
commit
16a372ab75
7 changed files with 2067 additions and 1695 deletions
|
@ -801,7 +801,16 @@ void UsbPacketReceived(uint8_t *packet, int len)
|
||||||
MifareUReadBlock(c->arg[0],c->d.asBytes);
|
MifareUReadBlock(c->arg[0],c->d.asBytes);
|
||||||
break;
|
break;
|
||||||
case CMD_MIFAREU_READCARD:
|
case CMD_MIFAREU_READCARD:
|
||||||
MifareUReadCard(c->arg[0],c->d.asBytes);
|
MifareUReadCard(c->arg[0],c->arg[1],c->d.asBytes);
|
||||||
|
break;
|
||||||
|
case CMD_MIFAREUC_READCARD:
|
||||||
|
MifareUReadCard(c->arg[0],c->arg[1],c->d.asBytes);
|
||||||
|
break;
|
||||||
|
case CMD_MIFAREUC_AUTH1:
|
||||||
|
MifareUC_Auth1(c->arg[0],c->d.asBytes);
|
||||||
|
break;
|
||||||
|
case CMD_MIFAREUC_AUTH2:
|
||||||
|
MifareUC_Auth2(c->arg[0],c->d.asBytes);
|
||||||
break;
|
break;
|
||||||
case CMD_MIFARE_READSC:
|
case CMD_MIFARE_READSC:
|
||||||
MifareReadSector(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
MifareReadSector(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
||||||
|
@ -824,7 +833,12 @@ void UsbPacketReceived(uint8_t *packet, int len)
|
||||||
case CMD_SIMULATE_MIFARE_CARD:
|
case CMD_SIMULATE_MIFARE_CARD:
|
||||||
Mifare1ksim(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
Mifare1ksim(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
||||||
break;
|
break;
|
||||||
|
case CMD_MIFARE_DES_AUTH1:
|
||||||
|
Mifare_DES_Auth1(c->arg[0],c->d.asBytes);
|
||||||
|
break;
|
||||||
|
case CMD_MIFARE_DES_AUTH2:
|
||||||
|
Mifare_DES_Auth2(c->arg[0],c->d.asBytes);
|
||||||
|
break;
|
||||||
// emulator
|
// emulator
|
||||||
case CMD_MIFARE_SET_DBGMODE:
|
case CMD_MIFARE_SET_DBGMODE:
|
||||||
MifareSetDbgLvl(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
MifareSetDbgLvl(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
|
||||||
|
|
|
@ -171,12 +171,8 @@ void EPA_PACE_Collect_Nonce(UsbCommand * c);
|
||||||
void ReaderMifare(bool first_try);
|
void ReaderMifare(bool first_try);
|
||||||
int32_t dist_nt(uint32_t nt1, uint32_t nt2);
|
int32_t dist_nt(uint32_t nt1, uint32_t nt2);
|
||||||
void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *data);
|
void MifareReadBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *data);
|
||||||
void MifareUReadBlock(uint8_t arg0,uint8_t *datain);
|
|
||||||
void MifareUReadCard(uint8_t arg0,uint8_t *datain);
|
|
||||||
void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
void MifareReadSector(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
||||||
void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
void MifareWriteBlock(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
||||||
void MifareUWriteBlock(uint8_t arg0,uint8_t *datain);
|
|
||||||
void MifareUWriteBlock_Special(uint8_t arg0,uint8_t *datain);
|
|
||||||
void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain);
|
void MifareNested(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain);
|
||||||
void MifareChkKeys(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
void MifareChkKeys(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
||||||
void Mifare1ksim(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
void Mifare1ksim(uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t *datain);
|
||||||
|
@ -187,6 +183,17 @@ void MifareEMemGet(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain)
|
||||||
void MifareECardLoad(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain);
|
void MifareECardLoad(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain);
|
||||||
void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain); // Work with "magic Chinese" card
|
void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain); // Work with "magic Chinese" card
|
||||||
void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain);
|
void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain);
|
||||||
|
//ultralight
|
||||||
|
void MifareUReadBlock(uint8_t arg0,uint8_t *datain);
|
||||||
|
void MifareUC_Auth1(uint8_t arg0, uint8_t *datain);
|
||||||
|
void MifareUC_Auth2(uint32_t arg0, uint8_t *datain);
|
||||||
|
void MifareUReadCard(uint8_t arg0,int Pages,uint8_t *datain);
|
||||||
|
void MifareUCReadCard(uint8_t arg0,int Pages,uint8_t *datain);
|
||||||
|
void MifareUWriteBlock(uint8_t arg0,uint8_t *datain);
|
||||||
|
void MifareUWriteBlock_Special(uint8_t arg0,uint8_t *datain);
|
||||||
|
//desfire
|
||||||
|
void Mifare_DES_Auth1(uint8_t arg0,uint8_t *datain);
|
||||||
|
void Mifare_DES_Auth2(uint32_t arg0, uint8_t *datain);
|
||||||
|
|
||||||
/// iso15693.h
|
/// iso15693.h
|
||||||
void RecordRawAdcSamplesIso15693(void);
|
void RecordRawAdcSamplesIso15693(void);
|
||||||
|
|
2543
armsrc/mifarecmd.c
2543
armsrc/mifarecmd.c
File diff suppressed because it is too large
Load diff
|
@ -1,28 +1,28 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Merlok - June 2011
|
// Merlok - June 2011
|
||||||
// Gerhard de Koning Gans - May 2008
|
// Gerhard de Koning Gans - May 2008
|
||||||
// Hagen Fritsch - June 2010
|
// Hagen Fritsch - June 2010
|
||||||
//
|
//
|
||||||
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
|
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
|
||||||
// at your option, any later version. See the LICENSE.txt file for the text of
|
// at your option, any later version. See the LICENSE.txt file for the text of
|
||||||
// the license.
|
// the license.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Routines to support ISO 14443 type A.
|
// Routines to support ISO 14443 type A.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
#ifndef __MIFARECMD_H
|
#ifndef __MIFARECMD_H
|
||||||
#define __MIFARECMD_H
|
#define __MIFARECMD_H
|
||||||
|
|
||||||
#include "proxmark3.h"
|
#include "proxmark3.h"
|
||||||
#include "apps.h"
|
#include "apps.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
#include "iso14443crc.h"
|
#include "iso14443crc.h"
|
||||||
#include "iso14443a.h"
|
#include "iso14443a.h"
|
||||||
#include "crapto1.h"
|
#include "crapto1.h"
|
||||||
#include "mifareutil.h"
|
#include "mifareutil.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
File diff suppressed because it is too large
Load diff
|
@ -1,68 +1,71 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Merlok, May 2011
|
// Merlok, May 2011
|
||||||
// Many authors, that makes it possible
|
// Many authors, that makes it possible
|
||||||
//
|
//
|
||||||
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
|
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
|
||||||
// at your option, any later version. See the LICENSE.txt file for the text of
|
// at your option, any later version. See the LICENSE.txt file for the text of
|
||||||
// the license.
|
// the license.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// code for work with mifare cards.
|
// code for work with mifare cards.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
#ifndef __MIFAREUTIL_H
|
#ifndef __MIFAREUTIL_H
|
||||||
#define __MIFAREUTIL_H
|
#define __MIFAREUTIL_H
|
||||||
|
|
||||||
// mifare authentication
|
// mifare authentication
|
||||||
#define CRYPT_NONE 0
|
#define CRYPT_NONE 0
|
||||||
#define CRYPT_ALL 1
|
#define CRYPT_ALL 1
|
||||||
#define CRYPT_REQUEST 2
|
#define CRYPT_REQUEST 2
|
||||||
#define AUTH_FIRST 0
|
#define AUTH_FIRST 0
|
||||||
#define AUTH_NESTED 2
|
#define AUTH_NESTED 2
|
||||||
|
|
||||||
// mifare 4bit card answers
|
// mifare 4bit card answers
|
||||||
#define CARD_ACK 0x0A // 1010 - ACK
|
#define CARD_ACK 0x0A // 1010 - ACK
|
||||||
#define CARD_NACK_NA 0x04 // 0100 - NACK, not allowed (command not allowed)
|
#define CARD_NACK_NA 0x04 // 0100 - NACK, not allowed (command not allowed)
|
||||||
#define CARD_NACK_TR 0x05 // 0101 - NACK, transmission error
|
#define CARD_NACK_TR 0x05 // 0101 - NACK, transmission error
|
||||||
|
|
||||||
// reader voltage field detector
|
// reader voltage field detector
|
||||||
#define MF_MINFIELDV 4000
|
#define MF_MINFIELDV 4000
|
||||||
|
|
||||||
// debug
|
// debug
|
||||||
// 0 - no debug messages 1 - error messages 2 - all messages 4 - extended debug mode
|
// 0 - no debug messages 1 - error messages 2 - all messages 4 - extended debug mode
|
||||||
#define MF_DBG_NONE 0
|
#define MF_DBG_NONE 0
|
||||||
#define MF_DBG_ERROR 1
|
#define MF_DBG_ERROR 1
|
||||||
#define MF_DBG_ALL 2
|
#define MF_DBG_ALL 2
|
||||||
#define MF_DBG_EXTENDED 4
|
#define MF_DBG_EXTENDED 4
|
||||||
|
|
||||||
extern int MF_DBGLEVEL;
|
extern int MF_DBGLEVEL;
|
||||||
|
|
||||||
//mifare emulator states
|
//mifare emulator states
|
||||||
#define MFEMUL_NOFIELD 0
|
#define MFEMUL_NOFIELD 0
|
||||||
#define MFEMUL_IDLE 1
|
#define MFEMUL_IDLE 1
|
||||||
#define MFEMUL_SELECT1 2
|
#define MFEMUL_SELECT1 2
|
||||||
#define MFEMUL_SELECT2 3
|
#define MFEMUL_SELECT2 3
|
||||||
#define MFEMUL_AUTH1 4
|
#define MFEMUL_AUTH1 4
|
||||||
#define MFEMUL_AUTH2 5
|
#define MFEMUL_AUTH2 5
|
||||||
#define MFEMUL_WORK 6
|
#define MFEMUL_WORK 6
|
||||||
#define MFEMUL_WRITEBL2 7
|
#define MFEMUL_WRITEBL2 7
|
||||||
#define MFEMUL_INTREG_INC 8
|
#define MFEMUL_INTREG_INC 8
|
||||||
#define MFEMUL_INTREG_DEC 9
|
#define MFEMUL_INTREG_DEC 9
|
||||||
#define MFEMUL_INTREG_REST 10
|
#define MFEMUL_INTREG_REST 10
|
||||||
#define MFEMUL_HALTED 11
|
#define MFEMUL_HALTED 11
|
||||||
|
|
||||||
#define cardSTATE_TO_IDLE() cardSTATE = MFEMUL_IDLE; LED_B_OFF(); LED_C_OFF();
|
#define cardSTATE_TO_IDLE() cardSTATE = MFEMUL_IDLE; LED_B_OFF(); LED_C_OFF();
|
||||||
|
|
||||||
//functions
|
//functions
|
||||||
uint8_t* mifare_get_bigbufptr(void);
|
uint8_t* mifare_get_bigbufptr(void);
|
||||||
int mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint32_t *timing);
|
int mifare_sendcmd_short(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint32_t *timing);
|
||||||
int mifare_sendcmd_short_special(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t* amswer, uint8_t *timing);
|
int mifare_sendcmd_short_special(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t* amswer, uint8_t *timing);
|
||||||
|
int mifare_sendcmd_short_mfucauth(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t* amswer, uint32_t *timing);
|
||||||
int mifare_sendcmd_shortex(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint32_t * parptr, uint32_t *timing);
|
int mifare_sendcmd_shortex(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t data, uint8_t* answer, uint32_t * parptr, uint32_t *timing);
|
||||||
|
|
||||||
int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, \
|
int mifare_classic_auth(struct Crypto1State *pcs, uint32_t uid, \
|
||||||
uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint64_t isNested);
|
uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint64_t isNested);
|
||||||
int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, \
|
int mifare_classic_authex(struct Crypto1State *pcs, uint32_t uid, \
|
||||||
uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint64_t isNested, uint32_t * ntptr, uint32_t *timing);
|
uint8_t blockNo, uint8_t keyType, uint64_t ui64Key, uint64_t isNested, uint32_t * ntptr, uint32_t *timing);
|
||||||
int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
int mifare_classic_readblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
||||||
|
int mifare_ultra_auth1(uint32_t cuid, uint8_t *blockData);
|
||||||
|
int mifare_ultra_auth2(uint32_t cuid, uint8_t *key, uint8_t *blockData);
|
||||||
int mifare_ultra_readblock(uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
int mifare_ultra_readblock(uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
||||||
int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
int mifare_classic_writeblock(struct Crypto1State *pcs, uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
||||||
int mifare_ultra_writeblock(uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
int mifare_ultra_writeblock(uint32_t uid, uint8_t blockNo, uint8_t *blockData);
|
||||||
|
@ -70,23 +73,27 @@ int mifare_ultra_special_writeblock(uint32_t uid, uint8_t blockNo, uint8_t *bloc
|
||||||
int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid);
|
int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid);
|
||||||
int mifare_ultra_halt(uint32_t uid);
|
int mifare_ultra_halt(uint32_t uid);
|
||||||
|
|
||||||
|
//desfire
|
||||||
|
int mifare_desfire_des_auth1(uint32_t uid, uint8_t *blockData);
|
||||||
|
int mifare_desfire_des_auth2(uint32_t uid, uint8_t *key, uint8_t *blockData);
|
||||||
|
|
||||||
// crypto functions
|
// crypto functions
|
||||||
void mf_crypto1_decrypt(struct Crypto1State *pcs, uint8_t *receivedCmd, int len);
|
void mf_crypto1_decrypt(struct Crypto1State *pcs, uint8_t *receivedCmd, int len);
|
||||||
void mf_crypto1_encrypt(struct Crypto1State *pcs, uint8_t *data, int len, uint32_t *par);
|
void mf_crypto1_encrypt(struct Crypto1State *pcs, uint8_t *data, int len, uint32_t *par);
|
||||||
uint8_t mf_crypto1_encrypt4bit(struct Crypto1State *pcs, uint8_t data);
|
uint8_t mf_crypto1_encrypt4bit(struct Crypto1State *pcs, uint8_t data);
|
||||||
|
|
||||||
// memory management
|
// memory management
|
||||||
uint8_t* mifare_get_bigbufptr(void);
|
uint8_t* mifare_get_bigbufptr(void);
|
||||||
uint8_t* eml_get_bigbufptr_sendbuf(void);
|
uint8_t* eml_get_bigbufptr_sendbuf(void);
|
||||||
uint8_t* eml_get_bigbufptr_recbuf(void);
|
uint8_t* eml_get_bigbufptr_recbuf(void);
|
||||||
|
|
||||||
// emulator functions
|
// emulator functions
|
||||||
void emlClearMem(void);
|
void emlClearMem(void);
|
||||||
void emlSetMem(uint8_t *data, int blockNum, int blocksCount);
|
void emlSetMem(uint8_t *data, int blockNum, int blocksCount);
|
||||||
void emlGetMem(uint8_t *data, int blockNum, int blocksCount);
|
void emlGetMem(uint8_t *data, int blockNum, int blocksCount);
|
||||||
void emlGetMemBt(uint8_t *data, int bytePtr, int byteCount);
|
void emlGetMemBt(uint8_t *data, int bytePtr, int byteCount);
|
||||||
uint64_t emlGetKey(int sectorNum, int keyType);
|
uint64_t emlGetKey(int sectorNum, int keyType);
|
||||||
int emlGetValBl(uint32_t *blReg, uint8_t *blBlock, int blockNum);
|
int emlGetValBl(uint32_t *blReg, uint8_t *blBlock, int blockNum);
|
||||||
int emlSetValBl(uint32_t blReg, uint8_t blBlock, int blockNum);
|
int emlSetValBl(uint32_t blReg, uint8_t blBlock, int blockNum);
|
||||||
int emlCheckValBl(int blockNum);
|
int emlCheckValBl(int blockNum);
|
||||||
|
|
||||||
|
|
|
@ -153,9 +153,16 @@ typedef struct {
|
||||||
#define CMD_MIFAREU_WRITEBL_COMPAT 0x0722
|
#define CMD_MIFAREU_WRITEBL_COMPAT 0x0722
|
||||||
#define CMD_MIFAREU_WRITEBL 0x0723
|
#define CMD_MIFAREU_WRITEBL 0x0723
|
||||||
#define CMD_MIFARE_CHKKEYS 0x0623
|
#define CMD_MIFARE_CHKKEYS 0x0623
|
||||||
|
|
||||||
#define CMD_MIFARE_SNIFFER 0x0630
|
#define CMD_MIFARE_SNIFFER 0x0630
|
||||||
|
|
||||||
|
//ultralightC
|
||||||
|
#define CMD_MIFAREUC_AUTH1 0x0724
|
||||||
|
#define CMD_MIFAREUC_AUTH2 0x0725
|
||||||
|
#define CMD_MIFAREUC_READCARD 0x0726
|
||||||
|
//desfire
|
||||||
|
#define CMD_MIFARE_DES_AUTH1 0x0730
|
||||||
|
#define CMD_MIFARE_DES_AUTH2 0x0731
|
||||||
|
|
||||||
#define CMD_UNKNOWN 0xFFFF
|
#define CMD_UNKNOWN 0xFFFF
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue