2010-02-03 03:07:07 +03:00
# include <linux/errno.h>
2010-06-12 03:58:48 +04:00
int ceph_armor ( char * dst , const char * src , const char * end ) ;
int ceph_unarmor ( char * dst , const char * src , const char * end ) ;
2010-02-03 03:07:07 +03:00
/*
* base64 encode / decode .
*/
2010-06-12 03:58:48 +04:00
static const char * pem_key =
" ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ " ;
2010-02-03 03:07:07 +03:00
static int encode_bits ( int c )
{
return pem_key [ c ] ;
}
static int decode_bits ( char c )
{
if ( c > = ' A ' & & c < = ' Z ' )
return c - ' A ' ;
if ( c > = ' a ' & & c < = ' z ' )
return c - ' a ' + 26 ;
if ( c > = ' 0 ' & & c < = ' 9 ' )
return c - ' 0 ' + 52 ;
if ( c = = ' + ' )
return 62 ;
if ( c = = ' / ' )
return 63 ;
if ( c = = ' = ' )
return 0 ; /* just non-negative, please */
return - EINVAL ;
}
int ceph_armor ( char * dst , const char * src , const char * end )
{
int olen = 0 ;
int line = 0 ;
while ( src < end ) {
unsigned char a , b , c ;
a = * src + + ;
* dst + + = encode_bits ( a > > 2 ) ;
if ( src < end ) {
b = * src + + ;
* dst + + = encode_bits ( ( ( a & 3 ) < < 4 ) | ( b > > 4 ) ) ;
if ( src < end ) {
c = * src + + ;
* dst + + = encode_bits ( ( ( b & 15 ) < < 2 ) |
( c > > 6 ) ) ;
* dst + + = encode_bits ( c & 63 ) ;
} else {
* dst + + = encode_bits ( ( b & 15 ) < < 2 ) ;
* dst + + = ' = ' ;
}
} else {
* dst + + = encode_bits ( ( ( a & 3 ) < < 4 ) ) ;
* dst + + = ' = ' ;
* dst + + = ' = ' ;
}
olen + = 4 ;
line + = 4 ;
if ( line = = 64 ) {
line = 0 ;
* ( dst + + ) = ' \n ' ;
olen + + ;
}
}
return olen ;
}
int ceph_unarmor ( char * dst , const char * src , const char * end )
{
int olen = 0 ;
while ( src < end ) {
int a , b , c , d ;
2011-02-02 22:39:32 +03:00
if ( src [ 0 ] = = ' \n ' ) {
2010-02-03 03:07:07 +03:00
src + + ;
2011-02-02 22:39:32 +03:00
continue ;
}
2010-02-03 03:07:07 +03:00
if ( src + 4 > end )
return - EINVAL ;
a = decode_bits ( src [ 0 ] ) ;
b = decode_bits ( src [ 1 ] ) ;
c = decode_bits ( src [ 2 ] ) ;
d = decode_bits ( src [ 3 ] ) ;
if ( a < 0 | | b < 0 | | c < 0 | | d < 0 )
return - EINVAL ;
* dst + + = ( a < < 2 ) | ( b > > 4 ) ;
if ( src [ 2 ] = = ' = ' )
return olen + 1 ;
* dst + + = ( ( b & 15 ) < < 4 ) | ( c > > 2 ) ;
if ( src [ 3 ] = = ' = ' )
return olen + 2 ;
* dst + + = ( ( c & 3 ) < < 6 ) | d ;
olen + = 3 ;
src + = 4 ;
}
return olen ;
}