forked from rachanon/stdbWeb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2161 lines
76 KiB
2161 lines
76 KiB
/*! asn1x509-1.0.14.js (c) 2013-2015 Kenji Urushima | kjur.github.com/jsrsasign/license |
|
*/ |
|
/* |
|
* asn1x509.js - ASN.1 DER encoder classes for X.509 certificate |
|
* |
|
* Copyright (c) 2013-2015 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. |
|
*/ |
|
|
|
/** |
|
* @fileOverview |
|
* @name asn1x509-1.0.js |
|
* @author Kenji Urushima kenji.urushima@gmail.com |
|
* @version 1.0.14 (2016-May-10) |
|
* @since jsrsasign 2.1 |
|
* @license <a href="http://kjur.github.io/jsrsasign/license/">MIT License</a> |
|
*/ |
|
|
|
/** |
|
* kjur's class library name space |
|
* // already documented in asn1-1.0.js |
|
* @name KJUR |
|
* @namespace kjur's class library name space |
|
*/ |
|
if (typeof KJUR == "undefined" || !KJUR) KJUR = {}; |
|
|
|
/** |
|
* kjur's ASN.1 class library name space |
|
* // already documented in asn1-1.0.js |
|
* @name KJUR.asn1 |
|
* @namespace |
|
*/ |
|
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) KJUR.asn1 = {}; |
|
|
|
/** |
|
* kjur's ASN.1 class for X.509 certificate library name space |
|
* <p> |
|
* <h4>FEATURES</h4> |
|
* <ul> |
|
* <li>easily issue any kind of certificate</li> |
|
* <li>APIs are very similar to BouncyCastle library ASN.1 classes. So easy to learn.</li> |
|
* </ul> |
|
* </p> |
|
* <h4>PROVIDED CLASSES</h4> |
|
* <ul> |
|
* <li>{@link KJUR.asn1.x509.Certificate}</li> |
|
* <li>{@link KJUR.asn1.x509.TBSCertificate}</li> |
|
* <li>{@link KJUR.asn1.x509.Extension}</li> |
|
* <li>{@link KJUR.asn1.x509.X500Name}</li> |
|
* <li>{@link KJUR.asn1.x509.RDN}</li> |
|
* <li>{@link KJUR.asn1.x509.AttributeTypeAndValue}</li> |
|
* <li>{@link KJUR.asn1.x509.SubjectPublicKeyInfo}</li> |
|
* <li>{@link KJUR.asn1.x509.AlgorithmIdentifier}</li> |
|
* <li>{@link KJUR.asn1.x509.GeneralName}</li> |
|
* <li>{@link KJUR.asn1.x509.GeneralNames}</li> |
|
* <li>{@link KJUR.asn1.x509.DistributionPointName}</li> |
|
* <li>{@link KJUR.asn1.x509.DistributionPoint}</li> |
|
* <li>{@link KJUR.asn1.x509.CRL}</li> |
|
* <li>{@link KJUR.asn1.x509.TBSCertList}</li> |
|
* <li>{@link KJUR.asn1.x509.CRLEntry}</li> |
|
* <li>{@link KJUR.asn1.x509.OID}</li> |
|
* </ul> |
|
* <h4>SUPPORTED EXTENSIONS</h4> |
|
* <ul> |
|
* <li>{@link KJUR.asn1.x509.BasicConstraints}</li> |
|
* <li>{@link KJUR.asn1.x509.KeyUsage}</li> |
|
* <li>{@link KJUR.asn1.x509.CRLDistributionPoints}</li> |
|
* <li>{@link KJUR.asn1.x509.ExtKeyUsage}</li> |
|
* <li>{@link KJUR.asn1.x509.AuthorityKeyIdentifier}</li> |
|
* </ul> |
|
* NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2. |
|
* @name KJUR.asn1.x509 |
|
* @namespace |
|
*/ |
|
if (typeof KJUR.asn1.x509 == "undefined" || !KJUR.asn1.x509) KJUR.asn1.x509 = {}; |
|
|
|
// === BEGIN Certificate =================================================== |
|
|
|
/** |
|
* X.509 Certificate class to sign and generate hex encoded certificate |
|
* @name KJUR.asn1.x509.Certificate |
|
* @class X.509 Certificate class to sign and generate hex encoded certificate |
|
* @param {Array} params associative array of parameters (ex. {'tbscertobj': obj, 'prvkeyobj': key}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @description |
|
* <br/> |
|
* As for argument 'params' for constructor, you can specify one of |
|
* following properties: |
|
* <ul> |
|
* <li>tbscertobj - specify {@link KJUR.asn1.x509.TBSCertificate} object</li> |
|
* <li>prvkeyobj - specify {@link RSAKey}, {@link KJUR.crypto.ECDSA} or {@link KJUR.crypto.DSA} object for CA private key to sign the certificate</li> |
|
* <li>(DEPRECATED)rsaprvkey - specify {@link RSAKey} object CA private key</li> |
|
* <li>(DEPRECATED)rsaprvpem - specify PEM string of RSA CA private key</li> |
|
* </ul> |
|
* NOTE1: 'params' can be omitted.<br/> |
|
* NOTE2: DSA/ECDSA is also supported for CA signging key from asn1x509 1.0.6. |
|
* @example |
|
* var caKey = KEYUTIL.getKey(caKeyPEM); // CA's private key |
|
* var cert = new KJUR.asn1x509.Certificate({'tbscertobj': tbs, 'prvkeyobj': caKey}); |
|
* cert.sign(); // issue certificate by CA's private key |
|
* var certPEM = cert.getPEMString(); |
|
* |
|
* // Certificate ::= SEQUENCE { |
|
* // tbsCertificate TBSCertificate, |
|
* // signatureAlgorithm AlgorithmIdentifier, |
|
* // signature BIT STRING } |
|
*/ |
|
KJUR.asn1.x509.Certificate = function(params) { |
|
KJUR.asn1.x509.Certificate.superclass.constructor.call(this); |
|
var asn1TBSCert = null; |
|
var asn1SignatureAlg = null; |
|
var asn1Sig = null; |
|
var hexSig = null; |
|
var prvKey = null; |
|
var rsaPrvKey = null; // DEPRECATED |
|
|
|
|
|
/** |
|
* set PKCS#5 encrypted RSA PEM private key as CA key |
|
* @name setRsaPrvKeyByPEMandPass |
|
* @memberOf KJUR.asn1.x509.Certificate |
|
* @function |
|
* @param {String} rsaPEM string of PKCS#5 encrypted RSA PEM private key |
|
* @param {String} passPEM passcode string to decrypt private key |
|
* @since 1.0.1 |
|
* @description |
|
* <br/> |
|
* <h4>EXAMPLES</h4> |
|
* @example |
|
* var cert = new KJUR.asn1.x509.Certificate({'tbscertobj': tbs}); |
|
* cert.setRsaPrvKeyByPEMandPass("-----BEGIN RSA PRIVATE..(snip)", "password"); |
|
*/ |
|
this.setRsaPrvKeyByPEMandPass = function(rsaPEM, passPEM) { |
|
var caKeyHex = PKCS5PKEY.getDecryptedKeyHex(rsaPEM, passPEM); |
|
var caKey = new RSAKey(); |
|
caKey.readPrivateKeyFromASN1HexString(caKeyHex); |
|
this.prvKey = caKey; |
|
}; |
|
|
|
/** |
|
* sign TBSCertificate and set signature value internally |
|
* @name sign |
|
* @memberOf KJUR.asn1.x509.Certificate |
|
* @function |
|
* @description |
|
* @example |
|
* var cert = new KJUR.asn1.x509.Certificate({'tbscertobj': tbs, 'rsaprvkey': prvKey}); |
|
* cert.sign(); |
|
*/ |
|
this.sign = function() { |
|
this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg; |
|
|
|
sig = new KJUR.crypto.Signature({'alg': 'SHA1withRSA'}); |
|
sig.init(this.prvKey); |
|
sig.updateHex(this.asn1TBSCert.getEncodedHex()); |
|
this.hexSig = sig.sign(); |
|
|
|
this.asn1Sig = new KJUR.asn1.DERBitString({'hex': '00' + this.hexSig}); |
|
|
|
var seq = new KJUR.asn1.DERSequence({'array': [this.asn1TBSCert, |
|
this.asn1SignatureAlg, |
|
this.asn1Sig]}); |
|
this.hTLV = seq.getEncodedHex(); |
|
this.isModified = false; |
|
}; |
|
|
|
/** |
|
* set signature value internally by hex string |
|
* @name setSignatureHex |
|
* @memberOf KJUR.asn1.x509.Certificate |
|
* @function |
|
* @since asn1x509 1.0.8 |
|
* @description |
|
* @example |
|
* var cert = new KJUR.asn1.x509.Certificate({'tbscertobj': tbs}); |
|
* cert.setSignatureHex('01020304'); |
|
*/ |
|
this.setSignatureHex = function(sigHex) { |
|
this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg; |
|
this.hexSig = sigHex; |
|
this.asn1Sig = new KJUR.asn1.DERBitString({'hex': '00' + this.hexSig}); |
|
|
|
var seq = new KJUR.asn1.DERSequence({'array': [this.asn1TBSCert, |
|
this.asn1SignatureAlg, |
|
this.asn1Sig]}); |
|
this.hTLV = seq.getEncodedHex(); |
|
this.isModified = false; |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
if (this.isModified == false && this.hTLV != null) return this.hTLV; |
|
throw "not signed yet"; |
|
}; |
|
|
|
/** |
|
* get PEM formatted certificate string after signed |
|
* @name getPEMString |
|
* @memberOf KJUR.asn1.x509.Certificate |
|
* @function |
|
* @return PEM formatted string of certificate |
|
* @description |
|
* @example |
|
* var cert = new KJUR.asn1.x509.Certificate({'tbscertobj': tbs, 'rsaprvkey': prvKey}); |
|
* cert.sign(); |
|
* var sPEM = cert.getPEMString(); |
|
*/ |
|
this.getPEMString = function() { |
|
var hCert = this.getEncodedHex(); |
|
var wCert = CryptoJS.enc.Hex.parse(hCert); |
|
var b64Cert = CryptoJS.enc.Base64.stringify(wCert); |
|
var pemBody = b64Cert.replace(/(.{64})/g, "$1\r\n"); |
|
return "-----BEGIN CERTIFICATE-----\r\n" + pemBody + "\r\n-----END CERTIFICATE-----\r\n"; |
|
}; |
|
|
|
if (typeof params != "undefined") { |
|
if (typeof params['tbscertobj'] != "undefined") { |
|
this.asn1TBSCert = params['tbscertobj']; |
|
} |
|
if (typeof params['prvkeyobj'] != "undefined") { |
|
this.prvKey = params['prvkeyobj']; |
|
} else if (typeof params['rsaprvkey'] != "undefined") { |
|
this.prvKey = params['rsaprvkey']; |
|
} else if ((typeof params['rsaprvpem'] != "undefined") && |
|
(typeof params['rsaprvpas'] != "undefined")) { |
|
this.setRsaPrvKeyByPEMandPass(params['rsaprvpem'], params['rsaprvpas']); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.Certificate, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* ASN.1 TBSCertificate structure class |
|
* @name KJUR.asn1.x509.TBSCertificate |
|
* @class ASN.1 TBSCertificate structure class |
|
* @param {Array} params associative array of parameters (ex. {}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @description |
|
* <br/> |
|
* <h4>EXAMPLE</h4> |
|
* @example |
|
* var o = new KJUR.asn1.x509.TBSCertificate(); |
|
* o.setSerialNumberByParam({'int': 4}); |
|
* o.setSignatureAlgByParam({'name': 'SHA1withRSA'}); |
|
* o.setIssuerByParam({'str': '/C=US/O=a'}); |
|
* o.setNotBeforeByParam({'str': '130504235959Z'}); |
|
* o.setNotAfterByParam({'str': '140504235959Z'}); |
|
* o.setSubjectByParam({'str': '/C=US/CN=b'}); |
|
* o.setSubjectPublicKeyByParam({'rsakey': rsaKey}); |
|
* o.appendExtension(new KJUR.asn1.x509.BasicConstraints({'cA':true})); |
|
* o.appendExtension(new KJUR.asn1.x509.KeyUsage({'bin':'11'})); |
|
*/ |
|
KJUR.asn1.x509.TBSCertificate = function(params) { |
|
KJUR.asn1.x509.TBSCertificate.superclass.constructor.call(this); |
|
|
|
this._initialize = function() { |
|
this.asn1Array = new Array(); |
|
|
|
this.asn1Version = |
|
new KJUR.asn1.DERTaggedObject({'obj': new KJUR.asn1.DERInteger({'int': 2})}); |
|
this.asn1SerialNumber = null; |
|
this.asn1SignatureAlg = null; |
|
this.asn1Issuer = null; |
|
this.asn1NotBefore = null; |
|
this.asn1NotAfter = null; |
|
this.asn1Subject = null; |
|
this.asn1SubjPKey = null; |
|
this.extensionsArray = new Array(); |
|
}; |
|
|
|
/** |
|
* set serial number field by parameter |
|
* @name setSerialNumberByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertificate |
|
* @function |
|
* @param {Array} intParam DERInteger param |
|
* @description |
|
* @example |
|
* tbsc.setSerialNumberByParam({'int': 3}); |
|
*/ |
|
this.setSerialNumberByParam = function(intParam) { |
|
this.asn1SerialNumber = new KJUR.asn1.DERInteger(intParam); |
|
}; |
|
|
|
/** |
|
* set signature algorithm field by parameter |
|
* @name setSignatureAlgByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertificate |
|
* @function |
|
* @param {Array} algIdParam AlgorithmIdentifier parameter |
|
* @description |
|
* @example |
|
* tbsc.setSignatureAlgByParam({'name': 'SHA1withRSA'}); |
|
*/ |
|
this.setSignatureAlgByParam = function(algIdParam) { |
|
this.asn1SignatureAlg = new KJUR.asn1.x509.AlgorithmIdentifier(algIdParam); |
|
}; |
|
|
|
/** |
|
* set issuer name field by parameter |
|
* @name setIssuerByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertificate |
|
* @function |
|
* @param {Array} x500NameParam X500Name parameter |
|
* @description |
|
* @example |
|
* tbsc.setIssuerParam({'str': '/C=US/CN=b'}); |
|
* @see KJUR.asn1.x509.X500Name |
|
*/ |
|
this.setIssuerByParam = function(x500NameParam) { |
|
this.asn1Issuer = new KJUR.asn1.x509.X500Name(x500NameParam); |
|
}; |
|
|
|
/** |
|
* set notBefore field by parameter |
|
* @name setNotBeforeByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertificate |
|
* @function |
|
* @param {Array} timeParam Time parameter |
|
* @description |
|
* @example |
|
* tbsc.setNotBeforeByParam({'str': '130508235959Z'}); |
|
* @see KJUR.asn1.x509.Time |
|
*/ |
|
this.setNotBeforeByParam = function(timeParam) { |
|
this.asn1NotBefore = new KJUR.asn1.x509.Time(timeParam); |
|
}; |
|
|
|
/** |
|
* set notAfter field by parameter |
|
* @name setNotAfterByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertificate |
|
* @function |
|
* @param {Array} timeParam Time parameter |
|
* @description |
|
* @example |
|
* tbsc.setNotAfterByParam({'str': '130508235959Z'}); |
|
* @see KJUR.asn1.x509.Time |
|
*/ |
|
this.setNotAfterByParam = function(timeParam) { |
|
this.asn1NotAfter = new KJUR.asn1.x509.Time(timeParam); |
|
}; |
|
|
|
/** |
|
* set subject name field by parameter |
|
* @name setSubjectByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertificate |
|
* @function |
|
* @param {Array} x500NameParam X500Name parameter |
|
* @description |
|
* @example |
|
* tbsc.setSubjectParam({'str': '/C=US/CN=b'}); |
|
* @see KJUR.asn1.x509.X500Name |
|
*/ |
|
this.setSubjectByParam = function(x500NameParam) { |
|
this.asn1Subject = new KJUR.asn1.x509.X500Name(x500NameParam); |
|
}; |
|
|
|
/** |
|
* (DEPRECATED) set subject public key info field by RSA key parameter |
|
* @name setSubjectPublicKeyByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertificate |
|
* @function |
|
* @param {Array} subjPKeyParam SubjectPublicKeyInfo parameter of RSA |
|
* @deprecated |
|
* @description |
|
* @example |
|
* tbsc.setSubjectPublicKeyByParam({'rsakey': pubKey}); |
|
* @see KJUR.asn1.x509.SubjectPublicKeyInfo |
|
*/ |
|
this.setSubjectPublicKeyByParam = function(subjPKeyParam) { |
|
this.asn1SubjPKey = new KJUR.asn1.x509.SubjectPublicKeyInfo(subjPKeyParam); |
|
}; |
|
|
|
/** |
|
* set subject public key info by RSA/ECDSA/DSA key parameter |
|
* @name setSubjectPublicKeyByGetKey |
|
* @memberOf KJUR.asn1.x509.TBSCertificate |
|
* @function |
|
* @param {Object} keyParam public key parameter which passed to {@link KEYUTIL.getKey} argument |
|
* @description |
|
* @example |
|
* tbsc.setSubjectPublicKeyByGetKeyParam(certPEMString); // or |
|
* tbsc.setSubjectPublicKeyByGetKeyParam(pkcs8PublicKeyPEMString); // or |
|
* tbsc.setSubjectPublicKeyByGetKeyParam(kjurCryptoECDSAKeyObject); // et.al. |
|
* @see KJUR.asn1.x509.SubjectPublicKeyInfo |
|
* @see KEYUTIL.getKey |
|
* @since asn1x509 1.0.6 |
|
*/ |
|
this.setSubjectPublicKeyByGetKey = function(keyParam) { |
|
var keyObj = KEYUTIL.getKey(keyParam); |
|
this.asn1SubjPKey = new KJUR.asn1.x509.SubjectPublicKeyInfo(keyObj); |
|
}; |
|
|
|
/** |
|
* append X.509v3 extension to this object |
|
* @name appendExtension |
|
* @memberOf KJUR.asn1.x509.TBSCertificate |
|
* @function |
|
* @param {Extension} extObj X.509v3 Extension object |
|
* @description |
|
* @example |
|
* tbsc.appendExtension(new KJUR.asn1.x509.BasicConstraints({'cA':true, 'critical': true})); |
|
* tbsc.appendExtension(new KJUR.asn1.x509.KeyUsage({'bin':'11'})); |
|
* @see KJUR.asn1.x509.Extension |
|
*/ |
|
this.appendExtension = function(extObj) { |
|
this.extensionsArray.push(extObj); |
|
}; |
|
|
|
/** |
|
* append X.509v3 extension to this object by name and parameters |
|
* @name appendExtensionByName |
|
* @memberOf KJUR.asn1.x509.TBSCertificate |
|
* @function |
|
* @param {name} name name of X.509v3 Extension object |
|
* @param {Array} extParams parameters as argument of Extension constructor. |
|
* @description |
|
* @example |
|
* tbsc.appendExtensionByName('BasicConstraints', {'cA':true, 'critical': true}); |
|
* tbsc.appendExtensionByName('KeyUsage', {'bin':'11'}); |
|
* tbsc.appendExtensionByName('CRLDistributionPoints', {uri: 'http://aaa.com/a.crl'}); |
|
* tbsc.appendExtensionByName('ExtKeyUsage', {array: [{name: 'clientAuth'}]}); |
|
* tbsc.appendExtensionByName('AuthorityKeyIdentifier', {kid: '1234ab..'}); |
|
* @see KJUR.asn1.x509.Extension |
|
*/ |
|
this.appendExtensionByName = function(name, extParams) { |
|
if (name.toLowerCase() == "basicconstraints") { |
|
var extObj = new KJUR.asn1.x509.BasicConstraints(extParams); |
|
this.appendExtension(extObj); |
|
} else if (name.toLowerCase() == "keyusage") { |
|
var extObj = new KJUR.asn1.x509.KeyUsage(extParams); |
|
this.appendExtension(extObj); |
|
} else if (name.toLowerCase() == "crldistributionpoints") { |
|
var extObj = new KJUR.asn1.x509.CRLDistributionPoints(extParams); |
|
this.appendExtension(extObj); |
|
} else if (name.toLowerCase() == "extkeyusage") { |
|
var extObj = new KJUR.asn1.x509.ExtKeyUsage(extParams); |
|
this.appendExtension(extObj); |
|
} else if (name.toLowerCase() == "authoritykeyidentifier") { |
|
var extObj = new KJUR.asn1.x509.AuthorityKeyIdentifier(extParams); |
|
this.appendExtension(extObj); |
|
} else { |
|
throw "unsupported extension name: " + name; |
|
} |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
if (this.asn1NotBefore == null || this.asn1NotAfter == null) |
|
throw "notBefore and/or notAfter not set"; |
|
var asn1Validity = |
|
new KJUR.asn1.DERSequence({'array':[this.asn1NotBefore, this.asn1NotAfter]}); |
|
|
|
this.asn1Array = new Array(); |
|
|
|
this.asn1Array.push(this.asn1Version); |
|
this.asn1Array.push(this.asn1SerialNumber); |
|
this.asn1Array.push(this.asn1SignatureAlg); |
|
this.asn1Array.push(this.asn1Issuer); |
|
this.asn1Array.push(asn1Validity); |
|
this.asn1Array.push(this.asn1Subject); |
|
this.asn1Array.push(this.asn1SubjPKey); |
|
|
|
if (this.extensionsArray.length > 0) { |
|
var extSeq = new KJUR.asn1.DERSequence({"array": this.extensionsArray}); |
|
var extTagObj = new KJUR.asn1.DERTaggedObject({'explicit': true, |
|
'tag': 'a3', |
|
'obj': extSeq}); |
|
this.asn1Array.push(extTagObj); |
|
} |
|
|
|
var o = new KJUR.asn1.DERSequence({"array": this.asn1Array}); |
|
this.hTLV = o.getEncodedHex(); |
|
this.isModified = false; |
|
return this.hTLV; |
|
}; |
|
|
|
this._initialize(); |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate, KJUR.asn1.ASN1Object); |
|
|
|
// === END TBSCertificate =================================================== |
|
|
|
// === BEGIN X.509v3 Extensions Related ======================================= |
|
|
|
/** |
|
* base Extension ASN.1 structure class |
|
* @name KJUR.asn1.x509.Extension |
|
* @class base Extension ASN.1 structure class |
|
* @param {Array} params associative array of parameters (ex. {'critical': true}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @description |
|
* @example |
|
* // Extension ::= SEQUENCE { |
|
* // extnID OBJECT IDENTIFIER, |
|
* // critical BOOLEAN DEFAULT FALSE, |
|
* // extnValue OCTET STRING } |
|
*/ |
|
KJUR.asn1.x509.Extension = function(params) { |
|
KJUR.asn1.x509.Extension.superclass.constructor.call(this); |
|
var asn1ExtnValue = null; |
|
|
|
this.getEncodedHex = function() { |
|
var asn1Oid = new KJUR.asn1.DERObjectIdentifier({'oid': this.oid}); |
|
var asn1EncapExtnValue = |
|
new KJUR.asn1.DEROctetString({'hex': this.getExtnValueHex()}); |
|
|
|
var asn1Array = new Array(); |
|
asn1Array.push(asn1Oid); |
|
if (this.critical) asn1Array.push(new KJUR.asn1.DERBoolean()); |
|
asn1Array.push(asn1EncapExtnValue); |
|
|
|
var asn1Seq = new KJUR.asn1.DERSequence({'array': asn1Array}); |
|
return asn1Seq.getEncodedHex(); |
|
}; |
|
|
|
this.critical = false; |
|
if (typeof params != "undefined") { |
|
if (typeof params['critical'] != "undefined") { |
|
this.critical = params['critical']; |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.Extension, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* KeyUsage ASN.1 structure class |
|
* @name KJUR.asn1.x509.KeyUsage |
|
* @class KeyUsage ASN.1 structure class |
|
* @param {Array} params associative array of parameters (ex. {'bin': '11', 'critical': true}) |
|
* @extends KJUR.asn1.x509.Extension |
|
* @description |
|
* @example |
|
*/ |
|
KJUR.asn1.x509.KeyUsage = function(params) { |
|
KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this, params); |
|
|
|
this.getExtnValueHex = function() { |
|
return this.asn1ExtnValue.getEncodedHex(); |
|
}; |
|
|
|
this.oid = "2.5.29.15"; |
|
if (typeof params != "undefined") { |
|
if (typeof params['bin'] != "undefined") { |
|
this.asn1ExtnValue = new KJUR.asn1.DERBitString(params); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage, KJUR.asn1.x509.Extension); |
|
|
|
/** |
|
* BasicConstraints ASN.1 structure class |
|
* @name KJUR.asn1.x509.BasicConstraints |
|
* @class BasicConstraints ASN.1 structure class |
|
* @param {Array} params associative array of parameters (ex. {'cA': true, 'critical': true}) |
|
* @extends KJUR.asn1.x509.Extension |
|
* @description |
|
* @example |
|
*/ |
|
KJUR.asn1.x509.BasicConstraints = function(params) { |
|
KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this, params); |
|
var cA = false; |
|
var pathLen = -1; |
|
|
|
this.getExtnValueHex = function() { |
|
var asn1Array = new Array(); |
|
if (this.cA) asn1Array.push(new KJUR.asn1.DERBoolean()); |
|
if (this.pathLen > -1) |
|
asn1Array.push(new KJUR.asn1.DERInteger({'int': this.pathLen})); |
|
var asn1Seq = new KJUR.asn1.DERSequence({'array': asn1Array}); |
|
this.asn1ExtnValue = asn1Seq; |
|
return this.asn1ExtnValue.getEncodedHex(); |
|
}; |
|
|
|
this.oid = "2.5.29.19"; |
|
this.cA = false; |
|
this.pathLen = -1; |
|
if (typeof params != "undefined") { |
|
if (typeof params['cA'] != "undefined") { |
|
this.cA = params['cA']; |
|
} |
|
if (typeof params['pathLen'] != "undefined") { |
|
this.pathLen = params['pathLen']; |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints, KJUR.asn1.x509.Extension); |
|
|
|
/** |
|
* CRLDistributionPoints ASN.1 structure class |
|
* @name KJUR.asn1.x509.CRLDistributionPoints |
|
* @class CRLDistributionPoints ASN.1 structure class |
|
* @param {Array} params associative array of parameters (ex. {'uri': 'http://a.com/', 'critical': true}) |
|
* @extends KJUR.asn1.x509.Extension |
|
* @description |
|
* @example |
|
*/ |
|
KJUR.asn1.x509.CRLDistributionPoints = function(params) { |
|
KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this, params); |
|
|
|
this.getExtnValueHex = function() { |
|
return this.asn1ExtnValue.getEncodedHex(); |
|
}; |
|
|
|
this.setByDPArray = function(dpArray) { |
|
this.asn1ExtnValue = new KJUR.asn1.DERSequence({'array': dpArray}); |
|
}; |
|
|
|
this.setByOneURI = function(uri) { |
|
var gn1 = new KJUR.asn1.x509.GeneralNames([{'uri': uri}]); |
|
var dpn1 = new KJUR.asn1.x509.DistributionPointName(gn1); |
|
var dp1 = new KJUR.asn1.x509.DistributionPoint({'dpobj': dpn1}); |
|
this.setByDPArray([dp1]); |
|
}; |
|
|
|
this.oid = "2.5.29.31"; |
|
if (typeof params != "undefined") { |
|
if (typeof params['array'] != "undefined") { |
|
this.setByDPArray(params['array']); |
|
} else if (typeof params['uri'] != "undefined") { |
|
this.setByOneURI(params['uri']); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints, KJUR.asn1.x509.Extension); |
|
|
|
/** |
|
* KeyUsage ASN.1 structure class |
|
* @name KJUR.asn1.x509.ExtKeyUsage |
|
* @class ExtKeyUsage ASN.1 structure class |
|
* @param {Array} params associative array of parameters |
|
* @extends KJUR.asn1.x509.Extension |
|
* @description |
|
* @example |
|
* var e1 = |
|
* new KJUR.asn1.x509.ExtKeyUsage({'critical': true, |
|
* 'array': |
|
* [{'oid': '2.5.29.37.0', // anyExtendedKeyUsage |
|
* 'name': 'clientAuth'}]}); |
|
* |
|
* // id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } |
|
* // ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId |
|
* // KeyPurposeId ::= OBJECT IDENTIFIER |
|
*/ |
|
KJUR.asn1.x509.ExtKeyUsage = function(params) { |
|
KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this, params); |
|
|
|
this.setPurposeArray = function(purposeArray) { |
|
this.asn1ExtnValue = new KJUR.asn1.DERSequence(); |
|
for (var i = 0; i < purposeArray.length; i++) { |
|
var o = new KJUR.asn1.DERObjectIdentifier(purposeArray[i]); |
|
this.asn1ExtnValue.appendASN1Object(o); |
|
} |
|
}; |
|
|
|
this.getExtnValueHex = function() { |
|
return this.asn1ExtnValue.getEncodedHex(); |
|
}; |
|
|
|
this.oid = "2.5.29.37"; |
|
if (typeof params != "undefined") { |
|
if (typeof params['array'] != "undefined") { |
|
this.setPurposeArray(params['array']); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.ExtKeyUsage, KJUR.asn1.x509.Extension); |
|
|
|
/** |
|
* AuthorityKeyIdentifier ASN.1 structure class |
|
* @name KJUR.asn1.x509.AuthorityKeyIdentifier |
|
* @class AuthorityKeyIdentifier ASN.1 structure class |
|
* @param {Array} params associative array of parameters (ex. {'uri': 'http://a.com/', 'critical': true}) |
|
* @extends KJUR.asn1.x509.Extension |
|
* @since asn1x509 1.0.8 |
|
* @description |
|
* <pre> |
|
* d-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } |
|
* AuthorityKeyIdentifier ::= SEQUENCE { |
|
* keyIdentifier [0] KeyIdentifier OPTIONAL, |
|
* authorityCertIssuer [1] GeneralNames OPTIONAL, |
|
* authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL } |
|
* KeyIdentifier ::= OCTET STRING |
|
* </pre> |
|
* @example |
|
* var param = {'kid': {'hex': '89ab'}, |
|
* 'issuer': {'str': '/C=US/CN=a'}, |
|
* 'sn': {'hex': '1234'}, |
|
* 'critical': true}); |
|
* var e1 = new KJUR.asn1.x509.AuthorityKeyIdentifier(param); |
|
*/ |
|
KJUR.asn1.x509.AuthorityKeyIdentifier = function(params) { |
|
KJUR.asn1.x509.AuthorityKeyIdentifier.superclass.constructor.call(this, params); |
|
this.asn1KID = null; |
|
this.asn1CertIssuer = null; |
|
this.asn1CertSN = null; |
|
|
|
this.getExtnValueHex = function() { |
|
var a = new Array(); |
|
if (this.asn1KID) |
|
a.push(new KJUR.asn1.DERTaggedObject({'explicit': false, |
|
'tag': '80', |
|
'obj': this.asn1KID})); |
|
if (this.asn1CertIssuer) |
|
a.push(new KJUR.asn1.DERTaggedObject({'explicit': false, |
|
'tag': 'a1', |
|
'obj': this.asn1CertIssuer})); |
|
if (this.asn1CertSN) |
|
a.push(new KJUR.asn1.DERTaggedObject({'explicit': false, |
|
'tag': '82', |
|
'obj': this.asn1CertSN})); |
|
|
|
var asn1Seq = new KJUR.asn1.DERSequence({'array': a}); |
|
this.asn1ExtnValue = asn1Seq; |
|
return this.asn1ExtnValue.getEncodedHex(); |
|
}; |
|
|
|
/** |
|
* set keyIdentifier value by DERInteger parameter |
|
* @name setKIDByParam |
|
* @memberOf KJUR.asn1.x509.AuthorityKeyIdentifier |
|
* @function |
|
* @param {Array} param array of {@link KJUR.asn1.DERInteger} parameter |
|
* @since asn1x509 1.0.8 |
|
* @description |
|
* NOTE: Automatic keyIdentifier value calculation by an issuer |
|
* public key will be supported in future version. |
|
*/ |
|
this.setKIDByParam = function(param) { |
|
this.asn1KID = new KJUR.asn1.DEROctetString(param); |
|
}; |
|
|
|
/** |
|
* set authorityCertIssuer value by X500Name parameter |
|
* @name setCertIssuerByParam |
|
* @memberOf KJUR.asn1.x509.AuthorityKeyIdentifier |
|
* @function |
|
* @param {Array} param array of {@link KJUR.asn1.x509.X500Name} parameter |
|
* @since asn1x509 1.0.8 |
|
* @description |
|
* NOTE: Automatic authorityCertIssuer name setting by an issuer |
|
* certificate will be supported in future version. |
|
*/ |
|
this.setCertIssuerByParam = function(param) { |
|
this.asn1CertIssuer = new KJUR.asn1.x509.X500Name(param); |
|
}; |
|
|
|
/** |
|
* set authorityCertSerialNumber value by DERInteger parameter |
|
* @name setCertSerialNumberByParam |
|
* @memberOf KJUR.asn1.x509.AuthorityKeyIdentifier |
|
* @function |
|
* @param {Array} param array of {@link KJUR.asn1.DERInteger} parameter |
|
* @since asn1x509 1.0.8 |
|
* @description |
|
* NOTE: Automatic authorityCertSerialNumber setting by an issuer |
|
* certificate will be supported in future version. |
|
*/ |
|
this.setCertSNByParam = function(param) { |
|
this.asn1CertSN = new KJUR.asn1.DERInteger(param); |
|
}; |
|
|
|
this.oid = "2.5.29.35"; |
|
if (typeof params != "undefined") { |
|
if (typeof params['kid'] != "undefined") { |
|
this.setKIDByParam(params['kid']); |
|
} |
|
if (typeof params['issuer'] != "undefined") { |
|
this.setCertIssuerByParam(params['issuer']); |
|
} |
|
if (typeof params['sn'] != "undefined") { |
|
this.setCertSNByParam(params['sn']); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.AuthorityKeyIdentifier, KJUR.asn1.x509.Extension); |
|
|
|
// === END X.509v3 Extensions Related ======================================= |
|
|
|
// === BEGIN CRL Related =================================================== |
|
/** |
|
* X.509 CRL class to sign and generate hex encoded CRL |
|
* @name KJUR.asn1.x509.CRL |
|
* @class X.509 CRL class to sign and generate hex encoded certificate |
|
* @param {Array} params associative array of parameters (ex. {'tbsobj': obj, 'rsaprvkey': key}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @since 1.0.3 |
|
* @description |
|
* <br/> |
|
* As for argument 'params' for constructor, you can specify one of |
|
* following properties: |
|
* <ul> |
|
* <li>tbsobj - specify {@link KJUR.asn1.x509.TBSCertList} object to be signed</li> |
|
* <li>rsaprvkey - specify {@link RSAKey} object CA private key</li> |
|
* </ul> |
|
* NOTE: 'params' can be omitted. |
|
* <h4>EXAMPLE</h4> |
|
* @example |
|
* var prvKey = new RSAKey(); // CA's private key |
|
* prvKey.readPrivateKeyFromASN1HexString("3080..."); |
|
* var crl = new KJUR.asn1x509.CRL({'tbsobj': tbs, 'rsaprvkey': prvKey}); |
|
* crl.sign(); // issue CRL by CA's private key |
|
* var hCRL = crl.getEncodedHex(); |
|
* |
|
* // CertificateList ::= SEQUENCE { |
|
* // tbsCertList TBSCertList, |
|
* // signatureAlgorithm AlgorithmIdentifier, |
|
* // signatureValue BIT STRING } |
|
*/ |
|
KJUR.asn1.x509.CRL = function(params) { |
|
KJUR.asn1.x509.CRL.superclass.constructor.call(this); |
|
|
|
var asn1TBSCertList = null; |
|
var asn1SignatureAlg = null; |
|
var asn1Sig = null; |
|
var hexSig = null; |
|
var rsaPrvKey = null; |
|
|
|
/** |
|
* set PKCS#5 encrypted RSA PEM private key as CA key |
|
* @name setRsaPrvKeyByPEMandPass |
|
* @memberOf KJUR.asn1.x509.CRL |
|
* @function |
|
* @param {String} rsaPEM string of PKCS#5 encrypted RSA PEM private key |
|
* @param {String} passPEM passcode string to decrypt private key |
|
* @description |
|
* <br/> |
|
* <h4>EXAMPLES</h4> |
|
* @example |
|
*/ |
|
this.setRsaPrvKeyByPEMandPass = function(rsaPEM, passPEM) { |
|
var caKeyHex = PKCS5PKEY.getDecryptedKeyHex(rsaPEM, passPEM); |
|
var caKey = new RSAKey(); |
|
caKey.readPrivateKeyFromASN1HexString(caKeyHex); |
|
this.rsaPrvKey = caKey; |
|
}; |
|
|
|
/** |
|
* sign TBSCertList and set signature value internally |
|
* @name sign |
|
* @memberOf KJUR.asn1.x509.CRL |
|
* @function |
|
* @description |
|
* @example |
|
* var cert = new KJUR.asn1.x509.CRL({'tbsobj': tbs, 'rsaprvkey': prvKey}); |
|
* cert.sign(); |
|
*/ |
|
this.sign = function() { |
|
this.asn1SignatureAlg = this.asn1TBSCertList.asn1SignatureAlg; |
|
|
|
sig = new KJUR.crypto.Signature({'alg': 'SHA1withRSA', 'prov': 'cryptojs/jsrsa'}); |
|
sig.initSign(this.rsaPrvKey); |
|
sig.updateHex(this.asn1TBSCertList.getEncodedHex()); |
|
this.hexSig = sig.sign(); |
|
|
|
this.asn1Sig = new KJUR.asn1.DERBitString({'hex': '00' + this.hexSig}); |
|
|
|
var seq = new KJUR.asn1.DERSequence({'array': [this.asn1TBSCertList, |
|
this.asn1SignatureAlg, |
|
this.asn1Sig]}); |
|
this.hTLV = seq.getEncodedHex(); |
|
this.isModified = false; |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
if (this.isModified == false && this.hTLV != null) return this.hTLV; |
|
throw "not signed yet"; |
|
}; |
|
|
|
/** |
|
* get PEM formatted CRL string after signed |
|
* @name getPEMString |
|
* @memberOf KJUR.asn1.x509.CRL |
|
* @function |
|
* @return PEM formatted string of certificate |
|
* @description |
|
* @example |
|
* var cert = new KJUR.asn1.x509.CRL({'tbsobj': tbs, 'rsaprvkey': prvKey}); |
|
* cert.sign(); |
|
* var sPEM = cert.getPEMString(); |
|
*/ |
|
this.getPEMString = function() { |
|
var hCert = this.getEncodedHex(); |
|
var wCert = CryptoJS.enc.Hex.parse(hCert); |
|
var b64Cert = CryptoJS.enc.Base64.stringify(wCert); |
|
var pemBody = b64Cert.replace(/(.{64})/g, "$1\r\n"); |
|
return "-----BEGIN X509 CRL-----\r\n" + pemBody + "\r\n-----END X509 CRL-----\r\n"; |
|
}; |
|
|
|
if (typeof params != "undefined") { |
|
if (typeof params['tbsobj'] != "undefined") { |
|
this.asn1TBSCertList = params['tbsobj']; |
|
} |
|
if (typeof params['rsaprvkey'] != "undefined") { |
|
this.rsaPrvKey = params['rsaprvkey']; |
|
} |
|
if ((typeof params['rsaprvpem'] != "undefined") && |
|
(typeof params['rsaprvpas'] != "undefined")) { |
|
this.setRsaPrvKeyByPEMandPass(params['rsaprvpem'], params['rsaprvpas']); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.CRL, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* ASN.1 TBSCertList structure class for CRL |
|
* @name KJUR.asn1.x509.TBSCertList |
|
* @class ASN.1 TBSCertList structure class for CRL |
|
* @param {Array} params associative array of parameters (ex. {}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @since 1.0.3 |
|
* @description |
|
* <br/> |
|
* <h4>EXAMPLE</h4> |
|
* @example |
|
* var o = new KJUR.asn1.x509.TBSCertList(); |
|
* o.setSignatureAlgByParam({'name': 'SHA1withRSA'}); |
|
* o.setIssuerByParam({'str': '/C=US/O=a'}); |
|
* o.setNotThisUpdateByParam({'str': '130504235959Z'}); |
|
* o.setNotNextUpdateByParam({'str': '140504235959Z'}); |
|
* o.addRevokedCert({'int': 4}, {'str':'130514235959Z'})); |
|
* o.addRevokedCert({'hex': '0f34dd'}, {'str':'130514235959Z'})); |
|
* |
|
* // TBSCertList ::= SEQUENCE { |
|
* // version Version OPTIONAL, |
|
* // -- if present, MUST be v2 |
|
* // signature AlgorithmIdentifier, |
|
* // issuer Name, |
|
* // thisUpdate Time, |
|
* // nextUpdate Time OPTIONAL, |
|
* // revokedCertificates SEQUENCE OF SEQUENCE { |
|
* // userCertificate CertificateSerialNumber, |
|
* // revocationDate Time, |
|
* // crlEntryExtensions Extensions OPTIONAL |
|
* // -- if present, version MUST be v2 |
|
* // } OPTIONAL, |
|
* // crlExtensions [0] EXPLICIT Extensions OPTIONAL |
|
*/ |
|
KJUR.asn1.x509.TBSCertList = function(params) { |
|
KJUR.asn1.x509.TBSCertList.superclass.constructor.call(this); |
|
var aRevokedCert = null; |
|
|
|
/** |
|
* set signature algorithm field by parameter |
|
* @name setSignatureAlgByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertList |
|
* @function |
|
* @param {Array} algIdParam AlgorithmIdentifier parameter |
|
* @description |
|
* @example |
|
* tbsc.setSignatureAlgByParam({'name': 'SHA1withRSA'}); |
|
*/ |
|
this.setSignatureAlgByParam = function(algIdParam) { |
|
this.asn1SignatureAlg = new KJUR.asn1.x509.AlgorithmIdentifier(algIdParam); |
|
}; |
|
|
|
/** |
|
* set issuer name field by parameter |
|
* @name setIssuerByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertList |
|
* @function |
|
* @param {Array} x500NameParam X500Name parameter |
|
* @description |
|
* @example |
|
* tbsc.setIssuerParam({'str': '/C=US/CN=b'}); |
|
* @see KJUR.asn1.x509.X500Name |
|
*/ |
|
this.setIssuerByParam = function(x500NameParam) { |
|
this.asn1Issuer = new KJUR.asn1.x509.X500Name(x500NameParam); |
|
}; |
|
|
|
/** |
|
* set thisUpdate field by parameter |
|
* @name setThisUpdateByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertList |
|
* @function |
|
* @param {Array} timeParam Time parameter |
|
* @description |
|
* @example |
|
* tbsc.setThisUpdateByParam({'str': '130508235959Z'}); |
|
* @see KJUR.asn1.x509.Time |
|
*/ |
|
this.setThisUpdateByParam = function(timeParam) { |
|
this.asn1ThisUpdate = new KJUR.asn1.x509.Time(timeParam); |
|
}; |
|
|
|
/** |
|
* set nextUpdate field by parameter |
|
* @name setNextUpdateByParam |
|
* @memberOf KJUR.asn1.x509.TBSCertList |
|
* @function |
|
* @param {Array} timeParam Time parameter |
|
* @description |
|
* @example |
|
* tbsc.setNextUpdateByParam({'str': '130508235959Z'}); |
|
* @see KJUR.asn1.x509.Time |
|
*/ |
|
this.setNextUpdateByParam = function(timeParam) { |
|
this.asn1NextUpdate = new KJUR.asn1.x509.Time(timeParam); |
|
}; |
|
|
|
/** |
|
* add revoked certficate by parameter |
|
* @name addRevokedCert |
|
* @memberOf KJUR.asn1.x509.TBSCertList |
|
* @function |
|
* @param {Array} snParam DERInteger parameter for certificate serial number |
|
* @param {Array} timeParam Time parameter for revocation date |
|
* @description |
|
* @example |
|
* tbsc.addRevokedCert({'int': 3}, {'str': '130508235959Z'}); |
|
* @see KJUR.asn1.x509.Time |
|
*/ |
|
this.addRevokedCert = function(snParam, timeParam) { |
|
var param = {}; |
|
if (snParam != undefined && snParam != null) param['sn'] = snParam; |
|
if (timeParam != undefined && timeParam != null) param['time'] = timeParam; |
|
var o = new KJUR.asn1.x509.CRLEntry(param); |
|
this.aRevokedCert.push(o); |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
this.asn1Array = new Array(); |
|
|
|
if (this.asn1Version != null) this.asn1Array.push(this.asn1Version); |
|
this.asn1Array.push(this.asn1SignatureAlg); |
|
this.asn1Array.push(this.asn1Issuer); |
|
this.asn1Array.push(this.asn1ThisUpdate); |
|
if (this.asn1NextUpdate != null) this.asn1Array.push(this.asn1NextUpdate); |
|
|
|
if (this.aRevokedCert.length > 0) { |
|
var seq = new KJUR.asn1.DERSequence({'array': this.aRevokedCert}); |
|
this.asn1Array.push(seq); |
|
} |
|
|
|
var o = new KJUR.asn1.DERSequence({"array": this.asn1Array}); |
|
this.hTLV = o.getEncodedHex(); |
|
this.isModified = false; |
|
return this.hTLV; |
|
}; |
|
|
|
this._initialize = function() { |
|
this.asn1Version = null; |
|
this.asn1SignatureAlg = null; |
|
this.asn1Issuer = null; |
|
this.asn1ThisUpdate = null; |
|
this.asn1NextUpdate = null; |
|
this.aRevokedCert = new Array(); |
|
}; |
|
|
|
this._initialize(); |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.TBSCertList, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* ASN.1 CRLEntry structure class for CRL |
|
* @name KJUR.asn1.x509.CRLEntry |
|
* @class ASN.1 CRLEntry structure class for CRL |
|
* @param {Array} params associative array of parameters (ex. {}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @since 1.0.3 |
|
* @description |
|
* @example |
|
* var e = new KJUR.asn1.x509.CRLEntry({'time': {'str': '130514235959Z'}, 'sn': {'int': 234}}); |
|
* |
|
* // revokedCertificates SEQUENCE OF SEQUENCE { |
|
* // userCertificate CertificateSerialNumber, |
|
* // revocationDate Time, |
|
* // crlEntryExtensions Extensions OPTIONAL |
|
* // -- if present, version MUST be v2 } |
|
*/ |
|
KJUR.asn1.x509.CRLEntry = function(params) { |
|
KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this); |
|
var sn = null; |
|
var time = null; |
|
|
|
/** |
|
* set DERInteger parameter for serial number of revoked certificate |
|
* @name setCertSerial |
|
* @memberOf KJUR.asn1.x509.CRLEntry |
|
* @function |
|
* @param {Array} intParam DERInteger parameter for certificate serial number |
|
* @description |
|
* @example |
|
* entry.setCertSerial({'int': 3}); |
|
*/ |
|
this.setCertSerial = function(intParam) { |
|
this.sn = new KJUR.asn1.DERInteger(intParam); |
|
}; |
|
|
|
/** |
|
* set Time parameter for revocation date |
|
* @name setRevocationDate |
|
* @memberOf KJUR.asn1.x509.CRLEntry |
|
* @function |
|
* @param {Array} timeParam Time parameter for revocation date |
|
* @description |
|
* @example |
|
* entry.setRevocationDate({'str': '130508235959Z'}); |
|
*/ |
|
this.setRevocationDate = function(timeParam) { |
|
this.time = new KJUR.asn1.x509.Time(timeParam); |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
var o = new KJUR.asn1.DERSequence({"array": [this.sn, this.time]}); |
|
this.TLV = o.getEncodedHex(); |
|
return this.TLV; |
|
}; |
|
|
|
if (typeof params != "undefined") { |
|
if (typeof params['time'] != "undefined") { |
|
this.setRevocationDate(params['time']); |
|
} |
|
if (typeof params['sn'] != "undefined") { |
|
this.setCertSerial(params['sn']); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry, KJUR.asn1.ASN1Object); |
|
|
|
// === END CRL Related =================================================== |
|
|
|
// === BEGIN X500Name Related ================================================= |
|
/** |
|
* X500Name ASN.1 structure class |
|
* @name KJUR.asn1.x509.X500Name |
|
* @class X500Name ASN.1 structure class |
|
* @param {Array} params associative array of parameters (ex. {'str': '/C=US/O=a'}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @description |
|
* @example |
|
* // 1. construct with string |
|
* o = new KJUR.asn1.x509.X500Name({str: "/C=US/O=aaa/OU=bbb/CN=foo@example.com"}); |
|
* // 2. construct by object |
|
* o = new KJUR.asn1.x509.X500Name({C: "US", O: "aaa", CN: "http://example.com/"}); |
|
*/ |
|
KJUR.asn1.x509.X500Name = function(params) { |
|
KJUR.asn1.x509.X500Name.superclass.constructor.call(this); |
|
this.asn1Array = new Array(); |
|
|
|
/** |
|
* set DN by string |
|
* @name setByString |
|
* @memberOf KJUR.asn1.x509.X500Name |
|
* @function |
|
* @param {Array} dnStr distinguished name by string (ex. /C=US/O=aaa) |
|
* @description |
|
* @example |
|
* name = new KJUR.asn1.x509.X500Name(); |
|
* name.setByString("/C=US/O=aaa/OU=bbb/CN=foo@example.com"); |
|
*/ |
|
this.setByString = function(dnStr) { |
|
var a = dnStr.split('/'); |
|
a.shift(); |
|
for (var i = 0; i < a.length; i++) { |
|
this.asn1Array.push(new KJUR.asn1.x509.RDN({'str':a[i]})); |
|
} |
|
}; |
|
|
|
/** |
|
* set DN by associative array |
|
* @name setByObject |
|
* @memberOf KJUR.asn1.x509.X500Name |
|
* @function |
|
* @param {Array} dnObj associative array of DN (ex. {C: "US", O: "aaa"}) |
|
* @since jsrsasign 4.9. asn1x509 1.0.13 |
|
* @description |
|
* @example |
|
* name = new KJUR.asn1.x509.X500Name(); |
|
* name.setByObject({C: "US", O: "aaa", CN="http://example.com/"1}); |
|
*/ |
|
this.setByObject = function(dnObj) { |
|
// Get all the dnObject attributes and stuff them in the ASN.1 array. |
|
for (var x in dnObj) { |
|
if (dnObj.hasOwnProperty(x)) { |
|
var newRDN = new KJUR.asn1.x509.RDN( |
|
{'str': x + '=' + dnObj[x]}); |
|
// Initialize or push into the ANS1 array. |
|
this.asn1Array ? this.asn1Array.push(newRDN) |
|
: this.asn1Array = [newRDN]; |
|
} |
|
} |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
if (typeof this.hTLV == "string") return this.hTLV; |
|
var o = new KJUR.asn1.DERSequence({"array": this.asn1Array}); |
|
this.hTLV = o.getEncodedHex(); |
|
return this.hTLV; |
|
}; |
|
|
|
if (typeof params != "undefined") { |
|
if (typeof params['str'] != "undefined") { |
|
this.setByString(params['str']); |
|
// If params is an object, then set the ASN1 array just using the object |
|
// attributes. This is nice for fields that have lots of special |
|
// characters (i.e. CN: 'http://www.github.com/kjur//'). |
|
} else if (typeof params === "object") { |
|
this.setByObject(params); |
|
} |
|
|
|
if (typeof params.certissuer != "undefined") { |
|
var x = new X509(); |
|
x.hex = X509.pemToHex(params.certissuer); |
|
this.hTLV = x.getIssuerHex(); |
|
} |
|
if (typeof params.certsubject != "undefined") { |
|
var x = new X509(); |
|
x.hex = X509.pemToHex(params.certsubject); |
|
this.hTLV = x.getSubjectHex(); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.X500Name, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* RDN (Relative Distinguish Name) ASN.1 structure class |
|
* @name KJUR.asn1.x509.RDN |
|
* @class RDN (Relative Distinguish Name) ASN.1 structure class |
|
* @param {Array} params associative array of parameters (ex. {'str': 'C=US'}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @description |
|
* @example |
|
*/ |
|
KJUR.asn1.x509.RDN = function(params) { |
|
KJUR.asn1.x509.RDN.superclass.constructor.call(this); |
|
this.asn1Array = new Array(); |
|
|
|
this.addByString = function(rdnStr) { |
|
this.asn1Array.push(new KJUR.asn1.x509.AttributeTypeAndValue({'str':rdnStr})); |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
var o = new KJUR.asn1.DERSet({"array": this.asn1Array}); |
|
this.TLV = o.getEncodedHex(); |
|
return this.TLV; |
|
}; |
|
|
|
if (typeof params != "undefined") { |
|
if (typeof params['str'] != "undefined") { |
|
this.addByString(params['str']); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.RDN, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* AttributeTypeAndValue ASN.1 structure class |
|
* @name KJUR.asn1.x509.AttributeTypeAndValue |
|
* @class AttributeTypeAndValue ASN.1 structure class |
|
* @param {Array} params associative array of parameters (ex. {'str': 'C=US'}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @description |
|
* @example |
|
*/ |
|
KJUR.asn1.x509.AttributeTypeAndValue = function(params) { |
|
KJUR.asn1.x509.AttributeTypeAndValue.superclass.constructor.call(this); |
|
var typeObj = null; |
|
var valueObj = null; |
|
var defaultDSType = "utf8"; |
|
|
|
this.setByString = function(attrTypeAndValueStr) { |
|
if (attrTypeAndValueStr.match(/^([^=]+)=(.+)$/)) { |
|
this.setByAttrTypeAndValueStr(RegExp.$1, RegExp.$2); |
|
} else { |
|
throw "malformed attrTypeAndValueStr: " + attrTypeAndValueStr; |
|
} |
|
}; |
|
|
|
this.setByAttrTypeAndValueStr = function(shortAttrType, valueStr) { |
|
this.typeObj = KJUR.asn1.x509.OID.atype2obj(shortAttrType); |
|
var dsType = defaultDSType; |
|
if (shortAttrType == "C") dsType = "prn"; |
|
this.valueObj = this.getValueObj(dsType, valueStr); |
|
}; |
|
|
|
this.getValueObj = function(dsType, valueStr) { |
|
if (dsType == "utf8") return new KJUR.asn1.DERUTF8String({"str": valueStr}); |
|
if (dsType == "prn") return new KJUR.asn1.DERPrintableString({"str": valueStr}); |
|
if (dsType == "tel") return new KJUR.asn1.DERTeletexString({"str": valueStr}); |
|
if (dsType == "ia5") return new KJUR.asn1.DERIA5String({"str": valueStr}); |
|
throw "unsupported directory string type: type=" + dsType + " value=" + valueStr; |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
var o = new KJUR.asn1.DERSequence({"array": [this.typeObj, this.valueObj]}); |
|
this.TLV = o.getEncodedHex(); |
|
return this.TLV; |
|
}; |
|
|
|
if (typeof params != "undefined") { |
|
if (typeof params['str'] != "undefined") { |
|
this.setByString(params['str']); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.AttributeTypeAndValue, KJUR.asn1.ASN1Object); |
|
|
|
// === END X500Name Related ================================================= |
|
|
|
// === BEGIN Other ASN1 structure class ====================================== |
|
|
|
/** |
|
* SubjectPublicKeyInfo ASN.1 structure class |
|
* @name KJUR.asn1.x509.SubjectPublicKeyInfo |
|
* @class SubjectPublicKeyInfo ASN.1 structure class |
|
* @param {Object} params parameter for subject public key |
|
* @extends KJUR.asn1.ASN1Object |
|
* @description |
|
* <br/> |
|
* As for argument 'params' for constructor, you can specify one of |
|
* following properties: |
|
* <ul> |
|
* <li>{@link RSAKey} object</li> |
|
* <li>{@link KJUR.crypto.ECDSA} object</li> |
|
* <li>{@link KJUR.crypto.DSA} object</li> |
|
* <li>(DEPRECATED)rsakey - specify {@link RSAKey} object of subject public key</li> |
|
* <li>(DEPRECATED)rsapem - specify a string of PEM public key of RSA key</li> |
|
* </ul> |
|
* NOTE1: 'params' can be omitted.<br/> |
|
* NOTE2: DSA/ECDSA key object is also supported since asn1x509 1.0.6.<br/> |
|
* <h4>EXAMPLE</h4> |
|
* @example |
|
* var spki = new KJUR.asn1.x509.SubjectPublicKeyInfo(RSAKey_object); |
|
* var spki = new KJUR.asn1.x509.SubjectPublicKeyInfo(KJURcryptoECDSA_object); |
|
* var spki = new KJUR.asn1.x509.SubjectPublicKeyInfo(KJURcryptoDSA_object); |
|
*/ |
|
KJUR.asn1.x509.SubjectPublicKeyInfo = function(params) { |
|
KJUR.asn1.x509.SubjectPublicKeyInfo.superclass.constructor.call(this); |
|
var asn1AlgId = null; |
|
var asn1SubjPKey = null; |
|
var rsaKey = null; |
|
|
|
/** |
|
* (DEPRECATED) set RSAKey object as subject public key |
|
* @name setRSAKey |
|
* @memberOf KJUR.asn1.x509.SubjectPublicKeyInfo |
|
* @function |
|
* @param {RSAKey} rsaKey {@link RSAKey} object for RSA public key |
|
* @description |
|
* @deprecated |
|
* @example |
|
* spki.setRSAKey(rsaKey); |
|
*/ |
|
this.setRSAKey = function(rsaKey) { |
|
if (! RSAKey.prototype.isPrototypeOf(rsaKey)) |
|
throw "argument is not RSAKey instance"; |
|
this.rsaKey = rsaKey; |
|
var asn1RsaN = new KJUR.asn1.DERInteger({'bigint': rsaKey.n}); |
|
var asn1RsaE = new KJUR.asn1.DERInteger({'int': rsaKey.e}); |
|
var asn1RsaPub = new KJUR.asn1.DERSequence({'array': [asn1RsaN, asn1RsaE]}); |
|
var rsaKeyHex = asn1RsaPub.getEncodedHex(); |
|
this.asn1AlgId = new KJUR.asn1.x509.AlgorithmIdentifier({'name':'rsaEncryption'}); |
|
this.asn1SubjPKey = new KJUR.asn1.DERBitString({'hex':'00'+rsaKeyHex}); |
|
}; |
|
|
|
/** |
|
* (DEPRECATED) set a PEM formatted RSA public key string as RSA public key |
|
* @name setRSAPEM |
|
* @memberOf KJUR.asn1.x509.SubjectPublicKeyInfo |
|
* @function |
|
* @param {String} rsaPubPEM PEM formatted RSA public key string |
|
* @deprecated |
|
* @description |
|
* @example |
|
* spki.setRSAPEM(rsaPubPEM); |
|
*/ |
|
this.setRSAPEM = function(rsaPubPEM) { |
|
if (rsaPubPEM.match(/-----BEGIN PUBLIC KEY-----/)) { |
|
var s = rsaPubPEM; |
|
s = s.replace(/^-----[^-]+-----/, ''); |
|
s = s.replace(/-----[^-]+-----\s*$/, ''); |
|
var rsaB64 = s.replace(/\s+/g, ''); |
|
var rsaWA = CryptoJS.enc.Base64.parse(rsaB64); |
|
var rsaP8Hex = CryptoJS.enc.Hex.stringify(rsaWA); |
|
var a = _rsapem_getHexValueArrayOfChildrenFromHex(rsaP8Hex); |
|
var hBitStrVal = a[1]; |
|
var rsaHex = hBitStrVal.substr(2); |
|
var a3 = _rsapem_getHexValueArrayOfChildrenFromHex(rsaHex); |
|
var rsaKey = new RSAKey(); |
|
rsaKey.setPublic(a3[0], a3[1]); |
|
this.setRSAKey(rsaKey); |
|
} else { |
|
throw "key not supported"; |
|
} |
|
}; |
|
|
|
/* |
|
* @since asn1x509 1.0.7 |
|
*/ |
|
this.getASN1Object = function() { |
|
if (this.asn1AlgId == null || this.asn1SubjPKey == null) |
|
throw "algId and/or subjPubKey not set"; |
|
var o = new KJUR.asn1.DERSequence({'array': |
|
[this.asn1AlgId, this.asn1SubjPKey]}); |
|
return o; |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
var o = this.getASN1Object(); |
|
this.hTLV = o.getEncodedHex(); |
|
return this.hTLV; |
|
}; |
|
|
|
this._setRSAKey = function(key) { |
|
var asn1RsaPub = KJUR.asn1.ASN1Util.newObject({ |
|
'seq': [{'int': {'bigint': key.n}}, {'int': {'int': key.e}}] |
|
}); |
|
var rsaKeyHex = asn1RsaPub.getEncodedHex(); |
|
this.asn1AlgId = new KJUR.asn1.x509.AlgorithmIdentifier({'name':'rsaEncryption'}); |
|
this.asn1SubjPKey = new KJUR.asn1.DERBitString({'hex':'00'+rsaKeyHex}); |
|
}; |
|
|
|
this._setEC = function(key) { |
|
var asn1Params = new KJUR.asn1.DERObjectIdentifier({'name': key.curveName}); |
|
this.asn1AlgId = |
|
new KJUR.asn1.x509.AlgorithmIdentifier({'name': 'ecPublicKey', |
|
'asn1params': asn1Params}); |
|
this.asn1SubjPKey = new KJUR.asn1.DERBitString({'hex': '00' + key.pubKeyHex}); |
|
}; |
|
|
|
this._setDSA = function(key) { |
|
var asn1Params = new KJUR.asn1.ASN1Util.newObject({ |
|
'seq': [{'int': {'bigint': key.p}}, |
|
{'int': {'bigint': key.q}}, |
|
{'int': {'bigint': key.g}}] |
|
}); |
|
this.asn1AlgId = |
|
new KJUR.asn1.x509.AlgorithmIdentifier({'name': 'dsa', |
|
'asn1params': asn1Params}); |
|
var pubInt = new KJUR.asn1.DERInteger({'bigint': key.y}); |
|
this.asn1SubjPKey = new KJUR.asn1.DERBitString({'hex': '00' + pubInt.getEncodedHex()}); |
|
}; |
|
|
|
if (typeof params != "undefined") { |
|
if (typeof RSAKey != 'undefined' && params instanceof RSAKey) { |
|
this._setRSAKey(params); |
|
} else if (typeof KJUR.crypto.ECDSA != 'undefined' && |
|
params instanceof KJUR.crypto.ECDSA) { |
|
this._setEC(params); |
|
} else if (typeof KJUR.crypto.DSA != 'undefined' && |
|
params instanceof KJUR.crypto.DSA) { |
|
this._setDSA(params); |
|
} else if (typeof params['rsakey'] != "undefined") { |
|
this.setRSAKey(params['rsakey']); |
|
} else if (typeof params['rsapem'] != "undefined") { |
|
this.setRSAPEM(params['rsapem']); |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.SubjectPublicKeyInfo, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* Time ASN.1 structure class |
|
* @name KJUR.asn1.x509.Time |
|
* @class Time ASN.1 structure class |
|
* @param {Array} params associative array of parameters (ex. {'str': '130508235959Z'}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @description |
|
* <br/> |
|
* <h4>EXAMPLES</h4> |
|
* @example |
|
* var t1 = new KJUR.asn1.x509.Time{'str': '130508235959Z'} // UTCTime by default |
|
* var t2 = new KJUR.asn1.x509.Time{'type': 'gen', 'str': '20130508235959Z'} // GeneralizedTime |
|
*/ |
|
KJUR.asn1.x509.Time = function(params) { |
|
KJUR.asn1.x509.Time.superclass.constructor.call(this); |
|
var type = null; |
|
var timeParams = null; |
|
|
|
this.setTimeParams = function(timeParams) { |
|
this.timeParams = timeParams; |
|
} |
|
|
|
this.getEncodedHex = function() { |
|
var o = null; |
|
|
|
if (this.timeParams != null) { |
|
if (this.type == "utc") { |
|
o = new KJUR.asn1.DERUTCTime(this.timeParams); |
|
} else { |
|
o = new KJUR.asn1.DERGeneralizedTime(this.timeParams); |
|
} |
|
} else { |
|
if (this.type == "utc") { |
|
o = new KJUR.asn1.DERUTCTime(); |
|
} else { |
|
o = new KJUR.asn1.DERGeneralizedTime(); |
|
} |
|
} |
|
this.TLV = o.getEncodedHex(); |
|
return this.TLV; |
|
}; |
|
|
|
this.type = "utc"; |
|
if (typeof params != "undefined") { |
|
if (typeof params.type != "undefined") { |
|
this.type = params.type; |
|
} else { |
|
if (typeof params.str != "undefined") { |
|
if (params.str.match(/^[0-9]{12}Z$/)) this.type = "utc"; |
|
if (params.str.match(/^[0-9]{14}Z$/)) this.type = "gen"; |
|
} |
|
} |
|
this.timeParams = params; |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.Time, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* AlgorithmIdentifier ASN.1 structure class |
|
* @name KJUR.asn1.x509.AlgorithmIdentifier |
|
* @class AlgorithmIdentifier ASN.1 structure class |
|
* @param {Array} params associative array of parameters (ex. {'name': 'SHA1withRSA'}) |
|
* @extends KJUR.asn1.ASN1Object |
|
* @description |
|
* @example |
|
*/ |
|
KJUR.asn1.x509.AlgorithmIdentifier = function(params) { |
|
KJUR.asn1.x509.AlgorithmIdentifier.superclass.constructor.call(this); |
|
var nameAlg = null; |
|
var asn1Alg = null; |
|
var asn1Params = null; |
|
var paramEmpty = false; |
|
|
|
this.getEncodedHex = function() { |
|
if (this.nameAlg == null && this.asn1Alg == null) { |
|
throw "algorithm not specified"; |
|
} |
|
if (this.nameAlg != null && this.asn1Alg == null) { |
|
this.asn1Alg = KJUR.asn1.x509.OID.name2obj(this.nameAlg); |
|
} |
|
var a = [this.asn1Alg]; |
|
if (! this.paramEmpty) a.push(this.asn1Params); |
|
var o = new KJUR.asn1.DERSequence({'array': a}); |
|
this.hTLV = o.getEncodedHex(); |
|
return this.hTLV; |
|
}; |
|
|
|
if (typeof params != "undefined") { |
|
if (typeof params['name'] != "undefined") { |
|
this.nameAlg = params['name']; |
|
} |
|
if (typeof params['asn1params'] != "undefined") { |
|
this.asn1Params = params['asn1params']; |
|
} |
|
if (typeof params['paramempty'] != "undefined") { |
|
this.paramEmpty = params['paramempty']; |
|
} |
|
} |
|
if (this.asn1Params == null) { |
|
this.asn1Params = new KJUR.asn1.DERNull(); |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.AlgorithmIdentifier, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* GeneralName ASN.1 structure class |
|
* @name KJUR.asn1.x509.GeneralName |
|
* @class GeneralName ASN.1 structure class |
|
* @description |
|
* <br/> |
|
* As for argument 'params' for constructor, you can specify one of |
|
* following properties: |
|
* <ul> |
|
* <li>rfc822 - rfc822Name[1] (ex. user1@foo.com)</li> |
|
* <li>dns - dNSName[2] (ex. foo.com)</li> |
|
* <li>uri - uniformResourceIdentifier[6] (ex. http://foo.com/)</li> |
|
* <li>certissuer - directoryName[4] (PEM or hex string of cert)</li> |
|
* <li>certsubj - directoryName[4] (PEM or hex string of cert)</li> |
|
* </ul> |
|
* NOTE1: certissuer and certsubj is supported since asn1x509 1.0.10. |
|
* |
|
* Here is definition of the ASN.1 syntax: |
|
* <pre> |
|
* -- NOTE: under the CHOICE, it will always be explicit. |
|
* GeneralName ::= CHOICE { |
|
* otherName [0] OtherName, |
|
* rfc822Name [1] IA5String, |
|
* dNSName [2] IA5String, |
|
* x400Address [3] ORAddress, |
|
* directoryName [4] Name, |
|
* ediPartyName [5] EDIPartyName, |
|
* uniformResourceIdentifier [6] IA5String, |
|
* iPAddress [7] OCTET STRING, |
|
* registeredID [8] OBJECT IDENTIFIER } |
|
* </pre> |
|
* |
|
* |
|
* |
|
* @example |
|
* gn = new KJUR.asn1.x509.GeneralName({rfc822: 'test@aaa.com'}); |
|
* gn = new KJUR.asn1.x509.GeneralName({dns: 'aaa.com'}); |
|
* gn = new KJUR.asn1.x509.GeneralName({uri: 'http://aaa.com/'}); |
|
* gn = new KJUR.asn1.x509.GeneralName({certissuer: certPEM}); |
|
* gn = new KJUR.asn1.x509.GeneralName({certsubj: certPEM}); |
|
*/ |
|
KJUR.asn1.x509.GeneralName = function(params) { |
|
KJUR.asn1.x509.GeneralName.superclass.constructor.call(this); |
|
var asn1Obj = null; |
|
var type = null; |
|
var pTag = {rfc822: '81', dns: '82', dn: 'a4', uri: '86'}; |
|
this.explicit = false; |
|
|
|
this.setByParam = function(params) { |
|
var str = null; |
|
var v = null; |
|
|
|
if (typeof params == "undefined") return; |
|
|
|
if (typeof params.rfc822 != "undefined") { |
|
this.type = 'rfc822'; |
|
v = new KJUR.asn1.DERIA5String({'str': params[this.type]}); |
|
} |
|
if (typeof params.dns != "undefined") { |
|
this.type = 'dns'; |
|
v = new KJUR.asn1.DERIA5String({'str': params[this.type]}); |
|
} |
|
if (typeof params.uri != "undefined") { |
|
this.type = 'uri'; |
|
v = new KJUR.asn1.DERIA5String({'str': params[this.type]}); |
|
} |
|
if (typeof params.certissuer != "undefined") { |
|
this.type = 'dn'; |
|
this.explicit = true; |
|
var certStr = params.certissuer; |
|
var certHex = null; |
|
if (certStr.match(/^[0-9A-Fa-f]+$/)) { |
|
certHex == certStr; |
|
} |
|
if (certStr.indexOf("-----BEGIN ") != -1) { |
|
certHex = X509.pemToHex(certStr); |
|
} |
|
if (certHex == null) throw "certissuer param not cert"; |
|
var x = new X509(); |
|
x.hex = certHex; |
|
var dnHex = x.getIssuerHex(); |
|
v = new KJUR.asn1.ASN1Object(); |
|
v.hTLV = dnHex; |
|
} |
|
if (typeof params.certsubj != "undefined") { |
|
this.type = 'dn'; |
|
this.explicit = true; |
|
var certStr = params.certsubj; |
|
var certHex = null; |
|
if (certStr.match(/^[0-9A-Fa-f]+$/)) { |
|
certHex == certStr; |
|
} |
|
if (certStr.indexOf("-----BEGIN ") != -1) { |
|
certHex = X509.pemToHex(certStr); |
|
} |
|
if (certHex == null) throw "certsubj param not cert"; |
|
var x = new X509(); |
|
x.hex = certHex; |
|
var dnHex = x.getSubjectHex(); |
|
v = new KJUR.asn1.ASN1Object(); |
|
v.hTLV = dnHex; |
|
} |
|
|
|
if (this.type == null) |
|
throw "unsupported type in params=" + params; |
|
this.asn1Obj = new KJUR.asn1.DERTaggedObject({'explicit': this.explicit, |
|
'tag': pTag[this.type], |
|
'obj': v}); |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
return this.asn1Obj.getEncodedHex(); |
|
} |
|
|
|
if (typeof params != "undefined") { |
|
this.setByParam(params); |
|
} |
|
|
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.GeneralName, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* GeneralNames ASN.1 structure class |
|
* @name KJUR.asn1.x509.GeneralNames |
|
* @class GeneralNames ASN.1 structure class |
|
* @description |
|
* <br/> |
|
* <h4>EXAMPLE AND ASN.1 SYNTAX</h4> |
|
* @example |
|
* var gns = new KJUR.asn1.x509.GeneralNames([{'uri': 'http://aaa.com/'}, {'uri': 'http://bbb.com/'}]); |
|
* |
|
* GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName |
|
*/ |
|
KJUR.asn1.x509.GeneralNames = function(paramsArray) { |
|
KJUR.asn1.x509.GeneralNames.superclass.constructor.call(this); |
|
var asn1Array = null; |
|
|
|
/** |
|
* set a array of {@link KJUR.asn1.x509.GeneralName} parameters |
|
* @name setByParamArray |
|
* @memberOf KJUR.asn1.x509.GeneralNames |
|
* @function |
|
* @param {Array} paramsArray Array of {@link KJUR.asn1.x509.GeneralNames} |
|
* @description |
|
* <br/> |
|
* <h4>EXAMPLES</h4> |
|
* @example |
|
* var gns = new KJUR.asn1.x509.GeneralNames(); |
|
* gns.setByParamArray([{'uri': 'http://aaa.com/'}, {'uri': 'http://bbb.com/'}]); |
|
*/ |
|
this.setByParamArray = function(paramsArray) { |
|
for (var i = 0; i < paramsArray.length; i++) { |
|
var o = new KJUR.asn1.x509.GeneralName(paramsArray[i]); |
|
this.asn1Array.push(o); |
|
} |
|
}; |
|
|
|
this.getEncodedHex = function() { |
|
var o = new KJUR.asn1.DERSequence({'array': this.asn1Array}); |
|
return o.getEncodedHex(); |
|
}; |
|
|
|
this.asn1Array = new Array(); |
|
if (typeof paramsArray != "undefined") { |
|
this.setByParamArray(paramsArray); |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.GeneralNames, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* DistributionPointName ASN.1 structure class |
|
* @name KJUR.asn1.x509.DistributionPointName |
|
* @class DistributionPointName ASN.1 structure class |
|
* @description |
|
* @example |
|
*/ |
|
KJUR.asn1.x509.DistributionPointName = function(gnOrRdn) { |
|
KJUR.asn1.x509.DistributionPointName.superclass.constructor.call(this); |
|
var asn1Obj = null; |
|
var type = null; |
|
var tag = null; |
|
var asn1V = null; |
|
|
|
this.getEncodedHex = function() { |
|
if (this.type != "full") |
|
throw "currently type shall be 'full': " + this.type; |
|
this.asn1Obj = new KJUR.asn1.DERTaggedObject({'explicit': false, |
|
'tag': this.tag, |
|
'obj': this.asn1V}); |
|
this.hTLV = this.asn1Obj.getEncodedHex(); |
|
return this.hTLV; |
|
}; |
|
|
|
if (typeof gnOrRdn != "undefined") { |
|
if (KJUR.asn1.x509.GeneralNames.prototype.isPrototypeOf(gnOrRdn)) { |
|
this.type = "full"; |
|
this.tag = "a0"; |
|
this.asn1V = gnOrRdn; |
|
} else { |
|
throw "This class supports GeneralNames only as argument"; |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.DistributionPointName, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* DistributionPoint ASN.1 structure class |
|
* @name KJUR.asn1.x509.DistributionPoint |
|
* @class DistributionPoint ASN.1 structure class |
|
* @description |
|
* @example |
|
*/ |
|
KJUR.asn1.x509.DistributionPoint = function(params) { |
|
KJUR.asn1.x509.DistributionPoint.superclass.constructor.call(this); |
|
var asn1DP = null; |
|
|
|
this.getEncodedHex = function() { |
|
var seq = new KJUR.asn1.DERSequence(); |
|
if (this.asn1DP != null) { |
|
var o1 = new KJUR.asn1.DERTaggedObject({'explicit': true, |
|
'tag': 'a0', |
|
'obj': this.asn1DP}); |
|
seq.appendASN1Object(o1); |
|
} |
|
this.hTLV = seq.getEncodedHex(); |
|
return this.hTLV; |
|
}; |
|
|
|
if (typeof params != "undefined") { |
|
if (typeof params['dpobj'] != "undefined") { |
|
this.asn1DP = params['dpobj']; |
|
} |
|
} |
|
}; |
|
YAHOO.lang.extend(KJUR.asn1.x509.DistributionPoint, KJUR.asn1.ASN1Object); |
|
|
|
/** |
|
* static object for OID |
|
* @name KJUR.asn1.x509.OID |
|
* @class static object for OID |
|
* @property {Assoc Array} atype2oidList for short attribyte type name and oid (i.e. 'C' and '2.5.4.6') |
|
* @property {Assoc Array} name2oidList for oid name and oid (i.e. 'keyUsage' and '2.5.29.15') |
|
* @property {Assoc Array} objCache for caching name and DERObjectIdentifier object |
|
* @description |
|
* <dl> |
|
* <dt><b>atype2oidList</b> |
|
* <dd>currently supports 'C', 'O', 'OU', 'ST', 'L' and 'CN' only. |
|
* <dt><b>name2oidList</b> |
|
* <dd>currently supports 'SHA1withRSA', 'rsaEncryption' and some extension OIDs |
|
* </dl> |
|
* @example |
|
*/ |
|
KJUR.asn1.x509.OID = new function(params) { |
|
this.atype2oidList = { |
|
'C': '2.5.4.6', |
|
'O': '2.5.4.10', |
|
'OU': '2.5.4.11', |
|
'ST': '2.5.4.8', |
|
'L': '2.5.4.7', |
|
'CN': '2.5.4.3', |
|
'SN': '2.5.4.4', |
|
'DN': '2.5.4.49', |
|
'DC': '0.9.2342.19200300.100.1.25', |
|
}; |
|
this.name2oidList = { |
|
'sha1': '1.3.14.3.2.26', |
|
'sha256': '2.16.840.1.101.3.4.2.1', |
|
'sha384': '2.16.840.1.101.3.4.2.2', |
|
'sha512': '2.16.840.1.101.3.4.2.3', |
|
'sha224': '2.16.840.1.101.3.4.2.4', |
|
'md5': '1.2.840.113549.2.5', |
|
'md2': '1.3.14.7.2.2.1', |
|
'ripemd160': '1.3.36.3.2.1', |
|
|
|
'MD2withRSA': '1.2.840.113549.1.1.2', |
|
'MD4withRSA': '1.2.840.113549.1.1.3', |
|
'MD5withRSA': '1.2.840.113549.1.1.4', |
|
'SHA1withRSA': '1.2.840.113549.1.1.5', |
|
'SHA224withRSA': '1.2.840.113549.1.1.14', |
|
'SHA256withRSA': '1.2.840.113549.1.1.11', |
|
'SHA384withRSA': '1.2.840.113549.1.1.12', |
|
'SHA512withRSA': '1.2.840.113549.1.1.13', |
|
|
|
'SHA1withECDSA': '1.2.840.10045.4.1', |
|
'SHA224withECDSA': '1.2.840.10045.4.3.1', |
|
'SHA256withECDSA': '1.2.840.10045.4.3.2', |
|
'SHA384withECDSA': '1.2.840.10045.4.3.3', |
|
'SHA512withECDSA': '1.2.840.10045.4.3.4', |
|
|
|
'dsa': '1.2.840.10040.4.1', |
|
'SHA1withDSA': '1.2.840.10040.4.3', |
|
'SHA224withDSA': '2.16.840.1.101.3.4.3.1', |
|
'SHA256withDSA': '2.16.840.1.101.3.4.3.2', |
|
|
|
'rsaEncryption': '1.2.840.113549.1.1.1', |
|
|
|
'countryName': '2.5.4.6', |
|
'organization': '2.5.4.10', |
|
'organizationalUnit': '2.5.4.11', |
|
'stateOrProvinceName': '2.5.4.8', |
|
'locality': '2.5.4.7', |
|
'commonName': '2.5.4.3', |
|
|
|
'subjectKeyIdentifier': '2.5.29.14', |
|
'keyUsage': '2.5.29.15', |
|
'subjectAltName': '2.5.29.17', |
|
'basicConstraints': '2.5.29.19', |
|
'nameConstraints': '2.5.29.30', |
|
'cRLDistributionPoints':'2.5.29.31', |
|
'certificatePolicies': '2.5.29.32', |
|
'authorityKeyIdentifier':'2.5.29.35', |
|
'policyConstraints': '2.5.29.36', |
|
'extKeyUsage': '2.5.29.37', |
|
'authorityInfoAccess': '1.3.6.1.5.5.7.1.1', |
|
|
|
'anyExtendedKeyUsage': '2.5.29.37.0', |
|
'serverAuth': '1.3.6.1.5.5.7.3.1', |
|
'clientAuth': '1.3.6.1.5.5.7.3.2', |
|
'codeSigning': '1.3.6.1.5.5.7.3.3', |
|
'emailProtection': '1.3.6.1.5.5.7.3.4', |
|
'timeStamping': '1.3.6.1.5.5.7.3.8', |
|
'ocspSigning': '1.3.6.1.5.5.7.3.9', |
|
|
|
'ecPublicKey': '1.2.840.10045.2.1', |
|
'secp256r1': '1.2.840.10045.3.1.7', |
|
'secp256k1': '1.3.132.0.10', |
|
'secp384r1': '1.3.132.0.34', |
|
|
|
'pkcs5PBES2': '1.2.840.113549.1.5.13', |
|
'pkcs5PBKDF2': '1.2.840.113549.1.5.12', |
|
|
|
'des-EDE3-CBC': '1.2.840.113549.3.7', |
|
|
|
'data': '1.2.840.113549.1.7.1', // CMS data |
|
'signed-data': '1.2.840.113549.1.7.2', // CMS signed-data |
|
'enveloped-data': '1.2.840.113549.1.7.3', // CMS enveloped-data |
|
'digested-data': '1.2.840.113549.1.7.5', // CMS digested-data |
|
'encrypted-data': '1.2.840.113549.1.7.6', // CMS encrypted-data |
|
'authenticated-data': '1.2.840.113549.1.9.16.1.2', // CMS authenticated-data |
|
'tstinfo': '1.2.840.113549.1.9.16.1.4', // RFC3161 TSTInfo |
|
}; |
|
|
|
this.objCache = {}; |
|
|
|
/** |
|
* get DERObjectIdentifier by registered OID name |
|
* @name name2obj |
|
* @memberOf KJUR.asn1.x509.OID |
|
* @function |
|
* @param {String} name OID |
|
* @description |
|
* @example |
|
* var asn1ObjOID = OID.name2obj('SHA1withRSA'); |
|
*/ |
|
this.name2obj = function(name) { |
|
if (typeof this.objCache[name] != "undefined") |
|
return this.objCache[name]; |
|
if (typeof this.name2oidList[name] == "undefined") |
|
throw "Name of ObjectIdentifier not defined: " + name; |
|
var oid = this.name2oidList[name]; |
|
var obj = new KJUR.asn1.DERObjectIdentifier({'oid': oid}); |
|
this.objCache[name] = obj; |
|
return obj; |
|
}; |
|
|
|
/** |
|
* get DERObjectIdentifier by registered attribyte type name such like 'C' or 'CN' |
|
* @name atype2obj |
|
* @memberOf KJUR.asn1.x509.OID |
|
* @function |
|
* @param {String} atype short attribute type name such like 'C' or 'CN' |
|
* @description |
|
* @example |
|
* var asn1ObjOID = OID.atype2obj('CN'); |
|
*/ |
|
this.atype2obj = function(atype) { |
|
if (typeof this.objCache[atype] != "undefined") |
|
return this.objCache[atype]; |
|
if (typeof this.atype2oidList[atype] == "undefined") |
|
throw "AttributeType name undefined: " + atype; |
|
var oid = this.atype2oidList[atype]; |
|
var obj = new KJUR.asn1.DERObjectIdentifier({'oid': oid}); |
|
this.objCache[atype] = obj; |
|
return obj; |
|
}; |
|
}; |
|
|
|
/* |
|
* convert OID to name |
|
* @name oid2name |
|
* @memberOf KJUR.asn1.x509.OID |
|
* @function |
|
* @param {String} dot noted Object Identifer string (ex. 1.2.3.4) |
|
* @return {String} OID name |
|
* @description |
|
* This static method converts OID string to its name. |
|
* If OID is undefined then it returns empty string (i.e. ''). |
|
* @example |
|
* name = KJUR.asn1.x509.OID.oid2name("1.3.6.1.5.5.7.1.1"); |
|
* // name will be 'authorityInfoAccess'. |
|
* @since asn1x509 1.0.9 |
|
*/ |
|
KJUR.asn1.x509.OID.oid2name = function(oid) { |
|
var list = KJUR.asn1.x509.OID.name2oidList; |
|
for (var name in list) { |
|
if (list[name] == oid) return name; |
|
} |
|
return ''; |
|
}; |
|
|
|
/* |
|
* convert name to OID |
|
* @name name2oid |
|
* @memberOf KJUR.asn1.x509.OID |
|
* @function |
|
* @param {String} OID name |
|
* @return {String} dot noted Object Identifer string (ex. 1.2.3.4) |
|
* @description |
|
* This static method converts from OID name to OID string. |
|
* If OID is undefined then it returns empty string (i.e. ''). |
|
* @example |
|
* name = KJUR.asn1.x509.OID.name2oid("authorityInfoAccess"); |
|
* // name will be '1.3.6.1.5.5.7.1.1'. |
|
* @since asn1x509 1.0.11 |
|
*/ |
|
KJUR.asn1.x509.OID.name2oid = function(name) { |
|
var list = KJUR.asn1.x509.OID.name2oidList; |
|
if (list[name] === undefined) return ''; |
|
return list[name]; |
|
}; |
|
|
|
/** |
|
* X.509 certificate and CRL utilities class |
|
* @name KJUR.asn1.x509.X509Util |
|
* @class X.509 certificate and CRL utilities class |
|
*/ |
|
KJUR.asn1.x509.X509Util = new function() { |
|
/** |
|
* get PKCS#8 PEM public key string from RSAKey object |
|
* @name getPKCS8PubKeyPEMfromRSAKey |
|
* @memberOf KJUR.asn1.x509.X509Util |
|
* @function |
|
* @param {RSAKey} rsaKey RSA public key of {@link RSAKey} object |
|
* @description |
|
* @example |
|
* var pem = KJUR.asn1.x509.X509Util.getPKCS8PubKeyPEMfromRSAKey(pubKey); |
|
*/ |
|
this.getPKCS8PubKeyPEMfromRSAKey = function(rsaKey) { |
|
var pem = null; |
|
var hN = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(rsaKey.n); |
|
var hE = KJUR.asn1.ASN1Util.integerToByteHex(rsaKey.e); |
|
var iN = new KJUR.asn1.DERInteger({hex: hN}); |
|
var iE = new KJUR.asn1.DERInteger({hex: hE}); |
|
var asn1PubKey = new KJUR.asn1.DERSequence({array: [iN, iE]}); |
|
var hPubKey = asn1PubKey.getEncodedHex(); |
|
var o1 = new KJUR.asn1.x509.AlgorithmIdentifier({name: 'rsaEncryption'}); |
|
var o2 = new KJUR.asn1.DERBitString({hex: '00' + hPubKey}); |
|
var seq = new KJUR.asn1.DERSequence({array: [o1, o2]}); |
|
var hP8 = seq.getEncodedHex(); |
|
var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(hP8, "PUBLIC KEY"); |
|
return pem; |
|
}; |
|
}; |
|
/** |
|
* issue a certificate in PEM format |
|
* @name newCertPEM |
|
* @memberOf KJUR.asn1.x509.X509Util |
|
* @function |
|
* @param {Array} param parameter to issue a certificate |
|
* @since asn1x509 1.0.6 |
|
* @description |
|
* This method can issue a certificate by a simple |
|
* JSON object. |
|
* Signature value will be provided by signing with |
|
* private key using 'cakey' parameter or |
|
* hexa decimal signature value by 'sighex' parameter. |
|
* |
|
* NOTE: When using DSA or ECDSA CA signing key, |
|
* use 'paramempty' in 'sigalg' to ommit parameter field |
|
* of AlgorithmIdentifer. In case of RSA, parameter |
|
* NULL will be specified by default. |
|
* |
|
* @example |
|
* var certPEM = KJUR.asn1.x509.X509Util.newCertPEM( |
|
* { serial: {int: 4}, |
|
* sigalg: {name: 'SHA1withECDSA', paramempty: true}, |
|
* issuer: {str: '/C=US/O=a'}, |
|
* notbefore: {'str': '130504235959Z'}, |
|
* notafter: {'str': '140504235959Z'}, |
|
* subject: {str: '/C=US/O=b'}, |
|
* sbjpubkey: pubKeyPEM, |
|
* ext: [ |
|
* {basicConstraints: {cA: true, critical: true}}, |
|
* {keyUsage: {bin: '11'}}, |
|
* ], |
|
* cakey: [prvkey, pass]} |
|
* ); |
|
* // -- or -- |
|
* var certPEM = KJUR.asn1.x509.X509Util.newCertPEM( |
|
* { serial: {int: 1}, |
|
* sigalg: {name: 'SHA1withRSA', paramempty: true}, |
|
* issuer: {str: '/C=US/O=T1'}, |
|
* notbefore: {'str': '130504235959Z'}, |
|
* notafter: {'str': '140504235959Z'}, |
|
* subject: {str: '/C=US/O=T1'}, |
|
* sbjpubkey: pubKeyObj, |
|
* sighex: '0102030405..'} |
|
* ); |
|
* // for the issuer and subject field, another |
|
* // representation is also available |
|
* var certPEM = KJUR.asn1.x509.X509Util.newCertPEM( |
|
* { serial: {int: 1}, |
|
* sigalg: {name: 'SHA1withRSA', paramempty: true}, |
|
* issuer: {C: "US", O: "T1"}, |
|
* notbefore: {'str': '130504235959Z'}, |
|
* notafter: {'str': '140504235959Z'}, |
|
* subject: {C: "US", O: "T1", CN: "http://example.com/"}, |
|
* sbjpubkey: pubKeyObj, |
|
* sighex: '0102030405..'} |
|
* ); |
|
*/ |
|
KJUR.asn1.x509.X509Util.newCertPEM = function(param) { |
|
var ns1 = KJUR.asn1.x509; |
|
var o = new ns1.TBSCertificate(); |
|
|
|
if (param.serial !== undefined) |
|
o.setSerialNumberByParam(param.serial); |
|
else |
|
throw "serial number undefined."; |
|
|
|
if (typeof param.sigalg.name == 'string') |
|
o.setSignatureAlgByParam(param.sigalg); |
|
else |
|
throw "unproper signature algorithm name"; |
|
|
|
if (param.issuer !== undefined) |
|
o.setIssuerByParam(param.issuer); |
|
else |
|
throw "issuer name undefined."; |
|
|
|
if (param.notbefore !== undefined) |
|
o.setNotBeforeByParam(param.notbefore); |
|
else |
|
throw "notbefore undefined."; |
|
|
|
if (param.notafter !== undefined) |
|
o.setNotAfterByParam(param.notafter); |
|
else |
|
throw "notafter undefined."; |
|
|
|
if (param.subject !== undefined) |
|
o.setSubjectByParam(param.subject); |
|
else |
|
throw "subject name undefined."; |
|
|
|
if (param.sbjpubkey !== undefined) |
|
o.setSubjectPublicKeyByGetKey(param.sbjpubkey); |
|
else |
|
throw "subject public key undefined."; |
|
|
|
if (param.ext !== undefined && param.ext.length !== undefined) { |
|
for (var i = 0; i < param.ext.length; i++) { |
|
for (key in param.ext[i]) { |
|
o.appendExtensionByName(key, param.ext[i][key]); |
|
} |
|
} |
|
} |
|
|
|
// set signature |
|
if (param.cakey === undefined && param.sighex === undefined) |
|
throw "param cakey and sighex undefined."; |
|
|
|
var caKey = null; |
|
var cert = null; |
|
|
|
if (param.cakey) { |
|
caKey = KEYUTIL.getKey.apply(null, param.cakey); |
|
cert = new ns1.Certificate({'tbscertobj': o, 'prvkeyobj': caKey}); |
|
cert.sign(); |
|
} |
|
|
|
if (param.sighex) { |
|
cert = new ns1.Certificate({'tbscertobj': o}); |
|
cert.setSignatureHex(param.sighex); |
|
} |
|
|
|
return cert.getPEMString(); |
|
}; |
|
|
|
/* |
|
org.bouncycastle.asn1.x500 |
|
AttributeTypeAndValue |
|
DirectoryString |
|
RDN |
|
X500Name |
|
X500NameBuilder |
|
|
|
org.bouncycastleasn1.x509 |
|
TBSCertificate |
|
*/
|
|
|