]> www.infradead.org Git - users/dwmw2/openconnect.git/commitdiff
Add line length argument to buf_append_base64()
authorDavid Woodhouse <dwmw2@infradead.org>
Mon, 17 May 2021 11:26:54 +0000 (12:26 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Mon, 17 May 2021 11:27:42 +0000 (12:27 +0100)
The multicert support will want to use this.

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
digest.c
dtls.c
f5.c
gssapi.c
http-auth.c
ntlm.c
openconnect-internal.h
sspi.c

index 06dca75b8507580858592d4a7d549a2ff4307bf2..a860ab87721a207e34453699b036a188425507b0 100644 (file)
--- a/digest.c
+++ b/digest.c
@@ -191,7 +191,7 @@ int digest_authorization(struct openconnect_info *vpninfo, int proxy,
        if (openconnect_random(&cnonce_random, sizeof(cnonce_random)))
                goto err;
        cnonce = buf_alloc();
-       buf_append_base64(cnonce, cnonce_random, sizeof(cnonce_random));
+       buf_append_base64(cnonce, cnonce_random, sizeof(cnonce_random), 0);
        if (buf_error(cnonce))
                goto err;
 
diff --git a/dtls.c b/dtls.c
index 1b1c86c2d31a52687eab4d135b43e930164affe5..63df51b96e8051e83334e04aef4a64b3c8843375 100644 (file)
--- a/dtls.c
+++ b/dtls.c
@@ -85,7 +85,7 @@ char *openconnect_bin2base64(const char *prefix, const uint8_t *data, unsigned l
        buf = buf_alloc();
        if (prefix)
                buf_append(buf, "%s", prefix);
-       buf_append_base64(buf, data, len);
+       buf_append_base64(buf, data, len, 0);
 
        if (!buf_error(buf)) {
                p = buf->data;
diff --git a/f5.c b/f5.c
index a6460c6b30f5df6008ce00b26203674f5eb5a5d8..df26d2f8f20889cde2832e87bee64290a987d540 100644 (file)
--- a/f5.c
+++ b/f5.c
@@ -586,7 +586,7 @@ static int f5_configure(struct openconnect_info *vpninfo)
        buf_truncate(reqbuf);
        buf_append(reqbuf, "GET /myvpn?sess=%s&hdlc_framing=%s&ipv4=%s&ipv6=%s&Z=%s&hostname=",
                   sid, hdlc?"yes":"no", ipv4?"yes":"no", ipv6?"yes":"no", ur_z);
-       buf_append_base64(reqbuf, vpninfo->localname, strlen(vpninfo->localname));
+       buf_append_base64(reqbuf, vpninfo->localname, strlen(vpninfo->localname), 0);
        buf_append(reqbuf, " HTTP/1.1\r\n");
        struct oc_vpn_option *saved_cookies = vpninfo->cookies;
        vpninfo->cookies = NULL; /* hide cookies */
index 762caea3477cf47c0215d881ee1a9dd7b6ca0078..6f9171494d2a1e017a55379ae83cc9ea2dff69a3 100644 (file)
--- a/gssapi.c
+++ b/gssapi.c
@@ -135,7 +135,7 @@ int gssapi_authorization(struct openconnect_info *vpninfo, int proxy,
                return in.value ? -EAGAIN : -ENOENT;
        }
        buf_append(hdrbuf, "%sAuthorization: Negotiate ", proxy ? "Proxy-" : "");
-       buf_append_base64(hdrbuf, out.value, out.length);
+       buf_append_base64(hdrbuf, out.value, out.length, 0);
        buf_append(hdrbuf, "\r\n");
 
        gss_release_buffer(&minor, &out);
index 7eb89c3d37ebae6772b78b1733ce3ce45761b3e1..8c3270b77769fa1c38aa41efd3b71aa076ba56d4 100644 (file)
@@ -110,7 +110,8 @@ static const char b64_table[] = {
        'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
 };
 
-void buf_append_base64(struct oc_text_buf *buf, const void *bytes, int len)
+void buf_append_base64(struct oc_text_buf *buf, const void *bytes, int len,
+                      int line_len)
 {
        const unsigned char *in = bytes;
        int hibits;
@@ -118,10 +119,28 @@ void buf_append_base64(struct oc_text_buf *buf, const void *bytes, int len)
        if (!buf || buf->error)
                return;
 
-       if (buf_ensure_space(buf, (4 * (len + 2) / 3) + 1))
+       unsigned int needed = (4 * (len + 2) / 3) + 1;
+       if (line_len)
+               needed += needed / line_len;
+
+       if (needed >= (unsigned)(INT_MAX - buf->pos)) {
+               buf->error = -E2BIG;
+               return;
+       }
+
+       if (buf_ensure_space(buf, needed))
                return;
 
+       int ll = 0;
        while (len > 0) {
+               if (line_len) {
+                       ll += 4;
+                       if (ll >= line_len) {
+                               ll = 0;
+                               buf->data[buf->pos++] = '\n';
+                       }
+               }
+
                buf->data[buf->pos++] = b64_table[in[0] >> 2];
                hibits = (in[0] << 4) & 0x30;
                if (len == 1) {
@@ -174,7 +193,7 @@ static int basic_authorization(struct openconnect_info *vpninfo, int proxy,
                return buf_free(text);
 
        buf_append(hdrbuf, "%sAuthorization: Basic ", proxy ? "Proxy-" : "");
-       buf_append_base64(hdrbuf, text->data, text->pos);
+       buf_append_base64(hdrbuf, text->data, text->pos, 0);
        buf_append(hdrbuf, "\r\n");
 
        memset(text->data, 0, text->pos);
diff --git a/ntlm.c b/ntlm.c
index 61497a50fade033e5f5184ddee09bbe1cec553dc..d7e249c423cd5b3602f1ca5daeca70cc8c089cd1 100644 (file)
--- a/ntlm.c
+++ b/ntlm.c
@@ -89,7 +89,7 @@ static int ntlm_sspi(struct openconnect_info *vpninfo, int proxy,
        }
 
        buf_append(buf, "%sAuthorization: NTLM ", proxy ? "Proxy-" : "");
-       buf_append_base64(buf, out_token.pvBuffer, out_token.cbBuffer);
+       buf_append_base64(buf, out_token.pvBuffer, out_token.cbBuffer, 0);
        buf_append(buf, "\r\n");
 
        FreeContextBuffer(out_token.pvBuffer);
@@ -971,7 +971,7 @@ static int ntlm_manual_challenge(struct openconnect_info *vpninfo, int proxy,
                return buf_free(resp);
 
        buf_append(hdrbuf, "%sAuthorization: NTLM ", proxy ? "Proxy-" : "");
-       buf_append_base64(hdrbuf, resp->data, resp->pos);
+       buf_append_base64(hdrbuf, resp->data, resp->pos, 0);
        buf_append(hdrbuf, "\r\n");
 
        buf_free(resp);
index fb0a580b055e716848398c887c6f47fc18bac0b0..754c7159e10fa6f6904561388f22739f3c2cb35a 100644 (file)
@@ -1324,7 +1324,7 @@ int handle_redirect(struct openconnect_info *vpninfo);
 void http_common_headers(struct openconnect_info *vpninfo, struct oc_text_buf *buf);
 
 /* http-auth.c */
-void buf_append_base64(struct oc_text_buf *buf, const void *bytes, int len);
+void buf_append_base64(struct oc_text_buf *buf, const void *bytes, int len, int line_len);
 void *openconnect_base64_decode(int *len, const char *in);
 void clear_auth_states(struct openconnect_info *vpninfo,
                       struct http_auth_state *auth_states, int reset);
diff --git a/sspi.c b/sspi.c
index 24b2eb19884d6cb6907b0e731eb12112f85e470c..f0edbb0f49bcc9caa45a7a3339d8d5da23ab8b4a 100644 (file)
--- a/sspi.c
+++ b/sspi.c
@@ -120,7 +120,7 @@ int gssapi_authorization(struct openconnect_info *vpninfo, int proxy,
        }
 
        buf_append(hdrbuf, "%sAuthorization: Negotiate ", proxy ? "Proxy-" : "");
-       buf_append_base64(hdrbuf, out_token.pvBuffer, out_token.cbBuffer);
+       buf_append_base64(hdrbuf, out_token.pvBuffer, out_token.cbBuffer, 0);
        buf_append(hdrbuf, "\r\n");
 
        FreeContextBuffer(out_token.pvBuffer);