This commit is contained in:
Philippe Teuwen
2023-09-25 00:51:43 +02:00
parent e23ad695e6
commit 372cfead0c
8 changed files with 99 additions and 91 deletions
+18 -11
View File
@@ -975,6 +975,7 @@ class HFMFInfo(DeviceRequiredUnit):
def on_exec(self, args: argparse.Namespace):
return self.scan()
@hf_mfu.command('rdpg', 'MIFARE Ultralight read one page')
class HFMFURDPG(BaseMFUAuthOpera):
# hf mfu rdpg -p 2
@@ -1006,6 +1007,7 @@ class HFMFURDPG(BaseMFUAuthOpera):
resp = self.cmd.hf14a_raw(options=options, resp_timeout_ms=200, data=struct.pack('!BB', 0x30, param.page))
print(f" - Data: {resp[:4].hex()}")
@hf_mfu.command('dump', 'MIFARE Ultralight dump pages')
class HFMFUDUMP(BaseMFUAuthOpera):
# hf mfu dump [-p start_page] [-q number_pages] [-f output_file]
@@ -1160,12 +1162,12 @@ class HWSlotList(DeviceRequiredUnit):
def get_slot_name(self, slot, sense):
try:
name = self.cmd.get_slot_tag_nick(slot, sense).decode(encoding="utf8")
return {'baselen':len(name), 'metalen':len(CC+C0), 'name':f'{CC}{name}{C0}'}
return {'baselen': len(name), 'metalen': len(CC+C0), 'name': f'{CC}{name}{C0}'}
except UnexpectedResponseError:
return {'baselen':0, 'metalen':0, 'name':f''}
return {'baselen': 0, 'metalen': 0, 'name': f''}
except UnicodeDecodeError:
name = "UTF8 Err"
return {'baselen':len(name), 'metalen':len(CC+C0), 'name':f'{CC}{name}{C0}'}
return {'baselen': len(name), 'metalen': len(CC+C0), 'name': f'{CC}{name}{C0}'}
# hw slot list
def on_exec(self, args: argparse.Namespace):
@@ -1180,7 +1182,7 @@ class HWSlotList(DeviceRequiredUnit):
lfn = self.get_slot_name(slot, chameleon_cmd.TagSenseType.TAG_SENSE_LF)
m = max(hfn['baselen'], lfn['baselen'])
maxnamelength = m if m > maxnamelength else maxnamelength
slotnames.append({'hf':hfn, 'lf':lfn})
slotnames.append({'hf': hfn, 'lf': lfn})
for slot in chameleon_cmd.SlotNumber:
fwslot = chameleon_cmd.SlotNumber.to_fw(slot)
hf_tag_type = chameleon_cmd.TagSpecificType(slotinfo[fwslot]['hf'])
@@ -1222,6 +1224,7 @@ class HWSlotList(DeviceRequiredUnit):
else:
print("undef")
@hw_slot.command('change', 'Set emulation tag slot activated.')
class HWSlotSet(SlotIndexRequireUnit):
def args_parser(self) -> ArgumentParserNoExit or None:
@@ -1319,6 +1322,7 @@ class HWSlotEnableSet(SlotIndexRequireUnit, SenseTypeRequireUnit):
self.cmd.set_slot_enable(slot_num, sense_type, enable)
print(f' - Set slot {slot_num} {"LF" if sense_type==chameleon_cmd.TagSenseType.TAG_SENSE_LF else "HF"} {"enable" if enable else "disable"} success.')
@lf_em_sim.command('set', 'Set simulated em410x card id')
class LFEMSimSet(LFEMCardRequiredUnit):
def args_parser(self) -> ArgumentParserNoExit or None:
@@ -1690,19 +1694,23 @@ class HWRaw(DeviceRequiredUnit):
class HF14ARaw(ReaderRequiredUnit):
def bool_to_bit(self, value):
return 1 if value else 0
return 1 if value else 0
def args_parser(self) -> ArgumentParserNoExit or None:
parser = ArgumentParserNoExit()
parser.add_argument('-a', '--activate-rf', help="Active signal field ON without select", action='store_true', default=False,)
parser.add_argument('-s', '--select-tag', help="Active signal field ON with select", action='store_true', default=False,)
parser.add_argument('-a', '--activate-rf', help="Active signal field ON without select",
action='store_true', default=False,)
parser.add_argument('-s', '--select-tag', help="Active signal field ON with select",
action='store_true', default=False,)
# TODO: parser.add_argument('-3', '--type3-select-tag', help="Active signal field ON with ISO14443-3 select (no RATS)", action='store_true', default=False,)
parser.add_argument('-d', '--data', type=str, help="Data to be sent")
parser.add_argument('-b', '--bits', type=int, help="Number of bits to send. Useful for send partial byte")
parser.add_argument('-c', '--crc', help="Calculate and append CRC", action='store_true', default=False,)
parser.add_argument('-r', '--response', help="Do not read response", action='store_true', default=False,)
parser.add_argument('-cc', '--crc-clear', help="Verify and clear CRC of received data", action='store_true', default=False,)
parser.add_argument('-k', '--keep-rf', help="Keep signal field ON after receive", action='store_true', default=False,)
parser.add_argument('-cc', '--crc-clear', help="Verify and clear CRC of received data",
action='store_true', default=False,)
parser.add_argument('-k', '--keep-rf', help="Keep signal field ON after receive",
action='store_true', default=False,)
parser.add_argument('-t', '--timeout', type=int, help="Timeout in ms", default=100)
# TODO: need support for carriage returns in parser, why are they mangled?
# parser.description = 'Examples:\n' \
@@ -1712,7 +1720,6 @@ class HF14ARaw(ReaderRequiredUnit):
# ' hf 14a raw -sc -d 6000\n'
return parser
def on_exec(self, args: argparse.Namespace):
options = {
'activate_rf_field': self.bool_to_bit(args.activate_rf),
@@ -1721,7 +1728,7 @@ class HF14ARaw(ReaderRequiredUnit):
'auto_select': self.bool_to_bit(args.select_tag),
'keep_rf_field': self.bool_to_bit(args.keep_rf),
'check_response_crc': self.bool_to_bit(args.crc_clear),
#'auto_type3_select': self.bool_to_bit(args.type3-select-tag),
# 'auto_type3_select': self.bool_to_bit(args.type3-select-tag),
}
data: str = args.data
if data is not None:
+14 -13
View File
@@ -164,7 +164,7 @@ class TagSpecificType(enum.IntEnum):
###### LF ######
#### ASK Tag-Talk-First 100
#### ASK Tag-Talk-First 100 ####
# EM410x
TAG_TYPE_EM410X = 100,
# FDX-B
@@ -177,18 +177,18 @@ class TagSpecificType(enum.IntEnum):
# Noralsy
# Jablotron
#### FSK Tag-Talk-First 200
#### FSK Tag-Talk-First 200 ####
# HID Prox
# ioProx
# AWID
# Paradox
#### PSK Tag-Talk-First 300
#### PSK Tag-Talk-First 300 ####
# Indala
# Keri
# NexWatch
#### Reader-Talk-First 400
#### Reader-Talk-First 400 ####
# T5577
# EM4x05/4x69
# EM4x50/4x70
@@ -198,28 +198,28 @@ class TagSpecificType(enum.IntEnum):
###### HF ######
# MIFARE Classic series 1000
#### MIFARE Classic series 1000 ####
TAG_TYPE_MIFARE_Mini = 1000,
TAG_TYPE_MIFARE_1024 = 1001,
TAG_TYPE_MIFARE_2048 = 1002,
TAG_TYPE_MIFARE_4096 = 1003,
# MFUL / NTAG series 1100
#### MFUL / NTAG series 1100 ####
TAG_TYPE_NTAG_213 = 1100,
TAG_TYPE_NTAG_215 = 1101,
TAG_TYPE_NTAG_216 = 1102,
# MIFARE Plus series 1200
# DESFire series 1300
#### MIFARE Plus series 1200 ####
#### DESFire series 1300 ####
# ST25TA series 2000
#### ST25TA series 2000 ####
# HF14A-4 series 3000
#### HF14A-4 series 3000 ####
@staticmethod
def list(exclude_meta=True):
return [t for t in TagSpecificType
if (t > TagSpecificType.OLD_TAG_TYPES_END and
if (t > TagSpecificType.OLD_TAG_TYPES_END and
t != TagSpecificType.TAG_TYPES_LF_END)
or not exclude_meta]
or not exclude_meta]
@staticmethod
def list_hf():
@@ -628,7 +628,7 @@ class ChameleonCMD:
:param bit_owned_by_the_last_byte:
:return:
"""
class CStruct(ctypes.BigEndianStructure):
_fields_ = [
("activate_rf_field", ctypes.c_uint8, 1),
@@ -1274,5 +1274,6 @@ def test_fn():
# disconnect
dev.close()
if __name__ == '__main__':
test_fn()