refactoring of the ASN.1 parser
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
|
||||
#include <asn1/oid.h>
|
||||
#include <asn1/asn1.h>
|
||||
#include <asn1/asn1_parser.h>
|
||||
#include <utils/linked_list.h>
|
||||
|
||||
#include "pkcs9.h"
|
||||
@@ -87,7 +88,6 @@ static const asn1Object_t attributesObjects[] = {
|
||||
{ 2, "end loop", ASN1_EOC, ASN1_END }, /* 5 */
|
||||
{ 0, "end loop", ASN1_EOC, ASN1_END }, /* 6 */
|
||||
};
|
||||
|
||||
#define ATTRIBUTE_OBJ_TYPE 2
|
||||
#define ATTRIBUTE_OBJ_VALUE 4
|
||||
#define ATTRIBUTE_OBJ_ROOF 7
|
||||
@@ -259,7 +259,7 @@ static void build_encoding(private_pkcs9_t *this)
|
||||
|
||||
/* allocate memory for the attributes and build the encoding */
|
||||
{
|
||||
u_char *pos = build_asn1_object(&this->encoding, ASN1_SET, attributes_len);
|
||||
u_char *pos = asn1_build_object(&this->encoding, ASN1_SET, attributes_len);
|
||||
|
||||
iterator = this->attributes->create_iterator(this->attributes, TRUE);
|
||||
|
||||
@@ -327,7 +327,8 @@ static chunk_t get_messageDigest(private_pkcs9_t *this)
|
||||
{
|
||||
return chunk_empty;
|
||||
}
|
||||
if (!parse_asn1_simple_object(&value, asn1_attributeType(oid), 0, oid_names[oid].name))
|
||||
if (!asn1_parse_simple_object(&value, asn1_attributeType(oid), 0,
|
||||
oid_names[oid].name))
|
||||
{
|
||||
return chunk_empty;
|
||||
}
|
||||
@@ -394,25 +395,21 @@ pkcs9_t *pkcs9_create(void)
|
||||
*/
|
||||
static bool parse_attributes(chunk_t chunk, int level0, private_pkcs9_t* this)
|
||||
{
|
||||
asn1_ctx_t ctx;
|
||||
asn1_parser_t *parser;
|
||||
chunk_t object;
|
||||
u_int level;
|
||||
int objectID;
|
||||
int oid = OID_UNKNOWN;
|
||||
int objectID = 0;
|
||||
bool success = TRUE;
|
||||
|
||||
asn1_init(&ctx, chunk, level0, FALSE, FALSE);
|
||||
parser = asn1_parser_create(attributesObjects, ATTRIBUTE_OBJ_ROOF, chunk);
|
||||
parser->set_top_level(parser, level0);
|
||||
|
||||
while (objectID < ATTRIBUTE_OBJ_ROOF)
|
||||
while (parser->iterate(parser, &objectID, &object))
|
||||
{
|
||||
if (!extract_object(attributesObjects, &objectID, &object, &level, &ctx))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
switch (objectID)
|
||||
{
|
||||
case ATTRIBUTE_OBJ_TYPE:
|
||||
oid = known_oid(object);
|
||||
oid = asn1_known_oid(object);
|
||||
break;
|
||||
case ATTRIBUTE_OBJ_VALUE:
|
||||
if (oid == OID_UNKNOWN)
|
||||
@@ -423,7 +420,8 @@ static bool parse_attributes(chunk_t chunk, int level0, private_pkcs9_t* this)
|
||||
{
|
||||
attribute_t *attribute = attribute_create(oid, object);
|
||||
|
||||
this->attributes->insert_last(this->attributes, (void*)attribute);
|
||||
this->attributes->insert_last(this->attributes,
|
||||
(void*)attribute);
|
||||
}
|
||||
/* parse known attributes */
|
||||
{
|
||||
@@ -431,16 +429,22 @@ static bool parse_attributes(chunk_t chunk, int level0, private_pkcs9_t* this)
|
||||
|
||||
if (type != ASN1_EOC)
|
||||
{
|
||||
if (!parse_asn1_simple_object(&object, type, level+1, oid_names[oid].name))
|
||||
if (!asn1_parse_simple_object(&object, type,
|
||||
parser->get_level(parser)+1,
|
||||
oid_names[oid].name))
|
||||
{
|
||||
return FALSE;
|
||||
success = FALSE;
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
objectID++;
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
end:
|
||||
success &= parser->success(parser);
|
||||
parser->destroy(parser);
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user