@@ -700,24 +700,19 @@ var _readSignatureParameters = function(oid, obj, fillDefaults) {
700700var _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