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.