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; }