GPApplication类
GPApplication是表示GlobalPlatform应用的native对象,该应用对象不是正在为其运行脚本的安全域或SecurityDomain卡管理器CardManger应用。编写应用程序脚本时,GPApplication对象作为this对象。
按照ECMAScript规范中的定义,本机对象在ECMAScript程序开始执行时出现。
如果在Application Profile文件中,ApplicationInfo元素的Type和SubType属性的值分别为“GP”和“APP”,则应创建GPApplication对象:
<ApplicationInfo Type=“GP” SubType=”APP” />
GPApplication对象实现了一些方法,这些方法支持GlobalPlatform卡规范v2.1版本以上中的APDU,还提供了一些附加功能,有助于简化涉及这些GlobalPlatform APDU的重复或常见操作。如果存在安全通道,APDU方法将通过安全通道发送。
本文档未详细阐述表示GlobalPlatform卡规范v2.1版本以上中的APDU命令参考中的命令的方法和相关属性,包括属性值和使用的CLA字节。希望读者理解该方法使用的上下文和格式,并提供GlobalPlatform卡规范v2.1要求的属性。
此外,GlobalPlatform脚本解释器的实现是根据GlobalPlatform卡规范v2.1版本以上中的要求做出决策的。这些决定将包括在适当的情况下使用哪个CLA字节,提供的属性值是否有效,以及必须填充和/或计算哪些附加字段才能使命令正常运行。
Constants常量
GPApplication对象没有常量。
Properties成员属性
在标准的GP脚本语言系统中,GPApplication的属性是GP脚本语言系统上下文解析GPApplication Profile文件中定义的各个属性元素初始化而来,在GPTS脚本语言系统中,由应用开发者在脚本片段中实际指定赋值。
Example示例
try
{
function PBOC_EMV_APP()
{
var app = new GPApplication();
app.__proto__ = PBOC_EMV_APP.prototype;
app.$init();
return app;
}
PBOC_EMV_APP.prototype.$init = function()
{
var $2B00000001 = {
profileVersion : "2.0.0",
objVersion : "2.0.1",
profileOID : "20171008021025",
profileID : "0000000001",
owner : "GloablPlatform",
type : Key.SECRET,
subType : Key.DES,
size : 128,
usage : 0 | Key.ENCRYPT | Key.DECRYPT | Key.DECRYPT_ENCRYPT | Key.UNWRAP | Key.WRAP | Key.UNWRAP_WRAP | Key.SIGN | Key.VERIFY | Key.DERIVE,
attribute : 0 | Key.EXPORTABLE | Key.SENSITIVE,
component : {CRT_DP1 : "11223344556677889900",CRT_PQ : "0000000000000000",CRT_DQ1 : "AABBCCDDEEFF1122"}
}
this.key.KMC = new Key($2B00000001);
//this.key.KMC.__proto__ = $2B00000001;
this.key.UDKAC = new Key($2B00000001);
//this.key.UDKAC.__proto__ = $2B00000001;
this.key.KEK = new Key($2B00000001);
//this.key.KEK.__proto__ = $2B00000001;
}
var _proto = PBOC_EMV_APP.prototype;
_proto.__proto__ = GPApplication.prototype;
_proto.$OID = '100000000000000000003';
_proto.profile = { LifeCycles : { LifeCycle : {} } };
var _cycle = _proto.profile.LifeCycles.LifeCycle;
_cycle.INSTALLED = { name : 'INSTALLED', value : 0x03 };
_cycle.SELECTABLE = { name : 'SELECTABLE', value : 0x07 };
_cycle.PERSONALIZED = { name : 'PERSONALIZED', value : 0x0F };
_proto.$$startLifeCycle = {};
_proto.$$endLifeCycle = {};
_proto.$$startLifeCycle.$install = _cycle.LOADED;
_proto.$$endLifeCycle.$install = _cycle.SELECTABLE;
_proto.$$startLifeCycle.$Perso = _cycle.SELECTABLE;
_proto.$$endLifeCycle.$Perso = _cycle.PERSONALIZED;
_proto.$$startLifeCycle.$Audit = _cycle.PERSONALIZED;
_proto.$$endLifeCycle.$Audit = _cycle.PERSONALIZED;
$A000000333010102 = PBOC_EMV_APP();
$A000000333010102.appSpecificInstallParams = new ByteString('00',HEX);
$A000000333010102.privilege = new ByteString('800000',HEX);
$A000000333010102.aid = new ByteString('A000000333010102', HEX)
$A000000333010102.lifeCycle = $A000000333010102.profile.LifeCycles.LifeCycle.LOADED;
$A000000333010102.data.DGI0101 = new ByteString('700C5A0A62220000000000000001',HEX);
Print("AID : " + $A000000333010102.aid);
data = $A000000333010102.data;
keyArray = $A000000333010102.key;
bs = $A000000333010102.key.UDKAC.getProfileOID();
Print("ProfileOID value is : " + bs.toString(ASCII));
app = $A000000333010102;
Print("app.data['DGI0101'] : " + app.data['DGI0101']);
}
catch (e)
{
Print("Exception : " + e.className + "," + e.error + "," + e.reason + "," + e.message);
}
aid
GPApplication.prototype.aid ByteString
aid属性是一个GlobalPlatform脚本语言ByteString对象。
aid属性表示只读、不删除属性。它表示正在执行的脚本的应用程序实例的aid。它是从Card Profile文件的ApplicationInstance子元素填充的。
如果它不可用或不适用,则它将包含空值。
appSpecificInstallParams
GPApplication.prototype.appSpecificInstallParams ByteString
appSpecificInstallParams属性是一种GlobalPlatform脚本语言ByteString对象。
appSpecificInstallParams属性表示只读的不删除属性。它表示正在执行的脚本的应用实例的install命令中使用的安装参数。它是从Card Profile文件的ApplicationInstance子元素填充的。如果它不可用或不适用,那么它将是未定义的。
card
GPApplication.prototype.card Card
card属性是一个GlobalPlatform脚本语言卡对象。
card属性表示只读、不删除属性。在标准的GP脚本语言系统中,Card对象是由GP脚本语言系统上下文集成在Application、GPApplication、GPSecurityDomain中定义的Card对象使用。在GPTS脚本语言系统中,允许单独使用。
crypto
GPApplication.prototype.crypto Crypto
crypto属性是一个GP脚本语言的Crypto对象。
只读,不删除属性。应用程序使用的加密对象。在标准的GP脚本语言系统中,Crypto对象是由GP脚本语言系统上下文集成在Application、GPApplication、GPSecurityDomain中定义的Crypto对象使用。在GPTS脚本语言系统中,允许单独使用。
data[]
GPApplication.protot ype.data[] Object[]
data属性是GlobalPlatform脚本语言ByteString和/或TLV对象的数组。
在标准的GP脚本语言系统中,GPApplication对象创建时,由GP脚本语言系统上下文反序列化包含在Application Pfofile文件中的每个数据元素,解析创建数据对象数组。每个数据对象都将根据其名称作为索引进行反序列化。有关更多信息和示例,请参阅《GlobalPlatform Systems Scripting Language Specification v1.1.0》第4.4.2节。
Application Profile文件的DataElement元素中的Type属性确定对象类型。对象类型为GP脚本语言native对象或ECMAScript对象。特别是,如果有足够的字节来容纳指定标记编码的标记和数据长度(如果有),除非另有规定,否则这是一个只读,不删除属性。此属性是Application Profile文件中定义的DataElement XML元素的对象数组。Application Profile文件的每个DataElement元素都有一个元素。索引值是DataElement元素的Name属性的值。根据<DataElement>标记,每个元素都有自己的属性(即,元素可以是只读的,也可以是R/W的,具体取决于概要文件中ReadWrite属性的值)。注意:还可以通过.(点)符号的方式使用按名称检索数据对象。
在GPTS脚本语言系统,data数组由开发者在脚本片段中实际指定赋值。
XML Application Profile Type Attribute | DataElement Element Encoding Attribute | GP Scripting Language Scripting Object Created |
---|---|---|
ByteString | HEX | ByteString |
ByteString | UTF8 | ByteString |
ByteString | ASCII | ByteString |
ByteString | BASE64 | ByteString |
ByteString | CN | ByteString |
ByteString | TLV * |
key[]
GPApplication.prototype.key[] Key[]
ckey属性是GlobalPlatform脚本语言键对象的数组。
在标准的GP脚本语言系统中,GPApplication对象创建时,由GP脚本语言系统上下文反序列化包含在Application Pfofile文件中引用Key对应用的Key Profile文件配置,解析创建Key对象数组。每个Key对象都将根据其名称作为索引进行反序列化。有关更多信息和示例,请参阅《GlobalPlatform Systems Scripting Language Specification v1.1.0》第4.4.3节。
这是一个只读,不删除属性。此属性是在Application Profile文件中定义的Key数组。应用的每个Key都有一个Tag相对应的元素。每个Tag对应的Key的Name属性的值作为索引。注意:还可以通过.(点)符号的方式使用按名称检索数据对象。
在GPTS脚本语言系统,Key数组由开发者在脚本片段中实际指定赋值。
lifecycle.name
GPApplication.prototype.lifecycle.name ByteString
lifecycle.name属性是一个GlobalPlatform脚本语言ByteString对象。
lifecycle.name属性表示只读的不可删除属性。它表示执行的脚本中的Application实例生命周期的名称。在标准的GP脚本语言系统中,它是由ProfileID与当前Application Profile文件的UniqueID匹配的Card Profile文件中的ApplicationInstance子元素填充。如果它不可用或不适用,则它将包含空值。
在GPTS脚本语言系统,lifecycle.name属性的值由开发者在脚本片段中实际指定赋值。
lifecycle.value
GPApplication.prototype.lifecycle.value Number
lifecycle.value属性是一个ECMAScript Number对象。
lifecycle.value属性表示只读、不删除属性。它表示正在执行的脚本的应用程序实例的生命周期值。它是由与LifeCycle.name属性匹配的Application Profile文件的ApplicationInfo.LifeCycle子元素的Value属性填充的。如果它不可用或不适用,则它将包含空值。
在GPTS脚本语言系统,lifecycle.value属性的值由开发者在脚本片段中实际指定赋值。
nonVolatileDataSpaceLimit
GPApplication.prototype.nonVolatileDataSpaceLimit Number
nonVolatileDataSpaceLimit属性是一个ECMAScript Number对象。
nonVolatileDataSpaceLimit属性表示只读、不删除属性。它表示正在执行的脚本的应用实例的安装操作中指定的非易失性数据空间量。它是从Card Profile文件的ApplicationInstance子元素填充的。如果它不可用或不适用,则它的值将包含一个未定义的空值。
在GPTS脚本语言系统,order属性的值由开发者在脚本片段中实际指定赋值。
order
GPApplication.prototype.order Number
order属性是一个ECMAScript Number对象。
order属性表示只读、不删除属性。它表示正在执行的脚本在应用程序实例卡上的顺序。它是从Card Profile文件的ApplicationInstance子元素填充的。如果它不可用或不适用,则它的值将包含一个未定义的空值。
在GPTS脚本语言系统,order属性的值由开发者在脚本片段中实际指定赋值。
privilege
GPApplication.prototype.privilege ByteString
privilege属性是一个GP脚本语言 ByteString对象。
(注意):在标准的GP脚本语言系统是ECMAScript Number对象,但在GPTS脚本语言系统中是ByteString对象。
privilege属性表示只读、不删除属性。它表示正在执行的脚本的应用实例的应用权限,其值将是Card Profile文件中相应ApplicationInstance元素的Privilege元素的十六进制编码。Privilege元素中的每个属性表示权限属性的特定字节表示形式,对应于GP卡规范2.1以上版本中规定的应用程序权限编码。多个属性将对应于获取与每个权限关联的特定字节表示的逻辑或值的属性。如果各个ApplicationInstance元素没有可用的权限子元素,则此属性将包含空值。
在GPTS脚本语言系统,privilege属性的值由开发者在脚本片段中实际指定赋值。
profile
GPApplication.prototype.profile Object
profile属性是GlobalPlatform脚本语言ByteString和ECMAScript Boolean和Number对象的树。
Application对象将使用一系列对象创建,这些对象复制了应用程序的GlobalPlatform XML格式的应用程序配置文件(除Key、KeyDeclaration、Declaration和DataElement元素外),并反序列化为对象树。应用程序配置文件的根XML元素将构成此根Application.Profile对象的内容。有关更多信息和示例,请参阅《GlobalPlatform Systems Scripting Language Specification v1.1.0》第4.4.1节。
属性的数据类型决定要创建的对象类型。对象类型是ByteString或本机ECMAScript对象。具体来说,XML中可以多次出现的元素被创建为数组,可以通过元素的第一个属性的名称对数组进行索引。
对于在Profile规范中指定为字符串数据类型的元素,将创建一个ByteString对象,其编码在Profile规范的编码列中指定。对于那些枚举字符串列表的属性,将使用ASCII编码将它们创建为ByteString对象。
GP Systems Profiles Specification XML Attribute Data Type | GP Scripting Language Scripting Object Created |
---|---|
String (or String based Data Type) | ByteString |
Boolean | Boolean |
Integer | Number |
securityDomain
GPApplication.prototype.securityDomain GPSecurityDomain
securityDomain属性是一种GP脚本语言GPSecurityDomain对象。
只读,不删除属性对象,表示在其下安装指定应用的安全域应用(从Card Profile中检索的信息)。
在GPTS脚本语言系统,该属性的值由开发者在脚本片段中实际指定赋值。
volatileDataSpaceLimit
GPApplication.prototype.volatileDataSpaceLimit Number
volatileDataSpaceLimit属性是一个ECMAScript Number对象。
volatileDataSpaceLimit属性表示只读、不删除属性。它表示正在执行的脚本的应用实例的安装操作中指定的易失性数据空间量。它是从Card Profile文件的ApplicationInstance子元素填充的。如果它不可用或不适用,那么它将是未定义的空值。
在GPTS脚本语言系统,该属性的值由开发者在脚本片段中实际指定赋值。
Methods成员方法
GPApplication( )
原型:
GPApplication( )
在标准的GP脚本语言系统中,GPApplication是依靠Application Profile的配置被实例化的,是由脚本语言系统的上下文维护,所以GPAppliation对象是没有构造函数,也不以许被显式调用,被调用时返回GPError.UNDEFINED ,因为是在程序运行前,由系统上下文会隐性创建。
在GPTS脚本语言系统中,通用系统下,脚本是定义为实际运行的脚本片段,存在该构造函数,也允许显式被调用,但一些属性的使用也是按照标准的GP脚本语言系统来处理,比如对象属性,应用状态等等,具体参考示例。
注意,GPTS脚本语言系统在一些定制的特殊系统中也与标准的GP脚本语言系统一样,会被上下文维护,不以允许用户实例化,返回GPError.UNDEFINED。
Arguments参数
None |
---|
Returns返回
Type | Description |
---|---|
GPApplication | A Application object. |
Exceptions异常
None |
---|
Example示例
try
{
function PBOC_EMV_APP()
{
var app = new GPApplication();
app.__proto__ = PBOC_EMV_APP.prototype;
app.$init();
return app;
}
PBOC_EMV_APP.prototype.$init = function()
{
var $2B00000001 = {
profileVersion : "2.0.0",
objVersion : "2.0.1",
profileOID : "20171008021025",
profileID : "0000000001",
owner : "GloablPlatform",
type : Key.SECRET,
subType : Key.DES,
size : 128,
usage : 0 | Key.ENCRYPT | Key.DECRYPT | Key.DECRYPT_ENCRYPT | Key.UNWRAP | Key.WRAP | Key.UNWRAP_WRAP | Key.SIGN | Key.VERIFY | Key.DERIVE,
attribute : 0 | Key.EXPORTABLE | Key.SENSITIVE,
component : {CRT_DP1 : "11223344556677889900",CRT_PQ : "0000000000000000",CRT_DQ1 : "AABBCCDDEEFF1122"}
}
}
var _proto = PBOC_EMV_APP.prototype;
_proto.__proto__ = GPApplication.prototype;
$A000000333010102 = PBOC_EMV_APP();
app = $A000000333010102;
Print("Start....");
//Card reset
atr = app.card.reset(Card.RESET_WARM);
/**************************************/
/* Do something */
/**************************************/
Print("End")
}
catch (e)
{
Print("Exception : " + e.className + "," + e.error + "," + e.reason + "," + e.message);
}
getData()
原型:
ByteString getData(Number tag)
ByteString getData(Number tag, Number[] sw)
通过安全通道发送GP卡规范2.1版本以上的 GET DATA命令APDU,用于获取指定tag的卡数据,例如tag为66的卡片数据。
如果应用使用安全通道,此方法应隐式调用安全域的相应Application Profile配置文件中定义的Wrap脚本片段。
安全域的Wrap元素中提供的脚本引发的任何异常都将被转发。
Arguments参数
Name | Type | Description |
---|---|---|
tag | Number | The tag value is always aligned internally to a double byte value.The MSB of this double byte is the P1 and LSB is P2. (i.e.: Tag value of 0x42 will set P1 =0x00 - P2 = 0x42. Tag value of 0x9F7F will set P1 = 0x9F – P2 = 0x7F) |
sw | Number[] | Array of expected valid SW for the APDU. If not present, the expected valid value is 0x9000 . |
Returns返回
Type | Description |
---|---|
ByteString | Response APDU (excluding status word) |
Exceptions异常
Value | Description |
---|---|
GPError.ARGUMENTS_MISSING | 参数缺失 |
GPError.CARD_COMM_ERROR | 卡通讯错误 |
GPError.CARD_SW_ERROR | 卡响应SW错误 |
GPError.INVALID_ARGUMENTS | 参数无效,格式错误或数据非法 |
GPError.INVALID_TYPE | 参数数据类型无效 |
Example示例
try
{
var app = new GPApplication();
//Card reset
atr = app.card.reset(Card.RESET_WARM);
//Get Data
da = app.getData(0x66);
Print("Tag 66 : " + da.toString(HEX));
//Get Data sw
da = app.getData(0x66,[0x9000]);
Print("Tag 66 : " + da.toString(HEX));
}
catch (e)
{
Print("Exception : " + e.className + "," + e.error + "," + e.reason + "," + e.message);
}
getStatus()
原型:
ByteString getStatus(Number type, ByteString criteria, Boolean next, Boolean accGPRegTab)
ByteString getStatus(Number type, ByteString criteria, Boolean next, Boolean accGPRegTab, Number[] sw)
ByteString getStatus(Number type, ByteString criteria, Boolean next, Boolean accGPRegTab, ByteString tagList ,Number[] sw)
通过安全通道发送GP卡规范2.1版本以上的 GET STATUS命令APDU,用于获取“卡管”、“应用实例”、“可执行装载文件”、“可执行装载模块”等卡内信息,一般需要在完成安全通道认证后才能正常发送。
如果应用使用安全通道,此方法应隐式调用安全域的相应Application Profile配置文件中定义的Wrap脚本片段。
安全域的Wrap元素中提供的脚本引发的任何异常都将被转发。
注意,在标准的GP脚本语言系统中,是没有accGPRegTab参数和tagList参数的,该参数是在GPTS中才存在的,具体的要求建议查看GP卡规范2.1版本以上的 GET STATUS命令APDU的要求。
Arguments参数
Name | Type | Description |
---|---|---|
type | Number | p1 is the reference control parameter as specified in the Card Specification: [CM_ONLY:Card Manager Only ]、[APPS_ONLY:Applications Only]、[LF_ONLY:Load File Only]、[LFE_ONLY :Load Files and All Executable Files ] |
criteria | ByteString | AID of the criteria. Could be a partial AID. |
next | Boolean | Whether the next occurrence should be returned. Default is false. |
accGPRegTab | Boolean | Response data structure according to Table 11-36 |
tagList | ByteString | The tag list (tag ‘5C’) indicates to the card how to construct the response data for each on- card entity matching the search criteria. |
sw | Number[] | Array of expected valid SW for the APDU. If not present, the expected valid value is 0x9000 . |
Returns返回
Type | Description |
---|---|
ByteString | Response APDU (excluding status word) |
Exceptions异常
Value | Description |
---|---|
GPError.ARGUMENTS_MISSING | 参数缺失 |
GPError.CARD_COMM_ERROR | 卡通讯错误 |
GPError.CARD_SW_ERROR | 卡响应SW错误 |
GPError.INVALID_ARGUMENTS | 参数无效,格式错误或数据非法 |
GPError.INVALID_TYPE | 参数数据类型无效 |
Example示例
try
{
var app = new GPApplication();
//Secure Channel
scp02 = new GPScp02;
//Security Domain
gpsd = new GPSecurityDomain;
//KMC
gpsd.key.KMC = new Key();
gpsd.key.KMC.setComponent(Key.DES,new ByteString("404142434445464748494A4B4C4D4E4F",HEX));
//Set KMC
scp02.setBaseKey(gpsd.key.KMC,GPScp02.DIVERSIFY_MODE_NON);
//Set Secure Channel
gpsd.secureChannel = scp02;
//set Security Domain
app.securityDomain = gpsd;
//Card reset
atr = app.card.reset(Card.RESET_WARM);
//Open secure channel
app.securityDomain.openSecureChannel();
//Get APP Not specifi AID
rsp = app.getStatus(GPSecurityDomain.APPS_ONLY,new ByteString("",HEX),false,false,[0x9000]);
Print("Get Status rsp : " + rsp.toString(HEX));
//Get APP Not specifi AID
rsp = app.getStatus(GPSecurityDomain.APPS_ONLY,new ByteString("A00000000002",HEX),false,true,[0x9000]);
Print("Get Status rsp : " + rsp.toString(HEX));
rsp = app.getStatus(GPSecurityDomain.APPS_ONLY,new ByteString("A00000000002",HEX),false,false,new ByteString("4F9F70CC",HEX),[0x9000]);
Print("Get Status rsp : " + rsp.toString(HEX));
}
catch (e)
{
Print("Exception : " + e.className + "," + e.error + "," + e.reason + "," + e.message);
}
putKey()
原型:
ByteString putKey(Number version, Number newVersion, Number index, [ [Number type, Key key, ByteString kcv] ])
ByteString putKey(Number version, Number newVersion, Number index, [ [Number type, Key key, ByteString kcv] ], Number[] sw)
ByteString putKey(Number version, Number newVersion, Number index, [ [Number type, Key key, ByteString kcv] ], Boolean more) ByteString putKey(Number version, Number newVersion, Number index, [ [Number type, Key key, ByteString kcv] ], Boolean more, Number[] sw)
ByteString putKey(Number version, Number newVersion, Number index, [ [Number keyType, Key key, Number componentCte] ])
ByteString putKey(Number version, Number newVersion, Number index, [ [Number keyType, Key key, Number componentCte] ], Number[] sw)
ByteString putKey(Number version, Number newVersion, Number index, [ [Number keyType, Key key, Number componentCte] ], Boolean more)
ByteString putKey(Number version, Number newVersion, Number index, [ [Number keyType, Key key, Number componentCte] ], Boolean more, Number[] sw)
通过安全通道发送GP卡规范2.1版本以上的 GET STATUS命令APDU,用于获取“卡管”、“应用实例”、“可执行装载文件”、“可执行装载模块”等卡内信息,一般需要在完成安全通道认证后才能正常发送。
如果应用使用安全通道,此方法应隐式调用安全域的相应Application Profile配置文件中定义的Wrap脚本片段。
安全域的Wrap元素中提供的脚本引发的任何异常都将被转发。
注意,在标准的GP脚本语言系统中,是没有accGPRegTab参数和tagList参数的,该参数是在GPTS中才存在的,具体的要求建议查看GP卡规范2.1版本以上的 GET STATUS命令APDU的要求。
Arguments参数
Name | Type | Description |
---|---|---|
type | Number | p1 is the reference control parameter as specified in the Card Specification: [CM_ONLY:Card Manager Only ]、[APPS_ONLY:Applications Only]、[LF_ONLY:Load File Only]、[LFE_ONLY :Load Files and All Executable Files ] |
criteria | ByteString | AID of the criteria. Could be a partial AID. |
next | Boolean | Whether the next occurrence should be returned. Default is false. |
accGPRegTab | Boolean | Response data structure according to Table 11-36 |
tagList | ByteString | The tag list (tag ‘5C’) indicates to the card how to construct the response data for each on- card entity matching the search criteria. |
sw | Number[] | Array of expected valid SW for the APDU. If not present, the expected valid value is 0x9000 . |
Returns返回
Type | Description |
---|---|
ByteString | Response APDU (excluding status word) |
Exceptions异常
Value | Description |
---|---|
GPError.ARGUMENTS_MISSING | 参数缺失 |
GPError.CARD_COMM_ERROR | 卡通讯错误 |
GPError.CARD_SW_ERROR | 卡响应SW错误 |
GPError.INVALID_ARGUMENTS | 参数无效,格式错误或数据非法 |
GPError.INVALID_TYPE | 参数数据类型无效 |
Example示例
try
{
var app = new GPApplication();
//Secure Channel
scp02 = new GPScp02;
//Security Domain
gpsd = new GPSecurityDomain;
//KMC
gpsd.key.KMC = new Key();
gpsd.key.KMC.setComponent(Key.DES,new ByteString("404142434445464748494A4B4C4D4E4F",HEX));
//Set KMC
scp02.setBaseKey(gpsd.key.KMC,GPScp02.DIVERSIFY_MODE_NON);
//Set Secure Channel
gpsd.secureChannel = scp02;
//set Security Domain
app.securityDomain = gpsd;
//Card reset
atr = app.card.reset(Card.RESET_WARM);
//Open secure channel
app.securityDomain.openSecureChannel();
//Get APP Not specifi AID
rsp = app.getStatus(GPSecurityDomain.APPS_ONLY,new ByteString("",HEX),false,false,[0x9000]);
Print("Get Status rsp : " + rsp.toString(HEX));
//Get APP Not specifi AID
rsp = app.getStatus(GPSecurityDomain.APPS_ONLY,new ByteString("A00000000002",HEX),false,true,[0x9000]);
Print("Get Status rsp : " + rsp.toString(HEX));
rsp = app.getStatus(GPSecurityDomain.APPS_ONLY,new ByteString("A00000000002",HEX),false,false,new ByteString("4F9F70CC",HEX),[0x9000]);
Print("Get Status rsp : " + rsp.toString(HEX));
}
catch (e)
{
Print("Exception : " + e.className + "," + e.error + "," + e.reason + "," + e.message);
}
select()
原型:
ByteString select()
ByteString select(Boolean next, Boolean noData)
ByteString select(Boolean next, Number[] sw)
ByteString select(Boolean next, Boolean noData, Number[] sw)
以字符串形式检索脚本解释器实现的GlobalPlatform脚本的版本。这与XML概要文件的版本不同。后者的信息可以通过在XML文档中导航适当的属性来获得。
这是GP脚本解释器在执行脚本时使用的规范版本。例如,对于为支持此规范而编写的脚本解释器,GPSystem.getVersion()方法将返回包含“1.1.0”的ASCII编码字符串。
返回的版本可能包含第四个数字,指定脚本解释器中实现的勘误表的版本。如果第四个数字为零,则执行了没有任何勘误表的原始规范。如果未返回此数字,则说明解释器未实现规范的勘误表。
Arguments参数
Name | Type | Description |
---|---|---|
next | Boolean | If true send a Select APDU with P2 set to 0x02, otherwise send a Select APDU with P2 set to 0x00. By default, if next is not provided as a parameter, then this parameter is false. |
noData | Boolean | If true no AID is required for the select. |
sw | Number[] | Array of expected valid SW for the APDU. If not present, the expected valid value is 0x9000. |
Returns返回
Type | Description |
---|---|
ByteString | Response APDU data. |
Exceptions异常
Value | Description |
---|---|
GPError.ARGUMENTS_MISSING | 参数缺失 |
GPError.CARD_COMM_ERROR | 卡通讯错误 |
GPError.CARD_SW_ERROR | 卡响应SW错误 |
GPError.INVALID_ARGUMENTS | 参数无效,格式错误或数据非法 |
GPError.INVALID_TYPE | 参数数据类型无效 |
Example示例
try
{
function PBOC_EMV_APP()
{
var app = new Application();
app.__proto__ = PBOC_EMV_APP.prototype;
app.$init();
return app;
}
PBOC_EMV_APP.prototype.$init = function()
{
var $2B00000001 = {
profileVersion : "2.0.0",
objVersion : "2.0.1",
profileOID : "20171008021025",
profileID : "0000000001",
owner : "GloablPlatform",
type : Key.SECRET,
subType : Key.DES,
size : 128,
usage : 0 | Key.ENCRYPT | Key.DECRYPT | Key.DECRYPT_ENCRYPT | Key.UNWRAP | Key.WRAP | Key.UNWRAP_WRAP | Key.SIGN | Key.VERIFY | Key.DERIVE,
attribute : 0 | Key.EXPORTABLE | Key.SENSITIVE,
component : {CRT_DP1 : "11223344556677889900",CRT_PQ : "0000000000000000",CRT_DQ1 : "AABBCCDDEEFF1122"}
}
}
var _proto = PBOC_EMV_APP.prototype;
_proto.__proto__ = Application.prototype;
$A000000333010102 = PBOC_EMV_APP();
app = $A000000333010102;
//Card reset
atr = app.card.reset(Card.RESET_WARM);
//Select
rsp = app.select();
Print("slect rsp : " + rsp.toString(HEX));
Print("Aid(after select) : " + app.aid.toString(HEX));
}
catch (e)
{
Print("Exception : " + e.className + "," + e.error + "," + e.reason + "," + e.message);
}
sendApdu()
原型:
ByteString sendApdu (Number cla, Number ins, Number p1, Number p2)
ByteString sendApdu (Number cla, Number ins, Number p1, Number p2, Number[] sw)
ByteString sendApdu (Number cla, Number ins, Number p1, Number p2, ByteString data)
ByteString sendApdu (Number cla, Number ins, Number p1, Number p2, ByteString data, Number[] sw)
ByteString sendApdu (Number cla, Number ins, Number p1, Number p2, Number le)
ByteString sendApdu (Number cla, Number ins, Number p1, Number p2, Number le,
Number[] sw)
ByteString sendApdu (Number cla, Number ins, Number p1, Number p2, ByteString data,
Number le)
ByteString sendApdu (Number cla, Number ins, Number p1, Number p2, ByteString data, Number le, Number[] sw)
向卡发送APDU。如果应用程序不使用安全通道,APDU将直接发送到卡(即与application.card.sendApdu()相同)。如果应用程序使用安全通道,此方法应隐式调用安全域的相应应用程序配置文件中定义的Wrap脚本片段,除非使用卡规范定义的安全通道和实现选项。sendApdu()方法中未指定APDU字段Lc,但必须由该方法隐式计算(请参见[IS7816-4])。
由Wrap元素中提供的脚本引发的任何异常都将被转发。
Arguments参数
Name | Type | Description |
---|---|---|
cla | Number | cla refers to the class byte (CLA) of the command message. |
ins | Number | ins refers to the instruction byte (INS) of the command message. |
p1 | Number | P1 parameter. |
p2 | Number | P2 parameter. |
data | ByteString | Optional data field to use with an APDU. This will be a ByteString object. If a Case 2 command is bei ng constructed, this must be provided as null. |
le | Number | Optional maximum length of data expected in response to a Case 2 or Case 4 command. |
sw | Number[] | Array of expected valid SW for the APDU. If not present, the expected valid value is 0x9000. |
Returns返回
Type | Description |
---|---|
ByteString | Response APDU (excluding status word) |
Exceptions异常
Value | Description |
---|---|
GPError.ARGUMENTS_MISSING | 参数缺失 |
GPError.CARD_COMM_ERROR | 卡通讯错误 |
GPError.CARD_SW_ERROR | 卡响应SW错误 |
GPError.INVALID_ID_ARGUMENTS | ID参数无效 |
GPError.INVALID_ID_LENGTH | 无效ID长度 |
GPError.INVALID_ID_TYPE | ID参数数据类型无效 |
Example示例
try
{
var app = new Application();
//Card reset
atr = app.card.reset(Card.RESET_WARM);
//APDU cla ins p1 p2
rsp = app.sendApdu(0x00,0xA4,0x04,0x00);
//APDU cla ins p1 p2 sw[]
rsp = app.sendApdu(0x00,0xA4,0x04,0x00,[0x9000,0x6A82]);
//APDU cla ins p1 p2 data
rsp = app.sendApdu(0x00,0xA4,0x04,0x00,new ByteString('A000000333010102', HEX));
//APDU cla ins p1 p2 data sw[]
rsp = app.sendApdu(0x00,0xA4,0x04,0x00,new ByteString('A000000333010102', HEX),[0x9000,0x6A82]);
//APDU cla ins p1 p2 le
rsp = app.sendApdu(0x00,0xA4,0x04,0x00,0x01);
//APDU cla ins p1 p2 le sw[]
rsp = app.sendApdu(0x00,0xA4,0x04,0x00,0x01,[0x9000,0x6A82,0x6999]);
//APDU cla ins p1 p2 data le
rsp = app.sendApdu(0x00,0xA4,0x04,0x00,new ByteString('A000000333010102', HEX),0x00);
//APDU cla ins p1 p2 data le sw[]
rsp = app.sendApdu(0x00,0xA4,0x04,0x00,new ByteString('A000000333010102', HEX),0x01,[0x9000,0x6A82]);
}
catch (e)
{
Print("Exception : " + e.className + "," + e.error + "," + e.reason + "," + e.message);
}