aboutsummaryrefslogtreecommitdiffstats
path: root/src/sbearssl/sbearssl_sni_policy_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sbearssl/sbearssl_sni_policy_init.c')
-rw-r--r--src/sbearssl/sbearssl_sni_policy_init.c55
1 files changed, 6 insertions, 49 deletions
diff --git a/src/sbearssl/sbearssl_sni_policy_init.c b/src/sbearssl/sbearssl_sni_policy_init.c
index fd0e946..150250f 100644
--- a/src/sbearssl/sbearssl_sni_policy_init.c
+++ b/src/sbearssl/sbearssl_sni_policy_init.c
@@ -1,6 +1,6 @@
/* ISC license. */
-#include <errno.h>
+#include <string.h>
#include <bearssl.h>
@@ -9,54 +9,11 @@
#include <skalibs/avltree.h>
#include <s6-networking/sbearssl.h>
-
-#define INSTANCE(c) ((sbearssl_sni_policy_context *)(c))
-
-static int choose (br_ssl_server_policy_class const **pctx, br_ssl_server_context const *sc, br_ssl_server_choices *choices)
-{
- sbearssl_sni_policy_context *pol = INSTANCE(pctx) ;
- uint32_t n ;
- char const *servername = br_ssl_engine_get_server_name(&sc->eng) ;
- if (!avltree_search(&pol->map, servername, &n)
- && (!servername[0] || !avltree_search(&pol->map, "", &n)))
- return 0 ;
- avltree_free(&pol->map) ;
- copy_and_free(pol, n) ;
-}
-
-static uint32_t do_keyx (br_ssl_server_policy_class const **pctx, unsigned char *data, size_t *len)
-{
- sbearssl_sni_policy_context *pol = INSTANCE(pctx) ;
- switch (pol->skey.type)
- {
- case BR_KEYTYPE_RSA : return kx_rsa(pol, data, len) ;
- case BR_KEYTYPE_EC : return kx_ec(pol, data, len) ;
- default : return 0 ;
- }
-}
-
-static size_t do_sign (br_ssl_server_policy_class const **pctx, unsigned int algo_id, unsigned char *data, size_t hv_len, size_t len)
-{
- sbearssl_sni_policy_context *pol = INSTANCE(pctx) ;
- switch (pol->skey.type)
- {
- case BR_KEYTYPE_RSA : return sign_rsa(pol, algo_id, data, hv_len, len) ;
- case BR_KEYTYPE_EC : return sign_ec(pol, algo_id, data, hv_len, len) ;
- default : return 0 ;
- }
-}
-
-static br_ssl_server_policy_class const vtable =
-{
- .context_size = sizeof(sbearssl_sni_policy_context),
- .choose = &choose,
- .do_keyx = &do_keyx,
- .do_sign = &do_sign
-} ;
+#include "sbearssl-internal.h"
static void *sbearssl_sni_policy_node_dtok (uint32_t d, void *data)
{
- return ((sbearssl_sni_policy_context *)data)->storage.s + d ;
+ return (void *)genalloc_s(sbearssl_sni_map, &((sbearssl_sni_policy_context *)data)->mapga)[d].servername ;
}
static int sbearssl_sni_policy_node_cmp (void const *a, void const *b, void *data)
@@ -67,9 +24,9 @@ static int sbearssl_sni_policy_node_cmp (void const *a, void const *b, void *dat
void sbearssl_sni_policy_init (sbearssl_sni_policy_context *pol)
{
- pol->vtable = &vtable ;
- pol->map = avltree_zero ;
+ avltree_init(&pol->map, 3, 3, 8, &sbearssl_sni_policy_node_dtok, &sbearssl_sni_policy_node_cmp, pol) ;
pol->mapga = genalloc_zero ;
pol->certga = genalloc_zero ;
- pol->storage = GENALLOC_ZERO ;
+ pol->storage = stralloc_zero ;
+ pol->vtable = &sbearssl_sni_policy_vtable ;
}