One of the most common signature formats on the web is known as CMS SignedData, this is the signature format used in PDF files, CAdES, S/MIME and several other digital signature solutions.
As a signature it has a few notable features:
- Having multiple signers.
- Including meta-data that will be signed along with the data that is being signed.
- Including meta-data that is outside the scope of the signature.
- Signing data contained within the signature or data referenced by it.
These traits mean you can do some interesting things like implementing counter-signing in-turn enabling notarization scenarios.
Utilizing PKI.js you can now create and verify this signature format, bellow is an example of how creating one of these messages looks using this library:
// #region Put a static values var sample_data = new Uint8Array(sample_data); sample_data[0] = 0x00; sample_data[1] = 0x01; sample_data[2] = 0x02; sample_data[3] = 0x03; sample_data[4] = 0x04; cms_signed_simpl = new org.pkijs.simpl.CMS_SIGNED_DATA({ digestAlgorithms: [ new org.pkijs.simpl.ALGORITHM_IDENTIFIER({ algorithm_id: "1.3.14.3.2.26" }) // SHA-1 ], encapContentInfo: new org.pkijs.simpl.cms.EncapsulatedContentInfo({ eContentType: "1.2.840.113549.1.7.1", // "data" content type eContent: new org.pkijs.asn1.OCTETSTRING({ value_hex: sample_data }) }), signerInfos: [ new org.pkijs.simpl.CMS_SIGNER_INFO({ sid: new org.pkijs.simpl.cms.IssuerAndSerialNumber({ issuer: cert_simpl.issuer, serialNumber: cert_simpl.serialNumber }), digestAlgorithm: new org.pkijs.simpl.ALGORITHM_IDENTIFIER({ algorithm_id: "1.3.14.3.2.26" }), // SHA-1 signatureAlgorithm: new org.pkijs.simpl.ALGORITHM_IDENTIFIER({ algorithm_id: "1.2.840.113549.1.1.5" }), // RSA + SHA-1 }) ], certificates: [cert_simpl] }); // #endregion return cms_signed_simpl.sign(privateKey, 0);
In this sample you can see we are putting our content to be signed within the SignedData message and then signing it with RSA and SHA1, this is in-the exact same thing that is needed to implement what is called opaque signed email in S/MIME.