mirror of
https://github.com/moparisthebest/pacman
synced 2024-10-31 15:45:03 -04:00
d59324c8ff
A look at what this does on 64 bit systems since we were using the unnecessarily large 'unsigned long' type before even though it was 64 bits wide: $ ~/bin/bloat-o-meter libalpm.so.old lib/libalpm/.libs/libalpm.so add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-10412 (-10412) function old new delta md5_finish 370 356 -14 sha2_finish 547 531 -16 md5_process 3762 2643 -1119 sha2_process 20356 11093 -9263 The code size is nearly halved in the sha2 case (44% smaller code size), and md5 gets a nice size reduction (27% smaller) as well. We also move base64 code to <stdint.h> types as well; we can use 'uint32_t' rather than 'unsigned long' for at least two variables in the decode function. This doesn't net the same size benefit as the hash code case, but it is more proper. Signed-off-by: Dan McGee <dan@archlinux.org>
195 lines
5.2 KiB
C
195 lines
5.2 KiB
C
/*
|
|
* RFC 1521 base64 encoding/decoding
|
|
*
|
|
* Copyright (C) 2006-2010, Brainspark B.V.
|
|
*
|
|
* This file is part of PolarSSL (http://www.polarssl.org)
|
|
* Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* 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
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
/*
|
|
* Pacman Notes:
|
|
*
|
|
* Taken from the PolarSSL project at www.polarssl.org under terms of the
|
|
* GPL. This is from version 0.14.2 of the library, and has been modified
|
|
* as following, which may be helpful for future updates:
|
|
* * remove "polarssl/config.h" include
|
|
* * change include from "polarssl/base64.h" to "base64.h"
|
|
* * removal of SELF_TEST code
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "base64.h"
|
|
|
|
static const unsigned char base64_enc_map[64] =
|
|
{
|
|
'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 const unsigned char base64_dec_map[128] =
|
|
{
|
|
127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
|
|
127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
|
|
127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
|
|
127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
|
|
127, 127, 127, 62, 127, 127, 127, 63, 52, 53,
|
|
54, 55, 56, 57, 58, 59, 60, 61, 127, 127,
|
|
127, 64, 127, 127, 127, 0, 1, 2, 3, 4,
|
|
5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
|
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
|
|
25, 127, 127, 127, 127, 127, 127, 26, 27, 28,
|
|
29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
|
|
39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
|
|
49, 50, 51, 127, 127, 127, 127, 127
|
|
};
|
|
|
|
#if 0
|
|
/*
|
|
* Encode a buffer into base64 format
|
|
*/
|
|
int base64_encode( unsigned char *dst, size_t *dlen,
|
|
const unsigned char *src, size_t slen )
|
|
{
|
|
size_t i, n;
|
|
int C1, C2, C3;
|
|
unsigned char *p;
|
|
|
|
if( slen == 0 )
|
|
return( 0 );
|
|
|
|
n = (slen << 3) / 6;
|
|
|
|
switch( (slen << 3) - (n * 6) )
|
|
{
|
|
case 2: n += 3; break;
|
|
case 4: n += 2; break;
|
|
default: break;
|
|
}
|
|
|
|
if( *dlen < n + 1 )
|
|
{
|
|
*dlen = n + 1;
|
|
return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL );
|
|
}
|
|
|
|
n = (slen / 3) * 3;
|
|
|
|
for( i = 0, p = dst; i < n; i += 3 )
|
|
{
|
|
C1 = *src++;
|
|
C2 = *src++;
|
|
C3 = *src++;
|
|
|
|
*p++ = base64_enc_map[(C1 >> 2) & 0x3F];
|
|
*p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
|
|
*p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F];
|
|
*p++ = base64_enc_map[C3 & 0x3F];
|
|
}
|
|
|
|
if( i < slen )
|
|
{
|
|
C1 = *src++;
|
|
C2 = ((i + 1) < slen) ? *src++ : 0;
|
|
|
|
*p++ = base64_enc_map[(C1 >> 2) & 0x3F];
|
|
*p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
|
|
|
|
if( (i + 1) < slen )
|
|
*p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];
|
|
else *p++ = '=';
|
|
|
|
*p++ = '=';
|
|
}
|
|
|
|
*dlen = p - dst;
|
|
*p = 0;
|
|
|
|
return( 0 );
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* Decode a base64-formatted buffer
|
|
*/
|
|
int base64_decode( unsigned char *dst, size_t *dlen,
|
|
const unsigned char *src, size_t slen )
|
|
{
|
|
size_t i, n;
|
|
uint32_t j, x;
|
|
unsigned char *p;
|
|
|
|
for( i = j = n = 0; i < slen; i++ )
|
|
{
|
|
if( ( slen - i ) >= 2 &&
|
|
src[i] == '\r' && src[i + 1] == '\n' )
|
|
continue;
|
|
|
|
if( src[i] == '\n' )
|
|
continue;
|
|
|
|
if( src[i] == '=' && ++j > 2 )
|
|
return( POLARSSL_ERR_BASE64_INVALID_CHARACTER );
|
|
|
|
if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
|
|
return( POLARSSL_ERR_BASE64_INVALID_CHARACTER );
|
|
|
|
if( base64_dec_map[src[i]] < 64 && j != 0 )
|
|
return( POLARSSL_ERR_BASE64_INVALID_CHARACTER );
|
|
|
|
n++;
|
|
}
|
|
|
|
if( n == 0 )
|
|
return( 0 );
|
|
|
|
n = ((n * 6) + 7) >> 3;
|
|
|
|
if( *dlen < n )
|
|
{
|
|
*dlen = n;
|
|
return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL );
|
|
}
|
|
|
|
for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )
|
|
{
|
|
if( *src == '\r' || *src == '\n' )
|
|
continue;
|
|
|
|
j -= ( base64_dec_map[*src] == 64 );
|
|
x = (x << 6) | ( base64_dec_map[*src] & 0x3F );
|
|
|
|
if( ++n == 4 )
|
|
{
|
|
n = 0;
|
|
if( j > 0 ) *p++ = (unsigned char)( x >> 16 );
|
|
if( j > 1 ) *p++ = (unsigned char)( x >> 8 );
|
|
if( j > 2 ) *p++ = (unsigned char)( x );
|
|
}
|
|
}
|
|
|
|
*dlen = p - dst;
|
|
|
|
return( 0 );
|
|
}
|