mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-09-11 18:29:22 -07:00
142 lines
4.8 KiB
C
142 lines
4.8 KiB
C
//-----------------------------------------------------------------------------
|
|
// 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.
|
|
//-----------------------------------------------------------------------------
|
|
// ISO 15693 type prototyping
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#ifndef _ISO15_H_
|
|
#define _ISO15_H_
|
|
|
|
#include "common.h"
|
|
|
|
#define ISO15693_UID_LENGTH 8
|
|
#define ISO15693_ATQB_LENGTH 7
|
|
|
|
// on-disk length of a raw iso15_tag_t dump, per struct revision. A .bin is
|
|
// identified by its length alone, so every revision needs a constant here.
|
|
#define ISO15_V4_DUMP_LENGTH 2235 // u8 pagesCount, locks[0xA0]
|
|
#define ISO15_V5_DUMP_LENGTH 2332 // u16 pagesCount, locks[0x100]
|
|
|
|
typedef struct {
|
|
uint8_t uid[ISO15693_UID_LENGTH];
|
|
uint8_t uidlen;
|
|
uint8_t atqb[ISO15693_ATQB_LENGTH];
|
|
uint8_t chipid;
|
|
uint8_t cid;
|
|
} PACKED iso15_card_select_t;
|
|
|
|
typedef enum ISO15_COMMAND {
|
|
ISO15_CONNECT = (1 << 0),
|
|
ISO15_NO_DISCONNECT = (1 << 1),
|
|
ISO15_RAW = (1 << 2),
|
|
ISO15_APPEND_CRC = (1 << 3),
|
|
ISO15_HIGH_SPEED = (1 << 4),
|
|
ISO15_READ_RESPONSE = (1 << 5),
|
|
ISO15_LONG_WAIT = (1 << 6),
|
|
} iso15_command_t;
|
|
|
|
typedef struct {
|
|
uint8_t flags; // PM3 Flags - see iso15_command_t
|
|
uint16_t rawlen;
|
|
uint8_t raw[]; // First byte in raw, raw[0] is ISO15693 protocol flag byte
|
|
} PACKED iso15_raw_cmd_t;
|
|
|
|
// 16-slot inventory support
|
|
#define ISO15693_MAX_SLOTS 16
|
|
#define ISO15693_MAX_SLOT_RESPONSE 128
|
|
|
|
typedef struct {
|
|
uint8_t status; // 0=no response (timeout), 1=valid response, 2=collision/error
|
|
uint8_t len; // response data length for this slot
|
|
} PACKED iso15_slot_result_t;
|
|
|
|
typedef struct {
|
|
uint8_t slot_count; // 1 or 16
|
|
iso15_slot_result_t slots[ISO15693_MAX_SLOTS]; // per-slot metadata
|
|
uint8_t data[]; // concatenated response bytes
|
|
} PACKED iso15_inventory_response_t;
|
|
|
|
// Two independent caps, not one expressed twice.
|
|
//
|
|
// MAX_PAGES sizes locks[], one byte per page. 0x100 is the real ceiling: a tag
|
|
// reports its block count in a single byte of the Get System Info
|
|
// response, so 256 blocks is as many as there can be.
|
|
// MAX_SIZE sizes data[], the whole payload.
|
|
//
|
|
// The product is what actually has to fit, and every load checks it:
|
|
//
|
|
// (pagesCount * bytesPerPage) > ISO15693_TAG_MAX_SIZE -> rejected
|
|
//
|
|
// so 2048 bytes covers 0x100 pages of 8, or 64 pages of 32 (256 bits), but not
|
|
// 0x100 pages of 16 or more. Tags with blocks larger than 8 bytes are therefore
|
|
// only supported up to 2048 bytes of memory. Raising this means raising
|
|
// CARD_MEMORY_SIZE too -- iso15_tag_t lives in BigBuf EM on the ARM.
|
|
#define ISO15693_TAG_MAX_PAGES 0x100 // in pages, one lock byte each
|
|
#define ISO15693_TAG_MAX_SIZE 2048 // in bytes, total payload
|
|
|
|
typedef struct {
|
|
uint8_t uid[8];
|
|
uint8_t dsfid;
|
|
bool dsfidLock;
|
|
uint8_t afi;
|
|
bool afiLock;
|
|
uint8_t bytesPerPage;
|
|
uint16_t pagesCount;
|
|
uint8_t ic;
|
|
uint8_t locks[ISO15693_TAG_MAX_PAGES];
|
|
uint8_t data[ISO15693_TAG_MAX_SIZE];
|
|
uint8_t random[2];
|
|
uint8_t privacyPasswd[4];
|
|
enum {
|
|
TAG_STATE_NO_FIELD,
|
|
TAG_STATE_READY,
|
|
TAG_STATE_ACTIVATED, // useless ?
|
|
TAG_STATE_SELECTED,
|
|
TAG_STATE_SILENCED
|
|
} state;
|
|
bool expectFast;
|
|
bool expectFsk;
|
|
} PACKED iso15_tag_t;
|
|
|
|
// The previous on-disk layout. Kept so a v4 dump can be converted to the
|
|
// current struct instead of being rejected for having the wrong length.
|
|
// Note the state enum: v4 carries TAG_STATE_ACTIVATED, so the enumerators
|
|
// match iso15_tag_t one for one and `state` copies straight across.
|
|
typedef struct {
|
|
uint8_t uid[8];
|
|
uint8_t dsfid;
|
|
bool dsfidLock;
|
|
uint8_t afi;
|
|
bool afiLock;
|
|
uint8_t bytesPerPage;
|
|
uint8_t pagesCount;
|
|
uint8_t ic;
|
|
uint8_t locks[0xA0];
|
|
uint8_t data[ISO15693_TAG_MAX_SIZE];
|
|
uint8_t random[2];
|
|
uint8_t privacyPasswd[4];
|
|
enum {
|
|
TAGv4_STATE_NO_FIELD,
|
|
TAGv4_STATE_READY,
|
|
TAGv4_STATE_ACTIVATED, // useless ?
|
|
TAGv4_STATE_SELECTED,
|
|
TAGv4_STATE_SILENCED
|
|
} state;
|
|
bool expectFast;
|
|
bool expectFsk;
|
|
} PACKED iso15_tag_v4_t;
|
|
|
|
#endif // _ISO15_H_
|