summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornelson%bolyard.com <devnull@localhost>2007-08-29 21:59:06 +0000
committernelson%bolyard.com <devnull@localhost>2007-08-29 21:59:06 +0000
commitfbf32ad46d0afe8536a798b49ae1bd7202abdaa4 (patch)
tree0795ca023e8eca904c5412d510ce3add67a0a23d
parent8c62cf06bee60486b602e8d27d37574d8502f0c6 (diff)
downloadnss-hg-fbf32ad46d0afe8536a798b49ae1bd7202abdaa4.tar.gz
Bug 392208 - PK11_FindCertByIssuerAndSN must validate input arguments
r=Kaspar Brand, sr=rrelyea
-rw-r--r--security/nss/lib/certdb/certt.h5
-rw-r--r--security/nss/lib/pk11wrap/pk11cert.c16
2 files changed, 20 insertions, 1 deletions
diff --git a/security/nss/lib/certdb/certt.h b/security/nss/lib/certdb/certt.h
index ca5dbf41e..56922ee15 100644
--- a/security/nss/lib/certdb/certt.h
+++ b/security/nss/lib/certdb/certt.h
@@ -620,7 +620,10 @@ struct CERTBasicConstraintsStr {
/* Maximum length of a certificate chain */
#define CERT_MAX_CERT_CHAIN 20
-/* x.509 v3 Reason Falgs, used in CRLDistributionPoint Extension */
+#define CERT_MAX_SERIAL_NUMBER_BYTES 20 /* from RFC 3280 */
+#define CERT_MAX_DN_BYTES 4096 /* arbitrary */
+
+/* x.509 v3 Reason Flags, used in CRLDistributionPoint Extension */
#define RF_UNUSED (0x80) /* bit 0 */
#define RF_KEY_COMPROMISE (0x40) /* bit 1 */
#define RF_CA_COMPROMISE (0x20) /* bit 2 */
diff --git a/security/nss/lib/pk11wrap/pk11cert.c b/security/nss/lib/pk11wrap/pk11cert.c
index c361bd44a..8aed6d48c 100644
--- a/security/nss/lib/pk11wrap/pk11cert.c
+++ b/security/nss/lib/pk11wrap/pk11cert.c
@@ -1187,6 +1187,14 @@ PK11_FindCertByIssuerAndSNOnToken(PK11SlotInfo *slot,
SECItem *derSerial;
PRStatus status;
+ if (!issuerSN || !issuerSN->derIssuer.data || !issuerSN->derIssuer.len ||
+ !issuerSN->serialNumber.data || !issuerSN->serialNumber.len ||
+ issuerSN->derIssuer.len > CERT_MAX_DN_BYTES ||
+ issuerSN->serialNumber.len > CERT_MAX_SERIAL_NUMBER_BYTES ) {
+ PORT_SetError(SEC_ERROR_INVALID_ARGS);
+ return NULL;
+ }
+
/* Paranoia */
if (token == NULL) {
PORT_SetError(SEC_ERROR_NO_TOKEN);
@@ -1522,6 +1530,14 @@ PK11_FindCertByIssuerAndSN(PK11SlotInfo **slotPtr, CERTIssuerAndSN *issuerSN,
NSSCryptoContext *cc;
SECItem *derSerial;
+ if (!issuerSN || !issuerSN->derIssuer.data || !issuerSN->derIssuer.len ||
+ !issuerSN->serialNumber.data || !issuerSN->serialNumber.len ||
+ issuerSN->derIssuer.len > CERT_MAX_DN_BYTES ||
+ issuerSN->serialNumber.len > CERT_MAX_SERIAL_NUMBER_BYTES ) {
+ PORT_SetError(SEC_ERROR_INVALID_ARGS);
+ return NULL;
+ }
+
if (slotPtr) *slotPtr = NULL;
/* PKCS#11 needs to use DER-encoded serial numbers. Create a