From a64958a8805b6ef1758293697e63309d3ddbe4ae Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 30 Mar 2011 17:49:01 +1100 Subject: lib/util Move base64 functions into lib/util/base64.c Andrew Bartlett --- source3/lib/util_str.c | 115 ------------------------------------------------- 1 file changed, 115 deletions(-) (limited to 'source3/lib') diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index 7b50717463..0f75f45bf1 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -1515,121 +1515,6 @@ void ipstr_list_free(char* ipstr_list) SAFE_FREE(ipstr_list); } -static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -/** - * Decode a base64 string into a DATA_BLOB - simple and slow algorithm - **/ -DATA_BLOB base64_decode_data_blob(const char *s) -{ - int bit_offset, byte_offset, idx, i, n; - DATA_BLOB decoded = data_blob(s, strlen(s)+1); - unsigned char *d = decoded.data; - char *p; - - n=i=0; - - while (*s && (p=strchr_m(b64,*s))) { - idx = (int)(p - b64); - byte_offset = (i*6)/8; - bit_offset = (i*6)%8; - d[byte_offset] &= ~((1<<(8-bit_offset))-1); - if (bit_offset < 3) { - d[byte_offset] |= (idx << (2-bit_offset)); - n = byte_offset+1; - } else { - d[byte_offset] |= (idx >> (bit_offset-2)); - d[byte_offset+1] = 0; - d[byte_offset+1] |= (idx << (8-(bit_offset-2))) & 0xFF; - n = byte_offset+2; - } - s++; i++; - } - - if ((n > 0) && (*s == '=')) { - n -= 1; - } - - /* fix up length */ - decoded.length = n; - return decoded; -} - -/** - * Decode a base64 string in-place - wrapper for the above - **/ -void base64_decode_inplace(char *s) -{ - DATA_BLOB decoded = base64_decode_data_blob(s); - - if ( decoded.length != 0 ) { - memcpy(s, decoded.data, decoded.length); - - /* null terminate */ - s[decoded.length] = '\0'; - } else { - *s = '\0'; - } - - data_blob_free(&decoded); -} - -/** - * Encode a base64 string into a talloc()ed string caller to free. - * - * From SQUID: adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c - * with adjustments - **/ - -char *base64_encode_data_blob(TALLOC_CTX *mem_ctx, DATA_BLOB data) -{ - int bits = 0; - int char_count = 0; - size_t out_cnt, len, output_len; - char *result; - - if (!data.length || !data.data) - return NULL; - - out_cnt = 0; - len = data.length; - output_len = data.length * 2 + 4; /* Account for closing bytes. 4 is - * random but should be enough for - * the = and \0 */ - result = TALLOC_ARRAY(mem_ctx, char, output_len); /* get us plenty of space */ - SMB_ASSERT(result != NULL); - - while (len--) { - int c = (unsigned char) *(data.data++); - bits += c; - char_count++; - if (char_count == 3) { - result[out_cnt++] = b64[bits >> 18]; - result[out_cnt++] = b64[(bits >> 12) & 0x3f]; - result[out_cnt++] = b64[(bits >> 6) & 0x3f]; - result[out_cnt++] = b64[bits & 0x3f]; - bits = 0; - char_count = 0; - } else { - bits <<= 8; - } - } - if (char_count != 0) { - bits <<= 16 - (8 * char_count); - result[out_cnt++] = b64[bits >> 18]; - result[out_cnt++] = b64[(bits >> 12) & 0x3f]; - if (char_count == 1) { - result[out_cnt++] = '='; - result[out_cnt++] = '='; - } else { - result[out_cnt++] = b64[(bits >> 6) & 0x3f]; - result[out_cnt++] = '='; - } - } - result[out_cnt] = '\0'; /* terminate */ - return result; -} - /* read a SMB_BIG_UINT from a string */ uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr) { -- cgit