From aae4e4bf70f17a597b0042910e6c2c050ea927df Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 25 Jul 2014 08:24:03 +0200 Subject: base64: added Curl_base64url_encode() This is now used by the http2 code. It has two different symbols at the end of the base64 table to make the output "url safe". Bug: https://github.com/tatsuhiro-t/nghttp2/issues/62 --- lib/base64.c | 83 ++++++++++++++++++++++++++++++++++++++++--------------- lib/curl_base64.h | 5 +++- lib/http2.c | 4 +-- 3 files changed, 66 insertions(+), 26 deletions(-) (limited to 'lib') diff --git a/lib/base64.c b/lib/base64.c index a941cc73a..9ba9a7d3e 100644 --- a/lib/base64.c +++ b/lib/base64.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -37,9 +37,14 @@ #include "memdebug.h" /* ---- Base64 Encoding/Decoding Table --- */ -static const char table64[]= +static const char base64[]= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +/* The Base 64 encoding with an URL and filename safe alphabet, RFC 4648 + section 5 */ +static const char base64url[]= + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + static size_t decodeQuantum(unsigned char *dest, const char *src) { size_t padding = 0; @@ -54,7 +59,7 @@ static size_t decodeQuantum(unsigned char *dest, const char *src) padding++; } else { - p = table64; + p = base64; while(*p && (*p != *s)) { v++; @@ -167,26 +172,10 @@ CURLcode Curl_base64_decode(const char *src, return CURLE_OK; } -/* - * Curl_base64_encode() - * - * Given a pointer to an input buffer and an input size, encode it and - * return a pointer in *outptr to a newly allocated memory area holding - * encoded data. Size of encoded data is returned in variable pointed by - * outlen. - * - * Input length of 0 indicates input buffer holds a NUL-terminated string. - * - * Returns CURLE_OK on success, otherwise specific error code. Function - * output shall not be considered valid unless CURLE_OK is returned. - * - * When encoded data length is 0, returns NULL in *outptr. - * - * @unittest: 1302 - */ -CURLcode Curl_base64_encode(struct SessionHandle *data, - const char *inputbuff, size_t insize, - char **outptr, size_t *outlen) +static CURLcode base64_encode(const char *table64, + struct SessionHandle *data, + const char *inputbuff, size_t insize, + char **outptr, size_t *outlen) { CURLcode error; unsigned char ibuf[3]; @@ -274,4 +263,52 @@ CURLcode Curl_base64_encode(struct SessionHandle *data, return CURLE_OK; } + +/* + * Curl_base64_encode() + * + * Given a pointer to an input buffer and an input size, encode it and + * return a pointer in *outptr to a newly allocated memory area holding + * encoded data. Size of encoded data is returned in variable pointed by + * outlen. + * + * Input length of 0 indicates input buffer holds a NUL-terminated string. + * + * Returns CURLE_OK on success, otherwise specific error code. Function + * output shall not be considered valid unless CURLE_OK is returned. + * + * When encoded data length is 0, returns NULL in *outptr. + * + * @unittest: 1302 + */ +CURLcode Curl_base64_encode(struct SessionHandle *data, + const char *inputbuff, size_t insize, + char **outptr, size_t *outlen) +{ + return base64_encode(base64, data, inputbuff, insize, outptr, outlen); +} + +/* + * Curl_base64url_encode() + * + * Given a pointer to an input buffer and an input size, encode it and + * return a pointer in *outptr to a newly allocated memory area holding + * encoded data. Size of encoded data is returned in variable pointed by + * outlen. + * + * Input length of 0 indicates input buffer holds a NUL-terminated string. + * + * Returns CURLE_OK on success, otherwise specific error code. Function + * output shall not be considered valid unless CURLE_OK is returned. + * + * When encoded data length is 0, returns NULL in *outptr. + * + * @unittest: + */ +CURLcode Curl_base64url_encode(struct SessionHandle *data, + const char *inputbuff, size_t insize, + char **outptr, size_t *outlen) +{ + return base64_encode(base64url, data, inputbuff, insize, outptr, outlen); +} /* ---- End of Base64 Encoding ---- */ diff --git a/lib/curl_base64.h b/lib/curl_base64.h index 6e200d2ec..92896fec1 100644 --- a/lib/curl_base64.h +++ b/lib/curl_base64.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2014, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -25,6 +25,9 @@ CURLcode Curl_base64_encode(struct SessionHandle *data, const char *inputbuff, size_t insize, char **outptr, size_t *outlen); +CURLcode Curl_base64url_encode(struct SessionHandle *data, + const char *inputbuff, size_t insize, + char **outptr, size_t *outlen); CURLcode Curl_base64_decode(const char *src, unsigned char **outptr, size_t *outlen); diff --git a/lib/http2.c b/lib/http2.c index fcc583dc9..00eb9d9b2 100644 --- a/lib/http2.c +++ b/lib/http2.c @@ -504,8 +504,8 @@ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req, } conn->proto.httpc.binlen = binlen; - result = Curl_base64_encode(conn->data, (const char *)binsettings, binlen, - &base64, &blen); + result = Curl_base64url_encode(conn->data, (const char *)binsettings, binlen, + &base64, &blen); if(result) return result; -- cgit v1.2.3