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子元素中提供的脚本,从该对象发送的APDUselect()方法除外)将受到影响,有关受影响的方法的概述,请参阅《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脚本语言系统上下文集成在ApplicationGPApplicationGPSecurityDomain中定义的Card对象使用。在GPTS脚本语言系统中,允许单独使用。

crypto

Application.prototype.crypto Crypto

crypto属性是一个GP脚本语言的Crypto对象。

只读,不删除属性。应用程序使用的加密对象。在标准的GP脚本语言系统中,Crypto对象是由GP脚本语言系统上下文集成在ApplicationGPApplicationGPSecurityDomain中定义的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脚本语言ByteStringECMAScript BooleanNumber对象的树。

Application对象将使用一系列对象创建,这些对象复制了应用程序的GlobalPlatform XML格式的应用程序配置文件(除KeyKeyDeclarationDeclarationDataElement元素外),并反序列化为对象树。应用程序配置文件的根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);
}

results matching ""

    No results matching ""