//-----------------------------------------------------------------------------
// Copyright (C) Proxmark3 contributors. See AUTHORS.md for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// See LICENSE.txt for the text of the license.
//-----------------------------------------------------------------------------
// Hitag2, HitagS
//-----------------------------------------------------------------------------


#ifndef HITAG_H__
#define HITAG_H__

#include "common.h"

typedef enum {
    RHTSF_CHALLENGE           = 01,
    RHTSF_KEY                 = 02,
    WHTSF_CHALLENGE           = 03,
    WHTSF_KEY                 = 04,
    HTS_LAST_CMD              = WHTSF_KEY,
    RHT1F_PLAIN               = 11,
    RHT1F_AUTHENTICATE        = 12,
    HT1_LAST_CMD              = RHT1F_AUTHENTICATE,
    RHT2F_PASSWORD            = 21,
    RHT2F_AUTHENTICATE        = 22,
    RHT2F_CRYPTO              = 23,
    WHT2F_CRYPTO              = 24,
    RHT2F_TEST_AUTH_ATTEMPTS  = 25,
    RHT2F_UID_ONLY            = 26,
    WHT2F_PASSWORD            = 27,
    HT2_LAST_CMD              = WHT2F_PASSWORD,
} 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 struct {
    uint8_t key_no;
    uint8_t logdata_0[4];
    uint8_t logdata_1[4];
    uint8_t nonce[4];
    uint8_t key[4];
} PACKED rht1d_authenticate;

typedef union {
    rht2d_password     pwd;
    rht1d_authenticate ht1auth;
    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