mailiverse/gwt/war/js/crypt/jsrsasign-1.3/asn1hex-1.1.js
2013-07-21 13:40:17 -04:00

280 lines
9.1 KiB
JavaScript

/*! asn1hex-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
*/
//
// asn1hex.js - Hexadecimal represented ASN.1 string library
//
// version: 1.1 (09-May-2012)
//
// Copyright (c) 2010-2012 Kenji Urushima (kenji.urushima@gmail.com)
//
// This software is licensed under the terms of the MIT License.
// http://kjur.github.com/jsrsasign/license/
//
// The above copyright and license notice shall be
// included in all copies or substantial portions of the Software.
//
// Depends on:
//
// 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 ...)
// -
/**
* get byte length for ASN.1 L(length) bytes
* @name getByteLengthOfL_AtObj
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} pos string index
* @return byte length for ASN.1 L(length) bytes
*/
function _asnhex_getByteLengthOfL_AtObj(s, pos) {
if (s.substring(pos + 2, pos + 3) != '8') return 1;
var i = parseInt(s.substring(pos + 3, pos + 4));
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
* @name getHexOfL_AtObj
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} pos string index
* @return {String} hexadecimal string for ASN.1 L(length) bytes
*/
function _asnhex_getHexOfL_AtObj(s, pos) {
var len = _asnhex_getByteLengthOfL_AtObj(s, pos);
if (len < 1) return '';
return s.substring(pos + 2, pos + 2 + len * 2);
}
//
// 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
/**
* get integer value of ASN.1 length for ASN.1 data
* @name getIntOfL_AtObj
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} pos string index
* @return ASN.1 L(length) integer value
*/
function _asnhex_getIntOfL_AtObj(s, pos) {
var hLength = _asnhex_getHexOfL_AtObj(s, pos);
if (hLength == '') return -1;
var bi;
if (parseInt(hLength.substring(0, 1)) < 8) {
bi = parseBigInt(hLength, 16);
} else {
bi = parseBigInt(hLength.substring(2), 16);
}
return bi.intValue();
}
/**
* get ASN.1 value starting string position for ASN.1 object refered by index 'idx'.
* @name getStartPosOfV_AtObj
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} pos string index
*/
function _asnhex_getStartPosOfV_AtObj(s, pos) {
var l_len = _asnhex_getByteLengthOfL_AtObj(s, pos);
if (l_len < 0) return l_len;
return pos + (l_len + 1) * 2;
}
/**
* get hexadecimal string of ASN.1 V(value)
* @name getHexOfV_AtObj
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} pos string index
* @return {String} hexadecimal string of ASN.1 value.
*/
function _asnhex_getHexOfV_AtObj(s, pos) {
var pos1 = _asnhex_getStartPosOfV_AtObj(s, pos);
var len = _asnhex_getIntOfL_AtObj(s, pos);
return s.substring(pos1, pos1 + len * 2);
}
/**
* get hexadecimal string of ASN.1 TLV at
* @name getHexOfTLV_AtObj
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} pos string index
* @return {String} hexadecimal string of ASN.1 TLV.
* @since 1.1
*/
function _asnhex_getHexOfTLV_AtObj(s, pos) {
var hT = s.substr(pos, 2);
var hL = _asnhex_getHexOfL_AtObj(s, pos);
var hV = _asnhex_getHexOfV_AtObj(s, pos);
return hT + hL + hV;
}
/**
* get next sibling starting index for ASN.1 object string
* @name getPosOfNextSibling_AtObj
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} pos string index
* @return next sibling starting index for ASN.1 object string
*/
function _asnhex_getPosOfNextSibling_AtObj(s, pos) {
var pos1 = _asnhex_getStartPosOfV_AtObj(s, pos);
var len = _asnhex_getIntOfL_AtObj(s, pos);
return pos1 + len * 2;
}
/**
* get array of indexes of child ASN.1 objects
* @name getPosArrayOfChildren_AtObj
* @memberOf ASN1HEX
* @function
* @param {String} s hexadecimal string of ASN.1 DER encoded data
* @param {Number} start string index of ASN.1 object
* @return {Array of Number} array of indexes for childen of ASN.1 objects
*/
function _asnhex_getPosArrayOfChildren_AtObj(h, pos) {
var a = new Array();
var p0 = _asnhex_getStartPosOfV_AtObj(h, pos);
a.push(p0);
var len = _asnhex_getIntOfL_AtObj(h, pos);
var p = p0;
var k = 0;
while (1) {
var pNext = _asnhex_getPosOfNextSibling_AtObj(h, p);
if (pNext == null || (pNext - p0 >= (len * 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
* @name getNthChildIndex_AtObj
* @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 1.1
*/
function _asnhex_getNthChildIndex_AtObj(h, idx, nth) {
var a = _asnhex_getPosArrayOfChildren_AtObj(h, idx);
return a[nth];
}
// ========== decendant methods ==============================
/**
* get string index of nth child object of ASN.1 object refered by h, idx
* @name getDecendantIndexByNthList
* @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
* @return {Number} string index refered by nthList
* @since 1.1
*/
function _asnhex_getDecendantIndexByNthList(h, currentIndex, nthList) {
if (nthList.length == 0) {
return currentIndex;
}
var firstNth = nthList.shift();
var a = _asnhex_getPosArrayOfChildren_AtObj(h, currentIndex);
return _asnhex_getDecendantIndexByNthList(h, a[firstNth], nthList);
}
/**
* get hexadecimal string of ASN.1 TLV refered by current index and nth index list.
* @name getDecendantHexTLVByNthList
* @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
* @return {Number} hexadecimal string of ASN.1 TLV refered by nthList
* @since 1.1
*/
function _asnhex_getDecendantHexTLVByNthList(h, currentIndex, nthList) {
var idx = _asnhex_getDecendantIndexByNthList(h, currentIndex, nthList);
return _asnhex_getHexOfTLV_AtObj(h, idx);
}
/**
* get hexadecimal string of ASN.1 V refered by current index and nth index list.
* @name getDecendantHexVByNthList
* @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
* @return {Number} hexadecimal string of ASN.1 V refered by nthList
* @since 1.1
*/
function _asnhex_getDecendantHexVByNthList(h, currentIndex, nthList) {
var idx = _asnhex_getDecendantIndexByNthList(h, currentIndex, nthList);
return _asnhex_getHexOfV_AtObj(h, idx);
}
// ========== class definition ==============================
/**
* ASN.1 DER encoded hexadecimal string utility class
* @class ASN.1 DER encoded hexadecimal string utility class
* @author Kenji Urushima
* @version 1.1 (09 May 2012)
* @see <a href="http://kjur.github.com/jsrsasigns/">'jwrsasign'(RSA Sign JavaScript Library) home page http://kjur.github.com/jsrsasign/</a>
* @since 1.1
*/
function ASN1HEX() {
return ASN1HEX;
}
ASN1HEX.getByteLengthOfL_AtObj = _asnhex_getByteLengthOfL_AtObj;
ASN1HEX.getHexOfL_AtObj = _asnhex_getHexOfL_AtObj;
ASN1HEX.getIntOfL_AtObj = _asnhex_getIntOfL_AtObj;
ASN1HEX.getStartPosOfV_AtObj = _asnhex_getStartPosOfV_AtObj;
ASN1HEX.getHexOfV_AtObj = _asnhex_getHexOfV_AtObj;
ASN1HEX.getHexOfTLV_AtObj = _asnhex_getHexOfTLV_AtObj;
ASN1HEX.getPosOfNextSibling_AtObj = _asnhex_getPosOfNextSibling_AtObj;
ASN1HEX.getPosArrayOfChildren_AtObj = _asnhex_getPosArrayOfChildren_AtObj;
ASN1HEX.getNthChildIndex_AtObj = _asnhex_getNthChildIndex_AtObj;
ASN1HEX.getDecendantIndexByNthList = _asnhex_getDecendantIndexByNthList;
ASN1HEX.getDecendantHexVByNthList = _asnhex_getDecendantHexVByNthList;
ASN1HEX.getDecendantHexTLVByNthList = _asnhex_getDecendantHexTLVByNthList;