api-console-assets
Version:
This repo only exists to publish api console components to npm
710 lines (667 loc) • 23.2 kB
JavaScript
/* asn1hex-1.2.0.js (c) 2012-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
/*
* asn1hex.js - Hexadecimal represented ASN.1 string library
*
* Copyright (c) 2010-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.
*/
/**
* @fileOverview
* @name asn1hex-1.1.js
* @author Kenji Urushima kenji.urushima@gmail.com
* @version asn1hex 1.2.0 (2017-Jun-24)
* @license <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a>
*/
/*
* MEMO:
* f('3082025b02...', 2) ... 82025b ... 3bytes
* f('020100', 2) ... 01 ... 1byte
* f('0203001...', 2) ... 03 ... 1byte
* f('02818003...', 2) ... 8180 ... 2bytes
* f('3080....0000', 2) ... 80 ... -1
*
* Requirements:
* - ASN.1 type octet length MUST be 1.
* (i.e. ASN.1 primitives like SET, SEQUENCE, INTEGER, OCTETSTRING ...)
*/
/**
* ASN.1 DER encoded hexadecimal string utility class
* @name ASN1HEX
* @class ASN.1 DER encoded hexadecimal string utility class
* @since jsrsasign 1.1
* @description
* This class provides a parser for hexadecimal string of
* DER encoded ASN.1 binary data.
* Here are major methods of this class.
* <ul>
* <li><b>ACCESS BY POSITION</b>
* <ul>
* <li>{@link ASN1HEX.getTLV} - get ASN.1 TLV at specified position</li>
* <li>{@link ASN1HEX.getV} - get ASN.1 V at specified position</li>
* <li>{@link ASN1HEX.getVlen} - get integer ASN.1 L at specified position</li>
* <li>{@link ASN1HEX.getVidx} - get ASN.1 V position from its ASN.1 TLV position</li>
* <li>{@link ASN1HEX.getL} - get hexadecimal ASN.1 L at specified position</li>
* <li>{@link ASN1HEX.getLblen} - get byte length for ASN.1 L(length) bytes</li>
* </ul>
* </li>
* <li><b>ACCESS FOR CHILD ITEM</b>
* <ul>
* <li>{@link ASN1HEX.getNthChildIndex_AtObj} - get nth child index at specified position</li>
* <li>{@link ASN1HEX.getPosArrayOfChildren_AtObj} - get indexes of children</li>
* <li>{@link ASN1HEX.getPosOfNextSibling_AtObj} - get position of next sibling</li>
* </ul>
* </li>
* <li><b>ACCESS NESTED ASN.1 STRUCTURE</b>
* <ul>
* <li>{@link ASN1HEX.getTLVbyList} - get ASN.1 TLV at specified list index</li>
* <li>{@link ASN1HEX.getVbyList} - get ASN.1 V at specified nth list index with checking expected tag</li>
* <li>{@link ASN1HEX.getIdxbyList} - get index at specified list index</li>
* </ul>
* </li>
* <li><b>UTILITIES</b>
* <ul>
* <li>{@link ASN1HEX.dump} - dump ASN.1 structure</li>
* <li>{@link ASN1HEX.isASN1HEX} - check whether ASN.1 hexadecimal string or not</li>
* <li>{@link ASN1HEX.hextooidstr} - convert hexadecimal string of OID to dotted integer list</li>
* </ul>
* </li>
* </ul>
*/
var ASN1HEX = new function() {
};
/**
* get byte length for ASN.1 L(length) bytes<br/>
* @name getLblen
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} idx string index
* @return byte length for ASN.1 L(length) bytes
* @since jsrsasign 7.2.0 asn1hex 1.1.11
* @example
* ASN1HEX.getLblen('020100', 0) → 1 for '01'
* ASN1HEX.getLblen('020200', 0) → 1 for '02'
* ASN1HEX.getLblen('02818003...', 0) → 2 for '8180'
* ASN1HEX.getLblen('0282025b03...', 0) → 3 for '82025b'
* ASN1HEX.getLblen('0280020100...', 0) → -1 for '80' BER indefinite length
* ASN1HEX.getLblen('02ffab...', 0) → -2 for malformed ASN.1 length
*/
ASN1HEX.getLblen = function(s, idx) {
if (s.substr(idx + 2, 1) != '8') return 1;
var i = parseInt(s.substr(idx + 3, 1));
if (i == 0) return -1; // length octet '80' indefinite length
if (0 < i && i < 10) return i + 1; // including '8?' octet;
return -2; // malformed format
};
/**
* get hexadecimal string for ASN.1 L(length) bytes<br/>
* @name getL
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} idx string index to get L of ASN.1 object
* @return {String} hexadecimal string for ASN.1 L(length) bytes
* @since jsrsasign 7.2.0 asn1hex 1.1.11
*/
ASN1HEX.getL = function(s, idx) {
var len = ASN1HEX.getLblen(s, idx);
if (len < 1) return '';
return s.substr(idx + 2, len * 2);
};
/**
* get integer value of ASN.1 length for ASN.1 data<br/>
* @name getVblen
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} idx string index
* @return ASN.1 L(length) integer value
* @since jsrsasign 7.2.0 asn1hex 1.1.11
*/
/*
getting ASN.1 length value at the position 'idx' of
hexa decimal string 's'.
f('3082025b02...', 0) ... 82025b ... ???
f('020100', 0) ... 01 ... 1
f('0203001...', 0) ... 03 ... 3
f('02818003...', 0) ... 8180 ... 128
*/
ASN1HEX.getVblen = function(s, idx) {
var hLen, bi;
hLen = ASN1HEX.getL(s, idx);
if (hLen == '') return -1;
if (hLen.substr(0, 1) === '8') {
bi = new BigInteger(hLen.substr(2), 16);
} else {
bi = new BigInteger(hLen, 16);
}
return bi.intValue();
};
/**
* get ASN.1 value starting string position for ASN.1 object refered by index 'idx'.
* @name getVidx
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} idx string index
* @since jsrsasign 7.2.0 asn1hex 1.1.11
*/
ASN1HEX.getVidx = function(s, idx) {
var l_len = ASN1HEX.getLblen(s, idx);
if (l_len < 0) return l_len;
return idx + (l_len + 1) * 2;
};
/**
* get hexadecimal string of ASN.1 V(value)<br/>
* @name getV
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} idx string index
* @return {String} hexadecimal string of ASN.1 value.
* @since jsrsasign 7.2.0 asn1hex 1.1.11
*/
ASN1HEX.getV = function(s, idx) {
var idx1 = ASN1HEX.getVidx(s, idx);
var blen = ASN1HEX.getVblen(s, idx);
return s.substr(idx1, blen * 2);
};
/**
* get hexadecimal string of ASN.1 TLV at<br/>
* @name getTLV
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} idx string index
* @return {String} hexadecimal string of ASN.1 TLV.
* @since jsrsasign 7.2.0 asn1hex 1.1.11
*/
ASN1HEX.getTLV = function(s, idx) {
return s.substr(idx, 2) + ASN1HEX.getL(s, idx) + ASN1HEX.getV(s, idx);
};
// ========== sibling methods ================================
/**
* get next sibling starting index for ASN.1 object string<br/>
* @name getNextSiblingIdx
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} idx string index
* @return next sibling starting index for ASN.1 object string
* @since jsrsasign 7.2.0 asn1hex 1.1.11
* @example
* SEQUENCE { INTEGER 3, INTEGER 4 }
* 3006
* 020103 :idx=4
* 020104 :next sibling idx=10
* getNextSiblingIdx("3006020103020104", 4) & rarr 10
*/
ASN1HEX.getNextSiblingIdx = function(s, idx) {
var idx1 = ASN1HEX.getVidx(s, idx);
var blen = ASN1HEX.getVblen(s, idx);
return idx1 + blen * 2;
};
// ========== children methods ===============================
/**
* get array of string indexes of child ASN.1 objects<br/>
* @name getChildIdx
* @memberOf ASN1HEX
* @function
* @param {String} h hexadecimal string of ASN.1 DER encoded data
* @param {Number} pos start string index of ASN.1 object
* @return {Array of Number} array of indexes for childen of ASN.1 objects
* @since jsrsasign 7.2.0 asn1hex 1.1.11
* @description
* This method returns array of integers for a concatination of ASN.1 objects
* in a ASN.1 value. As for BITSTRING, one byte of unusedbits is skipped.
* As for other ASN.1 simple types such as INTEGER, OCTET STRING or PRINTABLE STRING,
* it returns a array of a string index of its ASN.1 value.<br/>
* NOTE: Since asn1hex 1.1.7 of jsrsasign 6.1.2, Encapsulated BitString is supported.
* @example
* ASN1HEX.getChildIdx("0203012345", 0) ⇒ [4] // INTEGER 012345
* ASN1HEX.getChildIdx("1303616161", 0) ⇒ [4] // PrintableString aaa
* ASN1HEX.getChildIdx("030300ffff", 0) ⇒ [6] // BITSTRING ffff (unusedbits=00a)
* ASN1HEX.getChildIdx("3006020104020105", 0) ⇒ [4, 10] // SEQUENCE(INT4,INT5)
*/
ASN1HEX.getChildIdx = function(h, pos) {
var _ASN1HEX = ASN1HEX;
var a = new Array();
var p0 = _ASN1HEX.getVidx(h, pos);
if (h.substr(pos, 2) == "03") {
a.push(p0 + 2); // BITSTRING value without unusedbits
} else {
a.push(p0);
}
var blen = _ASN1HEX.getVblen(h, pos);
var p = p0;
var k = 0;
while (1) {
var pNext = _ASN1HEX.getNextSiblingIdx(h, p);
if (pNext == null || (pNext - p0 >= (blen * 2))) break;
if (k >= 200) break;
a.push(pNext);
p = pNext;
k++;
}
return a;
};
/**
* get string index of nth child object of ASN.1 object refered by h, idx<br/>
* @name getNthChildIdx
* @memberOf ASN1HEX
* @function
* @param {String} h hexadecimal string of ASN.1 DER encoded data
* @param {Number} idx start string index of ASN.1 object
* @param {Number} nth for child
* @return {Number} string index of nth child.
* @since jsrsasign 7.2.0 asn1hex 1.1.11
*/
ASN1HEX.getNthChildIdx = function(h, idx, nth) {
var a = ASN1HEX.getChildIdx(h, idx);
return a[nth];
};
// ========== decendant methods ==============================
/**
* get string index of nth child object of ASN.1 object refered by h, idx<br/>
* @name getIdxbyList
* @memberOf ASN1HEX
* @function
* @param {String} h hexadecimal string of ASN.1 DER encoded data
* @param {Number} currentIndex start string index of ASN.1 object
* @param {Array of Number} nthList array list of nth
* @param {String} checkingTag (OPTIONAL) string of expected ASN.1 tag for nthList
* @return {Number} string index refered by nthList
* @since jsrsasign 7.1.4 asn1hex 1.1.10.
* @description
* @example
* The "nthList" is a index list of structured ASN.1 object
* reference. Here is a sample structure and "nthList"s which
* refers each objects.
*
* SQUENCE -
* SEQUENCE - [0]
* IA5STRING 000 - [0, 0]
* UTF8STRING 001 - [0, 1]
* SET - [1]
* IA5STRING 010 - [1, 0]
* UTF8STRING 011 - [1, 1]
*/
ASN1HEX.getIdxbyList = function(h, currentIndex, nthList, checkingTag) {
var _ASN1HEX = ASN1HEX;
var firstNth, a;
if (nthList.length == 0) {
if (checkingTag !== undefined) {
if (h.substr(currentIndex, 2) !== checkingTag) {
throw "checking tag doesn't match: " +
h.substr(currentIndex, 2) + "!=" + checkingTag;
}
}
return currentIndex;
}
firstNth = nthList.shift();
a = _ASN1HEX.getChildIdx(h, currentIndex);
return _ASN1HEX.getIdxbyList(h, a[firstNth], nthList, checkingTag);
};
/**
* get ASN.1 TLV by nthList<br/>
* @name getTLVbyList
* @memberOf ASN1HEX
* @function
* @param {String} h hexadecimal string of ASN.1 structure
* @param {Integer} currentIndex string index to start searching in hexadecimal string "h"
* @param {Array} nthList array of nth list index
* @param {String} checkingTag (OPTIONAL) string of expected ASN.1 tag for nthList
* @since jsrsasign 7.1.4 asn1hex 1.1.10
* @description
* This static method is to get a ASN.1 value which specified "nthList" position
* with checking expected tag "checkingTag".
*/
ASN1HEX.getTLVbyList = function(h, currentIndex, nthList, checkingTag) {
var _ASN1HEX = ASN1HEX;
var idx = _ASN1HEX.getIdxbyList(h, currentIndex, nthList);
if (idx === undefined) {
throw "can't find nthList object";
}
if (checkingTag !== undefined) {
if (h.substr(idx, 2) != checkingTag) {
throw "checking tag doesn't match: " +
h.substr(idx,2) + "!=" + checkingTag;
}
}
return _ASN1HEX.getTLV(h, idx);
};
/**
* get ASN.1 value by nthList<br/>
* @name getVbyList
* @memberOf ASN1HEX
* @function
* @param {String} h hexadecimal string of ASN.1 structure
* @param {Integer} currentIndex string index to start searching in hexadecimal string "h"
* @param {Array} nthList array of nth list index
* @param {String} checkingTag (OPTIONAL) string of expected ASN.1 tag for nthList
* @param {Boolean} removeUnusedbits (OPTIONAL) flag for remove first byte for value (DEFAULT false)
* @since asn1hex 1.1.4
* @description
* This static method is to get a ASN.1 value which specified "nthList" position
* with checking expected tag "checkingTag".
* NOTE: 'removeUnusedbits' flag has been supported since
* jsrsasign 7.1.14 asn1hex 1.1.10.
*/
ASN1HEX.getVbyList = function(h, currentIndex, nthList, checkingTag, removeUnusedbits) {
var _ASN1HEX = ASN1HEX;
var idx, v;
idx = _ASN1HEX.getIdxbyList(h, currentIndex, nthList, checkingTag);
if (idx === undefined) {
throw "can't find nthList object";
}
v = _ASN1HEX.getV(h, idx);
if (removeUnusedbits === true) v = v.substr(2);
return v;
};
/**
* get OID string from hexadecimal encoded value<br/>
* @name hextooidstr
* @memberOf ASN1HEX
* @function
* @param {String} hex hexadecmal string of ASN.1 DER encoded OID value
* @return {String} OID string (ex. '1.2.3.4.567')
* @since asn1hex 1.1.5
*/
ASN1HEX.hextooidstr = function(hex) {
var zeroPadding = function(s, len) {
if (s.length >= len) return s;
return new Array(len - s.length + 1).join('0') + s;
};
var a = [];
// a[0], a[1]
var hex0 = hex.substr(0, 2);
var i0 = parseInt(hex0, 16);
a[0] = new String(Math.floor(i0 / 40));
a[1] = new String(i0 % 40);
// a[2]..a[n]
var hex1 = hex.substr(2);
var b = [];
for (var i = 0; i < hex1.length / 2; i++) {
b.push(parseInt(hex1.substr(i * 2, 2), 16));
}
var c = [];
var cbin = "";
for (var i = 0; i < b.length; i++) {
if (b[i] & 0x80) {
cbin = cbin + zeroPadding((b[i] & 0x7f).toString(2), 7);
} else {
cbin = cbin + zeroPadding((b[i] & 0x7f).toString(2), 7);
c.push(new String(parseInt(cbin, 2)));
cbin = "";
}
}
var s = a.join(".");
if (c.length > 0) s = s + "." + c.join(".");
return s;
};
/**
* get string of simple ASN.1 dump from hexadecimal ASN.1 data<br/>
* @name dump
* @memberOf ASN1HEX
* @function
* @param {Object} hexOrObj hexadecmal string of ASN.1 data or ASN1Object object
* @param {Array} flags associative array of flags for dump (OPTION)
* @param {Number} idx string index for starting dump (OPTION)
* @param {String} indent indent string (OPTION)
* @return {String} string of simple ASN.1 dump
* @since jsrsasign 4.8.3 asn1hex 1.1.6
* @description
* This method will get an ASN.1 dump from
* hexadecmal string of ASN.1 DER encoded data.
* Here are features:
* <ul>
* <li>ommit long hexadecimal string</li>
* <li>dump encapsulated OCTET STRING (good for X.509v3 extensions)</li>
* <li>structured/primitive context specific tag support (i.e. [0], [3] ...)</li>
* <li>automatic decode for implicit primitive context specific tag
* (good for X.509v3 extension value)
* <ul>
* <li>if hex starts '68747470'(i.e. http) it is decoded as utf8 encoded string.</li>
* <li>if it is in 'subjectAltName' extension value and is '[2]'(dNSName) tag
* value will be encoded as utf8 string</li>
* <li>otherwise it shows as hexadecimal string</li>
* </ul>
* </li>
* </ul>
* NOTE1: Argument {@link KJUR.asn1.ASN1Object} object is supported since
* jsrsasign 6.2.4 asn1hex 1.0.8
* @example
* // 1) ASN.1 INTEGER
* ASN1HEX.dump('0203012345')
* ↓
* INTEGER 012345
*
* // 2) ASN.1 Object Identifier
* ASN1HEX.dump('06052b0e03021a')
* ↓
* ObjectIdentifier sha1 (1 3 14 3 2 26)
*
* // 3) ASN.1 SEQUENCE
* ASN1HEX.dump('3006020101020102')
* ↓
* SEQUENCE
* INTEGER 01
* INTEGER 02
*
* // 4) ASN.1 SEQUENCE since jsrsasign 6.2.4
* o = KJUR.asn1.ASN1Util.newObject({seq: [{int: 1}, {int: 2}]});
* ASN1HEX.dump(o)
* ↓
* SEQUENCE
* INTEGER 01
* INTEGER 02
* // 5) ASN.1 DUMP FOR X.509 CERTIFICATE
* ASN1HEX.dump(pemtohex(certPEM))
* ↓
* SEQUENCE
* SEQUENCE
* [0]
* INTEGER 02
* INTEGER 0c009310d206dbe337553580118ddc87
* SEQUENCE
* ObjectIdentifier SHA256withRSA (1 2 840 113549 1 1 11)
* NULL
* SEQUENCE
* SET
* SEQUENCE
* ObjectIdentifier countryName (2 5 4 6)
* PrintableString 'US'
* :
*/
ASN1HEX.dump = function(hexOrObj, flags, idx, indent) {
var _ASN1HEX = ASN1HEX;
var _getV = _ASN1HEX.getV;
var _dump = _ASN1HEX.dump;
var _getChildIdx = _ASN1HEX.getChildIdx;
var hex = hexOrObj;
if (hexOrObj instanceof KJUR.asn1.ASN1Object)
hex = hexOrObj.getEncodedHex();
var _skipLongHex = function(hex, limitNumOctet) {
if (hex.length <= limitNumOctet * 2) {
return hex;
} else {
var s = hex.substr(0, limitNumOctet) +
"..(total " + hex.length / 2 + "bytes).." +
hex.substr(hex.length - limitNumOctet, limitNumOctet);
return s;
};
};
if (flags === undefined) flags = { "ommit_long_octet": 32 };
if (idx === undefined) idx = 0;
if (indent === undefined) indent = "";
var skipLongHex = flags.ommit_long_octet;
if (hex.substr(idx, 2) == "01") {
var v = _getV(hex, idx);
if (v == "00") {
return indent + "BOOLEAN FALSE\n";
} else {
return indent + "BOOLEAN TRUE\n";
}
}
if (hex.substr(idx, 2) == "02") {
var v = _getV(hex, idx);
return indent + "INTEGER " + _skipLongHex(v, skipLongHex) + "\n";
}
if (hex.substr(idx, 2) == "03") {
var v = _getV(hex, idx);
return indent + "BITSTRING " + _skipLongHex(v, skipLongHex) + "\n";
}
if (hex.substr(idx, 2) == "04") {
var v = _getV(hex, idx);
if (_ASN1HEX.isASN1HEX(v)) {
var s = indent + "OCTETSTRING, encapsulates\n";
s = s + _dump(v, flags, 0, indent + " ");
return s;
} else {
return indent + "OCTETSTRING " + _skipLongHex(v, skipLongHex) + "\n";
}
}
if (hex.substr(idx, 2) == "05") {
return indent + "NULL\n";
}
if (hex.substr(idx, 2) == "06") {
var hV = _getV(hex, idx);
var oidDot = KJUR.asn1.ASN1Util.oidHexToInt(hV);
var oidName = KJUR.asn1.x509.OID.oid2name(oidDot);
var oidSpc = oidDot.replace(/\./g, ' ');
if (oidName != '') {
return indent + "ObjectIdentifier " + oidName + " (" + oidSpc + ")\n";
} else {
return indent + "ObjectIdentifier (" + oidSpc + ")\n";
}
}
if (hex.substr(idx, 2) == "0c") {
return indent + "UTF8String '" + hextoutf8(_getV(hex, idx)) + "'\n";
}
if (hex.substr(idx, 2) == "13") {
return indent + "PrintableString '" + hextoutf8(_getV(hex, idx)) + "'\n";
}
if (hex.substr(idx, 2) == "14") {
return indent + "TeletexString '" + hextoutf8(_getV(hex, idx)) + "'\n";
}
if (hex.substr(idx, 2) == "16") {
return indent + "IA5String '" + hextoutf8(_getV(hex, idx)) + "'\n";
}
if (hex.substr(idx, 2) == "17") {
return indent + "UTCTime " + hextoutf8(_getV(hex, idx)) + "\n";
}
if (hex.substr(idx, 2) == "18") {
return indent + "GeneralizedTime " + hextoutf8(_getV(hex, idx)) + "\n";
}
if (hex.substr(idx, 2) == "30") {
if (hex.substr(idx, 4) == "3000") {
return indent + "SEQUENCE {}\n";
}
var s = indent + "SEQUENCE\n";
var aIdx = _getChildIdx(hex, idx);
var flagsTemp = flags;
if ((aIdx.length == 2 || aIdx.length == 3) &&
hex.substr(aIdx[0], 2) == "06" &&
hex.substr(aIdx[aIdx.length - 1], 2) == "04") { // supposed X.509v3 extension
var oidName = _ASN1HEX.oidname(_getV(hex, aIdx[0]));
var flagsClone = JSON.parse(JSON.stringify(flags));
flagsClone.x509ExtName = oidName;
flagsTemp = flagsClone;
}
for (var i = 0; i < aIdx.length; i++) {
s = s + _dump(hex, flagsTemp, aIdx[i], indent + " ");
}
return s;
}
if (hex.substr(idx, 2) == "31") {
var s = indent + "SET\n";
var aIdx = _getChildIdx(hex, idx);
for (var i = 0; i < aIdx.length; i++) {
s = s + _dump(hex, flags, aIdx[i], indent + " ");
}
return s;
}
var tag = parseInt(hex.substr(idx, 2), 16);
if ((tag & 128) != 0) { // context specific
var tagNumber = tag & 31;
if ((tag & 32) != 0) { // structured tag
var s = indent + "[" + tagNumber + "]\n";
var aIdx = _getChildIdx(hex, idx);
for (var i = 0; i < aIdx.length; i++) {
s = s + _dump(hex, flags, aIdx[i], indent + " ");
}
return s;
} else { // primitive tag
var v = _getV(hex, idx);
if (v.substr(0, 8) == "68747470") { // http
v = hextoutf8(v);
}
if (flags.x509ExtName === "subjectAltName" &&
tagNumber == 2) {
v = hextoutf8(v);
}
var s = indent + "[" + tagNumber + "] " + v + "\n";
return s;
}
}
return indent + "UNKNOWN(" + hex.substr(idx, 2) + ") " +
_getV(hex, idx) + "\n";
};
/**
* check wheather the string is ASN.1 hexadecimal string or not
* @name isASN1HEX
* @memberOf ASN1HEX
* @function
* @param {String} hex string to check whether it is hexadecmal string for ASN.1 DER or not
* @return {Boolean} true if it is hexadecimal string of ASN.1 data otherwise false
* @since jsrsasign 4.8.3 asn1hex 1.1.6
* @description
* This method checks wheather the argument 'hex' is a hexadecimal string of
* ASN.1 data or not.
* @example
* ASN1HEX.isASN1HEX('0203012345') → true // PROPER ASN.1 INTEGER
* ASN1HEX.isASN1HEX('0203012345ff') → false // TOO LONG VALUE
* ASN1HEX.isASN1HEX('02030123') → false // TOO SHORT VALUE
* ASN1HEX.isASN1HEX('fa3bcd') → false // WRONG FOR ASN.1
*/
ASN1HEX.isASN1HEX = function(hex) {
var _ASN1HEX = ASN1HEX;
if (hex.length % 2 == 1) return false;
var intL = _ASN1HEX.getVblen(hex, 0);
var tV = hex.substr(0, 2);
var lV = _ASN1HEX.getL(hex, 0);
var hVLength = hex.length - tV.length - lV.length;
if (hVLength == intL * 2) return true;
return false;
};
/**
* get hexacedimal string from PEM format data<br/>
* @name oidname
* @memberOf ASN1HEX
* @function
* @param {String} oidDotOrHex number dot notation(i.e. 1.2.3) or hexadecimal string for OID
* @return {String} name for OID
* @since jsrsasign 7.2.0 asn1hex 1.1.11
* @description
* This static method gets a OID name for
* a specified string of number dot notation (i.e. 1.2.3) or
* hexadecimal string.
* @example
* ASN1HEX.oidname("2.5.29.37") → extKeyUsage
* ASN1HEX.oidname("551d25") → extKeyUsage
* ASN1HEX.oidname("0.1.2.3") → 0.1.2.3 // unknown
*/
ASN1HEX.oidname = function(oidDotOrHex) {
var _KJUR_asn1 = KJUR.asn1;
if (KJUR.lang.String.isHex(oidDotOrHex))
oidDotOrHex = _KJUR_asn1.ASN1Util.oidHexToInt(oidDotOrHex);
var name = _KJUR_asn1.x509.OID.oid2name(oidDotOrHex);
if (name === "") name = oidDotOrHex;
return name;
};