Exemple #1
0
/*
 * Decode base64 str, outputting data to buffer
 * at data of length size.  Return length of
 * decoded data written or -1 on error or overflow.
 */
int
vpnconnect_base64_decode(const char *str, void *data, int size)
{
    const char *p;
    unsigned char *q;
    unsigned char *e = NULL;

    q = data;
    if (size >= 0)
      e = q + size;
    for (p = str; *p && (*p == '=' || strchr(base64_chars, *p)); p += 4) {
	unsigned int val = token_decode(p);
	unsigned int marker = (val >> 24) & 0xff;
	if (val == DECODE_ERROR)
	    return -1;
	if (e && q >= e)
	  return -1;
	*q++ = (val >> 16) & 0xff;
	if (marker < 2)
	  {
	    if (e && q >= e)
	      return -1;
	    *q++ = (val >> 8) & 0xff;
	  }
	if (marker < 1)
	  {
	    if (e && q >= e)
	      return -1;
	    *q++ = val & 0xff;
	  }
    }
    return q - (unsigned char *) data;
}
Exemple #2
0
// TODO: Implement an S3Data class.
S3_PRIVATE int s3_base64_decode(const char *str, void *data) {
    const char *p;
    unsigned char *q;

    q = data;
    for (p = str; *p && (*p == '=' || strchr(base64_chars, *p)); p += 4) {
	unsigned int val = token_decode(p);
	unsigned int marker = (val >> 24) & 0xff;
	if (val == DECODE_ERROR)
	    return -1;
	*q++ = (val >> 16) & 0xff;
	if (marker < 2)
	    *q++ = (val >> 8) & 0xff;
	if (marker < 1)
	    *q++ = val & 0xff;
    }
    return q - (unsigned char *) data;
}
Exemple #3
0
int
base64_decode(const char *str, void *data)
{
    const char     *p;
    unsigned char  *q;
    unsigned int    size;

    q = data;
    size = strlen(str);
    for (p = str; *p && (*p == '=' || is_base64_char(*p)); p += 4, size -= 4)
    {
        unsigned int val = token_decode(p, size);
        unsigned int marker = (val >> 24) & 0xff;
        
        if (val == DECODE_ERROR)
            return -1;
        *q++ = (val >> 16) & 0xff;
        if (marker < 2)
            *q++ = (val >> 8) & 0xff;
        if (marker < 1)
            *q++ = val & 0xff;
    }
    return q - (unsigned char *) data;
}