Skip to content

Commit 9d8b0ee

Browse files
committed
Add verification helper.
- Reduce duplicate code. - Small cleanups. - Add note about deprecated OID alias.
1 parent 2fb9995 commit 9d8b0ee

File tree

2 files changed

+72
-101
lines changed

2 files changed

+72
-101
lines changed

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ Forge ChangeLog
1212
links](https://github.com/digitalbazaar/forge/issues/825).
1313

1414
### Changed
15-
- [x509]: Reduce duplicate code with a helper function to create a signature
16-
digest given an signature algorithm OID.
15+
- [x509]: Reduce duplicate code. Add helper function to create a signature
16+
digest given an signature algorithm OID. Add helper function to verify
17+
signatures.
1718

1819
## 1.1.0 - 2022-01-06
1920

lib/x509.js

Lines changed: 69 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -700,24 +700,19 @@ var _readSignatureParameters = function(oid, obj, fillDefaults) {
700700
var _createSignatureDigest = function(options) {
701701
switch(oids[options.signatureOid]) {
702702
case 'sha1WithRSAEncryption':
703+
// depreacted alias
703704
case 'sha1WithRSASignature':
704705
return forge.md.sha1.create();
705-
break;
706706
case 'md5WithRSAEncryption':
707707
return forge.md.md5.create();
708-
break;
709708
case 'sha256WithRSAEncryption':
710709
return forge.md.sha256.create();
711-
break;
712710
case 'sha384WithRSAEncryption':
713711
return forge.md.sha384.create();
714-
break;
715712
case 'sha512WithRSAEncryption':
716713
return forge.md.sha512.create();
717-
break;
718714
case 'RSASSA-PSS':
719715
return forge.md.sha256.create();
720-
break;
721716
default:
722717
var error = new Error(
723718
'Could not compute ' + options.type + ' digest. ' +
@@ -727,6 +722,68 @@ var _createSignatureDigest = function(options) {
727722
}
728723
};
729724

725+
/**
726+
* Verify signature on certificate or CSR.
727+
*
728+
* @param options:
729+
* certificate the certificate or CSR to verify.
730+
* md the signature digest.
731+
* signature the signature
732+
* @return a created md instance. throws if unknown oid.
733+
*/
734+
var _verifySignature = function(options) {
735+
var cert = options.certificate;
736+
var scheme;
737+
738+
switch(cert.signatureOid) {
739+
case oids.sha1WithRSAEncryption:
740+
// depreacted alias
741+
case oids.sha1WithRSASignature:
742+
/* use PKCS#1 v1.5 padding scheme */
743+
break;
744+
case oids['RSASSA-PSS']:
745+
var hash, mgf;
746+
747+
/* initialize mgf */
748+
hash = oids[cert.signatureParameters.mgf.hash.algorithmOid];
749+
if(hash === undefined || forge.md[hash] === undefined) {
750+
var error = new Error('Unsupported MGF hash function.');
751+
error.oid = cert.signatureParameters.mgf.hash.algorithmOid;
752+
error.name = hash;
753+
throw error;
754+
}
755+
756+
mgf = oids[cert.signatureParameters.mgf.algorithmOid];
757+
if(mgf === undefined || forge.mgf[mgf] === undefined) {
758+
var error = new Error('Unsupported MGF function.');
759+
error.oid = cert.signatureParameters.mgf.algorithmOid;
760+
error.name = mgf;
761+
throw error;
762+
}
763+
764+
mgf = forge.mgf[mgf].create(forge.md[hash].create());
765+
766+
/* initialize hash function */
767+
hash = oids[cert.signatureParameters.hash.algorithmOid];
768+
if(hash === undefined || forge.md[hash] === undefined) {
769+
var error = new Error('Unsupported RSASSA-PSS hash function.');
770+
error.oid = cert.signatureParameters.hash.algorithmOid;
771+
error.name = hash;
772+
throw error;
773+
}
774+
775+
scheme = forge.pss.create(
776+
forge.md[hash].create(), mgf, cert.signatureParameters.saltLength
777+
);
778+
break;
779+
}
780+
781+
// verify signature on cert using public key
782+
return cert.publicKey.verify(
783+
options.md.digest().getBytes(), options.signature, scheme
784+
);
785+
};
786+
730787
/**
731788
* Converts an X.509 certificate from PEM format.
732789
*
@@ -1127,53 +1184,9 @@ pki.createCertificate = function() {
11271184
}
11281185

11291186
if(md !== null) {
1130-
var scheme;
1131-
1132-
switch(child.signatureOid) {
1133-
case oids.sha1WithRSAEncryption:
1134-
case oids.sha1WithRSASignature:
1135-
scheme = undefined; /* use PKCS#1 v1.5 padding scheme */
1136-
break;
1137-
case oids['RSASSA-PSS']:
1138-
var hash, mgf;
1139-
1140-
/* initialize mgf */
1141-
hash = oids[child.signatureParameters.mgf.hash.algorithmOid];
1142-
if(hash === undefined || forge.md[hash] === undefined) {
1143-
var error = new Error('Unsupported MGF hash function.');
1144-
error.oid = child.signatureParameters.mgf.hash.algorithmOid;
1145-
error.name = hash;
1146-
throw error;
1147-
}
1148-
1149-
mgf = oids[child.signatureParameters.mgf.algorithmOid];
1150-
if(mgf === undefined || forge.mgf[mgf] === undefined) {
1151-
var error = new Error('Unsupported MGF function.');
1152-
error.oid = child.signatureParameters.mgf.algorithmOid;
1153-
error.name = mgf;
1154-
throw error;
1155-
}
1156-
1157-
mgf = forge.mgf[mgf].create(forge.md[hash].create());
1158-
1159-
/* initialize hash function */
1160-
hash = oids[child.signatureParameters.hash.algorithmOid];
1161-
if(hash === undefined || forge.md[hash] === undefined) {
1162-
throw {
1163-
message: 'Unsupported RSASSA-PSS hash function.',
1164-
oid: child.signatureParameters.hash.algorithmOid,
1165-
name: hash
1166-
};
1167-
}
1168-
1169-
scheme = forge.pss.create(forge.md[hash].create(), mgf,
1170-
child.signatureParameters.saltLength);
1171-
break;
1172-
}
1173-
1174-
// verify signature on cert using public key
1175-
rval = cert.publicKey.verify(
1176-
md.digest().getBytes(), child.signature, scheme);
1187+
rval = _verifySignature({
1188+
certificate: cert, md: md, signature: child.signature
1189+
});
11771190
}
11781191

11791192
return rval;
@@ -1826,52 +1839,9 @@ pki.createCertificationRequest = function() {
18261839
}
18271840

18281841
if(md !== null) {
1829-
var scheme;
1830-
1831-
switch(csr.signatureOid) {
1832-
case oids.sha1WithRSAEncryption:
1833-
case oids.sha1WithRSASignature:
1834-
/* use PKCS#1 v1.5 padding scheme */
1835-
break;
1836-
case oids['RSASSA-PSS']:
1837-
var hash, mgf;
1838-
1839-
/* initialize mgf */
1840-
hash = oids[csr.signatureParameters.mgf.hash.algorithmOid];
1841-
if(hash === undefined || forge.md[hash] === undefined) {
1842-
var error = new Error('Unsupported MGF hash function.');
1843-
error.oid = csr.signatureParameters.mgf.hash.algorithmOid;
1844-
error.name = hash;
1845-
throw error;
1846-
}
1847-
1848-
mgf = oids[csr.signatureParameters.mgf.algorithmOid];
1849-
if(mgf === undefined || forge.mgf[mgf] === undefined) {
1850-
var error = new Error('Unsupported MGF function.');
1851-
error.oid = csr.signatureParameters.mgf.algorithmOid;
1852-
error.name = mgf;
1853-
throw error;
1854-
}
1855-
1856-
mgf = forge.mgf[mgf].create(forge.md[hash].create());
1857-
1858-
/* initialize hash function */
1859-
hash = oids[csr.signatureParameters.hash.algorithmOid];
1860-
if(hash === undefined || forge.md[hash] === undefined) {
1861-
var error = new Error('Unsupported RSASSA-PSS hash function.');
1862-
error.oid = csr.signatureParameters.hash.algorithmOid;
1863-
error.name = hash;
1864-
throw error;
1865-
}
1866-
1867-
scheme = forge.pss.create(forge.md[hash].create(), mgf,
1868-
csr.signatureParameters.saltLength);
1869-
break;
1870-
}
1871-
1872-
// verify signature on csr using its public key
1873-
rval = csr.publicKey.verify(
1874-
md.digest().getBytes(), csr.signature, scheme);
1842+
rval = _verifySignature({
1843+
certificate: csr, md: md, signature: csr.signature
1844+
});
18751845
}
18761846

18771847
return rval;

0 commit comments

Comments
 (0)