parse signedData object with empty content

This commit is contained in:
Andreas Steffen
2008-02-02 00:29:03 +00:00
parent f4a459473e
commit 9514d26c5c
+11 -3
View File
@@ -8,6 +8,7 @@
/* /*
* Copyright (C) 2005 Jan Hutter, Martin Willi * Copyright (C) 2005 Jan Hutter, Martin Willi
* Copyright (C) 2002-2008 Andreas Steffen * Copyright (C) 2002-2008 Andreas Steffen
*
* Hochschule fuer Technik Rapperswil, Switzerland * Hochschule fuer Technik Rapperswil, Switzerland
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
@@ -301,6 +302,11 @@ static bool parse_data(private_pkcs7_t *this)
{ {
return FALSE; return FALSE;
} }
if (data.len == 0)
{
this->data = chunk_empty;
return TRUE;
}
if (parse_asn1_simple_object(&data, ASN1_OCTET_STRING, this->level, "data")) if (parse_asn1_simple_object(&data, ASN1_OCTET_STRING, this->level, "data"))
{ {
this->data = chunk_clone(data); this->data = chunk_clone(data);
@@ -313,7 +319,7 @@ static bool parse_data(private_pkcs7_t *this)
} }
/** /**
* Parse PKCS#7 signedData content * Implements pkcs7_t.parse_signedData.
*/ */
static bool parse_signedData(private_pkcs7_t *this, x509_t *cacert) static bool parse_signedData(private_pkcs7_t *this, x509_t *cacert)
{ {
@@ -349,6 +355,7 @@ static bool parse_signedData(private_pkcs7_t *this, x509_t *cacert)
break; break;
case PKCS7_SIGNED_CONTENT_INFO: case PKCS7_SIGNED_CONTENT_INFO:
{ {
chunk_t pureData;
pkcs7_t *data = pkcs7_create_from_chunk(object, level+1); pkcs7_t *data = pkcs7_create_from_chunk(object, level+1);
if (data == NULL) if (data == NULL)
@@ -360,7 +367,8 @@ static bool parse_signedData(private_pkcs7_t *this, x509_t *cacert)
data->destroy(data); data->destroy(data);
return FALSE; return FALSE;
} }
this->data = chunk_clone(data->get_data(data)); pureData = data->get_data(data);
this->data = (pureData.len)? chunk_clone(pureData) : chunk_empty;
data->destroy(data); data->destroy(data);
} }
break; break;
@@ -973,7 +981,7 @@ static bool parse_contentInfo(chunk_t blob, u_int level0, private_pkcs7_t *cInfo
return FALSE; return FALSE;
} }
} }
else if (objectID == PKCS7_INFO_CONTENT) else if (objectID == PKCS7_INFO_CONTENT && object.len > 0)
{ {
cInfo->content = chunk_clone(object); cInfo->content = chunk_clone(object);
} }