#define FALSE 0
typedef unsigned char byte; /* Byte type */
-static byte dtable[256]; /* base64 encode / decode table */
+static byte dtable[SIZ]; /* base64 encode / decode table */
/*
* decode_base64() and encode_base64() are adaptations of code by
}
-
-void decode_base64(char *dest, char *source)
+/*
+ * Convert base64-encoded to binary. Returns the length of the decoded data.
+ * It will stop after reading 'length' bytes.
+ */
+int decode_base64(char *dest, char *source, size_t length)
{
- int i;
+ int i, c;
int dpos = 0;
int spos = 0;
byte a[4], b[4], o[3];
for (i = 0; i < 4; i++) {
- int c = source[spos++];
+ if (spos >= length) {
+ return(dpos);
+ }
+ c = source[spos++];
if (c == 0) {
if (i > 0) {
- return;
+ return(dpos);
}
- return;
+ return(dpos);
}
if (dtable[c] & 0x80) {
/* Ignoring errors: discard invalid character. */
if (i>=3) dest[dpos++] = o[2];
dest[dpos] = 0;
if (i < 3) {
- return;
+ return(dpos);
}
}
}
-
-
/*
* Pack all session info into one easy-to-digest cookie. Healthy and delicious!
*/
void stuff_to_cookie(char *cookie, int session, char *user, char *pass, char *room)
{
- char buf[256];
+ char buf[SIZ];
sprintf(buf, "%d|%s|%s|%s", session, user, pass, room);
encode_base64(cookie, buf);
*/
void cookie_to_stuff(char *cookie, int *session, char *user, char *pass, char *room)
{
- char buf[256];
+ char buf[SIZ];
- decode_base64(buf, cookie);
+ decode_base64(buf, cookie, strlen(cookie));
if (session != NULL)
*session = extract_int(buf, 0);