Migrates all 43 sim modules and 23 test files (~7.8k LOC, 686 tests) from .worktrees/sim-framework/ into pm3py/sim/. Import fixes: - 4 files: ..protocol/..transport → ..core.protocol/..core.transport - trace_fmt.py: pm3py.hf_15 → pm3py.trace.ndef - test_sim_pm3medium.py: flat imports → core.* - test_sim_trace_fmt.py: flat imports → core.* - Added sim Cmd entries to core/protocol.py (EML_SETMEM, SIM_TABLE_*) 751 tests passing (686 sim + 65 core). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
"""Implant preset profiles — pre-configured transponder instances."""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
from .t5577 import T5577Tag
|
|
from .ndef import NfcType2Tag
|
|
from .mifare import MifareClassicTag
|
|
from .desfire import DesfireTag
|
|
|
|
|
|
def _random_uid(length: int) -> bytes:
|
|
"""Generate a random UID starting with 0x04 (NXP manufacturer code)."""
|
|
return b"\x04" + os.urandom(length - 1)
|
|
|
|
|
|
def xEM(tag_id: int = 0x0000000000) -> T5577Tag:
|
|
"""xEM implant — T5577 configured as EM4100."""
|
|
return T5577Tag.preset("em4100", tag_id=tag_id)
|
|
|
|
|
|
def xNT(uid: bytes | None = None, ndef_message: bytes = b"") -> NfcType2Tag:
|
|
"""xNT implant — NTAG216, 888 bytes, NDEF capable."""
|
|
if uid is None:
|
|
uid = _random_uid(7)
|
|
return NfcType2Tag(uid=uid, ndef_message=ndef_message,
|
|
total_pages=231, # NTAG216: 924 bytes / 4
|
|
atqa=b"\x44\x00", sak=0x00)
|
|
|
|
|
|
def xM1(uid: bytes | None = None) -> MifareClassicTag:
|
|
"""xM1 implant — MIFARE Classic 1K."""
|
|
if uid is None:
|
|
uid = _random_uid(4)
|
|
return MifareClassicTag(uid=uid, size="1k")
|
|
|
|
|
|
def FlexDF(uid: bytes | None = None) -> DesfireTag:
|
|
"""FlexDF implant — DESFire EV2, 8K."""
|
|
if uid is None:
|
|
uid = _random_uid(7)
|
|
return DesfireTag(uid=uid)
|
|
|
|
|
|
def NExT(tag_id: int = 0x0000000000,
|
|
uid: bytes | None = None) -> tuple[T5577Tag, NfcType2Tag]:
|
|
"""NExT implant — dual frequency (xEM LF + xNT HF)."""
|
|
lf = xEM(tag_id=tag_id)
|
|
hf = xNT(uid=uid)
|
|
return lf, hf
|
|
|
|
|
|
class MagicMifareClassicTag(MifareClassicTag):
|
|
"""Magic MIFARE Classic — gen1a or gen2/CUID variant.
|
|
|
|
gen1a: responds to special backdoor commands, allows direct block 0 write
|
|
gen2/CUID: allows block 0 write via standard write commands
|
|
"""
|
|
|
|
def __init__(self, uid: bytes, magic_type: str = "gen1a", **kwargs):
|
|
super().__init__(uid=uid, **kwargs)
|
|
self._magic_type = magic_type
|
|
|
|
@property
|
|
def magic_type(self) -> str:
|
|
return self._magic_type
|