作者归档:softsim

智能卡cos开发的一些传说

某位大神(微信号:smarticcard)说:

上个世纪90年代初期曾经在一家中字头的公司工作过,当时的主要任务就是开发智能卡COS。和摩托罗拉、德州仪器等芯片公司接触颇多。印象比较深的是
当时还和著名的王爱英教授有过交流,王教授领导手下的研究生也开发了一款COS,但是苦于没有市场应用,4K的程序代码,能够完成基本的文件管理
和安全管理。王教授开价5万转让,沟通了几次最后没有谈成。

...
在这个时期CPU卡的价格维持在几十元人民币。包括金普斯(Gemplus)、捷德(G&D)、布尔(雅斯拓)、欧伽(ORGA)、飞利浦等国外公司的CPU卡
产品价格也都非常高。
...

随着CPU卡市场的逐渐普及,部分卡商也开始开发自己的COS。明华、航天、东信和平等原来更多地注重卡片封装生产的卡厂转而投入到COS开发的队伍当中。另外
像长城计算机等一些原来使用CPU卡进行系统集成开发的公司也加入到COS开发的行列,还有像武汉天喻这样的公司在成立之初就瞄准了COS开发。

越来越多的国内公司开发出了自己的COS产品,国外的公司也没有袖手旁观,捷德、金普斯等开始在国内建立研发团队针对中国市场开发COS产品。

到2000年前后,国产COS已经占据一定的市场份额,这时CPU卡的价格也跟随着下降。再加上部分国产CPU卡芯片也进入市场,所以CPU卡诱人的高利逐步降低。
2002年原雅斯拓的部分人员成立上海科斯,以迅雷不及掩耳之势同时获得中国移动和中国联通的入围资格,让众多还在为如何获得移动或者联通SIM卡入围
资格而苦思冥想的国内厂商惊诧不已。(像江苏恒宝这样的企业也是因为前一段时间收购了凤凰微电子手中的东方英卡股份才获得入围中国移动的资格。)

....


对于GSM的SIM卡因为没有合法获得A3A8算法的渠道,所以国内的厂商几乎没有自己开发SIM卡COS的,部分入围SIM卡的国内厂商也是直接从国外公司进口SIM卡
的模块,然后进行卡片封装。

国外的厂商比如斯伦贝谢(PayFlex)、金普斯(MPCos)、捷德(StarCOS)都力推自己的产品,而国内当时唯一成型的COS厂商握奇也在推广自己
的TimeCOS1.0。另外一家国内的COS厂商卡斯特也在物美集团下属的超市推广自己的产品。
......


到1977年才有三家公司参与智能卡的开发,那就是布尔(Bull)、斯伦贝谢(Schlumberger)以及SGS汤姆逊(SGS-Thomson),现在说来已经是三十年前的事情了。

1988年从SGS汤姆逊公司出来了5个员工,单打锣鼓另开张,创立了金普斯(Gemplus),并且为法国电信市场提供巨量的电话卡,从此一发而不可收,并且于1995年收购了Datacard集团位于欧洲和美国的卡片生产部门。

布尔为了强化智能卡市场也成立了独资公司就是著名的Bull CP8。但是布尔CP8因为整个布尔集团的结构策略调整而于2001年以3.5亿欧元的价格卖给了斯伦贝谢。

后来斯伦贝谢又将智能卡业务部门独立出来成立了雅斯拓(Axalto)。

从此雅斯拓和金普斯就成为整个智能卡行业的领头羊。分别提供各种行业的智能卡产品和终端机具,以及个性化服务和整体解决方案。

随着竞争的加剧,利润水平逐渐降低,这两个老大终于坐到了一起,从竞争转而开始讨论合并。并且历时一年左右的时间终于完成了合并,新的公司取名为“Gemalto”,中文翻译为“金雅拓”。为此削减了大量的冗余人员,降低了运营成本。

AT+CSIM(通用SIM访问命令)

3rd Generation Partnership Project; Technical Specification Group Core Network and Terminals;
AT command set for User Equipment (UE)
TS27.007

将命令APDU通过modem传递给SIM卡,然会返回响应APDU
这个命令,允许使用任意的APDU(但是 逻辑通道管理, 以及选择AID等命令, 可能会被AT命令实现,而不是用APDU: +CCHO=aid )

命令格式:

+CSIM=<length>,<command>

响应:

+CSIM: <length>,<response>

实战

红米6A,  一个终端运行
cat  /dev/pts/6


另外一个终端运行 (10是长度,是所有APDU命令的字符长度)
echo -e 'AT+CSIM=10,"A020000100"\r\n' > /dev/pts/6

AT+CSIM=14,"A0A40000027F20" 
AT+CSIM=42,"A088000010FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
选择7FF0 echo -e 'AT+CSIM=14,"00A4000C027FF0"\r\n' > /dev/pts/6 运行鉴权算法


一加5T

cat /dev/at_mdm0

echo   -c  'AT\r\n'      > /dev/at_mdm0 
echo  -c  'AT+CGSN\r\n' > /dev/at_mdm0
 echo  -c  'AT+CSIM=26,"0020000A083935323739353237"\r\n' > /dev/at_mdm0
回应
+CME ERROR: operation not supported



高通芯片不支持AT+CSIM, 但是对AT+CRSM支持得比较好

比如读ICCID

echo -c 'AT+CRSM=176,12258,0,0,10\r\n'  > /dev/at_mdm0

Androd将softsim加入到后台白名单

除了在 设置->电池优化 或者 设置-> 应用程序里 进行设置外

还可以在 adb shell 里调整

$ adb shell dumpsys deviceidle whitelist +com.mediatek.vsim
Added: com.mediatek.vsim

$  adb shell dumpsys deviceidle whitelist +im.softs.softsim
Added: im.softs.softsim

或者
adb shell cmd deviceidle  whitelist +com.mediatek.vsim
adb shell cmd deviceidle  whitelist +im.softs.softsim

从白名单中移除:
adb shell cmd deviceidle whitelist  -com.tencent.mm



查看 adb shell cmd 命令 (在Android N中添加了这个命令, 之前是没有的)

adb shell cmd -l
cactus:/ $ cmd deviceidle whitelist                                                                    
system-excidle,com.android.updater,9802
system-excidle,com.android.providers.downloads,10014
system-excidle,com.android.shell,2000
system-excidle,com.android.deskclock,10096
system,com.android.updater,9802
system,com.android.providers.downloads,10014
system,com.android.shell,2000
system,com.android.deskclock,10096
user,com.android.cts.priv.ctsshim,10006
user,org.simalliance.openmobileapi.uicc2terminal,10064
user,com.miui.contentextension,10030
user,com.miui.fm,10048
user,com.android.providers.calendar,10000
user,com.xiaomi.vipaccount,10052
user,com.android.providers.media,10014
user,com.milink.service,10085
user,com.mobiletools.systemhelper,10094
user,com.xiaomi.account,10075
user,com.android.wallpapercropper,10019
user,com.xiaomi.micloud.sdk,10035
user,com.miui.packageinstaller,10001
user,org.simalliance.openmobileapi.service,10051
user,com.android.documentsui,10021
user,com.android.externalstorage,10031
user,com.mediatek.vsim,10153
user,com.xiaomi.gamecenter.sdk.service,10036
user,com.android.htmlviewer,10084
user,com.miui.securityadd,10060
user,com.android.companiondevicemanager,10103
user,com.miui.gallery,10025
user,com.android.quicksearchbox,10009
user,im.softs.softsim,10152
user,com.android.providers.downloads,10014
user,com.xiaomi.payment,10100
user,com.mediatek.omacp,10080
user,com.android.browser,10033
user,com.android.soundrecorder,10004
user,com.android.defcontainer,10015
user,com.miui.guardprovider,10095
user,com.android.providers.downloads.ui,10014
user,com.android.pacprocessor,10045
user,com.miui.micloudsync,10074
user,com.xiaomi.ab,10073
user,com.android.certinstaller,10063
user,com.android.carrierconfig,10028
user,com.google.android.marvin.talkback,10076
user,com.android.contacts,10003
user,com.miui.hybrid,10065
user,com.mi.webkit.core,10023
user,com.android.mms,10032
user,com.android.mtp,10014
user,com.android.backupconfirm,10039
user,se.dirac.acs,10024
user,com.xiaomi.simactivate.service,10047
user,com.miui.player,10042
user,com.android.statementservice,10011
user,com.android.calendar,10037
user,com.miui.translation.kingsoft,10043
user,com.miui.virtualsim,10107
user,com.miui.compass,10124
user,com.miui.vpnsdkmanager,10057
user,com.android.sharedstoragebackup,10013
user,com.android.printspooler,10078
user,org.simalliance.openmobileapi.uicc1terminal,10097
user,com.miui.personalassistant,10026
user,com.android.dreams.basic,10090
user,com.android.incallui,10007
user,com.fido.xiaomi.uafclient,10059
user,com.fido.asm,10079
user,com.android.bips,10102
user,com.xiaomi.mircs,10034
user,com.miui.translation.youdao,10070
user,com.miui.cloudbackup,10040
user,com.google.android.webview,10050
user,android.ext.shared,10049
user,com.android.onetimeinitializer,10038
user,com.mipay.wallet,10061
user,com.android.camera,10041
user,com.android.printservice.recommendation,10058
user,com.xiaomi.upnp,10071
user,com.xiaomi.xmsf,10077
user,android.ext.services,10027
user,com.android.calllogbackup,10003
user,com.svox.pico,10010
user,com.android.proxyhandler,10016
user,com.miui.notes,10119
user,com.miui.video,10018
user,com.xiaomi.market,10069
user,com.miui.translationservice,10087
user,com.miui.cloudservice,10074
user,com.android.managedprovisioning,10022
user,com.miui.hybrid.accessory,10055
user,com.miui.translation.xmcloud,10099
user,com.sohu.inputmethod.sogou.xiaomi,10098
user,com.xiaomi.providers.appindex,10046
user,com.mediatek.op09clib.telecom,10067
user,com.android.smspush,10093
user,com.miui.calculator,10148
user,com.android.wallpaper.livepicker,10054
user,com.miui.miwallpaper,10081
user,com.miui.securityinputmethod,10068
user,com.xiaomi.metoknlp,10091
user,com.android.storagemanager,10008
user,com.miui.analytics,10088
user,com.miui.weather2,10147
user,com.xiaomi.scanner,10122
user,com.android.cts.ctsshim,10089
user,com.miui.yellowpage,10003
user,com.android.vpndialogs,10017
user,com.mediatek.op01.telecom,10053
user,com.android.email,10117
user,com.miui.voiceassist,10083
user,com.android.providers.blockednumber,10003
user,com.android.providers.userdictionary,10003
user,com.miui.providers.weather,10012
user,com.android.emergency,10020
user,com.miui.greenguard,10101
user,com.android.deskclock,10096
user,com.android.bluetoothmidiservice,10086
user,com.miui.smsextra,10092
user,com.mediatek.mtklogger,10072
user,com.android.thememanager.module,10044
user,com.lbe.security.miui,10005
user,com.android.providers.contacts,10003
user,com.android.captiveportallogin,10062
user,com.mediatek.mtklogger.proxy,10104
user,com.mediatek.dataprotection,10105
user,com.miui.core,10056
user,com.miui.home,10002

还有,appos允许后台运行

adb shell appops set  com.mediatek.vsim RUN_IN_BACKGROUND allow
或者
adb shell cmd appops set  com.mediatek.vsim RUN_IN_BACKGROUND allow
adb shell cmd appops set im.softs.softsim RUN_IN_BACKGROUND allow

查询允许运行在后台

adb shell cmd  appops  query-op  RUN_IN_BACKGROUND allow

禁止后台运行

adb shell cmd appops set com.sina.weibo RUN_IN_BACKGROUND deny
adb shell cmd appops set com.tencent.mm  RUN_IN_BACKGROUND deny




联想手机还有几处设置:
1.安全中心-->内存加速-->设置(右上角图标)-->加速保护名单
2.最近的应用列表:下滑加锁
 3.   电池管理-->电池优化-->待机省电 



几种虚拟卡COS实现的比较

1.红茶移动  (深圳红茶移动科技有限公司/深圳杰睿联科技有限公司)
在Java层面 对 SIM卡文件系统进行建模
对文件系统的访问,转换成对Java对象的访问
底层存储系统基于自建的ByteString对象

2.果通 (Shanghai Gotell Communication Technology Holdings Co., Ltd)
在C层面对SIM卡文件系统建模, 完全是传统的单片机COS源代码移植过来, 将内存的一块区域当成一块Flash存储

3. 二六三移动
在C层面,对APDU进行系统建模,  分fcp和bin 做为 内置数据
广州263已经退出虚拟SIM卡行业

4.小米
在Java层面,对APDU进行建模, 直接返回响应

简评:
设计得最漂亮的是 红茶
支持的最完善的是 果通
二六三设计得最直接,简单有效
最差的是小米

小米的开发人员,对SIM卡理解得还不够,估计是直接逻辑分析仪抓数据后,填的空,
很多响应,莫名奇妙返回901E,  其实那是STK交互, 提示modem卡有Proactive Cmd,它们都没搞明白

MSPL

格式

起始bit   位长  内容                  值      名称               注释
1      16     0000000000001111         15              MSPL_SIZE
17        8     00000001                 1             CUR_MMSS_P_REV
25       16    0000000000000001         1                MSPL_VER_ID
41       8      00000001                 1             NUM_MSPL_ID
49       8      00000001                 1             MSPL_ID
57       8      00000011                 3             NUM_MSPL_RECS

65       8      00000111                 7             SYS_TYPE                     EUTRAN (LTE)
73       4       0000                   0               PRI_CLASS                   HOME Only
77       1         1                    1               SYS_PRI                      More
78       3        000                    0              HIGHER_PRI_SRCH_TIME         1分钟
81      1         0                   0                NETWORK_CAP_IND


82      8         00000100            4                SYS_TYPE                        cdma2000 HRPD
90      4        1111                   15              PRI_CLASS                      Any
94      1        0                     0               SYS_PRI                         Same
95      3        000                    0              HIGHER_PRI_SRCH_TIME           1分钟
98      1        0                     0               NETWORK_CAP_IND

99       8       00000011             3                SYS_TYPE                      cdma2000 1x
107      4       1111                15                 PRI_CLASS                    Any
111      1        0                  0                   SYS_PRI                         Same
112      3        000                 0                  HIGHER_PRI_SRCH_TIME           1分钟
115      1       0                     0               NETWORK_CAP_IND

116      4       0000                   0              RESERVED                          保留将来使用

中国电信2016版MSPL

001B010008020104071F000E007D001E80204071F030F8147C03EE

phone book Index Administration Phone book

文件标识符: 4FXX (由PBR的内容决定)

如果参考文件(EF_PBR)中指示了标签’A9’,则存在该文件

EF包含指向作为电话簿一部分的文件中的不同记录的指针。 指数管理文件记录号/ ID与相应的EF_ADN一对一映射(记录到记录对应)。

该指数管理文件包含与EF_ADN相同数量的记录。

EF_IAP中指针的顺序应为与参考文件记录(PBR)中标签’A9’指示的TLV对象中出现的文件ID的顺序相同。

数量记录中的字节数等于标签’A9’后表示EFPBR的文件数。

值’FF’是无效的记录号/ ID,用于任何位置以表示没有相应的记录指示的文件可用。
在个性化阶段,EF_IAP的内容设置为“FF”。

phone book Change Counter

文件标识符: 4F23
文件大小: 2字节

更改计数器(CC)将用于检测对电话簿所做的更改。每次更新/删除现有电话簿条目或添加新电话簿条目都会导致终端增加EF_CC的值。 拥有CC的概念使得可以在不同的终端更新电话簿,它仍然能够检测到变化(例如,不同手机和/或第二代和第二代之间的不同的终端)。

跟EF_PSC一样, 当且仅当 USIM支持 电话簿同步时, 这个文件必须存在

Phone book Synchronisation Counter

文件标识符: 4F22
文件大小: 4字节

ME(一般是手机)使用电话簿同步计数器(PSC)来构建电话簿标识符(PBID)和确定所访问的电话簿是否与先前访问的电话簿相同或者是否是新的未知的电话簿(可能是DF-telecom下有一个电话簿和USIM ADF下也有一个电话簿)。

如果PSC未知,则将跟随电话簿的完全同步。

PSC还用于重新生成UID并重置CC以防止它们超出范围。 当UID或CC已达到其最大值,生成新的PSC。 这导致了CC和UID都不会超出范围。

如果下列情况之一出现,则终端将重新生成PSC:
1) UID的值已超出范围;
2) 整个电话簿已被重置/删除;
3) CC的值超出范围。

当且仅当 电话本 支持同步时, 这个文件必须存在

基于EF_PSC的Phonebook Identifier(PBID) 编码规则:
DF_Telecom目录下
PBID= ICCid(10字节) + 4字节(EF_PSC)

ADF目录下
PBID=  ICCid XOR AID (10字节) + 4字节(EF_PSC)

android 读取usim中的电话本

aosp/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/

IccConstants接口
DF_PHONEBOOK = “5F3A”;
EF_PBR = 0x4F30;

IccPhoneBookInterfaceManager.java

uicc/UsimFileHandler.java

uicc/AdnRecordCache.java

gsm/UsimPhoneBookManager.java