mirror of
https://github.com/warmcat/libwebsockets.git
synced 2025-03-09 00:00:04 +01:00
base64: add URL encode variant and allow decode of it
The URL encode variant is the same, except + is coded as -, and / is coded as _ to avoid urlencoding when the base64 is used in situations that are urlencoded.
This commit is contained in:
parent
46ee0713de
commit
2639b276f4
2 changed files with 35 additions and 3 deletions
|
@ -5269,6 +5269,18 @@ lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
|
|||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
|
||||
/**
|
||||
* lws_b64_encode_string_url(): encode a string into base 64
|
||||
*
|
||||
* \param in: incoming buffer
|
||||
* \param in_len: length of incoming buffer
|
||||
* \param out: result buffer
|
||||
* \param out_size: length of result buffer
|
||||
*
|
||||
* Encodes a string using b64 with the "URL" variant (+ -> -, and / -> _)
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_b64_encode_string_url(const char *in, int in_len, char *out, int out_size);
|
||||
/**
|
||||
* lws_b64_decode_string(): decode a string from base 64
|
||||
*
|
||||
|
|
|
@ -42,13 +42,16 @@
|
|||
#include <string.h>
|
||||
#include "private-libwebsockets.h"
|
||||
|
||||
static const char encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
static const char encode_orig[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
"abcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
static const char encode_url[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
"abcdefghijklmnopqrstuvwxyz0123456789-_";
|
||||
static const char decode[] = "|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW"
|
||||
"$$$$$$XYZ[\\]^_`abcdefghijklmnopq";
|
||||
|
||||
LWS_VISIBLE int
|
||||
lws_b64_encode_string(const char *in, int in_len, char *out, int out_size)
|
||||
static int
|
||||
_lws_b64_encode_string(const char *encode, const char *in, int in_len,
|
||||
char *out, int out_size)
|
||||
{
|
||||
unsigned char triple[3];
|
||||
int i;
|
||||
|
@ -89,6 +92,18 @@ lws_b64_encode_string(const char *in, int in_len, char *out, int out_size)
|
|||
return done;
|
||||
}
|
||||
|
||||
LWS_VISIBLE int
|
||||
lws_b64_encode_string(const char *in, int in_len, char *out, int out_size)
|
||||
{
|
||||
return _lws_b64_encode_string(encode_orig, in, in_len, out, out_size);
|
||||
}
|
||||
|
||||
LWS_VISIBLE int
|
||||
lws_b64_encode_string_url(const char *in, int in_len, char *out, int out_size)
|
||||
{
|
||||
return _lws_b64_encode_string(encode_url, in, in_len, out, out_size);
|
||||
}
|
||||
|
||||
/*
|
||||
* returns length of decoded string in out, or -1 if out was too small
|
||||
* according to out_size
|
||||
|
@ -109,6 +124,11 @@ lws_b64_decode_string(const char *in, char *out, int out_size)
|
|||
c = 0;
|
||||
while (*in && !v) {
|
||||
c = v = *in++;
|
||||
/* support the url base64 variant too */
|
||||
if (v == '-')
|
||||
c = v = '+';
|
||||
if (v == '_')
|
||||
c = v = '/';
|
||||
v = (v < 43 || v > 122) ? 0 : decode[v - 43];
|
||||
if (v)
|
||||
v = (v == '$') ? 0 : v - 61;
|
||||
|
|
Loading…
Add table
Reference in a new issue