mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
chg: refactoring of hitag (@piwi)
chg: refactoring of hitagS (@iceman)
This commit is contained in:
parent
c01497b8af
commit
a117f06380
9 changed files with 530 additions and 599 deletions
|
@ -222,18 +222,6 @@ void iClass_Dump(uint8_t blockno, uint8_t numblks);
|
||||||
void iClass_Clone(uint8_t startblock, uint8_t endblock, uint8_t *data);
|
void iClass_Clone(uint8_t startblock, uint8_t endblock, uint8_t *data);
|
||||||
void iClass_ReadCheck(uint8_t blockNo, uint8_t keyType);
|
void iClass_ReadCheck(uint8_t blockNo, uint8_t keyType);
|
||||||
|
|
||||||
// hitag2.h
|
|
||||||
void SniffHitag(uint32_t type);
|
|
||||||
void SimulateHitagTag(bool tag_mem_supplied, byte_t *data);
|
|
||||||
void ReaderHitag(hitag_function htf, hitag_data *htd);
|
|
||||||
void WriterHitag(hitag_function htf, hitag_data *htd, int page);
|
|
||||||
|
|
||||||
//hitagS.h
|
|
||||||
void SimulateHitagSTag(bool tag_mem_supplied, byte_t *data);
|
|
||||||
void ReadHitagS(hitag_function htf, hitag_data *htd);
|
|
||||||
void WritePageHitagS(hitag_function htf, hitag_data *htd, int page);
|
|
||||||
void check_challenges(bool file_given, byte_t *data);
|
|
||||||
|
|
||||||
// cmd.h
|
// cmd.h
|
||||||
uint8_t cmd_receive(UsbCommand *cmd);
|
uint8_t cmd_receive(UsbCommand *cmd);
|
||||||
uint8_t cmd_send(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len);
|
uint8_t cmd_send(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len);
|
||||||
|
|
|
@ -18,7 +18,9 @@
|
||||||
// Piwi, 2019
|
// Piwi, 2019
|
||||||
// Iceman, 2019
|
// Iceman, 2019
|
||||||
|
|
||||||
|
#include "hitag2.h"
|
||||||
#include "hitag2_crypto.h"
|
#include "hitag2_crypto.h"
|
||||||
|
#include "hitag.h"
|
||||||
#include "proxmark3.h"
|
#include "proxmark3.h"
|
||||||
#include "apps.h"
|
#include "apps.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
@ -1384,8 +1386,7 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) {
|
||||||
|
|
||||||
StopTicks();
|
StopTicks();
|
||||||
|
|
||||||
int frame_count;
|
int frame_count = 0, response = 0;
|
||||||
int response;
|
|
||||||
uint8_t rx[HITAG_FRAME_LEN];
|
uint8_t rx[HITAG_FRAME_LEN];
|
||||||
size_t rxlen = 0;
|
size_t rxlen = 0;
|
||||||
uint8_t txbuf[HITAG_FRAME_LEN];
|
uint8_t txbuf[HITAG_FRAME_LEN];
|
||||||
|
@ -1440,8 +1441,6 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) {
|
||||||
|
|
||||||
// Set fpga in edge detect with reader field, we can modulate as reader now
|
// Set fpga in edge detect with reader field, we can modulate as reader now
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT | FPGA_LF_EDGE_DETECT_READER_FIELD);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT | FPGA_LF_EDGE_DETECT_READER_FIELD);
|
||||||
|
|
||||||
// Set Frequency divisor which will drive the FPGA and analog mux selection
|
|
||||||
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz
|
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz
|
||||||
SetAdcMuxFor(GPIO_MUXSEL_LOPKD);
|
SetAdcMuxFor(GPIO_MUXSEL_LOPKD);
|
||||||
|
|
||||||
|
@ -1464,17 +1463,18 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) {
|
||||||
|
|
||||||
// TC1: Capture mode, defaul timer source = MCK/2 (TIMER_CLOCK1), TIOA is external trigger,
|
// TC1: Capture mode, defaul timer source = MCK/2 (TIMER_CLOCK1), TIOA is external trigger,
|
||||||
// external trigger rising edge, load RA on falling edge of TIOA.
|
// external trigger rising edge, load RA on falling edge of TIOA.
|
||||||
AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK | AT91C_TC_ETRGEDG_FALLING | AT91C_TC_ABETRG | AT91C_TC_LDRA_FALLING;
|
AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK
|
||||||
|
| AT91C_TC_ETRGEDG_FALLING
|
||||||
|
| AT91C_TC_ABETRG
|
||||||
|
| AT91C_TC_LDRA_FALLING;
|
||||||
|
|
||||||
// Enable and reset counters
|
// Enable and reset counters
|
||||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
|
||||||
|
|
||||||
while (AT91C_BASE_TC0->TC_CV > 0);
|
while (AT91C_BASE_TC0->TC_CV > 0) {};
|
||||||
|
|
||||||
// Reset the received frame, frame count and timing info
|
// Reset the received frame, frame count and timing info
|
||||||
frame_count = 0;
|
|
||||||
response = 0;
|
|
||||||
lastbit = 1;
|
lastbit = 1;
|
||||||
bStop = false;
|
bStop = false;
|
||||||
|
|
||||||
|
@ -1483,23 +1483,24 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) {
|
||||||
// hitagS settings
|
// hitagS settings
|
||||||
reset_sof = 1;
|
reset_sof = 1;
|
||||||
t_wait = 200;
|
t_wait = 200;
|
||||||
// DbpString("Configured for hitagS reader");
|
DbpString("Configured for hitagS reader");
|
||||||
} else if (htf < 20) {
|
} else if (htf < 20) {
|
||||||
// hitag1 settings
|
// hitag1 settings
|
||||||
reset_sof = 1;
|
reset_sof = 1;
|
||||||
t_wait = 200;
|
t_wait = 200;
|
||||||
// DbpString("Configured for hitag1 reader");
|
DbpString("Configured for hitag1 reader");
|
||||||
} else if (htf < 30) {
|
} else if (htf < 30) {
|
||||||
// hitag2 settings
|
// hitag2 settings
|
||||||
reset_sof = 4;
|
reset_sof = 4;
|
||||||
t_wait = HITAG_T_WAIT_2;
|
t_wait = HITAG_T_WAIT_2;
|
||||||
// DbpString("Configured for hitag2 reader");
|
DbpString("Configured for hitag2 reader");
|
||||||
} else {
|
} else {
|
||||||
Dbprintf("Error, unknown hitag reader type: %d", htf);
|
Dbprintf("Error, unknown hitag reader type: %d", htf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while (!bStop && !BUTTON_PRESS()) {
|
|
||||||
// Watchdog hit
|
while (!bStop && !BUTTON_PRESS() && !usb_poll_validate_length()) {
|
||||||
|
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
|
|
||||||
// Check if frame was captured and store it
|
// Check if frame was captured and store it
|
||||||
|
@ -1531,9 +1532,7 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) {
|
||||||
// falling edge occured halfway the period. with respect to this falling edge,
|
// falling edge occured halfway the period. with respect to this falling edge,
|
||||||
// we need to wait (T_Wait2 + half_tag_period) when the last was a 'one'.
|
// we need to wait (T_Wait2 + half_tag_period) when the last was a 'one'.
|
||||||
// All timer values are in terms of T0 units
|
// All timer values are in terms of T0 units
|
||||||
while (AT91C_BASE_TC0->TC_CV < T0 * (t_wait + (HITAG_T_TAG_HALF_PERIOD * lastbit)));
|
while (AT91C_BASE_TC0->TC_CV < T0 * (t_wait + (HITAG_T_TAG_HALF_PERIOD * lastbit))) {};
|
||||||
|
|
||||||
// Dbprintf("DEBUG: Sending reader frame");
|
|
||||||
|
|
||||||
// Transmit the reader frame
|
// Transmit the reader frame
|
||||||
hitag_reader_send_frame(tx, txlen);
|
hitag_reader_send_frame(tx, txlen);
|
||||||
|
@ -1555,7 +1554,6 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) {
|
||||||
bSkip = true;
|
bSkip = true;
|
||||||
tag_sof = reset_sof;
|
tag_sof = reset_sof;
|
||||||
response = 0;
|
response = 0;
|
||||||
// Dbprintf("DEBUG: Waiting to receive frame");
|
|
||||||
uint32_t errorCount = 0;
|
uint32_t errorCount = 0;
|
||||||
|
|
||||||
// Receive frame, watch for at most T0*EOF periods
|
// Receive frame, watch for at most T0*EOF periods
|
||||||
|
@ -1628,6 +1626,7 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) {
|
||||||
}
|
}
|
||||||
// if we saw over 100 wierd values break it probably isn't hitag...
|
// if we saw over 100 wierd values break it probably isn't hitag...
|
||||||
if (errorCount > 100) break;
|
if (errorCount > 100) break;
|
||||||
|
|
||||||
// We can break this loop if we received the last bit from a frame
|
// We can break this loop if we received the last bit from a frame
|
||||||
if (AT91C_BASE_TC1->TC_CV > T0 * HITAG_T_EOF) {
|
if (AT91C_BASE_TC1->TC_CV > T0 * HITAG_T_EOF) {
|
||||||
if (rxlen > 0) break;
|
if (rxlen > 0) break;
|
||||||
|
|
23
armsrc/hitag2.h
Normal file
23
armsrc/hitag2.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// (c) 2012 Roel Verdult
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
// the license.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Hitag2 type prototyping
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef _HITAG2_H_
|
||||||
|
#define _HITAG2_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "hitag.h"
|
||||||
|
|
||||||
|
void SniffHitag(uint32_t type);
|
||||||
|
void SimulateHitagTag(bool tag_mem_supplied, uint8_t *data);
|
||||||
|
void ReaderHitag(hitag_function htf, hitag_data *htd);
|
||||||
|
void WriterHitag(hitag_function htf, hitag_data *htd, int page);
|
||||||
|
|
||||||
|
#endif
|
684
armsrc/hitagS.c
684
armsrc/hitagS.c
File diff suppressed because it is too large
Load diff
31
armsrc/hitagS.h
Normal file
31
armsrc/hitagS.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// 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
|
||||||
|
// the license.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// HitagS emulation (preliminary test version)
|
||||||
|
//
|
||||||
|
// (c) 2016 Oguzhan Cicek, Hendrik Schwartke, Ralf Spenneberg
|
||||||
|
// <info@os-s.de>
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef _HITAGS_H_
|
||||||
|
#define _HITAGS_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hitag2_crypto.h"
|
||||||
|
#include "hitag.h"
|
||||||
|
#include "proxmark3.h"
|
||||||
|
#include "apps.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "BigBuf.h"
|
||||||
|
|
||||||
|
void SimulateHitagSTag(bool tag_mem_supplied, uint8_t *data);
|
||||||
|
void ReadHitagS(hitag_function htf, hitag_data *htd);
|
||||||
|
void WritePageHitagS(hitag_function htf, hitag_data *htd, int page);
|
||||||
|
void check_challenges(bool file_given, uint8_t *data);
|
||||||
|
|
||||||
|
#endif
|
|
@ -17,8 +17,7 @@
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "parity.h"
|
#include "parity.h"
|
||||||
#include "hitag2.h"
|
#include "hitag.h"
|
||||||
#include "hitagS.h"
|
|
||||||
#include "util_posix.h"
|
#include "util_posix.h"
|
||||||
#include "comms.h"
|
#include "comms.h"
|
||||||
#include "cmddata.h"
|
#include "cmddata.h"
|
||||||
|
|
117
include/hitag.h
Normal file
117
include/hitag.h
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// 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
|
||||||
|
// the license.
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Hitag2, HitagS
|
||||||
|
//
|
||||||
|
// (c) 2012 Roel Verdult
|
||||||
|
// (c) 2016 Oguzhan Cicek, Hendrik Schwartke, Ralf Spenneberg
|
||||||
|
// <info@os-s.de>
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HITAG_H__
|
||||||
|
#define HITAG_H__
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define PACKED
|
||||||
|
#else
|
||||||
|
#define PACKED __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
RHTSF_CHALLENGE = 01,
|
||||||
|
RHTSF_KEY = 02,
|
||||||
|
WHTSF_CHALLENGE = 03,
|
||||||
|
WHTSF_KEY = 04,
|
||||||
|
RHT2F_PASSWORD = 21,
|
||||||
|
RHT2F_AUTHENTICATE = 22,
|
||||||
|
RHT2F_CRYPTO = 23,
|
||||||
|
WHT2F_CRYPTO = 24,
|
||||||
|
RHT2F_TEST_AUTH_ATTEMPTS = 25,
|
||||||
|
RHT2F_UID_ONLY = 26,
|
||||||
|
} hitag_function;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t password[4];
|
||||||
|
} PACKED rht2d_password;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t NrAr[8];
|
||||||
|
uint8_t data[4];
|
||||||
|
} PACKED rht2d_authenticate;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t key[6];
|
||||||
|
uint8_t data[4];
|
||||||
|
} PACKED rht2d_crypto;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
rht2d_password pwd;
|
||||||
|
rht2d_authenticate auth;
|
||||||
|
rht2d_crypto crypto;
|
||||||
|
} hitag_data;
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// Hitag S
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// protocol-state
|
||||||
|
typedef enum PROTO_STATE {
|
||||||
|
HT_READY = 0,
|
||||||
|
HT_INIT,
|
||||||
|
HT_AUTHENTICATE,
|
||||||
|
HT_SELECTED,
|
||||||
|
HT_QUIET,
|
||||||
|
HT_TTF,
|
||||||
|
HT_FAIL
|
||||||
|
} PSTATE;
|
||||||
|
|
||||||
|
typedef enum TAG_STATE {
|
||||||
|
HT_NO_OP = 0,
|
||||||
|
HT_READING_PAGE,
|
||||||
|
HT_WRITING_PAGE_ACK,
|
||||||
|
HT_WRITING_PAGE_DATA,
|
||||||
|
HT_WRITING_BLOCK_DATA
|
||||||
|
} TSATE;
|
||||||
|
|
||||||
|
//number of start-of-frame bits
|
||||||
|
typedef enum SOF_TYPE {
|
||||||
|
HT_STANDARD = 0,
|
||||||
|
HT_ADVANCED,
|
||||||
|
HT_FAST_ADVANCED,
|
||||||
|
HT_ONE,
|
||||||
|
HT_NO_BITS
|
||||||
|
} stype;
|
||||||
|
|
||||||
|
struct hitagS_tag {
|
||||||
|
PSTATE pstate; //protocol-state
|
||||||
|
TSATE tstate; //tag-state
|
||||||
|
uint32_t uid;
|
||||||
|
uint8_t pages[64][4];
|
||||||
|
uint64_t key;
|
||||||
|
uint8_t pwdl0, pwdl1, pwdh0;
|
||||||
|
//con0
|
||||||
|
int max_page;
|
||||||
|
stype mode;
|
||||||
|
//con1
|
||||||
|
bool auth; //0=Plain 1=Auth
|
||||||
|
bool TTFC; //Transponder Talks first coding. 0=Manchester 1=Biphase
|
||||||
|
int TTFDR; //data rate in TTF Mode
|
||||||
|
int TTFM; //the number of pages that are sent to the RWD
|
||||||
|
bool LCON; //0=con1/2 read write 1=con1 read only and con2 OTP
|
||||||
|
bool LKP; //0=page2/3 read write 1=page2/3 read only in Plain mode and no access in authenticate mode
|
||||||
|
//con2
|
||||||
|
//0=read write 1=read only
|
||||||
|
bool LCK7; //page4/5
|
||||||
|
bool LCK6; //page6/7
|
||||||
|
bool LCK5; //page8-11
|
||||||
|
bool LCK4; //page12-15
|
||||||
|
bool LCK3; //page16-23
|
||||||
|
bool LCK2; //page24-31
|
||||||
|
bool LCK1; //page32-47
|
||||||
|
bool LCK0; //page48-63
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,55 +0,0 @@
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// (c) 2012 Roel Verdult
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
// the license.
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// Hitag2 type prototyping
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// HitagS added
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#ifndef _HITAG2_H_
|
|
||||||
#define _HITAG2_H_
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#define PACKED
|
|
||||||
#else
|
|
||||||
#define PACKED __attribute__((packed))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
RHTSF_CHALLENGE = 01,
|
|
||||||
RHTSF_KEY = 02,
|
|
||||||
WHTSF_CHALLENGE = 03,
|
|
||||||
WHTSF_KEY = 04,
|
|
||||||
RHT2F_PASSWORD = 21,
|
|
||||||
RHT2F_AUTHENTICATE = 22,
|
|
||||||
RHT2F_CRYPTO = 23,
|
|
||||||
WHT2F_CRYPTO = 24,
|
|
||||||
RHT2F_TEST_AUTH_ATTEMPTS = 25,
|
|
||||||
RHT2F_UID_ONLY = 26,
|
|
||||||
} hitag_function;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
byte_t password[4];
|
|
||||||
} PACKED rht2d_password;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
byte_t NrAr[8];
|
|
||||||
byte_t data[4];
|
|
||||||
} PACKED rht2d_authenticate;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
byte_t key[6];
|
|
||||||
byte_t data[4];
|
|
||||||
} PACKED rht2d_crypto;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
rht2d_password pwd;
|
|
||||||
rht2d_authenticate auth;
|
|
||||||
rht2d_crypto crypto;
|
|
||||||
} hitag_data;
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,77 +0,0 @@
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// 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
|
|
||||||
// the license.
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// HitagS emulation (preliminary test version)
|
|
||||||
//
|
|
||||||
// (c) 2016 Oguzhan Cicek, Hendrik Schwartke, Ralf Spenneberg
|
|
||||||
// <info@os-s.de>
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <hitag2.h>
|
|
||||||
|
|
||||||
#ifndef _HITAGS_H_
|
|
||||||
#define _HITAGS_H_
|
|
||||||
|
|
||||||
//protocol-state
|
|
||||||
typedef enum PROTO_STATE {
|
|
||||||
HT_READY = 0,
|
|
||||||
HT_INIT,
|
|
||||||
HT_AUTHENTICATE,
|
|
||||||
HT_SELECTED,
|
|
||||||
HT_QUIET,
|
|
||||||
HT_TTF,
|
|
||||||
HT_FAIL
|
|
||||||
} PSTATE;
|
|
||||||
|
|
||||||
//tag-state
|
|
||||||
typedef enum TAG_STATE {
|
|
||||||
HT_NO_OP = 0,
|
|
||||||
HT_READING_PAGE,
|
|
||||||
HT_WRITING_PAGE_ACK,
|
|
||||||
HT_WRITING_PAGE_DATA,
|
|
||||||
HT_WRITING_BLOCK_DATA
|
|
||||||
} TSATE;
|
|
||||||
|
|
||||||
//number of start-of-frame bits
|
|
||||||
typedef enum SOF_TYPE {
|
|
||||||
HT_STANDARD = 0,
|
|
||||||
HT_ADVANCED,
|
|
||||||
HT_FAST_ADVANCED,
|
|
||||||
HT_ONE,
|
|
||||||
HT_NO_BITS
|
|
||||||
} stype;
|
|
||||||
|
|
||||||
struct hitagS_tag {
|
|
||||||
PSTATE pstate; //protocol-state
|
|
||||||
TSATE tstate; //tag-state
|
|
||||||
uint32_t uid;
|
|
||||||
uint32_t pages[16][4];
|
|
||||||
uint64_t key;
|
|
||||||
byte_t pwdl0, pwdl1, pwdh0;
|
|
||||||
//con0
|
|
||||||
int max_page;
|
|
||||||
stype mode;
|
|
||||||
//con1
|
|
||||||
bool auth; //0=Plain 1=Auth
|
|
||||||
bool TTFC; //Transponder Talks first coding. 0=Manchester 1=Biphase
|
|
||||||
int TTFDR; //data rate in TTF Mode
|
|
||||||
int TTFM; //the number of pages that are sent to the RWD
|
|
||||||
bool LCON; //0=con1/2 read write 1=con1 read only and con2 OTP
|
|
||||||
bool LKP; //0=page2/3 read write 1=page2/3 read only in Plain mode and no access in authenticate mode
|
|
||||||
//con2
|
|
||||||
//0=read write 1=read only
|
|
||||||
bool LCK7; //page4/5
|
|
||||||
bool LCK6; //page6/7
|
|
||||||
bool LCK5; //page8-11
|
|
||||||
bool LCK4; //page12-15
|
|
||||||
bool LCK3; //page16-23
|
|
||||||
bool LCK2; //page24-31
|
|
||||||
bool LCK1; //page32-47
|
|
||||||
bool LCK0; //page48-63
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Add table
Add a link
Reference in a new issue