| /* asn1-1.0.13.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license | 
|  */ | 
| /* | 
|  * asn1.js - ASN.1 DER encoder classes | 
|  * | 
|  * Copyright (c) 2013-2017 Kenji Urushima (kenji.urushima@gmail.com) | 
|  * | 
|  * This software is licensed under the terms of the MIT License. | 
|  * https://kjur.github.io/jsrsasign/license | 
|  * | 
|  * The above copyright and license notice shall be | 
|  * included in all copies or substantial portions of the Software. | 
|  */ | 
| import { BigInteger } from "../jsbn/jsbn"; | 
| import { YAHOO } from "./yahoo"; | 
| /** | 
|  * @fileOverview | 
|  * @name asn1-1.0.js | 
|  * @author Kenji Urushima kenji.urushima@gmail.com | 
|  * @version asn1 1.0.13 (2017-Jun-02) | 
|  * @since jsrsasign 2.1 | 
|  * @license <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a> | 
|  */ | 
| /** | 
|  * kjur's class library name space | 
|  * <p> | 
|  * This name space provides following name spaces: | 
|  * <ul> | 
|  * <li>{@link KJUR.asn1} - ASN.1 primitive hexadecimal encoder</li> | 
|  * <li>{@link KJUR.asn1.x509} - ASN.1 structure for X.509 certificate and CRL</li> | 
|  * <li>{@link KJUR.crypto} - Java Cryptographic Extension(JCE) style MessageDigest/Signature | 
|  * class and utilities</li> | 
|  * </ul> | 
|  * </p> | 
|  * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2. | 
|  * @name KJUR | 
|  * @namespace kjur's class library name space | 
|  */ | 
| export var KJUR = {}; | 
| /** | 
|  * kjur's ASN.1 class library name space | 
|  * <p> | 
|  * This is ITU-T X.690 ASN.1 DER encoder class library and | 
|  * class structure and methods is very similar to | 
|  * org.bouncycastle.asn1 package of | 
|  * well known BouncyCaslte Cryptography Library. | 
|  * <h4>PROVIDING ASN.1 PRIMITIVES</h4> | 
|  * Here are ASN.1 DER primitive classes. | 
|  * <ul> | 
|  * <li>0x01 {@link KJUR.asn1.DERBoolean}</li> | 
|  * <li>0x02 {@link KJUR.asn1.DERInteger}</li> | 
|  * <li>0x03 {@link KJUR.asn1.DERBitString}</li> | 
|  * <li>0x04 {@link KJUR.asn1.DEROctetString}</li> | 
|  * <li>0x05 {@link KJUR.asn1.DERNull}</li> | 
|  * <li>0x06 {@link KJUR.asn1.DERObjectIdentifier}</li> | 
|  * <li>0x0a {@link KJUR.asn1.DEREnumerated}</li> | 
|  * <li>0x0c {@link KJUR.asn1.DERUTF8String}</li> | 
|  * <li>0x12 {@link KJUR.asn1.DERNumericString}</li> | 
|  * <li>0x13 {@link KJUR.asn1.DERPrintableString}</li> | 
|  * <li>0x14 {@link KJUR.asn1.DERTeletexString}</li> | 
|  * <li>0x16 {@link KJUR.asn1.DERIA5String}</li> | 
|  * <li>0x17 {@link KJUR.asn1.DERUTCTime}</li> | 
|  * <li>0x18 {@link KJUR.asn1.DERGeneralizedTime}</li> | 
|  * <li>0x30 {@link KJUR.asn1.DERSequence}</li> | 
|  * <li>0x31 {@link KJUR.asn1.DERSet}</li> | 
|  * </ul> | 
|  * <h4>OTHER ASN.1 CLASSES</h4> | 
|  * <ul> | 
|  * <li>{@link KJUR.asn1.ASN1Object}</li> | 
|  * <li>{@link KJUR.asn1.DERAbstractString}</li> | 
|  * <li>{@link KJUR.asn1.DERAbstractTime}</li> | 
|  * <li>{@link KJUR.asn1.DERAbstractStructured}</li> | 
|  * <li>{@link KJUR.asn1.DERTaggedObject}</li> | 
|  * </ul> | 
|  * <h4>SUB NAME SPACES</h4> | 
|  * <ul> | 
|  * <li>{@link KJUR.asn1.cades} - CAdES long term signature format</li> | 
|  * <li>{@link KJUR.asn1.cms} - Cryptographic Message Syntax</li> | 
|  * <li>{@link KJUR.asn1.csr} - Certificate Signing Request (CSR/PKCS#10)</li> | 
|  * <li>{@link KJUR.asn1.tsp} - RFC 3161 Timestamping Protocol Format</li> | 
|  * <li>{@link KJUR.asn1.x509} - RFC 5280 X.509 certificate and CRL</li> | 
|  * </ul> | 
|  * </p> | 
|  * NOTE: Please ignore method summary and document of this namespace. | 
|  * This caused by a bug of jsdoc2. | 
|  * @name KJUR.asn1 | 
|  * @namespace | 
|  */ | 
| if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) | 
|     KJUR.asn1 = {}; | 
| /** | 
|  * ASN1 utilities class | 
|  * @name KJUR.asn1.ASN1Util | 
|  * @class ASN1 utilities class | 
|  * @since asn1 1.0.2 | 
|  */ | 
| KJUR.asn1.ASN1Util = new function () { | 
|     this.integerToByteHex = function (i) { | 
|         var h = i.toString(16); | 
|         if ((h.length % 2) == 1) | 
|             h = '0' + h; | 
|         return h; | 
|     }; | 
|     this.bigIntToMinTwosComplementsHex = function (bigIntegerValue) { | 
|         var h = bigIntegerValue.toString(16); | 
|         if (h.substr(0, 1) != '-') { | 
|             if (h.length % 2 == 1) { | 
|                 h = '0' + h; | 
|             } | 
|             else { | 
|                 if (!h.match(/^[0-7]/)) { | 
|                     h = '00' + h; | 
|                 } | 
|             } | 
|         } | 
|         else { | 
|             var hPos = h.substr(1); | 
|             var xorLen = hPos.length; | 
|             if (xorLen % 2 == 1) { | 
|                 xorLen += 1; | 
|             } | 
|             else { | 
|                 if (!h.match(/^[0-7]/)) { | 
|                     xorLen += 2; | 
|                 } | 
|             } | 
|             var hMask = ''; | 
|             for (var i = 0; i < xorLen; i++) { | 
|                 hMask += 'f'; | 
|             } | 
|             var biMask = new BigInteger(hMask, 16); | 
|             var biNeg = biMask.xor(bigIntegerValue).add(BigInteger.ONE); | 
|             h = biNeg.toString(16).replace(/^-/, ''); | 
|         } | 
|         return h; | 
|     }; | 
|     /** | 
|      * get PEM string from hexadecimal data and header string | 
|      * @name getPEMStringFromHex | 
|      * @memberOf KJUR.asn1.ASN1Util | 
|      * @function | 
|      * @param {String} dataHex hexadecimal string of PEM body | 
|      * @param {String} pemHeader PEM header string (ex. 'RSA PRIVATE KEY') | 
|      * @return {String} PEM formatted string of input data | 
|      * @description | 
|      * This method converts a hexadecimal string to a PEM string with | 
|      * a specified header. Its line break will be CRLF("\r\n"). | 
|      * @example | 
|      * var pem  = KJUR.asn1.ASN1Util.getPEMStringFromHex('616161', 'RSA PRIVATE KEY'); | 
|      * // value of pem will be: | 
|      * -----BEGIN PRIVATE KEY----- | 
|      * YWFh | 
|      * -----END PRIVATE KEY----- | 
|      */ | 
|     this.getPEMStringFromHex = function (dataHex, pemHeader) { | 
|         return hextopem(dataHex, pemHeader); | 
|     }; | 
|     /** | 
|      * generate ASN1Object specifed by JSON parameters | 
|      * @name newObject | 
|      * @memberOf KJUR.asn1.ASN1Util | 
|      * @function | 
|      * @param {Array} param JSON parameter to generate ASN1Object | 
|      * @return {KJUR.asn1.ASN1Object} generated object | 
|      * @since asn1 1.0.3 | 
|      * @description | 
|      * generate any ASN1Object specified by JSON param | 
|      * including ASN.1 primitive or structured. | 
|      * Generally 'param' can be described as follows: | 
|      * <blockquote> | 
|      * {TYPE-OF-ASNOBJ: ASN1OBJ-PARAMETER} | 
|      * </blockquote> | 
|      * 'TYPE-OF-ASN1OBJ' can be one of following symbols: | 
|      * <ul> | 
|      * <li>'bool' - DERBoolean</li> | 
|      * <li>'int' - DERInteger</li> | 
|      * <li>'bitstr' - DERBitString</li> | 
|      * <li>'octstr' - DEROctetString</li> | 
|      * <li>'null' - DERNull</li> | 
|      * <li>'oid' - DERObjectIdentifier</li> | 
|      * <li>'enum' - DEREnumerated</li> | 
|      * <li>'utf8str' - DERUTF8String</li> | 
|      * <li>'numstr' - DERNumericString</li> | 
|      * <li>'prnstr' - DERPrintableString</li> | 
|      * <li>'telstr' - DERTeletexString</li> | 
|      * <li>'ia5str' - DERIA5String</li> | 
|      * <li>'utctime' - DERUTCTime</li> | 
|      * <li>'gentime' - DERGeneralizedTime</li> | 
|      * <li>'seq' - DERSequence</li> | 
|      * <li>'set' - DERSet</li> | 
|      * <li>'tag' - DERTaggedObject</li> | 
|      * </ul> | 
|      * @example | 
|      * newObject({'prnstr': 'aaa'}); | 
|      * newObject({'seq': [{'int': 3}, {'prnstr': 'aaa'}]}) | 
|      * // ASN.1 Tagged Object | 
|      * newObject({'tag': {'tag': 'a1', | 
|      *                    'explicit': true, | 
|      *                    'obj': {'seq': [{'int': 3}, {'prnstr': 'aaa'}]}}}); | 
|      * // more simple representation of ASN.1 Tagged Object | 
|      * newObject({'tag': ['a1', | 
|      *                    true, | 
|      *                    {'seq': [ | 
|      *                      {'int': 3}, | 
|      *                      {'prnstr': 'aaa'}]} | 
|      *                   ]}); | 
|      */ | 
|     this.newObject = function (param) { | 
|         var _KJUR = KJUR, _KJUR_asn1 = _KJUR.asn1, _DERBoolean = _KJUR_asn1.DERBoolean, _DERInteger = _KJUR_asn1.DERInteger, _DERBitString = _KJUR_asn1.DERBitString, _DEROctetString = _KJUR_asn1.DEROctetString, _DERNull = _KJUR_asn1.DERNull, _DERObjectIdentifier = _KJUR_asn1.DERObjectIdentifier, _DEREnumerated = _KJUR_asn1.DEREnumerated, _DERUTF8String = _KJUR_asn1.DERUTF8String, _DERNumericString = _KJUR_asn1.DERNumericString, _DERPrintableString = _KJUR_asn1.DERPrintableString, _DERTeletexString = _KJUR_asn1.DERTeletexString, _DERIA5String = _KJUR_asn1.DERIA5String, _DERUTCTime = _KJUR_asn1.DERUTCTime, _DERGeneralizedTime = _KJUR_asn1.DERGeneralizedTime, _DERSequence = _KJUR_asn1.DERSequence, _DERSet = _KJUR_asn1.DERSet, _DERTaggedObject = _KJUR_asn1.DERTaggedObject, _newObject = _KJUR_asn1.ASN1Util.newObject; | 
|         var keys = Object.keys(param); | 
|         if (keys.length != 1) | 
|             throw "key of param shall be only one."; | 
|         var key = keys[0]; | 
|         if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + key + ":") == -1) | 
|             throw "undefined key: " + key; | 
|         if (key == "bool") | 
|             return new _DERBoolean(param[key]); | 
|         if (key == "int") | 
|             return new _DERInteger(param[key]); | 
|         if (key == "bitstr") | 
|             return new _DERBitString(param[key]); | 
|         if (key == "octstr") | 
|             return new _DEROctetString(param[key]); | 
|         if (key == "null") | 
|             return new _DERNull(param[key]); | 
|         if (key == "oid") | 
|             return new _DERObjectIdentifier(param[key]); | 
|         if (key == "enum") | 
|             return new _DEREnumerated(param[key]); | 
|         if (key == "utf8str") | 
|             return new _DERUTF8String(param[key]); | 
|         if (key == "numstr") | 
|             return new _DERNumericString(param[key]); | 
|         if (key == "prnstr") | 
|             return new _DERPrintableString(param[key]); | 
|         if (key == "telstr") | 
|             return new _DERTeletexString(param[key]); | 
|         if (key == "ia5str") | 
|             return new _DERIA5String(param[key]); | 
|         if (key == "utctime") | 
|             return new _DERUTCTime(param[key]); | 
|         if (key == "gentime") | 
|             return new _DERGeneralizedTime(param[key]); | 
|         if (key == "seq") { | 
|             var paramList = param[key]; | 
|             var a = []; | 
|             for (var i = 0; i < paramList.length; i++) { | 
|                 var asn1Obj = _newObject(paramList[i]); | 
|                 a.push(asn1Obj); | 
|             } | 
|             return new _DERSequence({ 'array': a }); | 
|         } | 
|         if (key == "set") { | 
|             var paramList = param[key]; | 
|             var a = []; | 
|             for (var i = 0; i < paramList.length; i++) { | 
|                 var asn1Obj = _newObject(paramList[i]); | 
|                 a.push(asn1Obj); | 
|             } | 
|             return new _DERSet({ 'array': a }); | 
|         } | 
|         if (key == "tag") { | 
|             var tagParam = param[key]; | 
|             if (Object.prototype.toString.call(tagParam) === '[object Array]' && | 
|                 tagParam.length == 3) { | 
|                 var obj = _newObject(tagParam[2]); | 
|                 return new _DERTaggedObject({ tag: tagParam[0], | 
|                     explicit: tagParam[1], | 
|                     obj: obj }); | 
|             } | 
|             else { | 
|                 var newParam = {}; | 
|                 if (tagParam.explicit !== undefined) | 
|                     newParam.explicit = tagParam.explicit; | 
|                 if (tagParam.tag !== undefined) | 
|                     newParam.tag = tagParam.tag; | 
|                 if (tagParam.obj === undefined) | 
|                     throw "obj shall be specified for 'tag'."; | 
|                 newParam.obj = _newObject(tagParam.obj); | 
|                 return new _DERTaggedObject(newParam); | 
|             } | 
|         } | 
|     }; | 
|     /** | 
|      * get encoded hexadecimal string of ASN1Object specifed by JSON parameters | 
|      * @name jsonToASN1HEX | 
|      * @memberOf KJUR.asn1.ASN1Util | 
|      * @function | 
|      * @param {Array} param JSON parameter to generate ASN1Object | 
|      * @return hexadecimal string of ASN1Object | 
|      * @since asn1 1.0.4 | 
|      * @description | 
|      * As for ASN.1 object representation of JSON object, | 
|      * please see {@link newObject}. | 
|      * @example | 
|      * jsonToASN1HEX({'prnstr': 'aaa'}); | 
|      */ | 
|     this.jsonToASN1HEX = function (param) { | 
|         var asn1Obj = this.newObject(param); | 
|         return asn1Obj.getEncodedHex(); | 
|     }; | 
| }; | 
| /** | 
|  * get dot noted oid number string from hexadecimal value of OID | 
|  * @name oidHexToInt | 
|  * @memberOf KJUR.asn1.ASN1Util | 
|  * @function | 
|  * @param {String} hex hexadecimal value of object identifier | 
|  * @return {String} dot noted string of object identifier | 
|  * @since jsrsasign 4.8.3 asn1 1.0.7 | 
|  * @description | 
|  * This static method converts from hexadecimal string representation of | 
|  * ASN.1 value of object identifier to oid number string. | 
|  * @example | 
|  * KJUR.asn1.ASN1Util.oidHexToInt('550406') → "2.5.4.6" | 
|  */ | 
| KJUR.asn1.ASN1Util.oidHexToInt = function (hex) { | 
|     var s = ""; | 
|     var i01 = parseInt(hex.substr(0, 2), 16); | 
|     var i0 = Math.floor(i01 / 40); | 
|     var i1 = i01 % 40; | 
|     var s = i0 + "." + i1; | 
|     var binbuf = ""; | 
|     for (var i = 2; i < hex.length; i += 2) { | 
|         var value = parseInt(hex.substr(i, 2), 16); | 
|         var bin = ("00000000" + value.toString(2)).slice(-8); | 
|         binbuf = binbuf + bin.substr(1, 7); | 
|         if (bin.substr(0, 1) == "0") { | 
|             var bi = new BigInteger(binbuf, 2); | 
|             s = s + "." + bi.toString(10); | 
|             binbuf = ""; | 
|         } | 
|     } | 
|     ; | 
|     return s; | 
| }; | 
| /** | 
|  * get hexadecimal value of object identifier from dot noted oid value | 
|  * @name oidIntToHex | 
|  * @memberOf KJUR.asn1.ASN1Util | 
|  * @function | 
|  * @param {String} oidString dot noted string of object identifier | 
|  * @return {String} hexadecimal value of object identifier | 
|  * @since jsrsasign 4.8.3 asn1 1.0.7 | 
|  * @description | 
|  * This static method converts from object identifier value string. | 
|  * to hexadecimal string representation of it. | 
|  * @example | 
|  * KJUR.asn1.ASN1Util.oidIntToHex("2.5.4.6") → "550406" | 
|  */ | 
| KJUR.asn1.ASN1Util.oidIntToHex = function (oidString) { | 
|     var itox = function (i) { | 
|         var h = i.toString(16); | 
|         if (h.length == 1) | 
|             h = '0' + h; | 
|         return h; | 
|     }; | 
|     var roidtox = function (roid) { | 
|         var h = ''; | 
|         var bi = new BigInteger(roid, 10); | 
|         var b = bi.toString(2); | 
|         var padLen = 7 - b.length % 7; | 
|         if (padLen == 7) | 
|             padLen = 0; | 
|         var bPad = ''; | 
|         for (var i = 0; i < padLen; i++) | 
|             bPad += '0'; | 
|         b = bPad + b; | 
|         for (var i = 0; i < b.length - 1; i += 7) { | 
|             var b8 = b.substr(i, 7); | 
|             if (i != b.length - 7) | 
|                 b8 = '1' + b8; | 
|             h += itox(parseInt(b8, 2)); | 
|         } | 
|         return h; | 
|     }; | 
|     if (!oidString.match(/^[0-9.]+$/)) { | 
|         throw "malformed oid string: " + oidString; | 
|     } | 
|     var h = ''; | 
|     var a = oidString.split('.'); | 
|     var i0 = parseInt(a[0]) * 40 + parseInt(a[1]); | 
|     h += itox(i0); | 
|     a.splice(0, 2); | 
|     for (var i = 0; i < a.length; i++) { | 
|         h += roidtox(a[i]); | 
|     } | 
|     return h; | 
| }; | 
| // ******************************************************************** | 
| //  Abstract ASN.1 Classes | 
| // ******************************************************************** | 
| // ******************************************************************** | 
| /** | 
|  * base class for ASN.1 DER encoder object | 
|  * @name KJUR.asn1.ASN1Object | 
|  * @class base class for ASN.1 DER encoder object | 
|  * @property {Boolean} isModified flag whether internal data was changed | 
|  * @property {String} hTLV hexadecimal string of ASN.1 TLV | 
|  * @property {String} hT hexadecimal string of ASN.1 TLV tag(T) | 
|  * @property {String} hL hexadecimal string of ASN.1 TLV length(L) | 
|  * @property {String} hV hexadecimal string of ASN.1 TLV value(V) | 
|  * @description | 
|  */ | 
| KJUR.asn1.ASN1Object = function () { | 
|     var isModified = true; | 
|     var hTLV = null; | 
|     var hT = '00'; | 
|     var hL = '00'; | 
|     var hV = ''; | 
|     /** | 
|      * get hexadecimal ASN.1 TLV length(L) bytes from TLV value(V) | 
|      * @name getLengthHexFromValue | 
|      * @memberOf KJUR.asn1.ASN1Object# | 
|      * @function | 
|      * @return {String} hexadecimal string of ASN.1 TLV length(L) | 
|      */ | 
|     this.getLengthHexFromValue = function () { | 
|         if (typeof this.hV == "undefined" || this.hV == null) { | 
|             throw "this.hV is null or undefined."; | 
|         } | 
|         if (this.hV.length % 2 == 1) { | 
|             throw "value hex must be even length: n=" + hV.length + ",v=" + this.hV; | 
|         } | 
|         var n = this.hV.length / 2; | 
|         var hN = n.toString(16); | 
|         if (hN.length % 2 == 1) { | 
|             hN = "0" + hN; | 
|         } | 
|         if (n < 128) { | 
|             return hN; | 
|         } | 
|         else { | 
|             var hNlen = hN.length / 2; | 
|             if (hNlen > 15) { | 
|                 throw "ASN.1 length too long to represent by 8x: n = " + n.toString(16); | 
|             } | 
|             var head = 128 + hNlen; | 
|             return head.toString(16) + hN; | 
|         } | 
|     }; | 
|     /** | 
|      * get hexadecimal string of ASN.1 TLV bytes | 
|      * @name getEncodedHex | 
|      * @memberOf KJUR.asn1.ASN1Object# | 
|      * @function | 
|      * @return {String} hexadecimal string of ASN.1 TLV | 
|      */ | 
|     this.getEncodedHex = function () { | 
|         if (this.hTLV == null || this.isModified) { | 
|             this.hV = this.getFreshValueHex(); | 
|             this.hL = this.getLengthHexFromValue(); | 
|             this.hTLV = this.hT + this.hL + this.hV; | 
|             this.isModified = false; | 
|             //alert("first time: " + this.hTLV); | 
|         } | 
|         return this.hTLV; | 
|     }; | 
|     /** | 
|      * get hexadecimal string of ASN.1 TLV value(V) bytes | 
|      * @name getValueHex | 
|      * @memberOf KJUR.asn1.ASN1Object# | 
|      * @function | 
|      * @return {String} hexadecimal string of ASN.1 TLV value(V) bytes | 
|      */ | 
|     this.getValueHex = function () { | 
|         this.getEncodedHex(); | 
|         return this.hV; | 
|     }; | 
|     this.getFreshValueHex = function () { | 
|         return ''; | 
|     }; | 
| }; | 
| // == BEGIN DERAbstractString ================================================ | 
| /** | 
|  * base class for ASN.1 DER string classes | 
|  * @name KJUR.asn1.DERAbstractString | 
|  * @class base class for ASN.1 DER string classes | 
|  * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) | 
|  * @property {String} s internal string of value | 
|  * @extends KJUR.asn1.ASN1Object | 
|  * @description | 
|  * <br/> | 
|  * As for argument 'params' for constructor, you can specify one of | 
|  * following properties: | 
|  * <ul> | 
|  * <li>str - specify initial ASN.1 value(V) by a string</li> | 
|  * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li> | 
|  * </ul> | 
|  * NOTE: 'params' can be omitted. | 
|  */ | 
| KJUR.asn1.DERAbstractString = function (params) { | 
|     KJUR.asn1.DERAbstractString.superclass.constructor.call(this); | 
|     var s = null; | 
|     var hV = null; | 
|     /** | 
|      * get string value of this string object | 
|      * @name getString | 
|      * @memberOf KJUR.asn1.DERAbstractString# | 
|      * @function | 
|      * @return {String} string value of this string object | 
|      */ | 
|     this.getString = function () { | 
|         return this.s; | 
|     }; | 
|     /** | 
|      * set value by a string | 
|      * @name setString | 
|      * @memberOf KJUR.asn1.DERAbstractString# | 
|      * @function | 
|      * @param {String} newS value by a string to set | 
|      */ | 
|     this.setString = function (newS) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.s = newS; | 
|         this.hV = stohex(this.s); | 
|     }; | 
|     /** | 
|      * set value by a hexadecimal string | 
|      * @name setStringHex | 
|      * @memberOf KJUR.asn1.DERAbstractString# | 
|      * @function | 
|      * @param {String} newHexString value by a hexadecimal string to set | 
|      */ | 
|     this.setStringHex = function (newHexString) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.s = null; | 
|         this.hV = newHexString; | 
|     }; | 
|     this.getFreshValueHex = function () { | 
|         return this.hV; | 
|     }; | 
|     if (typeof params != "undefined") { | 
|         if (typeof params == "string") { | 
|             this.setString(params); | 
|         } | 
|         else if (typeof params['str'] != "undefined") { | 
|             this.setString(params['str']); | 
|         } | 
|         else if (typeof params['hex'] != "undefined") { | 
|             this.setStringHex(params['hex']); | 
|         } | 
|     } | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object); | 
| // == END   DERAbstractString ================================================ | 
| // == BEGIN DERAbstractTime ================================================== | 
| /** | 
|  * base class for ASN.1 DER Generalized/UTCTime class | 
|  * @name KJUR.asn1.DERAbstractTime | 
|  * @class base class for ASN.1 DER Generalized/UTCTime class | 
|  * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'}) | 
|  * @extends KJUR.asn1.ASN1Object | 
|  * @description | 
|  * @see KJUR.asn1.ASN1Object - superclass | 
|  */ | 
| KJUR.asn1.DERAbstractTime = function (params) { | 
|     KJUR.asn1.DERAbstractTime.superclass.constructor.call(this); | 
|     var s = null; | 
|     var date = null; | 
|     // --- PRIVATE METHODS -------------------- | 
|     this.localDateToUTC = function (d) { | 
|         utc = d.getTime() + (d.getTimezoneOffset() * 60000); | 
|         var utcDate = new Date(utc); | 
|         return utcDate; | 
|     }; | 
|     /* | 
|      * format date string by Data object | 
|      * @name formatDate | 
|      * @memberOf KJUR.asn1.AbstractTime; | 
|      * @param {Date} dateObject | 
|      * @param {string} type 'utc' or 'gen' | 
|      * @param {boolean} withMillis flag for with millisections or not | 
|      * @description | 
|      * 'withMillis' flag is supported from asn1 1.0.6. | 
|      */ | 
|     this.formatDate = function (dateObject, type, withMillis) { | 
|         var pad = this.zeroPadding; | 
|         var d = this.localDateToUTC(dateObject); | 
|         var year = String(d.getFullYear()); | 
|         if (type == 'utc') | 
|             year = year.substr(2, 2); | 
|         var month = pad(String(d.getMonth() + 1), 2); | 
|         var day = pad(String(d.getDate()), 2); | 
|         var hour = pad(String(d.getHours()), 2); | 
|         var min = pad(String(d.getMinutes()), 2); | 
|         var sec = pad(String(d.getSeconds()), 2); | 
|         var s = year + month + day + hour + min + sec; | 
|         if (withMillis === true) { | 
|             var millis = d.getMilliseconds(); | 
|             if (millis != 0) { | 
|                 var sMillis = pad(String(millis), 3); | 
|                 sMillis = sMillis.replace(/[0]+$/, ""); | 
|                 s = s + "." + sMillis; | 
|             } | 
|         } | 
|         return s + "Z"; | 
|     }; | 
|     this.zeroPadding = function (s, len) { | 
|         if (s.length >= len) | 
|             return s; | 
|         return new Array(len - s.length + 1).join('0') + s; | 
|     }; | 
|     // --- PUBLIC METHODS -------------------- | 
|     /** | 
|      * get string value of this string object | 
|      * @name getString | 
|      * @memberOf KJUR.asn1.DERAbstractTime# | 
|      * @function | 
|      * @return {String} string value of this time object | 
|      */ | 
|     this.getString = function () { | 
|         return this.s; | 
|     }; | 
|     /** | 
|      * set value by a string | 
|      * @name setString | 
|      * @memberOf KJUR.asn1.DERAbstractTime# | 
|      * @function | 
|      * @param {String} newS value by a string to set such like "130430235959Z" | 
|      */ | 
|     this.setString = function (newS) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.s = newS; | 
|         this.hV = stohex(newS); | 
|     }; | 
|     /** | 
|      * set value by a Date object | 
|      * @name setByDateValue | 
|      * @memberOf KJUR.asn1.DERAbstractTime# | 
|      * @function | 
|      * @param {Integer} year year of date (ex. 2013) | 
|      * @param {Integer} month month of date between 1 and 12 (ex. 12) | 
|      * @param {Integer} day day of month | 
|      * @param {Integer} hour hours of date | 
|      * @param {Integer} min minutes of date | 
|      * @param {Integer} sec seconds of date | 
|      */ | 
|     this.setByDateValue = function (year, month, day, hour, min, sec) { | 
|         var dateObject = new Date(Date.UTC(year, month - 1, day, hour, min, sec, 0)); | 
|         this.setByDate(dateObject); | 
|     }; | 
|     this.getFreshValueHex = function () { | 
|         return this.hV; | 
|     }; | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object); | 
| // == END   DERAbstractTime ================================================== | 
| // == BEGIN DERAbstractStructured ============================================ | 
| /** | 
|  * base class for ASN.1 DER structured class | 
|  * @name KJUR.asn1.DERAbstractStructured | 
|  * @class base class for ASN.1 DER structured class | 
|  * @property {Array} asn1Array internal array of ASN1Object | 
|  * @extends KJUR.asn1.ASN1Object | 
|  * @description | 
|  * @see KJUR.asn1.ASN1Object - superclass | 
|  */ | 
| KJUR.asn1.DERAbstractStructured = function (params) { | 
|     KJUR.asn1.DERAbstractString.superclass.constructor.call(this); | 
|     var asn1Array = null; | 
|     /** | 
|      * set value by array of ASN1Object | 
|      * @name setByASN1ObjectArray | 
|      * @memberOf KJUR.asn1.DERAbstractStructured# | 
|      * @function | 
|      * @param {array} asn1ObjectArray array of ASN1Object to set | 
|      */ | 
|     this.setByASN1ObjectArray = function (asn1ObjectArray) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.asn1Array = asn1ObjectArray; | 
|     }; | 
|     /** | 
|      * append an ASN1Object to internal array | 
|      * @name appendASN1Object | 
|      * @memberOf KJUR.asn1.DERAbstractStructured# | 
|      * @function | 
|      * @param {ASN1Object} asn1Object to add | 
|      */ | 
|     this.appendASN1Object = function (asn1Object) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.asn1Array.push(asn1Object); | 
|     }; | 
|     this.asn1Array = new Array(); | 
|     if (typeof params != "undefined") { | 
|         if (typeof params['array'] != "undefined") { | 
|             this.asn1Array = params['array']; | 
|         } | 
|     } | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object); | 
| // ******************************************************************** | 
| //  ASN.1 Object Classes | 
| // ******************************************************************** | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER Boolean | 
|  * @name KJUR.asn1.DERBoolean | 
|  * @class class for ASN.1 DER Boolean | 
|  * @extends KJUR.asn1.ASN1Object | 
|  * @description | 
|  * @see KJUR.asn1.ASN1Object - superclass | 
|  */ | 
| KJUR.asn1.DERBoolean = function () { | 
|     KJUR.asn1.DERBoolean.superclass.constructor.call(this); | 
|     this.hT = "01"; | 
|     this.hTLV = "0101ff"; | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER Integer | 
|  * @name KJUR.asn1.DERInteger | 
|  * @class class for ASN.1 DER Integer | 
|  * @extends KJUR.asn1.ASN1Object | 
|  * @description | 
|  * <br/> | 
|  * As for argument 'params' for constructor, you can specify one of | 
|  * following properties: | 
|  * <ul> | 
|  * <li>int - specify initial ASN.1 value(V) by integer value</li> | 
|  * <li>bigint - specify initial ASN.1 value(V) by BigInteger object</li> | 
|  * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li> | 
|  * </ul> | 
|  * NOTE: 'params' can be omitted. | 
|  */ | 
| KJUR.asn1.DERInteger = function (params) { | 
|     KJUR.asn1.DERInteger.superclass.constructor.call(this); | 
|     this.hT = "02"; | 
|     /** | 
|      * set value by Tom Wu's BigInteger object | 
|      * @name setByBigInteger | 
|      * @memberOf KJUR.asn1.DERInteger# | 
|      * @function | 
|      * @param {BigInteger} bigIntegerValue to set | 
|      */ | 
|     this.setByBigInteger = function (bigIntegerValue) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue); | 
|     }; | 
|     /** | 
|      * set value by integer value | 
|      * @name setByInteger | 
|      * @memberOf KJUR.asn1.DERInteger | 
|      * @function | 
|      * @param {Integer} integer value to set | 
|      */ | 
|     this.setByInteger = function (intValue) { | 
|         var bi = new BigInteger(String(intValue), 10); | 
|         this.setByBigInteger(bi); | 
|     }; | 
|     /** | 
|      * set value by integer value | 
|      * @name setValueHex | 
|      * @memberOf KJUR.asn1.DERInteger# | 
|      * @function | 
|      * @param {String} hexadecimal string of integer value | 
|      * @description | 
|      * <br/> | 
|      * NOTE: Value shall be represented by minimum octet length of | 
|      * two's complement representation. | 
|      * @example | 
|      * new KJUR.asn1.DERInteger(123); | 
|      * new KJUR.asn1.DERInteger({'int': 123}); | 
|      * new KJUR.asn1.DERInteger({'hex': '1fad'}); | 
|      */ | 
|     this.setValueHex = function (newHexString) { | 
|         this.hV = newHexString; | 
|     }; | 
|     this.getFreshValueHex = function () { | 
|         return this.hV; | 
|     }; | 
|     if (typeof params != "undefined") { | 
|         if (typeof params['bigint'] != "undefined") { | 
|             this.setByBigInteger(params['bigint']); | 
|         } | 
|         else if (typeof params['int'] != "undefined") { | 
|             this.setByInteger(params['int']); | 
|         } | 
|         else if (typeof params == "number") { | 
|             this.setByInteger(params); | 
|         } | 
|         else if (typeof params['hex'] != "undefined") { | 
|             this.setValueHex(params['hex']); | 
|         } | 
|     } | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER encoded BitString primitive | 
|  * @name KJUR.asn1.DERBitString | 
|  * @class class for ASN.1 DER encoded BitString primitive | 
|  * @extends KJUR.asn1.ASN1Object | 
|  * @description | 
|  * <br/> | 
|  * As for argument 'params' for constructor, you can specify one of | 
|  * following properties: | 
|  * <ul> | 
|  * <li>bin - specify binary string (ex. '10111')</li> | 
|  * <li>array - specify array of boolean (ex. [true,false,true,true])</li> | 
|  * <li>hex - specify hexadecimal string of ASN.1 value(V) including unused bits</li> | 
|  * <li>obj - specify {@link KJUR.asn1.ASN1Util.newObject} | 
|  * argument for "BitString encapsulates" structure.</li> | 
|  * </ul> | 
|  * NOTE1: 'params' can be omitted.<br/> | 
|  * NOTE2: 'obj' parameter have been supported since | 
|  * asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).<br/> | 
|  * @example | 
|  * // default constructor | 
|  * o = new KJUR.asn1.DERBitString(); | 
|  * // initialize with binary string | 
|  * o = new KJUR.asn1.DERBitString({bin: "1011"}); | 
|  * // initialize with boolean array | 
|  * o = new KJUR.asn1.DERBitString({array: [true,false,true,true]}); | 
|  * // initialize with hexadecimal string (04 is unused bits) | 
|  * o = new KJUR.asn1.DEROctetString({hex: "04bac0"}); | 
|  * // initialize with ASN1Util.newObject argument for encapsulated | 
|  * o = new KJUR.asn1.DERBitString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}}); | 
|  * // above generates a ASN.1 data like this: | 
|  * // BIT STRING, encapsulates { | 
|  * //   SEQUENCE { | 
|  * //     INTEGER 3 | 
|  * //     PrintableString 'aaa' | 
|  * //     } | 
|  * //   } | 
|  */ | 
| KJUR.asn1.DERBitString = function (params) { | 
|     if (params !== undefined && typeof params.obj !== "undefined") { | 
|         var o = KJUR.asn1.ASN1Util.newObject(params.obj); | 
|         params.hex = "00" + o.getEncodedHex(); | 
|     } | 
|     KJUR.asn1.DERBitString.superclass.constructor.call(this); | 
|     this.hT = "03"; | 
|     /** | 
|      * set ASN.1 value(V) by a hexadecimal string including unused bits | 
|      * @name setHexValueIncludingUnusedBits | 
|      * @memberOf KJUR.asn1.DERBitString# | 
|      * @function | 
|      * @param {String} newHexStringIncludingUnusedBits | 
|      */ | 
|     this.setHexValueIncludingUnusedBits = function (newHexStringIncludingUnusedBits) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.hV = newHexStringIncludingUnusedBits; | 
|     }; | 
|     /** | 
|      * set ASN.1 value(V) by unused bit and hexadecimal string of value | 
|      * @name setUnusedBitsAndHexValue | 
|      * @memberOf KJUR.asn1.DERBitString# | 
|      * @function | 
|      * @param {Integer} unusedBits | 
|      * @param {String} hValue | 
|      */ | 
|     this.setUnusedBitsAndHexValue = function (unusedBits, hValue) { | 
|         if (unusedBits < 0 || 7 < unusedBits) { | 
|             throw "unused bits shall be from 0 to 7: u = " + unusedBits; | 
|         } | 
|         var hUnusedBits = "0" + unusedBits; | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.hV = hUnusedBits + hValue; | 
|     }; | 
|     /** | 
|      * set ASN.1 DER BitString by binary string<br/> | 
|      * @name setByBinaryString | 
|      * @memberOf KJUR.asn1.DERBitString# | 
|      * @function | 
|      * @param {String} binaryString binary value string (i.e. '10111') | 
|      * @description | 
|      * Its unused bits will be calculated automatically by length of | 
|      * 'binaryValue'. <br/> | 
|      * NOTE: Trailing zeros '0' will be ignored. | 
|      * @example | 
|      * o = new KJUR.asn1.DERBitString(); | 
|      * o.setByBooleanArray("01011"); | 
|      */ | 
|     this.setByBinaryString = function (binaryString) { | 
|         binaryString = binaryString.replace(/0+$/, ''); | 
|         var unusedBits = 8 - binaryString.length % 8; | 
|         if (unusedBits == 8) | 
|             unusedBits = 0; | 
|         for (var i = 0; i <= unusedBits; i++) { | 
|             binaryString += '0'; | 
|         } | 
|         var h = ''; | 
|         for (var i = 0; i < binaryString.length - 1; i += 8) { | 
|             var b = binaryString.substr(i, 8); | 
|             var x = parseInt(b, 2).toString(16); | 
|             if (x.length == 1) | 
|                 x = '0' + x; | 
|             h += x; | 
|         } | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.hV = '0' + unusedBits + h; | 
|     }; | 
|     /** | 
|      * set ASN.1 TLV value(V) by an array of boolean<br/> | 
|      * @name setByBooleanArray | 
|      * @memberOf KJUR.asn1.DERBitString# | 
|      * @function | 
|      * @param {array} booleanArray array of boolean (ex. [true, false, true]) | 
|      * @description | 
|      * NOTE: Trailing falses will be ignored in the ASN.1 DER Object. | 
|      * @example | 
|      * o = new KJUR.asn1.DERBitString(); | 
|      * o.setByBooleanArray([false, true, false, true, true]); | 
|      */ | 
|     this.setByBooleanArray = function (booleanArray) { | 
|         var s = ''; | 
|         for (var i = 0; i < booleanArray.length; i++) { | 
|             if (booleanArray[i] == true) { | 
|                 s += '1'; | 
|             } | 
|             else { | 
|                 s += '0'; | 
|             } | 
|         } | 
|         this.setByBinaryString(s); | 
|     }; | 
|     /** | 
|      * generate an array of falses with specified length<br/> | 
|      * @name newFalseArray | 
|      * @memberOf KJUR.asn1.DERBitString | 
|      * @function | 
|      * @param {Integer} nLength length of array to generate | 
|      * @return {array} array of boolean falses | 
|      * @description | 
|      * This static method may be useful to initialize boolean array. | 
|      * @example | 
|      * o = new KJUR.asn1.DERBitString(); | 
|      * o.newFalseArray(3) → [false, false, false] | 
|      */ | 
|     this.newFalseArray = function (nLength) { | 
|         var a = new Array(nLength); | 
|         for (var i = 0; i < nLength; i++) { | 
|             a[i] = false; | 
|         } | 
|         return a; | 
|     }; | 
|     this.getFreshValueHex = function () { | 
|         return this.hV; | 
|     }; | 
|     if (typeof params != "undefined") { | 
|         if (typeof params == "string" && params.toLowerCase().match(/^[0-9a-f]+$/)) { | 
|             this.setHexValueIncludingUnusedBits(params); | 
|         } | 
|         else if (typeof params['hex'] != "undefined") { | 
|             this.setHexValueIncludingUnusedBits(params['hex']); | 
|         } | 
|         else if (typeof params['bin'] != "undefined") { | 
|             this.setByBinaryString(params['bin']); | 
|         } | 
|         else if (typeof params['array'] != "undefined") { | 
|             this.setByBooleanArray(params['array']); | 
|         } | 
|     } | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER OctetString<br/> | 
|  * @name KJUR.asn1.DEROctetString | 
|  * @class class for ASN.1 DER OctetString | 
|  * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) | 
|  * @extends KJUR.asn1.DERAbstractString | 
|  * @description | 
|  * This class provides ASN.1 OctetString simple type.<br/> | 
|  * Supported "params" attributes are: | 
|  * <ul> | 
|  * <li>str - to set a string as a value</li> | 
|  * <li>hex - to set a hexadecimal string as a value</li> | 
|  * <li>obj - to set a encapsulated ASN.1 value by JSON object | 
|  * which is defined in {@link KJUR.asn1.ASN1Util.newObject}</li> | 
|  * </ul> | 
|  * NOTE: A parameter 'obj' have been supported | 
|  * for "OCTET STRING, encapsulates" structure. | 
|  * since asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25). | 
|  * @see KJUR.asn1.DERAbstractString - superclass | 
|  * @example | 
|  * // default constructor | 
|  * o = new KJUR.asn1.DEROctetString(); | 
|  * // initialize with string | 
|  * o = new KJUR.asn1.DEROctetString({str: "aaa"}); | 
|  * // initialize with hexadecimal string | 
|  * o = new KJUR.asn1.DEROctetString({hex: "616161"}); | 
|  * // initialize with ASN1Util.newObject argument | 
|  * o = new KJUR.asn1.DEROctetString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}}); | 
|  * // above generates a ASN.1 data like this: | 
|  * // OCTET STRING, encapsulates { | 
|  * //   SEQUENCE { | 
|  * //     INTEGER 3 | 
|  * //     PrintableString 'aaa' | 
|  * //     } | 
|  * //   } | 
|  */ | 
| KJUR.asn1.DEROctetString = function (params) { | 
|     if (params !== undefined && typeof params.obj !== "undefined") { | 
|         var o = KJUR.asn1.ASN1Util.newObject(params.obj); | 
|         params.hex = o.getEncodedHex(); | 
|     } | 
|     KJUR.asn1.DEROctetString.superclass.constructor.call(this, params); | 
|     this.hT = "04"; | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER Null | 
|  * @name KJUR.asn1.DERNull | 
|  * @class class for ASN.1 DER Null | 
|  * @extends KJUR.asn1.ASN1Object | 
|  * @description | 
|  * @see KJUR.asn1.ASN1Object - superclass | 
|  */ | 
| KJUR.asn1.DERNull = function () { | 
|     KJUR.asn1.DERNull.superclass.constructor.call(this); | 
|     this.hT = "05"; | 
|     this.hTLV = "0500"; | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER ObjectIdentifier | 
|  * @name KJUR.asn1.DERObjectIdentifier | 
|  * @class class for ASN.1 DER ObjectIdentifier | 
|  * @param {Array} params associative array of parameters (ex. {'oid': '2.5.4.5'}) | 
|  * @extends KJUR.asn1.ASN1Object | 
|  * @description | 
|  * <br/> | 
|  * As for argument 'params' for constructor, you can specify one of | 
|  * following properties: | 
|  * <ul> | 
|  * <li>oid - specify initial ASN.1 value(V) by a oid string (ex. 2.5.4.13)</li> | 
|  * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li> | 
|  * </ul> | 
|  * NOTE: 'params' can be omitted. | 
|  */ | 
| KJUR.asn1.DERObjectIdentifier = function (params) { | 
|     var itox = function (i) { | 
|         var h = i.toString(16); | 
|         if (h.length == 1) | 
|             h = '0' + h; | 
|         return h; | 
|     }; | 
|     var roidtox = function (roid) { | 
|         var h = ''; | 
|         var bi = new BigInteger(roid, 10); | 
|         var b = bi.toString(2); | 
|         var padLen = 7 - b.length % 7; | 
|         if (padLen == 7) | 
|             padLen = 0; | 
|         var bPad = ''; | 
|         for (var i = 0; i < padLen; i++) | 
|             bPad += '0'; | 
|         b = bPad + b; | 
|         for (var i = 0; i < b.length - 1; i += 7) { | 
|             var b8 = b.substr(i, 7); | 
|             if (i != b.length - 7) | 
|                 b8 = '1' + b8; | 
|             h += itox(parseInt(b8, 2)); | 
|         } | 
|         return h; | 
|     }; | 
|     KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this); | 
|     this.hT = "06"; | 
|     /** | 
|      * set value by a hexadecimal string | 
|      * @name setValueHex | 
|      * @memberOf KJUR.asn1.DERObjectIdentifier# | 
|      * @function | 
|      * @param {String} newHexString hexadecimal value of OID bytes | 
|      */ | 
|     this.setValueHex = function (newHexString) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.s = null; | 
|         this.hV = newHexString; | 
|     }; | 
|     /** | 
|      * set value by a OID string<br/> | 
|      * @name setValueOidString | 
|      * @memberOf KJUR.asn1.DERObjectIdentifier# | 
|      * @function | 
|      * @param {String} oidString OID string (ex. 2.5.4.13) | 
|      * @example | 
|      * o = new KJUR.asn1.DERObjectIdentifier(); | 
|      * o.setValueOidString("2.5.4.13"); | 
|      */ | 
|     this.setValueOidString = function (oidString) { | 
|         if (!oidString.match(/^[0-9.]+$/)) { | 
|             throw "malformed oid string: " + oidString; | 
|         } | 
|         var h = ''; | 
|         var a = oidString.split('.'); | 
|         var i0 = parseInt(a[0]) * 40 + parseInt(a[1]); | 
|         h += itox(i0); | 
|         a.splice(0, 2); | 
|         for (var i = 0; i < a.length; i++) { | 
|             h += roidtox(a[i]); | 
|         } | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.s = null; | 
|         this.hV = h; | 
|     }; | 
|     /** | 
|      * set value by a OID name | 
|      * @name setValueName | 
|      * @memberOf KJUR.asn1.DERObjectIdentifier# | 
|      * @function | 
|      * @param {String} oidName OID name (ex. 'serverAuth') | 
|      * @since 1.0.1 | 
|      * @description | 
|      * OID name shall be defined in 'KJUR.asn1.x509.OID.name2oidList'. | 
|      * Otherwise raise error. | 
|      * @example | 
|      * o = new KJUR.asn1.DERObjectIdentifier(); | 
|      * o.setValueName("serverAuth"); | 
|      */ | 
|     this.setValueName = function (oidName) { | 
|         var oid = KJUR.asn1.x509.OID.name2oid(oidName); | 
|         if (oid !== '') { | 
|             this.setValueOidString(oid); | 
|         } | 
|         else { | 
|             throw "DERObjectIdentifier oidName undefined: " + oidName; | 
|         } | 
|     }; | 
|     this.getFreshValueHex = function () { | 
|         return this.hV; | 
|     }; | 
|     if (params !== undefined) { | 
|         if (typeof params === "string") { | 
|             if (params.match(/^[0-2].[0-9.]+$/)) { | 
|                 this.setValueOidString(params); | 
|             } | 
|             else { | 
|                 this.setValueName(params); | 
|             } | 
|         } | 
|         else if (params.oid !== undefined) { | 
|             this.setValueOidString(params.oid); | 
|         } | 
|         else if (params.hex !== undefined) { | 
|             this.setValueHex(params.hex); | 
|         } | 
|         else if (params.name !== undefined) { | 
|             this.setValueName(params.name); | 
|         } | 
|     } | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER Enumerated | 
|  * @name KJUR.asn1.DEREnumerated | 
|  * @class class for ASN.1 DER Enumerated | 
|  * @extends KJUR.asn1.ASN1Object | 
|  * @description | 
|  * <br/> | 
|  * As for argument 'params' for constructor, you can specify one of | 
|  * following properties: | 
|  * <ul> | 
|  * <li>int - specify initial ASN.1 value(V) by integer value</li> | 
|  * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li> | 
|  * </ul> | 
|  * NOTE: 'params' can be omitted. | 
|  * @example | 
|  * new KJUR.asn1.DEREnumerated(123); | 
|  * new KJUR.asn1.DEREnumerated({int: 123}); | 
|  * new KJUR.asn1.DEREnumerated({hex: '1fad'}); | 
|  */ | 
| KJUR.asn1.DEREnumerated = function (params) { | 
|     KJUR.asn1.DEREnumerated.superclass.constructor.call(this); | 
|     this.hT = "0a"; | 
|     /** | 
|      * set value by Tom Wu's BigInteger object | 
|      * @name setByBigInteger | 
|      * @memberOf KJUR.asn1.DEREnumerated# | 
|      * @function | 
|      * @param {BigInteger} bigIntegerValue to set | 
|      */ | 
|     this.setByBigInteger = function (bigIntegerValue) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue); | 
|     }; | 
|     /** | 
|      * set value by integer value | 
|      * @name setByInteger | 
|      * @memberOf KJUR.asn1.DEREnumerated# | 
|      * @function | 
|      * @param {Integer} integer value to set | 
|      */ | 
|     this.setByInteger = function (intValue) { | 
|         var bi = new BigInteger(String(intValue), 10); | 
|         this.setByBigInteger(bi); | 
|     }; | 
|     /** | 
|      * set value by integer value | 
|      * @name setValueHex | 
|      * @memberOf KJUR.asn1.DEREnumerated# | 
|      * @function | 
|      * @param {String} hexadecimal string of integer value | 
|      * @description | 
|      * <br/> | 
|      * NOTE: Value shall be represented by minimum octet length of | 
|      * two's complement representation. | 
|      */ | 
|     this.setValueHex = function (newHexString) { | 
|         this.hV = newHexString; | 
|     }; | 
|     this.getFreshValueHex = function () { | 
|         return this.hV; | 
|     }; | 
|     if (typeof params != "undefined") { | 
|         if (typeof params['int'] != "undefined") { | 
|             this.setByInteger(params['int']); | 
|         } | 
|         else if (typeof params == "number") { | 
|             this.setByInteger(params); | 
|         } | 
|         else if (typeof params['hex'] != "undefined") { | 
|             this.setValueHex(params['hex']); | 
|         } | 
|     } | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER UTF8String | 
|  * @name KJUR.asn1.DERUTF8String | 
|  * @class class for ASN.1 DER UTF8String | 
|  * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) | 
|  * @extends KJUR.asn1.DERAbstractString | 
|  * @description | 
|  * @see KJUR.asn1.DERAbstractString - superclass | 
|  */ | 
| KJUR.asn1.DERUTF8String = function (params) { | 
|     KJUR.asn1.DERUTF8String.superclass.constructor.call(this, params); | 
|     this.hT = "0c"; | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER NumericString | 
|  * @name KJUR.asn1.DERNumericString | 
|  * @class class for ASN.1 DER NumericString | 
|  * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) | 
|  * @extends KJUR.asn1.DERAbstractString | 
|  * @description | 
|  * @see KJUR.asn1.DERAbstractString - superclass | 
|  */ | 
| KJUR.asn1.DERNumericString = function (params) { | 
|     KJUR.asn1.DERNumericString.superclass.constructor.call(this, params); | 
|     this.hT = "12"; | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER PrintableString | 
|  * @name KJUR.asn1.DERPrintableString | 
|  * @class class for ASN.1 DER PrintableString | 
|  * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) | 
|  * @extends KJUR.asn1.DERAbstractString | 
|  * @description | 
|  * @see KJUR.asn1.DERAbstractString - superclass | 
|  */ | 
| KJUR.asn1.DERPrintableString = function (params) { | 
|     KJUR.asn1.DERPrintableString.superclass.constructor.call(this, params); | 
|     this.hT = "13"; | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER TeletexString | 
|  * @name KJUR.asn1.DERTeletexString | 
|  * @class class for ASN.1 DER TeletexString | 
|  * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) | 
|  * @extends KJUR.asn1.DERAbstractString | 
|  * @description | 
|  * @see KJUR.asn1.DERAbstractString - superclass | 
|  */ | 
| KJUR.asn1.DERTeletexString = function (params) { | 
|     KJUR.asn1.DERTeletexString.superclass.constructor.call(this, params); | 
|     this.hT = "14"; | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER IA5String | 
|  * @name KJUR.asn1.DERIA5String | 
|  * @class class for ASN.1 DER IA5String | 
|  * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) | 
|  * @extends KJUR.asn1.DERAbstractString | 
|  * @description | 
|  * @see KJUR.asn1.DERAbstractString - superclass | 
|  */ | 
| KJUR.asn1.DERIA5String = function (params) { | 
|     KJUR.asn1.DERIA5String.superclass.constructor.call(this, params); | 
|     this.hT = "16"; | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER UTCTime | 
|  * @name KJUR.asn1.DERUTCTime | 
|  * @class class for ASN.1 DER UTCTime | 
|  * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'}) | 
|  * @extends KJUR.asn1.DERAbstractTime | 
|  * @description | 
|  * <br/> | 
|  * As for argument 'params' for constructor, you can specify one of | 
|  * following properties: | 
|  * <ul> | 
|  * <li>str - specify initial ASN.1 value(V) by a string (ex.'130430235959Z')</li> | 
|  * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li> | 
|  * <li>date - specify Date object.</li> | 
|  * </ul> | 
|  * NOTE: 'params' can be omitted. | 
|  * <h4>EXAMPLES</h4> | 
|  * @example | 
|  * d1 = new KJUR.asn1.DERUTCTime(); | 
|  * d1.setString('130430125959Z'); | 
|  * | 
|  * d2 = new KJUR.asn1.DERUTCTime({'str': '130430125959Z'}); | 
|  * d3 = new KJUR.asn1.DERUTCTime({'date': new Date(Date.UTC(2015, 0, 31, 0, 0, 0, 0))}); | 
|  * d4 = new KJUR.asn1.DERUTCTime('130430125959Z'); | 
|  */ | 
| KJUR.asn1.DERUTCTime = function (params) { | 
|     KJUR.asn1.DERUTCTime.superclass.constructor.call(this, params); | 
|     this.hT = "17"; | 
|     /** | 
|      * set value by a Date object<br/> | 
|      * @name setByDate | 
|      * @memberOf KJUR.asn1.DERUTCTime# | 
|      * @function | 
|      * @param {Date} dateObject Date object to set ASN.1 value(V) | 
|      * @example | 
|      * o = new KJUR.asn1.DERUTCTime(); | 
|      * o.setByDate(new Date("2016/12/31")); | 
|      */ | 
|     this.setByDate = function (dateObject) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.date = dateObject; | 
|         this.s = this.formatDate(this.date, 'utc'); | 
|         this.hV = stohex(this.s); | 
|     }; | 
|     this.getFreshValueHex = function () { | 
|         if (typeof this.date == "undefined" && typeof this.s == "undefined") { | 
|             this.date = new Date(); | 
|             this.s = this.formatDate(this.date, 'utc'); | 
|             this.hV = stohex(this.s); | 
|         } | 
|         return this.hV; | 
|     }; | 
|     if (params !== undefined) { | 
|         if (params.str !== undefined) { | 
|             this.setString(params.str); | 
|         } | 
|         else if (typeof params == "string" && params.match(/^[0-9]{12}Z$/)) { | 
|             this.setString(params); | 
|         } | 
|         else if (params.hex !== undefined) { | 
|             this.setStringHex(params.hex); | 
|         } | 
|         else if (params.date !== undefined) { | 
|             this.setByDate(params.date); | 
|         } | 
|     } | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER GeneralizedTime | 
|  * @name KJUR.asn1.DERGeneralizedTime | 
|  * @class class for ASN.1 DER GeneralizedTime | 
|  * @param {Array} params associative array of parameters (ex. {'str': '20130430235959Z'}) | 
|  * @property {Boolean} withMillis flag to show milliseconds or not | 
|  * @extends KJUR.asn1.DERAbstractTime | 
|  * @description | 
|  * <br/> | 
|  * As for argument 'params' for constructor, you can specify one of | 
|  * following properties: | 
|  * <ul> | 
|  * <li>str - specify initial ASN.1 value(V) by a string (ex.'20130430235959Z')</li> | 
|  * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li> | 
|  * <li>date - specify Date object.</li> | 
|  * <li>millis - specify flag to show milliseconds (from 1.0.6)</li> | 
|  * </ul> | 
|  * NOTE1: 'params' can be omitted. | 
|  * NOTE2: 'withMillis' property is supported from asn1 1.0.6. | 
|  */ | 
| KJUR.asn1.DERGeneralizedTime = function (params) { | 
|     KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, params); | 
|     this.hT = "18"; | 
|     this.withMillis = false; | 
|     /** | 
|      * set value by a Date object | 
|      * @name setByDate | 
|      * @memberOf KJUR.asn1.DERGeneralizedTime# | 
|      * @function | 
|      * @param {Date} dateObject Date object to set ASN.1 value(V) | 
|      * @example | 
|      * When you specify UTC time, use 'Date.UTC' method like this:<br/> | 
|      * o1 = new DERUTCTime(); | 
|      * o1.setByDate(date); | 
|      * | 
|      * date = new Date(Date.UTC(2015, 0, 31, 23, 59, 59, 0)); #2015JAN31 23:59:59 | 
|      */ | 
|     this.setByDate = function (dateObject) { | 
|         this.hTLV = null; | 
|         this.isModified = true; | 
|         this.date = dateObject; | 
|         this.s = this.formatDate(this.date, 'gen', this.withMillis); | 
|         this.hV = stohex(this.s); | 
|     }; | 
|     this.getFreshValueHex = function () { | 
|         if (this.date === undefined && this.s === undefined) { | 
|             this.date = new Date(); | 
|             this.s = this.formatDate(this.date, 'gen', this.withMillis); | 
|             this.hV = stohex(this.s); | 
|         } | 
|         return this.hV; | 
|     }; | 
|     if (params !== undefined) { | 
|         if (params.str !== undefined) { | 
|             this.setString(params.str); | 
|         } | 
|         else if (typeof params == "string" && params.match(/^[0-9]{14}Z$/)) { | 
|             this.setString(params); | 
|         } | 
|         else if (params.hex !== undefined) { | 
|             this.setStringHex(params.hex); | 
|         } | 
|         else if (params.date !== undefined) { | 
|             this.setByDate(params.date); | 
|         } | 
|         if (params.millis === true) { | 
|             this.withMillis = true; | 
|         } | 
|     } | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER Sequence | 
|  * @name KJUR.asn1.DERSequence | 
|  * @class class for ASN.1 DER Sequence | 
|  * @extends KJUR.asn1.DERAbstractStructured | 
|  * @description | 
|  * <br/> | 
|  * As for argument 'params' for constructor, you can specify one of | 
|  * following properties: | 
|  * <ul> | 
|  * <li>array - specify array of ASN1Object to set elements of content</li> | 
|  * </ul> | 
|  * NOTE: 'params' can be omitted. | 
|  */ | 
| KJUR.asn1.DERSequence = function (params) { | 
|     KJUR.asn1.DERSequence.superclass.constructor.call(this, params); | 
|     this.hT = "30"; | 
|     this.getFreshValueHex = function () { | 
|         var h = ''; | 
|         for (var i = 0; i < this.asn1Array.length; i++) { | 
|             var asn1Obj = this.asn1Array[i]; | 
|             h += asn1Obj.getEncodedHex(); | 
|         } | 
|         this.hV = h; | 
|         return this.hV; | 
|     }; | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER Set | 
|  * @name KJUR.asn1.DERSet | 
|  * @class class for ASN.1 DER Set | 
|  * @extends KJUR.asn1.DERAbstractStructured | 
|  * @description | 
|  * <br/> | 
|  * As for argument 'params' for constructor, you can specify one of | 
|  * following properties: | 
|  * <ul> | 
|  * <li>array - specify array of ASN1Object to set elements of content</li> | 
|  * <li>sortflag - flag for sort (default: true). ASN.1 BER is not sorted in 'SET OF'.</li> | 
|  * </ul> | 
|  * NOTE1: 'params' can be omitted.<br/> | 
|  * NOTE2: sortflag is supported since 1.0.5. | 
|  */ | 
| KJUR.asn1.DERSet = function (params) { | 
|     KJUR.asn1.DERSet.superclass.constructor.call(this, params); | 
|     this.hT = "31"; | 
|     this.sortFlag = true; // item shall be sorted only in ASN.1 DER | 
|     this.getFreshValueHex = function () { | 
|         var a = new Array(); | 
|         for (var i = 0; i < this.asn1Array.length; i++) { | 
|             var asn1Obj = this.asn1Array[i]; | 
|             a.push(asn1Obj.getEncodedHex()); | 
|         } | 
|         if (this.sortFlag == true) | 
|             a.sort(); | 
|         this.hV = a.join(''); | 
|         return this.hV; | 
|     }; | 
|     if (typeof params != "undefined") { | 
|         if (typeof params.sortflag != "undefined" && | 
|             params.sortflag == false) | 
|             this.sortFlag = false; | 
|     } | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured); | 
| // ******************************************************************** | 
| /** | 
|  * class for ASN.1 DER TaggedObject | 
|  * @name KJUR.asn1.DERTaggedObject | 
|  * @class class for ASN.1 DER TaggedObject | 
|  * @extends KJUR.asn1.ASN1Object | 
|  * @description | 
|  * <br/> | 
|  * Parameter 'tagNoNex' is ASN.1 tag(T) value for this object. | 
|  * For example, if you find '[1]' tag in a ASN.1 dump, | 
|  * 'tagNoHex' will be 'a1'. | 
|  * <br/> | 
|  * As for optional argument 'params' for constructor, you can specify *ANY* of | 
|  * following properties: | 
|  * <ul> | 
|  * <li>explicit - specify true if this is explicit tag otherwise false | 
|  *     (default is 'true').</li> | 
|  * <li>tag - specify tag (default is 'a0' which means [0])</li> | 
|  * <li>obj - specify ASN1Object which is tagged</li> | 
|  * </ul> | 
|  * @example | 
|  * d1 = new KJUR.asn1.DERUTF8String({'str':'a'}); | 
|  * d2 = new KJUR.asn1.DERTaggedObject({'obj': d1}); | 
|  * hex = d2.getEncodedHex(); | 
|  */ | 
| KJUR.asn1.DERTaggedObject = function (params) { | 
|     KJUR.asn1.DERTaggedObject.superclass.constructor.call(this); | 
|     this.hT = "a0"; | 
|     this.hV = ''; | 
|     this.isExplicit = true; | 
|     this.asn1Object = null; | 
|     /** | 
|      * set value by an ASN1Object | 
|      * @name setString | 
|      * @memberOf KJUR.asn1.DERTaggedObject# | 
|      * @function | 
|      * @param {Boolean} isExplicitFlag flag for explicit/implicit tag | 
|      * @param {Integer} tagNoHex hexadecimal string of ASN.1 tag | 
|      * @param {ASN1Object} asn1Object ASN.1 to encapsulate | 
|      */ | 
|     this.setASN1Object = function (isExplicitFlag, tagNoHex, asn1Object) { | 
|         this.hT = tagNoHex; | 
|         this.isExplicit = isExplicitFlag; | 
|         this.asn1Object = asn1Object; | 
|         if (this.isExplicit) { | 
|             this.hV = this.asn1Object.getEncodedHex(); | 
|             this.hTLV = null; | 
|             this.isModified = true; | 
|         } | 
|         else { | 
|             this.hV = null; | 
|             this.hTLV = asn1Object.getEncodedHex(); | 
|             this.hTLV = this.hTLV.replace(/^../, tagNoHex); | 
|             this.isModified = false; | 
|         } | 
|     }; | 
|     this.getFreshValueHex = function () { | 
|         return this.hV; | 
|     }; | 
|     if (typeof params != "undefined") { | 
|         if (typeof params['tag'] != "undefined") { | 
|             this.hT = params['tag']; | 
|         } | 
|         if (typeof params['explicit'] != "undefined") { | 
|             this.isExplicit = params['explicit']; | 
|         } | 
|         if (typeof params['obj'] != "undefined") { | 
|             this.asn1Object = params['obj']; | 
|             this.setASN1Object(this.isExplicit, this.hT, this.asn1Object); | 
|         } | 
|     } | 
| }; | 
| YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object); |