/*! asn1cms-1.0.2.js (c) 2013-2014 Kenji Urushima | kjur.github.com/jsrsasign/license */ /* * asn1cms.js - ASN.1 DER encoder classes for Cryptographic Message Syntax(CMS) * * Copyright (c) 2014 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 asn1cms-1.0.js * @author Kenji Urushima kenji.urushima@gmail.com * @version 1.0.2 (2014-Jun-07) * @since jsrsasign 4.2.4 * @license MIT License */ /** * 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 Cryptographic Message Syntax(CMS) *
* This name space provides * RFC 5652 * Cryptographic Message Syntax (CMS) SignedData generator. * *
* Attributes ::= SET OF Attribute * Attribute ::= SEQUENCE { * type OBJECT IDENTIFIER, * values AttributeSetValue } * AttributeSetValue ::= SET OF ANY **/ KJUR.asn1.cms.Attribute = function(params) { KJUR.asn1.cms.Attribute.superclass.constructor.call(this); var valueList = []; // array of values this.getEncodedHex = function() { var attrTypeASN1, attrValueASN1, seq; attrTypeASN1 = new KJUR.asn1.DERObjectIdentifier({"oid": this.attrTypeOid}); attrValueASN1 = new KJUR.asn1.DERSet({"array": this.valueList}); try { attrValueASN1.getEncodedHex(); } catch (ex) { throw "fail valueSet.getEncodedHex in Attribute(1)/" + ex; } seq = new KJUR.asn1.DERSequence({"array": [attrTypeASN1, attrValueASN1]}); try { this.hTLV = seq.getEncodedHex(); } catch (ex) { throw "failed seq.getEncodedHex in Attribute(2)/" + ex; } return this.hTLV; }; }; YAHOO.lang.extend(KJUR.asn1.cms.Attribute, KJUR.asn1.ASN1Object); /** * class for CMS ContentType attribute * @name KJUR.asn1.cms.ContentType * @class class for CMS ContentType attribute * @param {Array} params associative array of parameters * @extends KJUR.asn1.cms.Attribute * @since jsrsasign 4.2.4 asn1cms 1.0.0 * @description *
* Attribute ::= SEQUENCE { * type OBJECT IDENTIFIER, * values AttributeSetValue } * AttributeSetValue ::= SET OF ANY * ContentType ::= OBJECT IDENTIFIER ** @example * o = new KJUR.asn1.cms.ContentType({name: 'data'}); * o = new KJUR.asn1.cms.ContentType({oid: '1.2.840.113549.1.9.16.1.4'}); */ KJUR.asn1.cms.ContentType = function(params) { KJUR.asn1.cms.ContentType.superclass.constructor.call(this); this.attrTypeOid = "1.2.840.113549.1.9.3"; var contentTypeASN1 = null; if (typeof params != "undefined") { var contentTypeASN1 = new KJUR.asn1.DERObjectIdentifier(params); this.valueList = [contentTypeASN1]; } }; YAHOO.lang.extend(KJUR.asn1.cms.ContentType, KJUR.asn1.cms.Attribute); /** * class for CMS MessageDigest attribute * @name KJUR.asn1.cms.MessageDigest * @class class for CMS MessageDigest attribute * @param {Array} params associative array of parameters * @extends KJUR.asn1.cms.Attribute * @since jsrsasign 4.2.4 asn1cms 1.0.0 * @description *
* Attribute ::= SEQUENCE { * type OBJECT IDENTIFIER, * values AttributeSetValue } * AttributeSetValue ::= SET OF ANY * MessageDigest ::= OCTET STRING ** @example * o = new KJUR.asn1.cms.MessageDigest({hex: 'a1a2a3a4...'}); */ KJUR.asn1.cms.MessageDigest = function(params) { KJUR.asn1.cms.MessageDigest.superclass.constructor.call(this); this.attrTypeOid = "1.2.840.113549.1.9.4"; if (typeof params != "undefined") { if (params.eciObj instanceof KJUR.asn1.cms.EncapsulatedContentInfo && typeof params.hashAlg == "string") { var dataHex = params.eciObj.eContentValueHex; var hashAlg = params.hashAlg; var hashValueHex = KJUR.crypto.Util.hashHex(dataHex, hashAlg); var dAttrValue1 = new KJUR.asn1.DEROctetString({hex: hashValueHex}); dAttrValue1.getEncodedHex(); this.valueList = [dAttrValue1]; } else { var dAttrValue1 = new KJUR.asn1.DEROctetString(params); dAttrValue1.getEncodedHex(); this.valueList = [dAttrValue1]; } } }; YAHOO.lang.extend(KJUR.asn1.cms.MessageDigest, KJUR.asn1.cms.Attribute); /** * class for CMS SigningTime attribute * @name KJUR.asn1.cms.SigningTime * @class class for CMS SigningTime attribute * @param {Array} params associative array of parameters * @extends KJUR.asn1.cms.Attribute * @since jsrsasign 4.2.4 asn1cms 1.0.0 * @description *
* Attribute ::= SEQUENCE { * type OBJECT IDENTIFIER, * values AttributeSetValue } * AttributeSetValue ::= SET OF ANY * SigningTime ::= Time * Time ::= CHOICE { * utcTime UTCTime, * generalTime GeneralizedTime } ** @example * o = new KJUR.asn1.cms.SigningTime(); // current time UTCTime by default * o = new KJUR.asn1.cms.SigningTime({type: 'gen'}); // current time GeneralizedTime * o = new KJUR.asn1.cms.SigningTime({str: '20140517093800Z'}); // specified GeneralizedTime * o = new KJUR.asn1.cms.SigningTime({str: '140517093800Z'}); // specified UTCTime */ KJUR.asn1.cms.SigningTime = function(params) { KJUR.asn1.cms.SigningTime.superclass.constructor.call(this); this.attrTypeOid = "1.2.840.113549.1.9.5"; if (typeof params != "undefined") { var asn1 = new KJUR.asn1.x509.Time(params); try { asn1.getEncodedHex(); } catch (ex) { throw "SigningTime.getEncodedHex() failed/" + ex; } this.valueList = [asn1]; } }; YAHOO.lang.extend(KJUR.asn1.cms.SigningTime, KJUR.asn1.cms.Attribute); /** * class for CMS SigningCertificate attribute * @name KJUR.asn1.cms.SigningCertificate * @class class for CMS SigningCertificate attribute * @param {Array} params associative array of parameters * @extends KJUR.asn1.cms.Attribute * @since jsrsasign 4.5.1 asn1cms 1.0.1 * @description *
* Attribute ::= SEQUENCE { * type OBJECT IDENTIFIER, * values AttributeSetValue } * AttributeSetValue ::= SET OF ANY * SigningCertificate ::= SEQUENCE { * certs SEQUENCE OF ESSCertID, * policies SEQUENCE OF PolicyInformation OPTIONAL } * ESSCertID ::= SEQUENCE { * certHash Hash, * issuerSerial IssuerSerial OPTIONAL } * IssuerSerial ::= SEQUENCE { * issuer GeneralNames, * serialNumber CertificateSerialNumber } ** @example * o = new KJUR.asn1.cms.SigningCertificate({array: [certPEM]}); */ KJUR.asn1.cms.SigningCertificate = function(params) { KJUR.asn1.cms.SigningCertificate.superclass.constructor.call(this); this.attrTypeOid = "1.2.840.113549.1.9.16.2.12"; var nA = KJUR.asn1; var nC = KJUR.asn1.cms; var nY = KJUR.crypto; this.setCerts = function(listPEM) { var list = []; for (var i = 0; i < listPEM.length; i++) { var hex = KEYUTIL.getHexFromPEM(listPEM[i]); var certHashHex = nY.Util.hashHex(hex, 'sha1'); var dCertHash = new nA.DEROctetString({hex: certHashHex}); dCertHash.getEncodedHex(); var dIssuerSerial = new nC.IssuerAndSerialNumber({cert: listPEM[i]}); dIssuerSerial.getEncodedHex(); var dESSCertID = new nA.DERSequence({array: [dCertHash, dIssuerSerial]}); dESSCertID.getEncodedHex(); list.push(dESSCertID); } var dValue = new nA.DERSequence({array: list}); dValue.getEncodedHex(); this.valueList = [dValue]; }; if (typeof params != "undefined") { if (typeof params.array == "object") { this.setCerts(params.array); } } }; YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificate, KJUR.asn1.cms.Attribute); /** * class for CMS SigningCertificateV2 attribute * @name KJUR.asn1.cms.SigningCertificateV2 * @class class for CMS SigningCertificateV2 attribute * @param {Array} params associative array of parameters * @extends KJUR.asn1.cms.Attribute * @since jsrsasign 4.5.1 asn1cms 1.0.1 * @description *
* oid-signingCertificateV2 = 1.2.840.113549.1.9.16.2.47 * Attribute ::= SEQUENCE { * type OBJECT IDENTIFIER, * values AttributeSetValue } * AttributeSetValue ::= SET OF ANY * SigningCertificateV2 ::= SEQUENCE { * certs SEQUENCE OF ESSCertIDv2, * policies SEQUENCE OF PolicyInformation OPTIONAL } * ESSCertIDv2 ::= SEQUENCE { * hashAlgorithm AlgorithmIdentifier * DEFAULT {algorithm id-sha256}, * certHash Hash, * issuerSerial IssuerSerial OPTIONAL } * Hash ::= OCTET STRING * IssuerSerial ::= SEQUENCE { * issuer GeneralNames, * serialNumber CertificateSerialNumber } ** @example * // hash algorithm is sha256 by default: * o = new KJUR.asn1.cms.SigningCertificateV2({array: [certPEM]}); * o = new KJUR.asn1.cms.SigningCertificateV2({array: [certPEM], * hashAlg: 'sha512'}); */ KJUR.asn1.cms.SigningCertificateV2 = function(params) { KJUR.asn1.cms.SigningCertificateV2.superclass.constructor.call(this); this.attrTypeOid = "1.2.840.113549.1.9.16.2.47"; var nA = KJUR.asn1; var nX = KJUR.asn1.x509; var nC = KJUR.asn1.cms; var nY = KJUR.crypto; this.setCerts = function(listPEM, hashAlg) { var list = []; for (var i = 0; i < listPEM.length; i++) { var hex = KEYUTIL.getHexFromPEM(listPEM[i]); var a = []; if (hashAlg != "sha256") a.push(new nX.AlgorithmIdentifier({name: hashAlg})); var certHashHex = nY.Util.hashHex(hex, hashAlg); var dCertHash = new nA.DEROctetString({hex: certHashHex}); dCertHash.getEncodedHex(); a.push(dCertHash); var dIssuerSerial = new nC.IssuerAndSerialNumber({cert: listPEM[i]}); dIssuerSerial.getEncodedHex(); a.push(dIssuerSerial); var dESSCertIDv2 = new nA.DERSequence({array: a}); dESSCertIDv2.getEncodedHex(); list.push(dESSCertIDv2); } var dValue = new nA.DERSequence({array: list}); dValue.getEncodedHex(); this.valueList = [dValue]; }; if (typeof params != "undefined") { if (typeof params.array == "object") { var hashAlg = "sha256"; // sha2 default if (typeof params.hashAlg == "string") hashAlg = params.hashAlg; this.setCerts(params.array, hashAlg); } } }; YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificateV2, KJUR.asn1.cms.Attribute); /** * class for IssuerAndSerialNumber ASN.1 structure for CMS * @name KJUR.asn1.cms.IssuerAndSerialNumber * @class class for CMS IssuerAndSerialNumber ASN.1 structure for CMS * @param {Array} params associative array of parameters * @extends KJUR.asn1.ASN1Object * @since jsrsasign 4.2.4 asn1cms 1.0.0 * @description *
* IssuerAndSerialNumber ::= SEQUENCE { * issuer Name, * serialNumber CertificateSerialNumber } * CertificateSerialNumber ::= INTEGER ** @example * // specify by X500Name and DERInteger * o = new KJUR.asn1.cms.IssuerAndSerialNumber( * {issuer: {str: '/C=US/O=T1'}, serial {int: 3}}); * // specify by PEM certificate * o = new KJUR.asn1.cms.IssuerAndSerialNumber({cert: certPEM}); * o = new KJUR.asn1.cms.IssuerAndSerialNumber(certPEM); // since 1.0.3 */ KJUR.asn1.cms.IssuerAndSerialNumber = function(params) { KJUR.asn1.cms.IssuerAndSerialNumber.superclass.constructor.call(this); var dIssuer = null; var dSerial = null; var nA = KJUR.asn1; var nX = nA.x509; /* * @since asn1cms 1.0.1 */ this.setByCertPEM = function(certPEM) { var certHex = KEYUTIL.getHexFromPEM(certPEM); var x = new X509(); x.hex = certHex; var issuerTLVHex = x.getIssuerHex(); this.dIssuer = new nX.X500Name(); this.dIssuer.hTLV = issuerTLVHex; var serialVHex = x.getSerialNumberHex(); this.dSerial = new nA.DERInteger({hex: serialVHex}); }; this.getEncodedHex = function() { var seq = new KJUR.asn1.DERSequence({"array": [this.dIssuer, this.dSerial]}); this.hTLV = seq.getEncodedHex(); return this.hTLV; }; if (typeof params != "undefined") { if (typeof params == "string" && params.indexOf("-----BEGIN ") != -1) { this.setByCertPEM(params); } if (params.issuer && params.serial) { if (params.issuer instanceof KJUR.asn1.x509.X500Name) { this.dIssuer = params.issuer; } else { this.dIssuer = new KJUR.asn1.x509.X500Name(params.issuer); } if (params.serial instanceof KJUR.asn1.DERInteger) { this.dSerial = params.serial; } else { this.dSerial = new KJUR.asn1.DERInteger(params.serial); } } if (typeof params.cert == "string") { this.setByCertPEM(params.cert); } } }; YAHOO.lang.extend(KJUR.asn1.cms.IssuerAndSerialNumber, KJUR.asn1.ASN1Object); /** * class for Attributes ASN.1 structure for CMS * @name KJUR.asn1.cms.AttributeList * @class class for Attributes ASN.1 structure for CMS * @param {Array} params associative array of parameters * @extends KJUR.asn1.ASN1Object * @since jsrsasign 4.2.4 asn1cms 1.0.0 * @description *
* Attributes ::= SET OF Attribute * Attribute ::= SEQUENCE { * type OBJECT IDENTIFIER, * values AttributeSetValue } ** @example * // specify by X500Name and DERInteger * o = new KJUR.asn1.cms.AttributeList({sorted: false}); // ASN.1 BER unsorted SET OF * o = new KJUR.asn1.cms.AttributeList(); // ASN.1 DER sorted by default * o.clear(); // clear list of Attributes * n = o.length(); // get number of Attribute * o.add(new KJUR.asn1.cms.SigningTime()); // add SigningTime attribute * hex = o.getEncodedHex(); // get hex encoded ASN.1 data */ KJUR.asn1.cms.AttributeList = function(params) { KJUR.asn1.cms.AttributeList.superclass.constructor.call(this); this.list = new Array(); this.sortFlag = true; this.add = function(item) { if (item instanceof KJUR.asn1.cms.Attribute) { this.list.push(item); } }; this.length = function() { return this.list.length; }; this.clear = function() { this.list = new Array(); this.hTLV = null; this.hV = null; }; this.getEncodedHex = function() { if (typeof this.hTLV == "string") return this.hTLV; var set = new KJUR.asn1.DERSet({array: this.list, sortflag: this.sortFlag}); this.hTLV = set.getEncodedHex(); return this.hTLV; }; if (typeof params != "undefined") { if (typeof params.sortflag != "undefined" && params.sortflag == false) this.sortFlag = false; } }; YAHOO.lang.extend(KJUR.asn1.cms.AttributeList, KJUR.asn1.ASN1Object); /** * class for SignerInfo ASN.1 structure of CMS SignedData * @name KJUR.asn1.cms.SignerInfo * @class class for Attributes ASN.1 structure of CMS SigndData * @param {Array} params associative array of parameters * @extends KJUR.asn1.ASN1Object * @since jsrsasign 4.2.4 asn1cms 1.0.0 * @description *
* SignerInfo ::= SEQUENCE { * version CMSVersion, * sid SignerIdentifier, * digestAlgorithm DigestAlgorithmIdentifier, * signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL, * signatureAlgorithm SignatureAlgorithmIdentifier, * signature SignatureValue, * unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL } ** @example * o = new KJUR.asn1.cms.SignerInfo(); * o.setSignerIdentifier(certPEMstring); * o.dSignedAttrs.add(new KJUR.asn1.cms.ContentType({name: 'data'})); * o.dSignedAttrs.add(new KJUR.asn1.cms.MessageDigest({hex: 'a1b2...'})); * o.dSignedAttrs.add(new KJUR.asn1.cms.SigningTime()); * o.sign(privteKeyParam, "SHA1withRSA"); */ KJUR.asn1.cms.SignerInfo = function(params) { KJUR.asn1.cms.SignerInfo.superclass.constructor.call(this); var nA = KJUR.asn1; var nC = KJUR.asn1.cms; var nX = KJUR.asn1.x509; this.dCMSVersion = new nA.DERInteger({'int': 1}); this.dSignerIdentifier = null; this.dDigestAlgorithm = null; this.dSignedAttrs = new nC.AttributeList(); this.dSigAlg = null; this.dSig = null; this.dUnsignedAttrs = new nC.AttributeList(); this.setSignerIdentifier = function(params) { if (typeof params == "string" && params.indexOf("CERTIFICATE") != -1 && params.indexOf("BEGIN") != -1 && params.indexOf("END") != -1) { var certPEM = params; this.dSignerIdentifier = new nC.IssuerAndSerialNumber({cert: params}); } }; /** * set ContentType/MessageDigest/DigestAlgorithms for SignerInfo/SignedData * @name setForContentAndHash * @memberOf KJUR.asn1.cms.SignerInfo * @param {Array} params JSON parameter to set content related field * @description * This method will specify following fields by a parameters: *
* EncapsulatedContentInfo ::= SEQUENCE { * eContentType ContentType, * eContent [0] EXPLICIT OCTET STRING OPTIONAL } * ContentType ::= OBJECT IDENTIFIER ** @example * o = new KJUR.asn1.cms.EncapsulatedContentInfo(); * o.setContentType('1.2.3.4.5'); // specify eContentType by OID * o.setContentType('data'); // specify eContentType by name * o.setContentValueHex('a1a2a4...'); // specify eContent data by hex string * o.setContentValueStr('apple'); // specify eContent data by UTF-8 string * // for detached contents (i.e. data not concluded in eContent) * o.isDetached = true; // false as default */ KJUR.asn1.cms.EncapsulatedContentInfo = function(params) { KJUR.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this); var nA = KJUR.asn1; var nC = KJUR.asn1.cms; var nX = KJUR.asn1.x509; this.dEContentType = new nA.DERObjectIdentifier({name: 'data'}); this.dEContent = null; this.isDetached = false; this.eContentValueHex = null; this.setContentType = function(nameOrOid) { if (nameOrOid.match(/^[0-2][.][0-9.]+$/)) { this.dEContentType = new nA.DERObjectIdentifier({oid: nameOrOid}); } else { this.dEContentType = new nA.DERObjectIdentifier({name: nameOrOid}); } }; this.setContentValue = function(params) { if (typeof params != "undefined") { if (typeof params.hex == "string") { this.eContentValueHex = params.hex; } else if (typeof params.str == "string") { this.eContentValueHex = utf8tohex(params.str); } } }; this.setContentValueHex = function(valueHex) { this.eContentValueHex = valueHex; }; this.setContentValueStr = function(valueStr) { this.eContentValueHex = utf8tohex(valueStr); }; this.getEncodedHex = function() { if (typeof this.eContentValueHex != "string") { throw "eContentValue not yet set"; } var dValue = new nA.DEROctetString({hex: this.eContentValueHex}); this.dEContent = new nA.DERTaggedObject({obj: dValue, tag: 'a0', explicit: true}); var a = [this.dEContentType]; if (! this.isDetached) a.push(this.dEContent); var seq = new nA.DERSequence({array: a}); this.hTLV = seq.getEncodedHex(); return this.hTLV; }; }; YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo, KJUR.asn1.ASN1Object); // - type // - obj /** * class for ContentInfo ASN.1 structure for CMS * @name KJUR.asn1.cms.ContentInfo * @class class for ContentInfo ASN.1 structure for CMS * @param {Array} params associative array of parameters * @extends KJUR.asn1.ASN1Object * @since jsrsasign 4.2.4 asn1cms 1.0.0 * @description *
* ContentInfo ::= SEQUENCE { * contentType ContentType, * content [0] EXPLICIT ANY DEFINED BY contentType } * ContentType ::= OBJECT IDENTIFIER ** @example * a = [new KJUR.asn1.DERInteger({int: 1}), * new KJUR.asn1.DERInteger({int: 2})]; * seq = new KJUR.asn1.DERSequence({array: a}); * o = new KJUR.asn1.cms.ContentInfo({type: 'data', obj: seq}); */ KJUR.asn1.cms.ContentInfo = function(params) { KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this); var nA = KJUR.asn1; var nC = KJUR.asn1.cms; var nX = KJUR.asn1.x509; this.dContentType = null; this.dContent = null; this.setContentType = function(params) { if (typeof params == "string") { this.dContentType = nX.OID.name2obj(params); } }; this.getEncodedHex = function() { var dContent0 = new nA.DERTaggedObject({obj: this.dContent, tag: 'a0', explicit: true}); var seq = new nA.DERSequence({array: [this.dContentType, dContent0]}); this.hTLV = seq.getEncodedHex(); return this.hTLV; }; if (typeof params != "undefined") { if (params.type) this.setContentType(params.type); if (params.obj && params.obj instanceof nA.ASN1Object) this.dContent = params.obj; } }; YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo, KJUR.asn1.ASN1Object); /** * class for SignerInfo ASN.1 structure of CMS SignedData * @name KJUR.asn1.cms.SignedData * @class class for Attributes ASN.1 structure of CMS SigndData * @param {Array} params associative array of parameters * @extends KJUR.asn1.ASN1Object * @since jsrsasign 4.2.4 asn1cms 1.0.0 * * @description *
* SignedData ::= SEQUENCE { * version CMSVersion, * digestAlgorithms DigestAlgorithmIdentifiers, * encapContentInfo EncapsulatedContentInfo, * certificates [0] IMPLICIT CertificateSet OPTIONAL, * crls [1] IMPLICIT RevocationInfoChoices OPTIONAL, * signerInfos SignerInfos } * SignerInfos ::= SET OF SignerInfo * CertificateSet ::= SET OF CertificateChoices * DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier * CertificateSet ::= SET OF CertificateChoices * RevocationInfoChoices ::= SET OF RevocationInfoChoice ** * @example * sd = new KJUR.asn1.cms.SignedData(); * sd.dEncapContentInfo.setContentValueStr("test string"); * sd.signerInfoList[0].setForContentAndHash({sdObj: sd, * eciObj: sd.dEncapContentInfo, * hashAlg: 'sha256'}); * sd.signerInfoList[0].dSignedAttrs.add(new KJUR.asn1.cms.SigningTime()); * sd.signerInfoList[0].setSignerIdentifier(certPEM); * sd.signerInfoList[0].sign(prvP8PEM, "SHA256withRSA"); * hex = sd.getContentInfoEncodedHex(); */ KJUR.asn1.cms.SignedData = function(params) { KJUR.asn1.cms.SignedData.superclass.constructor.call(this); var nA = KJUR.asn1; var nC = KJUR.asn1.cms; var nX = KJUR.asn1.x509; this.dCMSVersion = new nA.DERInteger({'int': 1}); this.dDigestAlgs = null; this.digestAlgNameList = []; this.dEncapContentInfo = new nC.EncapsulatedContentInfo(); this.dCerts = null; this.certificateList = []; this.crlList = []; this.signerInfoList = [new nC.SignerInfo()]; this.addCertificatesByPEM = function(certPEM) { var hex = KEYUTIL.getHexFromPEM(certPEM); var o = new nA.ASN1Object(); o.hTLV = hex; this.certificateList.push(o); }; this.getEncodedHex = function() { if (typeof this.hTLV == "string") return this.hTLV; if (this.dDigestAlgs == null) { var digestAlgList = []; for (var i = 0; i < this.digestAlgNameList.length; i++) { var name = this.digestAlgNameList[i]; var o = new nX.AlgorithmIdentifier({name: name}); digestAlgList.push(o); } this.dDigestAlgs = new nA.DERSet({array: digestAlgList}); } var a = [this.dCMSVersion, this.dDigestAlgs, this.dEncapContentInfo]; if (this.dCerts == null) { if (this.certificateList.length > 0) { var o1 = new nA.DERSet({array: this.certificateList}); this.dCerts = new nA.DERTaggedObject({obj: o1, tag: 'a0', explicit: false}); } } if (this.dCerts != null) a.push(this.dCerts); var dSignerInfos = new nA.DERSet({array: this.signerInfoList}); a.push(dSignerInfos); var seq = new nA.DERSequence({array: a}); this.hTLV = seq.getEncodedHex(); return this.hTLV; }; this.getContentInfo = function() { this.getEncodedHex(); var ci = new nC.ContentInfo({type: 'signed-data', obj: this}); return ci; }; this.getContentInfoEncodedHex = function() { var ci = this.getContentInfo(); var ciHex = ci.getEncodedHex(); return ciHex; }; this.getPEM = function() { var hex = this.getContentInfoEncodedHex(); var pem = nA.ASN1Util.getPEMStringFromHex(hex, "CMS"); return pem; }; }; YAHOO.lang.extend(KJUR.asn1.cms.SignedData, KJUR.asn1.ASN1Object); /** * CMS utiliteis class * @name KJUR.asn1.cms.CMSUtil * @class CMS utilities class */ KJUR.asn1.cms.CMSUtil = new function() { }; /** * generate SignedData object specified by JSON parameters * @name newSignedData * @memberOf KJUR.asn1.cms.CMSUtil * @function * @param {Array} param JSON parameter to generate CMS SignedData * @return {KJUR.asn1.cms.SignedData} object just generated * @description * This method provides more easy way to genereate * CMS SignedData ASN.1 structure by JSON data. * @example * var sd = KJUR.asn1.cms.CMSUtil.newSignedData({ * content: {str: "jsrsasign"}, * certs: [certPEM], * signerInfos: [{ * hashAlg: 'sha256', * sAttr: { * SigningTime: {} * SigningCertificateV2: {array: [certPEM]}, * }, * signerCert: certPEM, * sigAlg: 'SHA256withRSA', * signerPrvKey: prvPEM * }] * }); */ KJUR.asn1.cms.CMSUtil.newSignedData = function(param) { var nC = KJUR.asn1.cms; var nE = KJUR.asn1.cades; var sd = new nC.SignedData(); sd.dEncapContentInfo.setContentValue(param.content); if (typeof param.certs == "object") { for (var i = 0; i < param.certs.length; i++) { sd.addCertificatesByPEM(param.certs[i]); } } sd.signerInfoList = []; for (var i = 0; i < param.signerInfos.length; i++) { var siParam = param.signerInfos[i]; var si = new nC.SignerInfo(); si.setSignerIdentifier(siParam.signerCert); si.setForContentAndHash({sdObj: sd, eciObj: sd.dEncapContentInfo, hashAlg: siParam.hashAlg}); for (attrName in siParam.sAttr) { var attrParam = siParam.sAttr[attrName]; if (attrName == "SigningTime") { var attr = new nC.SigningTime(attrParam); si.dSignedAttrs.add(attr); } if (attrName == "SigningCertificate") { var attr = new nC.SigningCertificate(attrParam); si.dSignedAttrs.add(attr); } if (attrName == "SigningCertificateV2") { var attr = new nC.SigningCertificateV2(attrParam); si.dSignedAttrs.add(attr); } if (attrName == "SignaturePolicyIdentifier") { var attr = new nE.SignaturePolicyIdentifier(attrParam); si.dSignedAttrs.add(attr); } } si.sign(siParam.signerPrvKey, siParam.sigAlg); sd.signerInfoList.push(si); } return sd; };