diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2020-02-23 22:31:10 +0000 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2020-02-23 22:31:10 +0000 |
commit | 5a5670410b2cf3c90f5ef8534c48feb0c97532bb (patch) | |
tree | eca679a144735d2d0a05b8d6f4c642852c5c3cc3 /utils | |
parent | 494db4cd51a5896778fcda150ed9c29b92ef504a (diff) | |
download | netsurf-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.c | 37 |
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 |