11//! Base64 encoding support
22
3- use crate :: defs:: { MAP , TAB } ;
3+ use crate :: defs:: { BLOCK_SIZE , MAP_SHA512 , PW_SIZE_SHA512 } ;
44use alloc:: vec:: Vec ;
5+ use base64ct:: { Base64ShaCrypt , Encoding } ;
6+
57
68#[ cfg( feature = "simple" ) ]
79use crate :: errors:: DecodeError ;
810
9- pub fn encode ( source : & [ u8 ] ) -> Vec < u8 > {
10- let mut out: Vec < u8 > = vec ! [ ] ;
11- for entry in & MAP {
12- let mut w: usize = 0 ;
13- if entry. 3 > 2 {
14- w |= source[ entry. 2 as usize ] as usize ;
15- w <<= 8 ;
16- w |= source[ entry. 1 as usize ] as usize ;
17- w <<= 8 ;
18- }
19- w |= source[ entry. 0 as usize ] as usize ;
20-
21- for _ in 0 ..entry. 3 {
22- out. push ( TAB [ ( w & 0x3f ) as usize ] ) ;
23- w >>= 6 ;
24- }
11+ pub fn encode_sha512 ( source : & [ u8 ] ) -> Vec < u8 > {
12+ const BUF_SIZE : usize = PW_SIZE_SHA512 ;
13+ let mut transposed = [ 0u8 ; BLOCK_SIZE ] ;
14+ for ( i, & ti) in MAP_SHA512 . iter ( ) . enumerate ( ) {
15+ transposed[ i] = source[ ti as usize ] ;
2516 }
26- out
17+ let mut buf = [ 0u8 ; BUF_SIZE ] ;
18+ Base64ShaCrypt :: encode ( & transposed, & mut buf) . unwrap ( ) ;
19+ buf. to_vec ( )
2720}
2821
2922#[ cfg( feature = "simple" ) ]
30- pub fn decode ( source : & [ u8 ] ) -> Result < Vec < u8 > , DecodeError > {
31- let mut out: [ u8 ; 64 ] = [ 0 ; 64 ] ;
32-
33- for iter in MAP . iter ( ) . enumerate ( ) {
34- let ( i, entry) = iter;
35-
36- let mut w: usize = 0 ;
37-
38- for k in ( 0 ..entry. 3 ) . rev ( ) {
39- let byte = source. get ( i * 4 + k as usize ) . ok_or ( DecodeError ) ?;
40- let pos = TAB . iter ( ) . position ( |x| x == byte) . ok_or ( DecodeError ) ?;
41- w <<= 6 ;
42- w |= pos as usize ;
43- }
44-
45- out[ entry. 0 as usize ] = ( w & 0xff ) as u8 ;
46- w >>= 8 ;
47-
48- if entry. 3 > 2 {
49- out[ entry. 1 as usize ] = ( w & 0xff ) as u8 ;
50- w >>= 8 ;
51- out[ entry. 2 as usize ] = ( w & 0xff ) as u8 ;
52- }
23+ pub fn decode_sha512 ( source : & [ u8 ] ) -> Result < Vec < u8 > , DecodeError > {
24+ const BUF_SIZE : usize = 86 ;
25+ let mut buf = [ 0u8 ; BUF_SIZE ] ;
26+ Base64ShaCrypt :: decode ( & source, & mut buf) . map_err ( |_| DecodeError ) ?;
27+
28+ let mut transposed = [ 0u8 ; BLOCK_SIZE ] ;
29+ for ( i, & ti) in MAP_SHA512 . iter ( ) . enumerate ( ) {
30+ transposed[ ti as usize ] = buf[ i] ;
5331 }
54-
55- Ok ( out. to_vec ( ) )
32+ Ok ( transposed. to_vec ( ) )
5633}
5734
5835mod tests {
5936 #[ cfg( feature = "simple" ) ]
6037 #[ test]
61- fn test_encode_decode ( ) {
38+ fn test_encode_decode_sha512 ( ) {
6239 let original: [ u8 ; 64 ] = [
6340 0x0b , 0x5b , 0xdf , 0x7d , 0x92 , 0xe2 , 0xfc , 0xbd , 0xab , 0x57 , 0xcb , 0xf3 , 0xe0 , 0x03 ,
6441 0x16 , 0x62 , 0xd3 , 0x6e , 0xa0 , 0x57 , 0x44 , 0x8c , 0xca , 0x35 , 0xec , 0x80 , 0x75 , 0x2a ,
@@ -67,8 +44,8 @@ mod tests {
6744 0x5f , 0xaf , 0x1a , 0xe5 , 0x08 , 0xe7 , 0x7d , 0xd4 ,
6845 ] ;
6946
70- let e = super :: encode ( & original) ;
71- let d = super :: decode ( & e) . unwrap ( ) ;
47+ let e = super :: encode_sha512 ( & original) ;
48+ let d = super :: decode_sha512 ( & e) . unwrap ( ) ;
7249
7350 for i in 0 ..d. len ( ) {
7451 assert_eq ! ( & original[ i] , & d[ i] ) ;
0 commit comments