1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
pub fn b32_validation(ptr_input:*const u8,len_input:usize,size_input:usize,ptr_alphabet:*const u8,max_pads:usize,bitmask_pads:u8,rem_len:usize,min_len:usize,max_len:usize)->B32DecodeError{
    if len_input<min_len {return B32DecodeError::InvalidLength;}
    if max_len>min_len && len_input>max_len{return B32DecodeError::InvalidLength;}
    if len_input==0 {return B32DecodeError::Null;}

    if len_input%rem_len!=0 {return B32DecodeError::InvalidLength;}
    let mut index=len_input as isize;
    #[allow(unused_parens)]
    unsafe{while({index-=1;index>0&&(*ptr_input.offset(index)==61)}){}}
    let len_pads=len_input-1-index as usize;
    if len_pads>max_pads {return B32DecodeError::InvalidPadding;}
    if ((len_input-len_pads)*5/8)%size_input!=0{return B32DecodeError::InvalidPadding;}
    if ((bitmask_pads>>len_pads)&0b1)==0 {return B32DecodeError::InvalidPadding;}
    unsafe{while index!=0{
        if *ptr_alphabet.offset(*ptr_input.offset(index) as isize)==255{
            return B32DecodeError::InvalidByte;
        }
        index-=1;
    }}

    return B32DecodeError::Null;
}