refactoring of the ASN.1 parser

This commit is contained in:
Andreas Steffen
2008-04-26 09:24:14 +00:00
parent 3444390241
commit d3d7e46b8c
19 changed files with 1587 additions and 1166 deletions
+23 -19
View File
@@ -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;
}