From 5a5670410b2cf3c90f5ef8534c48feb0c97532bb Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sun, 23 Feb 2020 22:31:10 +0000 Subject: ssl_certs: Add dup_into Signed-off-by: Daniel Silverstone --- include/netsurf/ssl_certs.h | 12 ++++++++++++ utils/ssl_certs.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/include/netsurf/ssl_certs.h b/include/netsurf/ssl_certs.h index 1aaf485a7..b5e79abd5 100644 --- a/include/netsurf/ssl_certs.h +++ b/include/netsurf/ssl_certs.h @@ -86,6 +86,18 @@ struct cert_chain { */ nserror cert_chain_alloc(size_t depth, struct cert_chain **chain_out); +/** + * duplicate a certificate chain into an existing chain + * + * \param src The certificate chain to copy from + * \param dst The chain to overwrite with a copy of src + * \return NSERROR_OK on success or NSERROR_NOMEM on memory exhaustion + * + * NOTE: if this returns NSERROR_NOMEM then the destination chain will have + * some amount of content and should be cleaned up with cert_chain_free. + */ +nserror cert_chain_dup_into(const struct cert_chain *src, struct cert_chain *dst); + /** * duplicate a certificate chain * 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 @@ -53,6 +53,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 * -- cgit v1.2.3