SoftSIM - swSIM

https://github.com/tomasz-lisowski/swsim

编译

复制代码
服务器端 swicc-pcsc
sudo apt-get install make cmake gcc pkg-config libpcsclite1 libpcsclite-dev pcscd
git clone --recurse-submodules https://github.com/tomasz-lisowski/swicc-pcsc
MakeFile去除 -Werror \
cd swicc-pcsc
make main-dbg
sudo make install

客户端 swsim
sudo apt-get install make gcc
git clone --recurse-submodules https://github.com/tomasz-lisowski/swsim
MakeFile去除 -Werror \
cd swsim
make main-dbg

启动

复制代码
读卡器启动: sudo pcscd -f -d -T 停止: pkill -x pcscd
swsim启动:cd swsim && ./build/swsim.elf --ip 127.0.0.1 --port 37324 --fs filesystem.swiccfs --fs-gen ./data/usim.json

测试

复制代码
sudo apt install python-pip
sudo apt install python3-pyscard
python3 test_swsim.py
复制代码
# -*- coding: utf-8 -*-
from smartcard.System import readers
from smartcard.util import toHexString

def hex_to_string(hex_list):
    """将十六进制列表转换为可读的字符串(用于BCD编码的数字)"""
    result = ""
    for byte in hex_list:
        high = (byte >> 4) & 0x0F
        low = byte & 0x0F
        # 处理可能存在的填充位 (0xF)
        if high != 0x0F:
            result += str(high)
        if low != 0x0F:
            result += str(low)
    return result

# 1. 查找读卡器
reader_list = readers()
swicc_readers = [r for r in reader_list if 'swICC' in str(r)]
if not swicc_readers:
    print("错误:未找到swICC读卡器。请确保swSIM服务器正在另一个终端运行。")
    exit(1)

swicc_reader = swicc_readers[0]
print(f"已连接到: {swicc_reader}")

# 2. 连接
connection = swicc_reader.createConnection()
connection.connect()

print("\n=== 开始读取SIM卡信息 ===\n")

# 3. 读取ICCID (文件ID: 2FE2,位于MF下)
print("1. 正在读取ICCID...")

SELECT_MF = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x2F, 0xE2]
resp, sw1, sw2 = connection.transmit(SELECT_MF)
print(f"   选择MF状态: {hex(sw1)} {hex(sw2)}")

SELECT_ICCID = [0xA0, 0xB0, 0x00, 0x00, 0x00A]
iccid_data, sw1, sw2 = connection.transmit(SELECT_ICCID)
print(f"   ICCID原始数据: {toHexString(iccid_data)}")