Files
pm3py/tests/test_sim_implants.py
michael c1ab980036 refactor: remove all backward-compat shims from sim/
Deletes 24 shim files from sim/. All test imports now point directly
to canonical transponders/ and trace/ paths. sim/ contains only
infrastructure (15 files): frame, memory, transponder ABC, reader ABC,
medium, sim_session, table_compiler, replay, relay, fuzzer, pm3medium,
mcu_bridge, mcu_protocol, dual_session, __init__.

751 tests passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 20:56:40 -07:00

106 lines
3.1 KiB
Python

"""Tests for implant preset profiles."""
import asyncio
import pytest
from pm3py.sim.medium import SoftwareMedium
from pm3py.transponders.implants import (
xEM, xNT, xM1, FlexDF, NExT,
MagicMifareClassicTag,
)
from pm3py.transponders.lf.em.em4100 import EM4100Reader
from pm3py.transponders.hf.iso14443a.base import Reader14443A, _compute_bcc
def run(coro):
return asyncio.get_event_loop().run_until_complete(coro)
class TestXEM:
def test_creates_t5577_configured_as_em4100(self):
tag = xEM(tag_id=0x1122334455)
assert tag.blocks[0] != 0 # config block set
def test_readable_as_em4100(self):
medium = SoftwareMedium()
tag = xEM(tag_id=0x1122334455)
run(medium.attach(tag))
reader = EM4100Reader(medium)
result = run(reader.read_id())
assert result is not None
assert result["tag_id"] == 0x1122334455
class TestXNT:
def test_creates_ntag216_like(self):
tag = xNT()
assert tag._total_pages >= 45 # NTAG213+ size
def test_is_type2_tag(self):
from pm3py.transponders.hf.iso14443a.ndef import NfcType2Tag
tag = xNT()
assert isinstance(tag, NfcType2Tag)
def test_has_7byte_uid(self):
tag = xNT()
assert len(tag._uid) == 7
class TestXM1:
def test_creates_mifare_classic_1k(self):
tag = xM1()
assert tag._size == "1k"
assert len(tag._data) == 1024
def test_default_keys_ff(self):
tag = xM1()
assert tag._keys_a[0] == b"\xFF" * 6
class TestMagicMifareClassic:
def test_gen1a_backdoor_write_block0(self):
"""Magic gen1a allows direct write to block 0."""
tag = MagicMifareClassicTag(uid=b"\x01\x02\x03\x04",
magic_type="gen1a")
run(tag.power_on())
# gen1a responds to special WUPA sequence for backdoor
assert tag.magic_type == "gen1a"
# Direct block 0 write should work
new_data = b"\xDE\xAD\xBE\xEF" + b"\x00" * 12
tag.write_block_raw(0, new_data)
assert tag.read_block_raw(0) == new_data
def test_gen2_cuid(self):
tag = MagicMifareClassicTag(uid=b"\x01\x02\x03\x04",
magic_type="gen2")
assert tag.magic_type == "gen2"
class TestFlexDF:
def test_creates_desfire(self):
from pm3py.transponders.hf.iso14443a.nxp.desfire import DesfireTag
tag = FlexDF()
assert isinstance(tag, DesfireTag)
def test_has_7byte_uid(self):
tag = FlexDF()
assert len(tag._uid) == 7
class TestNExT:
def test_creates_dual_frequency(self):
lf, hf = NExT(tag_id=0x1122334455)
# LF side is T5577 configured as EM4100
assert lf.blocks[0] != 0
# HF side is NfcType2Tag (xNT)
from pm3py.transponders.hf.iso14443a.ndef import NfcType2Tag
assert isinstance(hf, NfcType2Tag)
def test_both_sides_work(self):
lf, hf = NExT(tag_id=0xAABBCCDDEE)
# LF
lf_medium = SoftwareMedium()
run(lf_medium.attach(lf))
reader = EM4100Reader(lf_medium)
result = run(reader.read_id())
assert result["tag_id"] == 0xAABBCCDDEE