+//-----------------------------------------------------------------------------
+// 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
+//---------------------------------------------------------
+typedef enum PROTO_STATE {READY=0,INIT,AUTHENTICATE,SELECTED,QUIET,TTF,FAIL} PSTATE; //protocol-state
+typedef enum TAG_STATE {NO_OP=0,READING_PAGE,READING_BLOCK,WRITING_PAGE_ACK,WRITING_PAGE_DATA,WRITING_BLOCK_DATA} TSATE; //tag-state
+typedef enum SOF_TYPE {STANDARD=0,ADVANCED,FAST_ADVANCED,ONE,NO_BITS} stype; //number of start-of-frame bits
+
+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