RRDP has a lot of base64 strings to handle. Because of this adjust the
base64_decode function in tal.c to take a regular string as input.
For now keep the function static, will change that once RRDP is ready.

OK?
-- 
:wq Claudio

Index: tal.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/tal.c,v
retrieving revision 1.28
diff -u -p -r1.28 tal.c
--- tal.c       5 Mar 2021 17:15:19 -0000       1.28
+++ tal.c       25 Mar 2021 08:54:27 -0000
@@ -28,11 +28,11 @@
 #include "extern.h"
 
 static int
-base64_decode(const unsigned char *in, size_t inlen, unsigned char **out,
-   size_t *outlen)
+base64_decode(const unsigned char *in, unsigned char **out, size_t *outlen)
 {
        static EVP_ENCODE_CTX *ctx;
        unsigned char *to;
+       size_t inlen;
        int tolen;
 
        if (ctx == NULL && (ctx = EVP_ENCODE_CTX_new()) == NULL)
@@ -41,6 +41,7 @@ base64_decode(const unsigned char *in, s
        *out = NULL;
        *outlen = 0;
 
+       inlen = strlen(in);
        if (inlen >= INT_MAX - 3)
                return -1;
        tolen = ((inlen + 3) / 4) * 3 + 1;
@@ -81,7 +82,7 @@ tal_parse_buffer(const char *fn, char *b
 {
        char            *nl, *line, *f, *file = NULL;
        unsigned char   *der;
-       size_t           sz, dersz;
+       size_t           dersz;
        int              rc = 0;
        struct tal      *tal = NULL;
        EVP_PKEY        *pkey = NULL;
@@ -147,16 +148,12 @@ tal_parse_buffer(const char *fn, char *b
        /* sort uri lexicographically so https:// is preferred */
        qsort(tal->uri, tal->urisz, sizeof(tal->uri[0]), tal_cmp);
 
-       sz = strlen(buf);
-       if (sz == 0) {
+       /* Now the BASE64-encoded public key. */
+       if ((base64_decode(buf, &der, &dersz)) == -1) {
                warnx("%s: RFC 7730 section 2.1: subjectPublicKeyInfo: "
-                   "zero-length public key", fn);
+                   "bad public key", fn);
                goto out;
        }
-
-       /* Now the BASE64-encoded public key. */
-       if ((base64_decode(buf, sz, &der, &dersz)) == -1)
-               errx(1, "base64 decode");
 
        tal->pkey = der;
        tal->pkeysz = dersz;

Reply via email to