X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=base64%2Fbase64_enc.c;h=49a7c36874deeda8d9ae23216a253a9ad9c26873;hp=c58899830cd87c71ed3ba29c12a919a109f03483;hb=4b5da1dc27a791b5c448274a3db09cd035b33493;hpb=c9c11514d91b8c19f77d65ac051b998bd99048b0 diff --git a/base64/base64_enc.c b/base64/base64_enc.c index c588998..49a7c36 100644 --- a/base64/base64_enc.c +++ b/base64/base64_enc.c @@ -1,7 +1,7 @@ /* base64_enc.c */ /* * This file is part of the AVR-Crypto-Lib. - * Copyright (C) 2006, 2007, 2008 Daniel Otte (daniel.otte@rub.de) + * Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,7 +17,6 @@ * along with this program. If not, see . */ - /** * base64 encoder (RFC3548) * Author: Daniel Otte @@ -32,86 +31,91 @@ #if 1 #include -char base64_alphabet[64] PROGMEM = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', - 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', - '4', '5', '6', '7', '8', '9', '+', '/' }; +const char base64_alphabet[64] PROGMEM = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/' }; -static -char bit6toAscii(uint8_t a){ - a &= (uint8_t)0x3F; - return pgm_read_byte(base64_alphabet+a); +static +char bit6toAscii(uint8_t a) +{ + a &= (uint8_t) 0x3F; + return pgm_read_byte(base64_alphabet + a); } #else -static -char bit6toAscii(uint8_t a){ - a &= (uint8_t)0x3F; - - if(a<=25){ - return a+'A'; - } else { - if(a<=51){ - return a-26+'a'; - } else { - if(a<=61){ - return a-52+'0'; - } else { - if(a==62){ - return '+'; - } else { - return '/'; /* a == 63 */ - } - } - } - } +static +char bit6toAscii(uint8_t a) { + a &= (uint8_t)0x3F; + + if(a<=25) { + return a+'A'; + } else { + if(a<=51) { + return a-26+'a'; + } else { + if(a<=61) { + return a-52+'0'; + } else { + if(a==62) { + return '+'; + } else { + return '/'; /* a == 63 */ + } + } + } + } } #endif -void base64enc(char* dest,const void* src, uint16_t length){ - uint16_t i,j; - uint8_t a[4]; - for(i=0; i>2; - a[1]= (((((uint8_t*)src)[i*3+0])<<4) | ((((uint8_t*)src)[i*3+1])>>4)) & 0x3F; - a[2]= (((((uint8_t*)src)[i*3+1])<<2) | ((((uint8_t*)src)[i*3+2])>>6)) & 0x3F; - a[3]= (((uint8_t*)src)[i*3+2]) & 0x3F; - for(j=0; j<4; ++j){ - *dest++=bit6toAscii(a[j]); - } - } - /* now we do the rest */ - switch(length%3){ - case 0: - break; - case 1: - a[0]=(((uint8_t*)src)[i*3+0])>>2; - a[1]=((((uint8_t*)src)[i*3+0])<<4)&0x3F; - *dest++ = bit6toAscii(a[0]); - *dest++ = bit6toAscii(a[1]); - *dest++ = '='; - *dest++ = '='; - break; - case 2: - a[0]= (((uint8_t*)src)[i*3+0])>>2; - a[1]= (((((uint8_t*)src)[i*3+0])<<4) | ((((uint8_t*)src)[i*3+1])>>4)) & 0x3F; - a[2]= ((((uint8_t*)src)[i*3+1])<<2) & 0x3F; - *dest++ = bit6toAscii(a[0]); - *dest++ = bit6toAscii(a[1]); - *dest++ = bit6toAscii(a[2]); - *dest++ = '='; - break; - default: /* this will not happen! */ - break; - } -/* finalize: */ - *dest='\0'; +void base64enc(char *dest, const void *src, uint16_t length) +{ + uint16_t i, j; + uint8_t a[4]; + for (i = 0; i < length / 3; ++i) { + a[0] = (((uint8_t*) src)[i * 3 + 0]) >> 2; + a[1] = (((((uint8_t*) src)[i * 3 + 0]) << 4) + | ((((uint8_t*) src)[i * 3 + 1]) >> 4)) & 0x3F; + a[2] = (((((uint8_t*) src)[i * 3 + 1]) << 2) + | ((((uint8_t*) src)[i * 3 + 2]) >> 6)) & 0x3F; + a[3] = (((uint8_t*) src)[i * 3 + 2]) & 0x3F; + for (j = 0; j < 4; ++j) { + *dest++ = bit6toAscii(a[j]); + } + } + /* now we do the rest */ + switch (length % 3) { + case 0: + break; + case 1: + a[0] = (((uint8_t*) src)[i * 3 + 0]) >> 2; + a[1] = ((((uint8_t*) src)[i * 3 + 0]) << 4) & 0x3F; + *dest++ = bit6toAscii(a[0]); + *dest++ = bit6toAscii(a[1]); + *dest++ = '='; + *dest++ = '='; + break; + case 2: + a[0] = (((uint8_t*) src)[i * 3 + 0]) >> 2; + a[1] = (((((uint8_t*) src)[i * 3 + 0]) << 4) + | ((((uint8_t*) src)[i * 3 + 1]) >> 4)) & 0x3F; + a[2] = ((((uint8_t*) src)[i * 3 + 1]) << 2) & 0x3F; + *dest++ = bit6toAscii(a[0]); + *dest++ = bit6toAscii(a[1]); + *dest++ = bit6toAscii(a[2]); + *dest++ = '='; + break; + default: /* this will not happen! */ + break; + } + /* finalize: */ + *dest = '\0'; }