作者归档:softsim

智能卡简史

1970 年,日本 Kunitaka Arimura 博士申请了智能卡概念的第1个也是唯一的专利。

1974年,法国的Roland Moreno申请了IC卡的原始专利,后来被称为“智能卡”。当时的原型只是一个安全存储卡,并没有处理器。

1977年,三家法国公司Bull CP8,SGS Thomson和Schlumberger都开始开发IC卡。
其中,Honeywell Bull公司的Michel Ugon在1977年发明了第一次使用微处理器的智能卡,于1978年获得 self-programmable one-chip microcomputer (SPOM)专利。

1979年, 美国摩托罗拉公司 基于Michel Ugon的这个专利,开发了首个用于法国银行业的安全单芯片微控制器CP8.

1982年,法国开始IC卡电话测试,1983年用于payphone

1984年, 带芯片的ATM银行卡测试

1986年, Bull CP8在弗吉尼亚银行和马里兰国家银行分发了14,000张

1987年, 与美国农业部的全国性花生营销卡一起在美国实施了第一个大规模智能卡应用程序。

1991年, 德国慕尼黑智能卡制造商Giesecke&Devrient开发了第一张SIM卡,第一批300张SIM卡卖给了芬兰无线网络运营商Radiolinja。

1992年, 在丹麦启动了全国性的预付费(电子钱包)卡项目(DANMONT)。

1993年, 在法国雷恩对多功能智能卡应用程序进行了现场测试,其中在智能银行卡中启用了Telecarte功能(用于公用电话)。

1994年, Europay,MasterCard和Visa(EMV)发布了有关基于全球微芯片的银行卡(智能卡)的联合规范。

1995年, 全世界超过300万的数字移动电话用户开始使用智能卡(SIM卡)发起通话并为通话计费。

但ISO 7816国际标准的,主要雏形是 日本东芝公司的 JPN 2537199 号专利 Integrated circuit card,(priority date: 1986-06-20;publication date: 1996-07-08)

USA 5161231 号专利 Processing system which transmits a predetermined
error code upon detection of an incorrect transmission code,
(priority date: 1991-03-12;publication date: 1992-11-03).

7816-3: 接触卡 — 电气接口和传输协议

创建于 1989, 补充于 1992 (增加 T=1 协议),
再次补充于 1994 (修改了协议类型选择),
更新于 1997 (包含了 3V电压),
补充于 2002 (添加 1.8 电压),
最后更新时间是 2006 (移除 Vpp触点)

打包/解包中兴电信光猫 CTCE8 格式 cfg 配置文件工具

https://github.com/corberan/ctce8_cfg_tool

用法:
.\ctce8_cfg_tool.exe unpack “E:\e8_Config_Backup\ctce8_ZXHN_F450.cfg” ctce8_ZXHN_F450.xml
.\ctce8_cfg_tool.exe pack ctce8_ZXHN_F450.xml ctce8_ZXHN_F450.cfg “ZXHN F450”
pack 打包命令的第三个参数是光猫设备名,一般为配置文件名中的字段。如我得到的配置文件名为 ctce8_ZXHN_F450.cfg,那么这个字符串就是 “ZXHN F450″,注意中间是空格。

大神用rust写的工具

如果已经有web admin权限, 可进到“设备管理” usb备份配置
这里开启 telnet 权限

7816参数和协议选择PPS

Selection of transmission Parameters and protocol

在完成复位应答(ATR)后,卡应该等待从接口设备来的字符:
传输受传输参数(transmission Parameters)控制; 它们的解释受协议(protocol)约束。

如果ATR的TA2字段存在(也就是卡处于特定模式),那么接口设备应该用特定的传输参数来开始一个特定的传输协议。
否则(也就是卡处于协商模式), 那么 ATR期间使用的传输参数(也就是默认参数), 应该被继续使用, 以便接收 协商数据。
1. 如果卡在ATR之后收到的第1个字节是 FF, 那么接口设备应该开始了 PPS交换。默认的传输参数在PPS交换期间应该被继续使用,直到PPS交换成功。
2. 否则, 接口设备不支持PPS, 应该继续使用 默认参数。

如果卡受到 接口设备 发送的PPS字节后,如果能接受这个参数,也应回应同样的PPS字节给 接口设备。这样完成一次PPS协商。

7816接口集成电路卡/智能卡上电激活过程

卡片可以支持5V, 3V, 1.8V 的电压的一种或者多种。
如果支持多种,则必须连续。 也就是可以支持
5, 3, 1.8

5, 3

3, 1.8
但是,不能支持 5, 1.8 (这种是跳跃的)

如果接口设备 给卡指定了一种它能支持的电压, 那么卡就必须按这种电压操作。
如果接口设备支持多种电压, 实施这些电压的顺序,没有定义
一般来说,应该从低电压开始尝试。
但是, 因为所有的卡,都应该保护自己在高电压下不被损坏, 所以,即使从高电压开始尝试,也是符合规范的。

激活序列:
RST为低电平,
VCC加电(先1.8V,后3.3V,再5V)
I/O脚置于 接收模式, 也就是高电平. 但接口设备在激活过程中,要忽略I/O脚上的数据。
为CLK提供稳定的时钟信号。在复位应答期间,f在1~5MHz(5V卡), 1~4M(3V卡)

在给VCC上电,设置IO处于接收模式,提供时钟信号, 这几个操作间,应该存在一个延时。
但具体延时多长时间,没做定义,实现者自己把握。

————补充说明——————
SIM_IO的 输入(接收模式recption,一般此时接口设备来发送)
输出(发送模式transmission mode).

状态H- 如果卡和接口设备都处于接收模式(reception mode)
或者 发送方 强加此状态(trasmitter imposed this state), 也就是说 发送方,要发送1
状态L– 发送方 强制此状态, 也就是发送方要发送0
————补充说明完毕——————

在激活完成之后,准备冷复位
此时, RST处于低电平, VCC上电,IO处于高电平也就是接收模式,CLK提供了合适且稳定的时钟。

卡就准备好了冷复位。

DSView安装到用户home目录

apt install libboost-dev libboost-thread-dev libboost-system-dev libboost-filesystem-dev

$ git clone git://github.com/DreamSourceLab/DSView
$ cd DSView

$ cd libsigrok4DSL
$ ./autogen.sh
$ ./configure –prefix=/home/softsim/utils/dsview
或者
PKG_CONFIG_PATH=/home/softsim/utils/dsview/lib/pkgconfig ./configure –prefix=/home/softsim/utils/dsview
$ make
$ make install

$ cd ../libsigrokdecode4DSL
$ ./autogen.sh
$ ./configure –prefix=/home/softsim/utils/dsview
$ make
$ make install

$ cd ../DSView
$ PKG_CONFIG_PATH=/home/softsim/utils/dsview/lib/pkgconfig cmake -DCMAKE_INSTALL_PREFIX:PATH=/home/softsim/utils/dsview .
$ make
$ make install


参考资料
https://github.com/DreamSourceLab/DSView/blob/master/INSTALL

SAM7S64

ARM7TDMI ® ARM ® Thumb ® Processor Core

当SAM7S64复位时, ARM核心处于重启模式,访问外部存储器(通常是ROM), 位于地址0
而SRAM位于 0x20 0000处。

当软件执行 remap命令(往AMC_RCR寄存器的RCB字段写入1), 内部SRAM会自动定位到
0x0处
0 -> F FFFF remap前是Flash, remap后是SRAM
10 0000 -> 1F FFFF Internal Flash
20 0000 -> 2F FFFF Internal SRAM

设备初始化流程

  1. FIQ initialization
  2. Stack setup for ARM supervisor mode
  3. Setup the Embedded Flash Controller
  4. External Clock detection
  5. Main oscillator frequency detection if no external clock detected
  6. Switch Master Clock on Main Oscillator
  7. Copy code into SRAM
  8. C variable initialization
  9. PLL setup: PLL is initialized to generate a 48 MHz clock
  10. Disable of the Watchdog and enable of the user reset

remap前
ROM 0x0000 0000 – 0x23FF FFFF 64M (实际只有8K)
RAM 0x0800 0000 – 0x0FFF FFFF 128M

remap后
Norflash 0x0000 0000 – 0x03FF FFFF 64M (实际584k)
RAM 0x0800 0000 – 0x0FFF FFFF 128M
ROM 0x2000 0000 – 0x23FF FFFF 64M

芯片上电后是从 8k ROM (地址0开始) 启动,在 ROM 启动程序中,将会判断 跳转地址
0x20144800(此时 NORFLASH 起始地址为 0x2000 0000)中的跳转判断字符,若该地
址读出字符为 0x55,则当前程序将会向系统重映射寄存器写入 0x00000001,进
行系统重映射,并在重映射之后进行软复位(系统不断电复位),arm 核将从
NORFLASH 读取第一条指令开始执行程序。此时 NORFLASH 起始地址映射到
0x00000000,程序开始运行。


如果芯片在 8k ROM 启动程序中未进行地址重映射,程序将会进入 7816 接口
hex 下载模式,hex 文件转换为符合 7816 协议数据格式,将 hex 数据下载入
NORFLASH 中(其中将会进行 flash 擦除、写入、读出 crc 校验、写入跳转判断 0x55
操作),不同操作类型由 APDU 头和 Lc 数据组成。


智能卡COS操作系统,目前主要有两种下载方式:一种是把已经经过验证的COS直接通过掩膜的方式,在生产过程中固化到智能卡芯片的只读存储器ROM中;另一种是芯片生产结束后,通过ROM中的Boot Loader将COS下载到智能卡中的Flash、EEPROM等非易失储存器中。相比于COS固化在ROM中COS不会被恶意修改的优势,采用Boot Loader下载COS的方式使COS具有更大的灵活性,避免修改掩膜周期长的麻烦,在市场上更具竞争优势。

实际生产中,需要把COS数据提供给厂商,由厂商来生产SIM模块或卡产品。如果把从芯片供应商处订购的芯片和委托方的COS程序直接提供给厂商生产,可能存在厂商将芯片用作其它用途的风险。厂商获得COS程序直接找芯片供应商订购芯片,下载COS程序后即可出售,会直接损害委托方和使用者的利益。因此,在制卡过程中如何从技术手段保证COS程序下载到芯片的安全,是现有技术需要解决的一个重要问题。

目前常用的COS数据的加解密方案是,加密机方案或软件加解密方案。其中,加密机方案较为成熟,但其成本高昂;软件加解密方案不便于对密钥的管理,且容易泄露密钥,安全性极差。


Parallel Input/Output Controller (PIO) 并行IO控制器

连接 USART 的引脚可与 PIO 线复用。必须先对 PIO 编程以将 USART 引脚分配到期望的外设功能。若 USART 的 I/O 线未使用, PIO 控制器可将其用作其它功能

当USART功能关闭是,为了防止TXD管脚变为低电平,需要使用一个内部上拉。
如果硬件握手功能启用,或者使用modem模式,也需要使用内部上拉。

USART中断线与高级中断控制器的一个内部中断源连接。 使用USART中断请求前要先对AIC编程。注意,边沿敏感模式下不推荐使用 USART 中断线。

USART有一个与ISO7816兼容模式。该模式允许与智能卡连接并可通过ISO7816链接与安全访问模块 (SAM) 通信。支持 ISO7816 规范定义的 T = 0 与 T = 1 协议。

将 US_MR 寄存器 USART_MODE 域写 0x4,将设置 USART 在 ISO7816 的 T = 0 模式下工作;若 USART_MODE 域写 0x5,则 USART 在 ISO7816 的 T = 1 模式下工作。

ISO7816为一条双向线的半双工通信。波特率由远程器件(读卡器/modem)提供的时钟分频提供.

USART 与智能卡的连接见下图。 TXD 线变为双向, 波特率发生器由 SCK 引脚向 ISO7816提供时钟。由于 TXD 引脚变为双向,其输出还是由发送器输出驱动,但只有当发送器激活 时,其输入被重定向为接收器的输入。(也就是说,发送器激活时,输入到了RXD线上)
由于 USART 产生时钟,因此它被视为通信的主设备。

The TXD line becomes bidirectional and the Baud Rate Generator feeds the ISO7816 clock on the SCK pin. As the TXD pin becomes idirectional, its output remains driven by the output of the transmitter but only when the transmitter is active while its input is directed to the input of the receiver. The USART is considered as the master of the communication as it generates the clock.

当设置为7816模式是, 字符格式固定。不管 CHRL、 MODE9、 PAR
及 CHMODE 域中是什么值,其配置始终万为 8 位数据位,偶检验及 1 或 2 位停止位。 MSBF 可设置发送是高位在先还是低位在先。奇偶校验 (PAR)可以用普通模式或者 反相模式.

由于通信不是双向的,USART 不能同时在发送器与接收器模式下操作。因而必须根据需要使能或禁用接收器/发送器。 ISO7816 模式下同时使能发送器与接收器结果无法预知。

keil ulink

ULINK2 根据PID分为两个可用固件版本:2720 或者 2722

lsusb 可以看到

Bus 001 Device 011: ID c251:2720 Keil Software, Inc. 4-Port USB 2.0 Hub


2720
ULINK2 固件版本为 1.42 或者更低

ULINK2 固件版本为 2.00 或者更高,但是 用UL2_Configure工具配置成了 ulink boot模式

同 MDK-ARM V4.60 之前的版本兼容

2722
ULINK2 固件版本为 2.00 或者更高, 配置成了CMSIS-DAP兼容模式, 默认的boot模式也是 CMSIS-DAP


2727
没有固件,只有bootloader


CMSIS-DAP is the interface firmware for a Debug Unit that connects the Debug Port to USB. Debuggers, which execute on a host computer, connect via USB to the Debug Unit and to the Device that runs the application software. The Debug Unit connects via JTAG or SW to the target Device. ARM Cortex processors provide the CoreSight Debug and Trace Unit. CMSIS-DAP supports target devices that contain one or more Cortex processors.

CMSIS-DAP can be used with:

MDK-ARM V4.54. (or later).
The Debug Unit in use must support the Firmware for the CoreSight Debug Access Port (CMSIS-DAP). The firmware gets implemented by the vendor of the device or debug adapter.
CMSIS-DAP firmware needs to be version V1.10 or newer to support SWO trace. Verify the firmware in CMSIS-DAP JTAG/SW Adapter.

ULINK2 and ULINK-ME firmware updates have always been backward compatible to all previous µVision versions but unfortunately firmware version 2.01 is an exception. The firmware version 2.01 and later is now CMSIS-DAP compatible by default.

ATSAM3S4B

ARM Cortex-M3 主频可至64MHz
256 Kbytes 内置 Flash
48 Kbytes 静态 SRAM

The SRAM is accessible over System Cortex-M3 bus at address 0x2000 0000

16 Kbytes ROM( UART, USB驱动和在线应用升级IAP)

调试器开发支持:
1. Serial Wire/JTAG Debug Port(SWJ-DP)
Serial Wire Debug Port (SW-DP) and Serial Wire JTAG Debug Port (SWJ-DP) debug access.

  1. 访问所有的内存和系统的寄存器
    当内核处于 运行,挂起,或者 reset暂停 状态时,寄存器都可以访问
  2. Flash Patch and Breakpoint (FPB) unit for implementing breakpoints and code patches.
  3. Data Watchpoint and Trace (DWT) unit for implementing watchpoints, data tracing, and system profiling.
  4. Instrumentation Trace Macrocell (ITM) for support of printf style debugging.
  5. IEEE1149.1 JTAG Boundary-scan on all digital pins.

在SRAM中执行代码

  1. 实现升级程序时, 此时Flash被擦除或者写入,不能执行代码
  2. 调试功能是,代码下载到SRAM中更快,且不会频繁写FLASH,造成Flash过快损耗。

https://community.arm.com/developer/tools-software/tools/f/armds-forum/992/cortex-m3-execution-code-from-ram-during-flash-programming/2971

https://community.arm.com/developer/tools-software/tools/f/keil-forum/30830/executing-code-from-sram

https://community.arm.com/developer/tools-software/tools/f/keil-forum/31659/no-jlink-algorithm-for-cortex-sram

使用keil的LOAD命令
http://www.keil.com/support/man/docs/uv4/uv4_cm_load.htm

https://stackoverflow.com/questions/42612329/executing-code-from-ram-in-stm32


https://studio.segger.com/index.htm?https://studio.segger.com/ide_section_placement.htm

These are the steps needed to get the whole application placed in RAM, and to get it to run as expected in RAM.

Get data (read/write and constant) and code linked to be placed in RAM.
Place the Vector Table in RAM (with at least the alignment forced by the Cortex-M design.)
During C-start-up, set VTOR to the address of the Vector Table.

两种方法

Place CODE and DATA in RAM.

Use the “edit”-button (or change directory in your .icf file) at Project > Options > Linker > Config to open the window “Linker configuration file editor”
配置链接器

Go to the tab “memory regions” – copy the value in RAM/start and paste that value in ROM/start – then copy the value in RAM/end and paste it as ROM/end.
修改内存, 把RAM 当成 ROM用

simtrace2使用步骤

0.
apt install libsctp1

  1. 从 https://download.opensuse.org/repositories/network:/osmocom:/latest/Debian_Testing/amd64/ 安装

simtrace2-utils_0.5.2_amd64.deb
libosmo-simtrace2-0_0.52_amd64.deb
libosmosim0_1.3.1_amd64.deb
libosmocore12_1.3.1_amd64.deb
libosmogsm13_1.3.1_amd64.deb

也可以将 lib 解压缩指定的目录

export LD_LIBRARY_PATH=/dev/shm/y/cc/usr/lib

3.运行
./simtrace2-list
USB matches: 2
1d50:60e3 Addr=22, Path=1-3.4, Cfg=1, Intf=0, Alt=0: 255/1/0 (SIMtrace Sniffer)
1d50:60e3 Addr=22, Path=1-3.4, Cfg=2, Intf=0, Alt=0: 255/255/0 (0.5.1.37-ede8)

JTAG管脚定义

Test Clock Input (TCK) 为TAP的操作提供一个独立的时钟信号
Test Mode Select(TMS) 测试模式选择, 在TCK的上升沿有效,用来控制TAP状态机的转换
Test Data Input (TDI) 是数据输入的接口。所有输入到特定寄存器的数据,都是通过TDI接口,一位一位串行输入的.
Test Data Output (TDO) 数据输出的接口。 所有要求从特定寄存器读出的数据,都是通过TDO接口串行输出的。

VTREF 接口参考电平,一般直接接在VSupply上。

Test Reset Input 测试复位输入。 TRST用来对TAP控制器复位。但是TMS也可以对TAP复位,所以这个管脚可以不要。

Return Test Clock (RTCK) 目标端反馈给emulator的时钟信号,用来通过TCK 信号的产生,不用时 接地。

System Reset (nSRST), 对目标系统复位。

==================
因为JTAG经常用排线连接,为了更好的抗干扰,就在每条线间,加了地线。