summaryrefslogtreecommitdiff
path: root/node_modules/node-forge/lib/pkcs7asn1.js
diff options
context:
space:
mode:
authorakiyamn2023-09-24 23:22:21 +1000
committerakiyamn2023-09-24 23:22:21 +1000
commit4e87195739f2a5d9a05451b48773c8afdc680765 (patch)
tree9cba501844a4a11dcbdffc4050ed8189561c55ed /node_modules/node-forge/lib/pkcs7asn1.js
downloadprice-tracker-worker-4e87195739f2a5d9a05451b48773c8afdc680765.tar.gz
price-tracker-worker-4e87195739f2a5d9a05451b48773c8afdc680765.zip
Initial commit (by create-cloudflare CLI)
Diffstat (limited to 'node_modules/node-forge/lib/pkcs7asn1.js')
-rw-r--r--node_modules/node-forge/lib/pkcs7asn1.js410
1 files changed, 410 insertions, 0 deletions
diff --git a/node_modules/node-forge/lib/pkcs7asn1.js b/node_modules/node-forge/lib/pkcs7asn1.js
new file mode 100644
index 0000000..0e13c89
--- /dev/null
+++ b/node_modules/node-forge/lib/pkcs7asn1.js
@@ -0,0 +1,410 @@
+/**
+ * Javascript implementation of ASN.1 validators for PKCS#7 v1.5.
+ *
+ * @author Dave Longley
+ * @author Stefan Siegl
+ *
+ * Copyright (c) 2012-2015 Digital Bazaar, Inc.
+ * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>
+ *
+ * The ASN.1 representation of PKCS#7 is as follows
+ * (see RFC #2315 for details, http://www.ietf.org/rfc/rfc2315.txt):
+ *
+ * A PKCS#7 message consists of a ContentInfo on root level, which may
+ * contain any number of further ContentInfo nested into it.
+ *
+ * ContentInfo ::= SEQUENCE {
+ * contentType ContentType,
+ * content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL
+ * }
+ *
+ * ContentType ::= OBJECT IDENTIFIER
+ *
+ * EnvelopedData ::= SEQUENCE {
+ * version Version,
+ * recipientInfos RecipientInfos,
+ * encryptedContentInfo EncryptedContentInfo
+ * }
+ *
+ * EncryptedData ::= SEQUENCE {
+ * version Version,
+ * encryptedContentInfo EncryptedContentInfo
+ * }
+ *
+ * id-signedData OBJECT IDENTIFIER ::= { iso(1) member-body(2)
+ * us(840) rsadsi(113549) pkcs(1) pkcs7(7) 2 }
+ *
+ * SignedData ::= SEQUENCE {
+ * version INTEGER,
+ * digestAlgorithms DigestAlgorithmIdentifiers,
+ * contentInfo ContentInfo,
+ * certificates [0] IMPLICIT Certificates OPTIONAL,
+ * crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
+ * signerInfos SignerInfos
+ * }
+ *
+ * SignerInfos ::= SET OF SignerInfo
+ *
+ * SignerInfo ::= SEQUENCE {
+ * version Version,
+ * issuerAndSerialNumber IssuerAndSerialNumber,
+ * digestAlgorithm DigestAlgorithmIdentifier,
+ * authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
+ * digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
+ * encryptedDigest EncryptedDigest,
+ * unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
+ * }
+ *
+ * EncryptedDigest ::= OCTET STRING
+ *
+ * Attributes ::= SET OF Attribute
+ *
+ * Attribute ::= SEQUENCE {
+ * attrType OBJECT IDENTIFIER,
+ * attrValues SET OF AttributeValue
+ * }
+ *
+ * AttributeValue ::= ANY
+ *
+ * Version ::= INTEGER
+ *
+ * RecipientInfos ::= SET OF RecipientInfo
+ *
+ * EncryptedContentInfo ::= SEQUENCE {
+ * contentType ContentType,
+ * contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
+ * encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
+ * }
+ *
+ * ContentEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
+ *
+ * The AlgorithmIdentifier contains an Object Identifier (OID) and parameters
+ * for the algorithm, if any. In the case of AES and DES3, there is only one,
+ * the IV.
+ *
+ * AlgorithmIdentifer ::= SEQUENCE {
+ * algorithm OBJECT IDENTIFIER,
+ * parameters ANY DEFINED BY algorithm OPTIONAL
+ * }
+ *
+ * EncryptedContent ::= OCTET STRING
+ *
+ * RecipientInfo ::= SEQUENCE {
+ * version Version,
+ * issuerAndSerialNumber IssuerAndSerialNumber,
+ * keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
+ * encryptedKey EncryptedKey
+ * }
+ *
+ * IssuerAndSerialNumber ::= SEQUENCE {
+ * issuer Name,
+ * serialNumber CertificateSerialNumber
+ * }
+ *
+ * CertificateSerialNumber ::= INTEGER
+ *
+ * KeyEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
+ *
+ * EncryptedKey ::= OCTET STRING
+ */
+var forge = require('./forge');
+require('./asn1');
+require('./util');
+
+// shortcut for ASN.1 API
+var asn1 = forge.asn1;
+
+// shortcut for PKCS#7 API
+var p7v = module.exports = forge.pkcs7asn1 = forge.pkcs7asn1 || {};
+forge.pkcs7 = forge.pkcs7 || {};
+forge.pkcs7.asn1 = p7v;
+
+var contentInfoValidator = {
+ name: 'ContentInfo',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'ContentInfo.ContentType',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.OID,
+ constructed: false,
+ capture: 'contentType'
+ }, {
+ name: 'ContentInfo.content',
+ tagClass: asn1.Class.CONTEXT_SPECIFIC,
+ type: 0,
+ constructed: true,
+ optional: true,
+ captureAsn1: 'content'
+ }]
+};
+p7v.contentInfoValidator = contentInfoValidator;
+
+var encryptedContentInfoValidator = {
+ name: 'EncryptedContentInfo',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'EncryptedContentInfo.contentType',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.OID,
+ constructed: false,
+ capture: 'contentType'
+ }, {
+ name: 'EncryptedContentInfo.contentEncryptionAlgorithm',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'EncryptedContentInfo.contentEncryptionAlgorithm.algorithm',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.OID,
+ constructed: false,
+ capture: 'encAlgorithm'
+ }, {
+ name: 'EncryptedContentInfo.contentEncryptionAlgorithm.parameter',
+ tagClass: asn1.Class.UNIVERSAL,
+ captureAsn1: 'encParameter'
+ }]
+ }, {
+ name: 'EncryptedContentInfo.encryptedContent',
+ tagClass: asn1.Class.CONTEXT_SPECIFIC,
+ type: 0,
+ /* The PKCS#7 structure output by OpenSSL somewhat differs from what
+ * other implementations do generate.
+ *
+ * OpenSSL generates a structure like this:
+ * SEQUENCE {
+ * ...
+ * [0]
+ * 26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38
+ * C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45
+ * ...
+ * }
+ *
+ * Whereas other implementations (and this PKCS#7 module) generate:
+ * SEQUENCE {
+ * ...
+ * [0] {
+ * OCTET STRING
+ * 26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38
+ * C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45
+ * ...
+ * }
+ * }
+ *
+ * In order to support both, we just capture the context specific
+ * field here. The OCTET STRING bit is removed below.
+ */
+ capture: 'encryptedContent',
+ captureAsn1: 'encryptedContentAsn1'
+ }]
+};
+
+p7v.envelopedDataValidator = {
+ name: 'EnvelopedData',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'EnvelopedData.Version',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.INTEGER,
+ constructed: false,
+ capture: 'version'
+ }, {
+ name: 'EnvelopedData.RecipientInfos',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SET,
+ constructed: true,
+ captureAsn1: 'recipientInfos'
+ }].concat(encryptedContentInfoValidator)
+};
+
+p7v.encryptedDataValidator = {
+ name: 'EncryptedData',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'EncryptedData.Version',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.INTEGER,
+ constructed: false,
+ capture: 'version'
+ }].concat(encryptedContentInfoValidator)
+};
+
+var signerValidator = {
+ name: 'SignerInfo',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'SignerInfo.version',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.INTEGER,
+ constructed: false
+ }, {
+ name: 'SignerInfo.issuerAndSerialNumber',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'SignerInfo.issuerAndSerialNumber.issuer',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ captureAsn1: 'issuer'
+ }, {
+ name: 'SignerInfo.issuerAndSerialNumber.serialNumber',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.INTEGER,
+ constructed: false,
+ capture: 'serial'
+ }]
+ }, {
+ name: 'SignerInfo.digestAlgorithm',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'SignerInfo.digestAlgorithm.algorithm',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.OID,
+ constructed: false,
+ capture: 'digestAlgorithm'
+ }, {
+ name: 'SignerInfo.digestAlgorithm.parameter',
+ tagClass: asn1.Class.UNIVERSAL,
+ constructed: false,
+ captureAsn1: 'digestParameter',
+ optional: true
+ }]
+ }, {
+ name: 'SignerInfo.authenticatedAttributes',
+ tagClass: asn1.Class.CONTEXT_SPECIFIC,
+ type: 0,
+ constructed: true,
+ optional: true,
+ capture: 'authenticatedAttributes'
+ }, {
+ name: 'SignerInfo.digestEncryptionAlgorithm',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ capture: 'signatureAlgorithm'
+ }, {
+ name: 'SignerInfo.encryptedDigest',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.OCTETSTRING,
+ constructed: false,
+ capture: 'signature'
+ }, {
+ name: 'SignerInfo.unauthenticatedAttributes',
+ tagClass: asn1.Class.CONTEXT_SPECIFIC,
+ type: 1,
+ constructed: true,
+ optional: true,
+ capture: 'unauthenticatedAttributes'
+ }]
+};
+
+p7v.signedDataValidator = {
+ name: 'SignedData',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'SignedData.Version',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.INTEGER,
+ constructed: false,
+ capture: 'version'
+ }, {
+ name: 'SignedData.DigestAlgorithms',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SET,
+ constructed: true,
+ captureAsn1: 'digestAlgorithms'
+ },
+ contentInfoValidator,
+ {
+ name: 'SignedData.Certificates',
+ tagClass: asn1.Class.CONTEXT_SPECIFIC,
+ type: 0,
+ optional: true,
+ captureAsn1: 'certificates'
+ }, {
+ name: 'SignedData.CertificateRevocationLists',
+ tagClass: asn1.Class.CONTEXT_SPECIFIC,
+ type: 1,
+ optional: true,
+ captureAsn1: 'crls'
+ }, {
+ name: 'SignedData.SignerInfos',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SET,
+ capture: 'signerInfos',
+ optional: true,
+ value: [signerValidator]
+ }]
+};
+
+p7v.recipientInfoValidator = {
+ name: 'RecipientInfo',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'RecipientInfo.version',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.INTEGER,
+ constructed: false,
+ capture: 'version'
+ }, {
+ name: 'RecipientInfo.issuerAndSerial',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'RecipientInfo.issuerAndSerial.issuer',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ captureAsn1: 'issuer'
+ }, {
+ name: 'RecipientInfo.issuerAndSerial.serialNumber',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.INTEGER,
+ constructed: false,
+ capture: 'serial'
+ }]
+ }, {
+ name: 'RecipientInfo.keyEncryptionAlgorithm',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.SEQUENCE,
+ constructed: true,
+ value: [{
+ name: 'RecipientInfo.keyEncryptionAlgorithm.algorithm',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.OID,
+ constructed: false,
+ capture: 'encAlgorithm'
+ }, {
+ name: 'RecipientInfo.keyEncryptionAlgorithm.parameter',
+ tagClass: asn1.Class.UNIVERSAL,
+ constructed: false,
+ captureAsn1: 'encParameter',
+ optional: true
+ }]
+ }, {
+ name: 'RecipientInfo.encryptedKey',
+ tagClass: asn1.Class.UNIVERSAL,
+ type: asn1.Type.OCTETSTRING,
+ constructed: false,
+ capture: 'encKey'
+ }]
+};