summaryrefslogtreecommitdiff
path: root/trust/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'trust/parser.c')
-rw-r--r--trust/parser.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/trust/parser.c b/trust/parser.c
index 0ab9468..56d3226 100644
--- a/trust/parser.c
+++ b/trust/parser.c
@@ -47,6 +47,7 @@
#include "parser.h"
#include "pem.h"
#include "pkcs11x.h"
+#include "persist.h"
#include "x509.h"
#include <libtasn1.h>
@@ -65,6 +66,7 @@ struct _p11_parser {
p11_index *index;
p11_asn1_cache *asn1_cache;
p11_dict *asn1_defs;
+ p11_persist *persist;
char *basename;
int flags;
};
@@ -573,7 +575,38 @@ parse_pem_certificates (p11_parser *parser,
return P11_PARSE_SUCCESS;
}
+static int
+parse_p11_kit_persist (p11_parser *parser,
+ const unsigned char *data,
+ size_t length)
+{
+ p11_array *objects;
+ bool ret;
+ int i;
+
+ if (!p11_persist_magic (data, length))
+ return P11_PARSE_UNRECOGNIZED;
+
+ if (!parser->persist) {
+ parser->persist = p11_persist_new ();
+ return_val_if_fail (parser->persist != NULL, P11_PARSE_UNRECOGNIZED);
+ }
+
+ objects = p11_array_new (NULL);
+ return_val_if_fail (objects != NULL, P11_PARSE_FAILURE);
+
+ ret = p11_persist_read (parser->persist, parser->basename, data, length, objects);
+ if (ret) {
+ for (i = 0; i < objects->num; i++)
+ sink_object (parser, objects->elem[i]);
+ }
+
+ p11_array_free (objects);
+ return ret ? P11_PARSE_SUCCESS : P11_PARSE_FAILURE;
+}
+
static parser_func all_parsers[] = {
+ parse_p11_kit_persist,
parse_pem_certificates,
parse_der_x509_certificate,
NULL,
@@ -598,6 +631,8 @@ p11_parser_new (p11_index *index,
void
p11_parser_free (p11_parser *parser)
{
+ return_if_fail (parser != NULL);
+ p11_persist_free (parser->persist);
free (parser);
}