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.
311 lines
10 KiB
311 lines
10 KiB
9 years ago
|
/*! asn1csr-1.0.0.js (c) 2015 Kenji Urushima | kjur.github.com/jsrsasign/license
|
||
|
*/
|
||
|
/*
|
||
|
* asn1csr.js - ASN.1 DER encoder classes for PKCS#10 CSR
|
||
|
*
|
||
|
* Copyright (c) 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 asn1csr-1.0.js
|
||
|
* @author Kenji Urushima kenji.urushima@gmail.com
|
||
|
* @version 1.0.0 (2015-Sep-12)
|
||
|
* @since jsrsasign 4.8.7
|
||
|
* @license <a href="http://kjur.github.io/jsrsasign/license/">MIT License</a>
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* kjur's ASN.1 class for CSR/PKCS#10 name space
|
||
|
* <p>
|
||
|
* This name space is a sub name space for {@link KJUR.asn1}.
|
||
|
* This name space contains classes for
|
||
|
* <a href="https://tools.ietf.org/html/rfc2986">RFC 2986</a>
|
||
|
* certificate signing request(CSR/PKCS#10) and its utilities
|
||
|
* to be issued your certificate from certification authorities.
|
||
|
* <h4>PROVIDING ASN.1 STRUCTURES</h4>
|
||
|
* <ul>
|
||
|
* <li>{@link KJUR.asn1.csr.CertificationRequest}</li>
|
||
|
* <li>{@link KJUR.asn1.csr.CertificationRequestInfo}</li>
|
||
|
* </ul>
|
||
|
* <h4>PROVIDING UTILITY CLASSES</h4>
|
||
|
* <ul>
|
||
|
* <li>{@link KJUR.asn1.csr.CSRUtil}</li>
|
||
|
* </ul>
|
||
|
* {@link KJUR.asn1.csr.CSRUtil.newCSRPEM} method is very useful to
|
||
|
* get your certificate signing request (CSR/PKCS#10) file.
|
||
|
* </p>
|
||
|
* @name KJUR.asn1.csr
|
||
|
* @namespace
|
||
|
*/
|
||
|
if (typeof KJUR.asn1.csr == "undefined" || !KJUR.asn1.csr) KJUR.asn1.csr = {};
|
||
|
|
||
|
/**
|
||
|
* ASN.1 CertificationRequest structure class
|
||
|
* @name KJUR.asn1.csr.CertificationRequest
|
||
|
* @class ASN.1 CertificationRequest structure class
|
||
|
* @param {Array} params associative array of parameters (ex. {})
|
||
|
* @extends KJUR.asn1.ASN1Object
|
||
|
* @since jsrsasign 4.8.7 asn1csr 1.0.0
|
||
|
* @description
|
||
|
* <br/>
|
||
|
* @example
|
||
|
* csri = new KJUR.asn1.csr.CertificationRequestInfo();
|
||
|
* csri.setSubjectByParam({'str': '/C=US/O=Test/CN=example.com'});
|
||
|
* csri.setSubjectPublicKeyByGetKey(pubKeyObj);
|
||
|
* csr = new KJUR.asn1.csr.CertificationRequest({'csrinfo': csri});
|
||
|
* csr.sign("SHA256withRSA", prvKeyObj);
|
||
|
* pem = csr.getPEMString();
|
||
|
*
|
||
|
* // -- DEFINITION OF ASN.1 SYNTAX --
|
||
|
* // CertificationRequest ::= SEQUENCE {
|
||
|
* // certificationRequestInfo CertificationRequestInfo,
|
||
|
* // signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
|
||
|
* // signature BIT STRING }
|
||
|
*/
|
||
|
KJUR.asn1.csr.CertificationRequest = function(params) {
|
||
|
KJUR.asn1.csr.CertificationRequest.superclass.constructor.call(this);
|
||
|
var asn1CSRInfo = null;
|
||
|
var asn1SignatureAlg = null;
|
||
|
var asn1Sig = null;
|
||
|
var hexSig = null;
|
||
|
var prvKey = null;
|
||
|
|
||
|
/**
|
||
|
* sign CertificationRequest and set signature value internally
|
||
|
* @name sign
|
||
|
* @memberOf KJUR.asn1.csr.CertificationRequest
|
||
|
* @function
|
||
|
* @description
|
||
|
* This method self-signs CertificateRequestInfo with a subject's
|
||
|
* private key and set signature value internally.
|
||
|
* <br/>
|
||
|
* @example
|
||
|
* csr = new KJUR.asn1.csr.CertificationRequest({'csrinfo': csri});
|
||
|
* csr.sign("SHA256withRSA", prvKeyObj);
|
||
|
*/
|
||
|
this.sign = function(sigAlgName, prvKeyObj) {
|
||
|
if (this.prvKey == null) this.prvKey = prvKeyObj;
|
||
|
|
||
|
this.asn1SignatureAlg =
|
||
|
new KJUR.asn1.x509.AlgorithmIdentifier({'name': sigAlgName});
|
||
|
|
||
|
sig = new KJUR.crypto.Signature({'alg': sigAlgName});
|
||
|
sig.initSign(this.prvKey);
|
||
|
sig.updateHex(this.asn1CSRInfo.getEncodedHex());
|
||
|
this.hexSig = sig.sign();
|
||
|
|
||
|
this.asn1Sig = new KJUR.asn1.DERBitString({'hex': '00' + this.hexSig});
|
||
|
var seq = new KJUR.asn1.DERSequence({'array': [this.asn1CSRInfo,
|
||
|
this.asn1SignatureAlg,
|
||
|
this.asn1Sig]});
|
||
|
this.hTLV = seq.getEncodedHex();
|
||
|
this.isModified = false;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* get PEM formatted certificate signing request (CSR/PKCS#10)
|
||
|
* @name getPEMString
|
||
|
* @memberOf KJUR.asn1.csr.CertificationRequest
|
||
|
* @function
|
||
|
* @return PEM formatted string of CSR/PKCS#10
|
||
|
* @description
|
||
|
* This method is to a get CSR PEM string after signed.
|
||
|
* <br/>
|
||
|
* @example
|
||
|
* csr = new KJUR.asn1.csr.CertificationRequest({'csrinfo': csri});
|
||
|
* csr.sign();
|
||
|
* pem = csr.getPEMString();
|
||
|
* // pem will be following:
|
||
|
* // -----BEGIN CERTIFICATE REQUEST-----
|
||
|
* // MII ...snip...
|
||
|
* // -----END CERTIFICATE REQUEST-----
|
||
|
*/
|
||
|
this.getPEMString = function() {
|
||
|
var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex(this.getEncodedHex(),
|
||
|
"CERTIFICATE REQUEST");
|
||
|
return pem;
|
||
|
};
|
||
|
|
||
|
this.getEncodedHex = function() {
|
||
|
if (this.isModified == false && this.hTLV != null) return this.hTLV;
|
||
|
throw "not signed yet";
|
||
|
};
|
||
|
|
||
|
if (typeof params != "undefined") {
|
||
|
if (typeof params['csrinfo'] != "undefined") {
|
||
|
this.asn1CSRInfo = params['csrinfo'];
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
YAHOO.lang.extend(KJUR.asn1.csr.CertificationRequest, KJUR.asn1.ASN1Object);
|
||
|
|
||
|
/**
|
||
|
* ASN.1 CertificationRequestInfo structure class
|
||
|
* @name KJUR.asn1.csr.CertificationRequestInfo
|
||
|
* @class ASN.1 CertificationRequestInfo structure class
|
||
|
* @param {Array} params associative array of parameters (ex. {})
|
||
|
* @extends KJUR.asn1.ASN1Object
|
||
|
* @since jsrsasign 4.8.7 asn1csr 1.0.0
|
||
|
* @description
|
||
|
* <br/>
|
||
|
* @example
|
||
|
* csri = new KJUR.asn1.csr.CertificationRequestInfo();
|
||
|
* csri.setSubjectByParam({'str': '/C=US/O=Test/CN=example.com'});
|
||
|
* csri.setSubjectPublicKeyByGetKey(pubKeyObj);
|
||
|
*
|
||
|
* // -- DEFINITION OF ASN.1 SYNTAX --
|
||
|
* // CertificationRequestInfo ::= SEQUENCE {
|
||
|
* // version INTEGER { v1(0) } (v1,...),
|
||
|
* // subject Name,
|
||
|
* // subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
|
||
|
* // attributes [0] Attributes{{ CRIAttributes }} }
|
||
|
*
|
||
|
*/
|
||
|
KJUR.asn1.csr.CertificationRequestInfo = function(params) {
|
||
|
KJUR.asn1.csr.CertificationRequestInfo.superclass.constructor.call(this);
|
||
|
|
||
|
this._initialize = function() {
|
||
|
this.asn1Array = new Array();
|
||
|
|
||
|
this.asn1Version = new KJUR.asn1.DERInteger({'int': 0});
|
||
|
this.asn1Subject = null;
|
||
|
this.asn1SubjPKey = null;
|
||
|
this.extensionsArray = new Array();
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* set subject name field by parameter
|
||
|
* @name setSubjectByParam
|
||
|
* @memberOf KJUR.asn1.csr.CertificationRequestInfo
|
||
|
* @function
|
||
|
* @param {Array} x500NameParam X500Name parameter
|
||
|
* @description
|
||
|
* @example
|
||
|
* csri.setSubjectByParam({'str': '/C=US/CN=b'});
|
||
|
* @see KJUR.asn1.x509.X500Name
|
||
|
*/
|
||
|
this.setSubjectByParam = function(x500NameParam) {
|
||
|
this.asn1Subject = new KJUR.asn1.x509.X500Name(x500NameParam);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* set subject public key info by RSA/ECDSA/DSA key parameter
|
||
|
* @name setSubjectPublicKeyByGetKey
|
||
|
* @memberOf KJUR.asn1.csr.CertificationRequestInfo
|
||
|
* @function
|
||
|
* @param {Object} keyParam public key parameter which passed to {@link KEYUTIL.getKey} argument
|
||
|
* @description
|
||
|
* @example
|
||
|
* csri.setSubjectPublicKeyByGetKeyParam(certPEMString); // or
|
||
|
* csri.setSubjectPublicKeyByGetKeyParam(pkcs8PublicKeyPEMString); // or
|
||
|
* csir.setSubjectPublicKeyByGetKeyParam(kjurCryptoECDSAKeyObject); // et.al.
|
||
|
* @see KJUR.asn1.x509.SubjectPublicKeyInfo
|
||
|
* @see KEYUTIL.getKey
|
||
|
*/
|
||
|
this.setSubjectPublicKeyByGetKey = function(keyParam) {
|
||
|
var keyObj = KEYUTIL.getKey(keyParam);
|
||
|
this.asn1SubjPKey = new KJUR.asn1.x509.SubjectPublicKeyInfo(keyObj);
|
||
|
};
|
||
|
|
||
|
this.getEncodedHex = function() {
|
||
|
this.asn1Array = new Array();
|
||
|
|
||
|
this.asn1Array.push(this.asn1Version);
|
||
|
this.asn1Array.push(this.asn1Subject);
|
||
|
this.asn1Array.push(this.asn1SubjPKey);
|
||
|
|
||
|
var extSeq = new KJUR.asn1.DERSequence({"array": this.extensionsArray});
|
||
|
var extTagObj = new KJUR.asn1.DERTaggedObject({'explicit': false,
|
||
|
'tag': 'a0',
|
||
|
'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.csr.CertificationRequestInfo, KJUR.asn1.ASN1Object);
|
||
|
|
||
|
/**
|
||
|
* Certification Request (CSR/PKCS#10) utilities class
|
||
|
* @name KJUR.asn1.csr.CSRUtil
|
||
|
* @class Certification Request (CSR/PKCS#10) utilities class
|
||
|
*/
|
||
|
KJUR.asn1.csr.CSRUtil = new function() {
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* generate a PEM format of CSR/PKCS#10 certificate signing request
|
||
|
* @name newCSRPEM
|
||
|
* @memberOf KJUR.asn1.csr.CSRUtil
|
||
|
* @function
|
||
|
* @param {Array} param parameter to generate CSR
|
||
|
* @since jsrsasign 4.8.7 asn1csr 1.0.0
|
||
|
* @description
|
||
|
* This method can generate a CSR certificate signing
|
||
|
* request by a simple JSON object which has following parameters:
|
||
|
* <ul>
|
||
|
* <li>subject - parameter to be passed to {@link KJUR.asn1.x509.X500Name}</li>
|
||
|
* <li>sbjpubkey - parameter to be passed to {@link KEYUTIL.getKey}</li>
|
||
|
* <li>sigalg - signature algorithm name (ex. SHA256withRSA)</li>
|
||
|
* <li>sbjprvkey - parameter to be passed to {@link KEYUTIL.getKey}</li>
|
||
|
* </ul>
|
||
|
*
|
||
|
* @example
|
||
|
* // 1) by key object
|
||
|
* pem = KJUR.asn1.csr.CSRUtil.newCSRPEM({
|
||
|
* subject: {str: '/C=US/O=Test/CN=example.com'},
|
||
|
* sbjpubkey: pubKeyObj,
|
||
|
* sigalg: "SHA256withRSA",
|
||
|
* sbjprvkey: prvKeyObj
|
||
|
* });
|
||
|
*
|
||
|
* // 2) by private/public key PEM
|
||
|
* pem = KJUR.asn1.csr.CSRUtil.newCSRPEM({
|
||
|
* subject: {str: '/C=US/O=Test/CN=example.com'},
|
||
|
* sbjpubkey: pubKeyPEM,
|
||
|
* sigalg: "SHA256withRSA",
|
||
|
* sbjprvkey: prvKeyPEM
|
||
|
* });
|
||
|
*
|
||
|
* // 3) with generateKeypair
|
||
|
* kp = KEYUTIL.generateKeypair("RSA", 2048);
|
||
|
* pem = KJUR.asn1.csr.CSRUtil.newCSRPEM({
|
||
|
* subject: {str: '/C=US/O=Test/CN=example.com'},
|
||
|
* sbjpubkey: kp.pubKeyObj,
|
||
|
* sigalg: "SHA256withRSA",
|
||
|
* sbjprvkey: kp.prvKeyObj
|
||
|
* });
|
||
|
*/
|
||
|
KJUR.asn1.csr.CSRUtil.newCSRPEM = function(param) {
|
||
|
var ns1 = KJUR.asn1.csr;
|
||
|
|
||
|
if (param.subject === undefined) throw "parameter subject undefined";
|
||
|
if (param.sbjpubkey === undefined) throw "parameter sbjpubkey undefined";
|
||
|
if (param.sigalg === undefined) throw "parameter sigalg undefined";
|
||
|
if (param.sbjprvkey === undefined) throw "parameter sbjpubkey undefined";
|
||
|
|
||
|
var csri = new ns1.CertificationRequestInfo();
|
||
|
csri.setSubjectByParam(param.subject);
|
||
|
csri.setSubjectPublicKeyByGetKey(param.sbjpubkey);
|
||
|
|
||
|
var csr = new ns1.CertificationRequest({'csrinfo': csri});
|
||
|
var prvKey = KEYUTIL.getKey(param.sbjprvkey);
|
||
|
csr.sign(param.sigalg, prvKey);
|
||
|
|
||
|
var pem = csr.getPEMString();
|
||
|
return pem;
|
||
|
};
|
||
|
|