2012-10-18 15:38:53 +00:00
|
|
|
From 4ed91a1bb65769401c0fd6c1c5b2a3c64c0c1266 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Peter Jones <pjones@redhat.com>
|
|
|
|
Date: Wed, 17 Oct 2012 16:35:43 -0400
|
2012-10-19 14:24:10 +00:00
|
|
|
Subject: [PATCH 23/41] Add sanity checking to make sure we don't emit
|
2012-10-18 15:38:53 +00:00
|
|
|
uninitialized hashes.
|
|
|
|
|
|
|
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
|
|
|
---
|
|
|
|
src/cms_common.c | 15 ++++++++++++++-
|
|
|
|
src/content_info.c | 11 +++++++++++
|
|
|
|
src/signer_info.c | 5 +++++
|
|
|
|
src/util.h | 13 +++++++++++++
|
|
|
|
4 files changed, 43 insertions(+), 1 deletion(-)
|
|
|
|
|
|
|
|
diff --git a/src/cms_common.c b/src/cms_common.c
|
|
|
|
index a1ed460..ab5a066 100644
|
|
|
|
--- a/src/cms_common.c
|
|
|
|
+++ b/src/cms_common.c
|
|
|
|
@@ -532,6 +532,10 @@ generate_empty_sequence(cms_context *cms, SECItem *encoded)
|
|
|
|
int
|
|
|
|
generate_octet_string(cms_context *cms, SECItem *encoded, SECItem *original)
|
|
|
|
{
|
|
|
|
+ if (content_is_empty(original->data, original->len)) {
|
|
|
|
+ cms->log(cms, LOG_ERR, "content is empty, not encoding");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
if (SEC_ASN1EncodeItem(cms->arena, encoded, original,
|
|
|
|
SEC_OctetStringTemplate) == NULL)
|
|
|
|
return -1;
|
|
|
|
@@ -942,7 +946,16 @@ generate_signature(cms_context *cms)
|
|
|
|
{
|
|
|
|
int rc = 0;
|
|
|
|
|
|
|
|
- assert(cms->digests[cms->selected_digest].pe_digest != NULL);
|
|
|
|
+ if (cms->digests[cms->selected_digest].pe_digest == NULL) {
|
|
|
|
+ cms->log(cms, LOG_ERR, "pe digest has not been allocated");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (content_is_empty(cms->digests[cms->selected_digest].pe_digest->data,
|
|
|
|
+ cms->digests[cms->selected_digest].pe_digest->len)) {
|
|
|
|
+ cms->log(cms, LOG_ERR, "pe binary has not been digested");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
SECItem sd_der;
|
|
|
|
memset(&sd_der, '\0', sizeof(sd_der));
|
|
|
|
diff --git a/src/content_info.c b/src/content_info.c
|
|
|
|
index 044e85e..7246d20 100644
|
|
|
|
--- a/src/content_info.c
|
|
|
|
+++ b/src/content_info.c
|
|
|
|
@@ -197,6 +197,11 @@ generate_spc_digest_info(cms_context *cms, SECItem *dip)
|
|
|
|
int i = cms->selected_digest;
|
|
|
|
memcpy(&di.digest, cms->digests[i].pe_digest, sizeof (di.digest));
|
|
|
|
|
|
|
|
+ if (content_is_empty(di.digest.data, di.digest.len)) {
|
|
|
|
+ cms->log(cms, LOG_ERR, "got empty digest");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
if (SEC_ASN1EncodeItem(cms->arena, dip, &di,
|
|
|
|
DigestInfoTemplate) == NULL) {
|
|
|
|
cms->log(cms, LOG_ERR, "could not encode DigestInfo: %s",
|
|
|
|
@@ -327,6 +332,12 @@ generate_cinfo_digest(cms_context *cms, SpcContentInfo *cip)
|
|
|
|
&cms->ci_digest->len,
|
|
|
|
digest_get_digest_size(cms)) != SECSuccess)
|
|
|
|
goto err;
|
|
|
|
+
|
|
|
|
+ if (content_is_empty(cms->ci_digest->data, cms->ci_digest->len)) {
|
|
|
|
+ cms->log(cms, LOG_ERR, "generated empty digest");
|
|
|
|
+ goto err;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
if (cms->ci_digest->len > digest_get_digest_size(cms))
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
diff --git a/src/signer_info.c b/src/signer_info.c
|
|
|
|
index 7a73c26..932b896 100644
|
|
|
|
--- a/src/signer_info.c
|
|
|
|
+++ b/src/signer_info.c
|
|
|
|
@@ -207,6 +207,11 @@ sign_blob(cms_context *cms, SECItem *sigitem, SECItem *sign_content)
|
|
|
|
if (!sign_content)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
+ if (content_is_empty(sign_content->data, sign_content->len)) {
|
|
|
|
+ cms->log(cms, LOG_ERR, "not signing empty digest");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
SECOidData *oid = SECOID_FindOIDByTag(digest_get_signature_oid(cms));
|
|
|
|
if (!oid)
|
|
|
|
goto err;
|
|
|
|
diff --git a/src/util.h b/src/util.h
|
|
|
|
index f495a0b..5e0ea34 100644
|
|
|
|
--- a/src/util.h
|
|
|
|
+++ b/src/util.h
|
|
|
|
@@ -110,6 +110,19 @@ free_poison(void *addrv, ssize_t len)
|
|
|
|
addr[x] = poison_pills[x % 2];
|
|
|
|
}
|
|
|
|
|
|
|
|
+static int
|
|
|
|
+__attribute__ ((unused))
|
|
|
|
+content_is_empty(uint8_t *data, ssize_t len)
|
|
|
|
+{
|
|
|
|
+ if (len < 1)
|
|
|
|
+ return 1;
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < len; i++)
|
|
|
|
+ if (data[i] != 0)
|
|
|
|
+ return 0;
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
#if defined(DAEMON_H)
|
|
|
|
static inline uint32_t
|
|
|
|
__attribute__ ((unused))
|
|
|
|
--
|
|
|
|
1.7.12.1
|
|
|
|
|