summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2020-02-23 22:31:10 +0000
committerDaniel Silverstone <dsilvers@digital-scurf.org>2020-02-23 22:31:10 +0000
commit5a5670410b2cf3c90f5ef8534c48feb0c97532bb (patch)
treeeca679a144735d2d0a05b8d6f4c642852c5c3cc3 /utils
parent494db4cd51a5896778fcda150ed9c29b92ef504a (diff)
downloadnetsurf-5a5670410b2cf3c90f5ef8534c48feb0c97532bb.tar.gz
netsurf-5a5670410b2cf3c90f5ef8534c48feb0c97532bb.tar.bz2
ssl_certs: Add dup_into
Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
Diffstat (limited to 'utils')
-rw-r--r--utils/ssl_certs.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/utils/ssl_certs.c b/utils/ssl_certs.c
index 7154561aa..09500a4fe 100644
--- a/utils/ssl_certs.c
+++ b/utils/ssl_certs.c
@@ -54,6 +54,43 @@ cert_chain_alloc(size_t depth, struct cert_chain **chain_out)
/*
+ * duplicate certificate chain into existing chain
+ *
+ * exported interface documented in netsurf/ssl_certs.h
+ */
+nserror
+cert_chain_dup_into(const struct cert_chain *src, struct cert_chain *dst)
+{
+ size_t depth;
+ for (depth = 0; depth < dst->depth; depth++) {
+ if (dst->certs[depth].der != NULL) {
+ free(dst->certs[depth].der);
+ dst->certs[depth].der = NULL;
+ }
+ }
+
+ dst->depth = src->depth;
+
+ for (depth = 0; depth < src->depth; depth++) {
+ dst->certs[depth].err = src->certs[depth].err;
+ dst->certs[depth].der_length = src->certs[depth].der_length;
+ if (src->certs[depth].der != NULL) {
+ dst->certs[depth].der = malloc(src->certs[depth].der_length);
+ if (dst->certs[depth].der == NULL) {
+ return NSERROR_NOMEM;
+ }
+ memcpy(dst->certs[depth].der,
+ src->certs[depth].der,
+ src->certs[depth].der_length);
+ }
+
+ }
+
+ return NSERROR_OK;
+}
+
+
+/*
* duplicate certificate chain
*
* exported interface documented in netsurf/ssl_certs.h