作者归档:softsim

iOs开发命令行程序

Virtualbox虚拟机导入 macOS Catalina Final Version by Geekrar的vmdk
app store下载安装XCode

xcrun --sdk iphoneos --find clang
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang



xcrun --sdk iphoneos --show-sdk-path
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk

编译命令

clang -arch armv7s -mios-version-min=7.0   imei.im -o imei \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk  \
-framework Foundation  -framework CoreTelephony

签名

codesign -s 'iPhone Develoer' ./path/to/binary

Android CarrierConfigManager和CarrierService

将运营商 ID 与 CarrierConfig 集成
从 Android 10 开始,运营商配置支持将运营商 ID 用作密钥,从 CarrierService 获取运营商专属配置。

将运营商 ID 与 CarrierConfig 集成具有以下优势:

将每个运营商的所有 MCC/MNC 对整合到一个位置,从而移除重复或不一致的数据。
为每个运营商创建规范标识符并消除歧义。

允许使用单个 ID 标识移动虚拟网络运营商 (MVNO),而不是将配置作为移动网络运营商 (MNO) 的一部分。

final CarrierConfigManager configManager = (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);

PersistableBundle b = configManager.getConfig();
b.putBoolean(KEY_PREFER_2G_BOOL, false);

b.putBoolean(KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL, true);

v4.putBoolean(“prefer_2g_bool”, false);
v4.putBoolean(“carrier_settings_enable_bool”, true);
v4.putBoolean(“carrier_allow_turnoff_ims_bool”, false);
v4.putBoolean(“carrier_wfc_ims_available_bool”, true);
v4.putBoolean(“display_hd_audio_property_bool”, true);
v4.putBoolean(“editable_enhanced_4g_lte_bool”, true);
v4.putBoolean(“carrier_volte_available_bool”, true);
v4.putBoolean(“carrier_volte_provisioning_required_bool”, false);
v4.putBoolean(“carrier_volte_provisioned_bool”, true);
v4.putBoolean(“carrier_vt_available_bool”, true);
v4.putBoolean(“carrier_volte_tty_supported_bool”, false);
v4.putBoolean(“hide_enhanced_4g_lte_bool”, false);
v4.putBoolean(“carrier_wfc_supports_wifi_only_bool”, true);
v4.putBoolean(“allow_adding_apns_bool”, true);
v4.putBoolean(“apn_expand_bool”, true);
v4.putBoolean(“carrier_ims_gba_required_bool”, false);
v4.putBoolean(“require_entitlement_checks_bool”, false);
v4.putBoolean(“hide_ims_apn_bool”, false);
v4.putInt(“volte_replacement_rat_int”, 0);
v4.putBoolean(“carrier_use_ims_first_for_emergency_bool”, true);
v4.putBoolean(“auto_retry_enabled_bool”, true);
v4.putBoolean(“world_phone_bool”, true);
v4.putBoolean(“carrier_ut_provisioning_required_bool”, false);
v4.putBoolean(“carrier_supports_ss_over_ut_bool”, false);
v4.putBoolean(“carrier_volte_default_enabled_bool”, true);
v4.putBoolean(“show_ims_registration_status_bool”, true);
v4.putBoolean(“support_manage_ims_conference_call_bool”, true);
v4.putBoolean(“support_ims_conference_call_bool”, true);
v4.putBoolean(“support_video_conference_call_bool”, true);
v4.putBoolean(“enhanced_4g_lte_on_by_default_bool”, true);
v4.putBoolean(“editable_wfc_mode_bool”, true);
v4.putBoolean(“emergency_sms_support_bool”, false);
v4.putBoolean(“notify_handover_video_from_wifi_to_lte_bool”, true);
v4.putBoolean(“notify_handover_video_from_lte_to_wifi_bool”, true);
v4.putBoolean(“support_downgrade_vt_to_audio_bool”, true);
v4.putInt(“carrier_default_wfc_ims_mode_int”, 1);
v4.putInt(“carrier_default_wfc_ims_roaming_mode_int”, 1);
v4.putBoolean(“carrier_default_wfc_ims_enabled_bool”, true);
v4.putBoolean(“carrier_default_wfc_ims_roaming_enabled_bool”, true);
v4.putBoolean(“carrier_promote_wfc_on_call_fail_bool”, true);
v4.putBoolean(“carrier_volte_override_wfc_provisioning_bool”, true);
v4.putBoolean(“allow_emergency_video_calls_bool”, false);
v4.putBoolean(“editable_wfc_roaming_mode_bool”, true);
v4.putBoolean(“carrier_config_applied_bool”, true);
v4.putStringArray(“carrier_wlan_disallowed_apn_types_string_array”, new String[]{“”});
v4.putStringArray(“carrier_wwan_disallowed_apn_types_string_array”, new String[]{“”});
v4.putBoolean(“hide_preset_apn_details_bool”, false);
v4.putStringArray(“read_only_apn_types_string_array”, new String[]{“”});
v4.putStringArray(“read_only_apn_fields_string_array”, new String[]{“”});
v4.putStringArray(“apn_settings_default_apn_types_string_array”, new String[]{“”});

Toolkit Applet

普通Java Card applet和Tookit applet的区别是,后者不直接处理APDU. 它只处理高层级的消息(事件)。

另外,后者一个方法(java method)的执行,能够跨越多个APDU(Fetch, Terminal Resposne等主动命令)。

并且,Tookiet applet 的触发,不会调用 select()方法,只会调用processTookit()

EVENT_EVENT_DOWNLOAD_CALL_DISCONNECTED
EVENT_EVENT_DOWNLOAD_LOCATION_STATUS
EVENT_EVENT_DOWNLOAD_DATA_AVAILABLE
EVENT_EVENT_DOWNLOAD_ACCESS_TECHNOLOGY_CHANGE
EVENT_UNRECOGNIZED_ENVELOPE

Java Card Tookit相关对象
1. ProactiveHandler
1) 在 Terminal Profile 命令被CAT运行环境处理之前, ProactiveHandler对象不可用。
2) 如果 ProactiveHandler对象 可用,它将一直保持可用,直到processToolkit()方法结束
3)ProactiveHandler不可用, 主动命令将被挂起
4) 调用 proHdlr.init()方法,将会清除 主动命令的内容,然后再初始化

  1. EnvelopeHandler
    1) 在 processToolkit()方法的调用 到结束的过程中,如果 EnvelopeHandler 可用,将在整个过程中保持可用。
    2) 它的TLV列表,是用 ENVELOPE 命令的APDU里的简单TLV数据对象填充的,并且保持原有的顺序。

TERMINAL PROFILE

uicc初始化过程中 , 终端回发送 profile download命令给uicc

如果支持 s 级,只要 通过 modem接口 访问 CAT功能的已连接实体  连接/端口/改变profile ,都会发送profile download指令。

过程定义在  ETSI TS 102.221 (Smart Cards; UICC-Terminal interface;Physical and logical characteristics) 规范中。

这个过程让UICC知道 终端有哪些能力,然后UICC决定使用那些终端可以支持的CAT指令。

如果终端不发送profile download指令,那么UICC应该认为终端不支持CAT.

80 10 00 00 23
10
FF FF FF FF -7F 9F- 00- DF FF 00 00 1F E2 08 11 06
C7 C0 00 00 00 00 40 00 51 00 00 00 00 18 00 00
03 00 00
91 0E

1个字节(下载能力)

Call Control by NAA

USSD string data object support in Call Contrl by USIM

Timer expiration

SMS-PP data download

Menu selection

Cell Broadcatst data download

SMS-PP data download

Profile download

第2个字节

Display text

UCS2 Display suported

UCS2 Enctry supported

Call Control by NAA

MO short message control support

Call Control by NAA

Call Control by NAA

Command result

第3个字节(Proactive UICC)

Refresh

Polling Off

Poll Interval

Play Tone

More Time

Get Input

Get InKey

Display Text

第4个字节(Proactive UICC)

Provide Local Information (NMR)  —此功能不支持

Provide Local Information(MCC, MNC, LAC, Cell Id, IMEI)

Set Up MENU

Set Up CALL

Send USSD

Send SS

Send Short Message with 3GPP SMS TPDU

Select Item

0111 1111

第5个字节(事件驱动信息)

Card reader status事件

Idle screen avaiable事件 (不支持)

User activity  (不支持)

Location status

Call disconnected

Call connected

MT Call

Proactive UICC: Set UP Event List

1001 1111

第6字节(事件驱动信息扩展)

Language Selection

Broswer Termination( “ac”被支持)

Data avaiable

Channel status

Access Technolopy Change

Disaplay parameters changes

Local Connection

Network Search Mode Change

全不支持

第7个字节(为 class a的Multi card proactive commands)

Power On Card

Power Off Card

Perform Card APDU

Get Reader Status(card reader status)

Get Reader Status(card reader identifier)

RFU=0

第8个字节 (Proactive UICC)

Call Control by NAA (Network Access Application)

Setup Call

Run AT Command(也就是b class被支持 )   (此功能不支持)

Setup Idel Mode text

Get InKey

Proactive UICC: Provider Local Infromation(date/time/timezone)

Proactive UICC: Timer Management(get current value)

Proactive UICC: Timer Management(start/stop)

1101 1111

第9字节

Proactive UICC:  Provide Local Information(Access Technology)

Proactive UICC:   Lanch Browser( class “ab” 支持)

Proactive UICC:   Language Notification

Proactive UICC:  Provide Local Information (Timing Advance)

Proactive UICC:  Provide Local Information (language)

Proactive UICC: Provide Local Information (NMR)

Send DTMF command

Display Text

第10字节 (软键盘支持)

RFU=0

RFU=0

RFU=0

RFU=0

RFU=0

RFU=0

Soft Key支持:Select Item

Soft Key支持: Setup Menu

第11字节(soft key info)

第12字节 (BIP proactive commands)

Proactive UICC: Declare Service  (不支持)

Proactive UICC: Get Service Information (不支持)

Proactive UICC: Service Search  (不支持)

Proactive UICC: Get Channel Status

Proactive UICC: Send Data

Proactive UICC: Receive Data

Proactive UICC: Close Channel

Proactive UICC: Open Channel

0001 1111

第13字节: (BIP支持的bearers)

b8-b6 = 终端支持的通道数

RS232

IrDA

Bluetooth

GPRS

CSD

1110 0010 也就是,支持的通道数为8, 仅支持GPRS

第14字节:(屏幕高度)

第15字节:(屏幕宽度)

第16字节: (屏幕效果)

第17字节: (BIP支持的传输接口/承载)

HSDPA

E-UTRAN

直接通信通道

UDP(UICC处于客户模式,本地连接)

TCP(UICC处于客户模式,本地连接)

TCP(UICC服务器模式)

UDP(UICC客户模式,远程连接)

TCP(UICC客户模式,远程连接)

第18字节:

Proactive UICC:  Provide Local Information(Search Mode Change)

第19字节: TIA/EIA-136-270 设施

第20字节:  3GPP2 C.S0035-B CCAT

CDMA CSIM应用

第21字节: 浏览器能力

b8-b5  RFU=0

CHTML

HTML

XHMTL

WML

第35字节:

b8-b5 RFU=0

Refresh with “Application Update” mode

Data conection Status Change Event support-PDN Connection

Data conection Status Change Event support-PDP Connection

Proactive UICC: GET INPUT (Variable Time out)


80 12 00 00 0E
12

D0 (Proactive UICC command tag)

0C   (command length)

81 (Command details tag) 03   01 (Command number) 05(SET UP EVENT LIST) 00 (Command Qualifier=RFU)

82 (Device identity tag)02 81 (UICC) 82(terminal)

99 (Event list tag) 01 03 (Location status)
90 00


80 14 00 00 0C
14
81 (Command details) 03 01 05(set up event) 00

02(Device identities)02 82(terminal) 81 (UICC)

83 (Result)01 00
90 00

表示  set up event list 命令,成功执行

参考:TS 102.223  第98页 Structure of TERMINAL RESPONSE


80 C2 00 00 17
C2
D6 (Event download)15

99 (Event list)01 03 (location status)

82 (Device identity)02 82 (terminal) 81 (uicc)

9B (Location status) 01 00 (Normal Service)

93 09

64 F0 00  70 CE (TAC)  F1 41 38 1F(Cell Id)
91 12

80 12 00 00 12
12
D0 (Proactive UICC command )10

81 (Command details)03 01 (Command number)   21 (Command Type=display text) 80 ( 1000 0000)

82 (Device identity)02 81 02

8D (Text string) 05    48 65 6C 6C 6F
90 00

bit 8 = 1 wait for user to clear message

bit 1 = 0 normal priority


80 C2 00 00 17
C2
D6 15

99 01 03

82 02 82 81

9B 01 00

93 09

64 F0 (MCC) 00 (MNC) 70 CE(LAC/TAC) F1 45 28 1F (Cell Id)
90 00


80 14 00 00 0C
14
81 ( (Command details) 03 01 21(display tex) 80

82 (Device identities)02 82 81

83 (result)01 00

90 00

报告显示文字任务,成功执行

stk事件

EVENT_PROFILE_DOWNLOAD 获取移动设备的能力
EVENT_STATUS_COMMAND 当移动设备份发送STATUS命令,得到触发
EVENT_UNRECOGNIZED_ENVELOPE 处理未定义的事件,将来升级用
EVENT_FORMATTED_SMS_PP_ENV 处理来自网络的SMS-PP消息
EVENT_FORMATEDD_SMS_PP_UPD
EVENT_UNFORMATTED_SMS_PP_ENV
EVENT_UNFORMATTED_SMS_PP_UPD
EVENT_UNFORMATTED_SMS_CB
EVENT_FORMATTED_SMS_CB
EVENT_FORMATTED_USSD
EVENT_UNFORMATTED_USSD
EVENT_TIMER_EXPIRATION
EVENT_CALL_CONTROL_BY_NAA
EVENT_MO_SHORT_MESSAGE_CONTROL_BY_NAA
EVENT_EVENT_DOWNLOAD_
_MT_CALL
_CALL_CONNNECTED
_CALL_DISCONNECTED
_LOCATION_STATUS
_USER_ACTIVITY
_IDEL_SCREEN_AVAILABLE
_CARD_READER_STATUS
_LANGUAGE_SELECTION
_BROWSER_TERMINATION
_DATA_AVAILABLE
_CHANNEL_STATUS
_ACCESS_TECHNOLOGY_CHANGE
_DISPLAY_PARAMETER_CHANGED
_LOCAL_CONNECTION
_NETWORK_SEARCH_MODE_CHANGE
_BROWSING_STATUS
_IWLAN_ACCESS_STATUS
EVENT_PROACTIVE_HANDLER_AVAILABLE
EVENT_EXTERNAL_FILE_UPDATE
EVENT_APPLICATION_DESELECT
EVENT_FIRST_COMMAND_AFTER_ATR

移动通信中的Java Card标准

ETSI TS 102 241 : Smart cards, UICC Application Programming Interface (UICC API) for Java Card

3GPP TS 31.130 : (U)SIM Application Programming Interface,((U)SIM API) for Java Card

102 241 定义的包
uicc.access
访问UICC文件系统
uicc.access.fileadministration
管理UICC文件系统
uicc.system
允许建立 实现TLV handler借口的对象
uicc.toolkit
注册CAT框架时间, 处理TLV信息
按照 TS 102.223规范,发送 主动命令

31.130 定义的包

uicc.usim.access
访问 USIM/SIM中定义的文件

uicc.usim.toolkit
注册USAT/STK中定义的事件
处理TLV信息
按照 3GPP TS 31.111 和 3GPP TS 51.014 规范,发送主动命令


Card Application Toolkit (CAT) 和 USIM Application Toolkit
(USAT)

Card Application Toolkit (CAT) 定义在 ETSI TS 102 223
USIM Application Toolkit (USAT)定义在 3GPP TS 31.111.

stk命令交互只能在主通道

平台到平台APDU通道仅应在逻辑通道0上建立,并且当平台到平台安全通道处于活动状态时,UICC应当拒绝任何其他逻辑通道上的APDU。 加密的APDU净荷中应该可以使用逻辑信道。
同时,“应用程序对应用程序-APDU安全”通道无法保护主动命令(根据标准在逻辑通道0上发送),因为它只能保护非0逻辑通道,即除逻辑通道0之外的任何逻辑通道。

Secure Element 的访问不能使用 逻辑通道0, 因为这是给电信应用(sim/usim app)使用的

CAT会话,起始于 TERMINAL PPROFILE命令,终止于 卡的复位/去激活

在开始CAT会话时, 卡执行下面的行为:
1. 它由任意一个注册了 TERMINAL PROFILE事件的 applet的触发。
2. 如果至少有一个菜单项目注册,并被一个可选中的Toolkit Applet启用, 它就发送一个 SET UP MENU 主动命令。
3. 如果至少一个EVENT_EVENT_DOWNLOAD_*被注册,它 发送 SET UP EVENT LIST主动命令
4. 如果至少有一个applet请求轮询 interval duration, 那么,他就发送 POLL INTERVAL主动命令。 这会让ME调整 空闲时 发送STATUS命令的间隔。


Toolkit Applet 比 普通Applet多了一些功能, 也就是实现了 uicc.toolkit.ToolkitInterface的一些接口。必须实现processToolkit()方法


当sim卡收到一个APDU时, 转换器 将 它转换成 对应的事件。
触发器(Triggering Entity)向 Toolkit Registry是否有Toolkit Applet注册到这个事件,然后通过调用 ToolkitInterface对象的processToolkit()方法来 触发所有注册了该事件的Toolkit Applets.

在普通applet和Toolkit Applet之间的区别是Tookit Applet不直接处理APDU
select()方法也不会启动。 因为 Toolkit Applet自己不会被选择。

实际上,
1. CAT运行环境,调用Toolkit Applet的getShareableInterfaceObject()方法
来 取得 ToolkitInterface对象的引用。
在Toolkit Applet的第1次触发前,调用此方法。
getShareableInterfaceObject()的AID参数被设置为null, 字节参数被设置为 1

2.CAT运行环境,调用 ToolkitInterface对象的processToolkit() 来触发Applet

在Applet被触发时,如果EnvelopeHandler可用,用它来获取事件的细节。
如果 ProactiveHandler 可用,它可以请求CAT运行环境去发送几个主动命令,并通过ProactiveHandler来分析 UE(Terminall Response)响应。

对于某些特定的事件,EnvelopeResponseHandler也可用来传输applet对终端命令的响应。

FCP和FCI以及FMD

FCP (File Control Parameters)
FCI (File Control Information)
FMD (File Management Data)

在ISO7816-4中定义了一些 重要的数据对象(Data Objects)

TAG 数据对象名称 描述
62 FCP模板 FCP模板含有FCP
64 FMD模板 FMD模板含有FMD
6F FCI模板 FCI模板含有FCP和FMD

在ISO 7816标准中
P2 = 0 返回 FCI
= 4 返回 FCP
= 8 返回 FMD

但在 ETSI TS 102.221 中 只有
P2 = 4 返回 FCP
P2 = C 不返回数据

62 2F
82 02 78 (共享的DF文件) 21
84 10 A0000000871002FF86FF0389FFFFFFFF
8A 01 05
8B 03 2F060D
C6 0F
90 01 E0
95 01 00
83 01 11
83 01 01
83 01 81

62 1A
82 02 38 (不共享的DF文件) 21 文件描述符号
83 02 00 00 文件标识符 为 00 00
8A 01 00 生命周期
8C 02 20 00
C6 09 PIN状态
90 01 00
83 01 00
83 01 00

6F 0B
84(文件名称) 09 A00000015141434C00


MF/DF/ADF的FCP
82 文件描述符
83 文件标识符
84 文件名称(DF Name或者AID)
8A 生命周期状态(Life Cycle Status Integer)
8B/8C 安全属性
C6 PIN状态
81 总共的字节书

sim卡通信速率

ATR中的TA1表示速率

TA1 = 11, 13440 bps
TA1 = 91, 9765 bps
TA1 = 94 78.125kbps 中国电信/中国联通的卡片默认速率
TA1 = 95 156.25kbps 中国移动/淘宝买的华虹COS的USIM/CSIM卡
TA1 = 96 312.5kbps Sysmocom USIM SJS1

以上是 fMax for Fi = 5 MHz,情况下,卡片可支持的最高速率

参考资料:
https://ludovicrousseau.blogspot.com/2016/04/atr-statistics-ta1-global-encodes-fi.html

中国电信 起始速率 12.9kbps (12903 bps), 协商后为 75 kbps
TA(1) = 94 –> Fi=512, Di=8, 64 cycles/ETU^M
62500 bits/s at 4 MHz, fMax for Fi = 5 MHz => 78125 bits/s^M

75k*64=4.8M


中国移动,协商速率 150 kbps

150k*32=4.8M 说明Modem(EC20 R2)给SIM的时钟频率是 4.8MHz的
其实默认速率是 4800000/372=12903

TA(1) = 95 –> Fi=512, Di=16, 32 cycles/ETU
125000 bits/s at 4 MHz, fMax for Fi = 5 MHz => 156250 bits/s


TA(1) = 96 –> Fi=512, Di=32, 16 cycles/ETU
250000 bits/s at 4 MHz, fMax for Fi = 5 MHz => 312500 bits/s

读卡器跑到 300kbps

GlobalPlatform Device Access API

  1. AID
    Executable Load File AID ‘A000000151444143’
    Executable Module AID ‘A00000015144414300’
    Application AID ‘A00000015144414300’

但是,如果 ARA-D (Access Rule Application for Device API Access Control)
与 ARA-M (Access Rule Application Master) 一起部署,并且 ARA-D与 ARA-M用同一个可执行加载文件, 那么 它将 共享 ARA-M 的Executable Load File AID, 也就是’A00000015141434C’

  1. 三种权限
    仅MNO
    仅OEM
    MNO/OEM共享

  2. DeviceAppID
    在Android上,就是 证书的签名 + 包名

  3. 用 GET DATA 的APDU命令,来获取访问规则