Application类
在ECMAScript术语中,Application是一个Native对象,用于表示正在为其运行脚本的应用程序,特别是非GlobalPlatform应用程序。编写应用程序脚本时,应用程序对象称为this对象。
按照ECMAScript规范中的定义,Native对象在ECMAScript程序开始执行时出现。如果在Application Profile文件中,ApplicationInfo元素的Type属性具有非GlobalPlatform值,则应创建Application对象。例如:
<ApplicationInfo Type=”OTHER” />
Application对象实现了一些方法,这些方法提供了对独立于平台的安全通道命令的支持,以及发送APDU的方法。如果为应用程序对象设置了安全通道,则APDU将通过安全通道发送。
如果为Application对象打开了安全通道,则根据Application Profile文件的Wrap子元素中提供的脚本,从该对象发送的APDU(select()方法除外)将受到影响,有关受影响的方法的概述,请参阅《GlobalPlatform Systems Scripting Language Specification v1.1.0》附录C。
Constants常量
Application对象没有常量。
Properties成员属性
在标准的GP脚本语言系统中,Application的属性是GP脚本语言系统上下文解析Application Profile文件中定义的各个属性元素初始化而来,在GPTS脚本语言系统中,由应用开发者在脚本片段中实际指定赋值。
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 : "2B00000001",
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__ = Application.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.aid = new ByteString('A000000333010102', HEX)
$A000000333010102.lifeCycle = $A000000333010102.profile.LifeCycles.LifeCycle.LOADED;
Print("AID : " + $A000000333010102.aid);
data = $A000000333010102.data;
keyArray = $A000000333010102.key;
bs = $A000000333010102.key.UDKAC.getProfileOID();
Print("ProfileOID value is : " + bs.toString(ASCII));
app = $A000000333010102;
//Card reset
atr = app.card.reset(Card.RESET_WARM);
/**************************************/
/* Do something */
/**************************************/
}
catch (e)
{
Print("Exception : " + e.className + "," + e.error + "," + e.reason + "," + e.message);
}
aid
Application.prototype.aid ByteString
aid属性是一个GlobalPlatform脚本语言ByteString对象。
aid属性表示只读、不删除属性。它表示正在执行的脚本的应用程序实例的aid。它是从Card Profile文件的ApplicationInstance子元素填充的。
如果它不可用或不适用,则它将包含空值。
card
Application.prototype.card Card
card属性是一个GlobalPlatform脚本语言卡对象。
card属性表示只读、不删除属性。在标准的GP脚本语言系统中,Card对象是由GP脚本语言系统上下文集成在Application、GPApplication、GPSecurityDomain中定义的Card对象使用。在GPTS脚本语言系统中,允许单独使用。
crypto
Application.prototype.crypto Crypto
crypto属性是一个GP脚本语言的Crypto对象。
只读,不删除属性。应用程序使用的加密对象。在标准的GP脚本语言系统中,Crypto对象是由GP脚本语言系统上下文集成在Application、GPApplication、GPSecurityDomain中定义的Crypto对象使用。在GPTS脚本语言系统中,允许单独使用。
key[]
Application.prototype.key[] Key[]
ckey属性是GlobalPlatform脚本语言键对象的数组。
在标准的GP脚本语言系统中,Application对象创建时,由GP脚本语言系统上下文反序列化包含在Application Pfofile文件中引用Key对应用的Key Profile文件配置,解析创建Key对象数组。每个Key对象都将根据其名称作为索引进行反序列化。有关更多信息和示例,请参阅《GlobalPlatform Systems Scripting Language Specification v1.1.0》第4.4.3节。
在GPTS脚本语言系统,Key数组由开发者在脚本片段中实际指定赋值。
lifecycle.name
Application.prototype.lifecycle.name ByteString
lifecycle.name属性是一个GlobalPlatform脚本语言ByteString对象。
lifecycle.name属性表示只读的不可删除属性。它表示执行的脚本中的Application实例生命周期的名称。在标准的GP脚本语言系统中,它是由ProfileID与当前Application Profile文件的UniqueID匹配的Card Profile文件中的ApplicationInstance子元素填充。如果它不可用或不适用,则它将包含空值。
在GPTS脚本语言系统,lifecycle.name属性的值由开发者在脚本片段中实际指定赋值。
lifecycle.value
Application.prototype.lifecycle.value Number
lifecycle.value属性是一个ECMAScript Number对象。
lifecycle.value属性表示只读、不删除属性。它表示正在执行的脚本的应用程序实例的生命周期值。它是由与LifeCycle.name属性匹配的Application Profile文件的ApplicationInfo.LifeCycle子元素的Value属性填充的。如果它不可用或不适用,则它将包含空值。
在GPTS脚本语言系统,lifecycle.value属性的值由开发者在脚本片段中实际指定赋值。
order
Application.prototype.order Number
order属性是一个ECMAScript Number对象。
order属性表示只读、不删除属性。它表示正在执行的脚本在应用程序实例卡上的顺序。它是从Card Profile文件的ApplicationInstance子元素填充的。如果它不可用或不适用,则它的值将包含一个未定义的空值。
在GPTS脚本语言系统,order属性的值由开发者在脚本片段中实际指定赋值。
profile
Application.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 |
secureChannel
Application.prototype.secureChannel SecureChannel
secureChannel属性是GP脚本语言SecureChannel对象,只读,不删除属性。表示Application的安全通道属性的SecureChannel对象,如果未为此应用程序定义安全通道,则为null。
Methods成员方法
Application( )
原型:
Application( )
在标准的GP脚本语言系统中,Application是依靠Application Profile的配置被实例化的,是由脚本语言系统的上下文维护,所以Appliation对象是没有构造函数,也不以许被显式调用,被调用时返回GPError.UNDEFINED ,因为是在程序运行前,由系统上下文会隐性创建。
在GPTS脚本语言系统中,通用系统下,脚本是定义为实际运行的脚本片段,存在该构造函数,也允许显式被调用,但一些属性的使用也是按照标准的GP脚本语言系统来处理,比如对象属性,应用状态等等,具体参考示例。
注意,GPTS脚本语言系统在一些定制的特殊系统中也与标准的GP脚本语言系统一样,会被上下文维护,不以允许用户实例化,返回GPError.UNDEFINED。
Arguments参数
None |
---|
Returns返回
Type | Description |
---|---|
Application | A Application object. |
Exceptions异常
None |
---|
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"}
}
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__ = Application.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.aid = new ByteString('A000000333010102', HEX)
$A000000333010102.lifeCycle = $A000000333010102.profile.LifeCycles.LifeCycle.LOADED;
Print("AID : " + $A000000333010102.aid);
data = $A000000333010102.data;
keyArray = $A000000333010102.key;
bs = $A000000333010102.key.UDKAC.getProfileOID();
Print("ProfileOID value is : " + bs.toString(ASCII));
app = $A000000333010102;
//Card reset
atr = app.card.reset(Card.RESET_WARM);
/**************************************/
/* Do something */
/**************************************/
}
catch (e)
{
Print("Exception : " + e.className + "," + e.error + "," + e.reason + "," + e.message);
}
openSecureChannel()
原型:
Object openSecureChannel(arguments)
打开卡上的安全通,由应用开发者自己编写。此方法应隐式调用安全域或等效Application Profile文件中定义的OpenSecureChannel脚本片段。打开安全通道后,使用Application Profile文件中指定的Wrap脚本通过安全通道发送所有APDU。
Arguments参数
Name | Type | Description |
---|---|---|
arguments | Defined by application developer | Argument(s) required by application developer to open the secure channel. |
Returns返回
Type | Description |
---|---|
Object | Defined by application developer.In addition, the SecureChannel object will have its state property set correctly, indicating that the secure channel is either successfully opened ( SC_OPEN) or closed (SC_CLOSE ). This property will be used to determine whether to invoke the wrap script provided in the Application Profile for the Application object’s sendApdu()method. |
Exceptions异常
Value | Description |
---|---|
GPError.XXXX | OpenSecureChannel脚本片段引发的任何异常都将被转发。 |
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"}
}
}
PBOC_EMV_APP.prototype.openSecureChannel = function()
{
Print("openSecureChannel...");
}
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));
//Open Secure Channel
rsp = app.openSecureChannel();
}
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);
}