summaryrefslogtreecommitdiff
path: root/src/sbearssl/sbearssl_ta_certs.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2016-11-30 16:00:29 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2016-11-30 16:00:29 +0000
commitcc08be523a2a647a999dcf82dcce9dee62b4162c (patch)
tree235f40d2d5431e383491e74a21d34073cf6ed712 /src/sbearssl/sbearssl_ta_certs.c
parent3f78080496cddb11cbe9040efce694e44cfac7fe (diff)
downloads6-networking-cc08be523a2a647a999dcf82dcce9dee62b4162c.tar.xz
sbearssl: allow DER-encoded certificates in TA directory
Diffstat (limited to 'src/sbearssl/sbearssl_ta_certs.c')
-rw-r--r--src/sbearssl/sbearssl_ta_certs.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/sbearssl/sbearssl_ta_certs.c b/src/sbearssl/sbearssl_ta_certs.c
new file mode 100644
index 0000000..42b6115
--- /dev/null
+++ b/src/sbearssl/sbearssl_ta_certs.c
@@ -0,0 +1,36 @@
+/* ISC license. */
+
+#include <sys/types.h>
+#include <bearssl.h>
+#include <skalibs/stralloc.h>
+#include <skalibs/genalloc.h>
+#include <s6-networking/sbearssl.h>
+
+int sbearssl_ta_certs (genalloc *taga, stralloc *tasa, sbearssl_cert const *certs, size_t certn, char const *certstorage)
+{
+ size_t tagabase = genalloc_len(sbearssl_ta, taga) ;
+ size_t tasabase = tasa->len ;
+ size_t i = 0 ;
+ int tagawasnull = !genalloc_s(sbearssl_ta, taga) ;
+ int tasawasnull = !tasa->s ;
+ int r ;
+
+ for (; i < certn ; i++)
+ {
+ sbearssl_ta ta ;
+ int r = sbearssl_ta_cert(&ta, certs + i, certstorage, tasa) ;
+ if (r) goto fail ;
+ if (!genalloc_append(sbearssl_ta, taga, &ta)) goto rfail ;
+ }
+
+ return 0 ;
+
+ rfail:
+ r = -1 ;
+ fail:
+ if (tagawasnull) genalloc_free(sbearssl_ta, taga) ;
+ else genalloc_setlen(sbearssl_ta, taga, tagabase) ;
+ if (tasawasnull) stralloc_free(tasa) ;
+ else tasa->len = tasabase ;
+ return r ;
+}