(args: Pbkdf2HmacArgs, vm: &VirtualMachine)
| 830 | |
| 831 | #[pyfunction] |
| 832 | fn pbkdf2_hmac(args: Pbkdf2HmacArgs, vm: &VirtualMachine) -> PyResult<PyBytes> { |
| 833 | let name = args.hash_name.as_str().to_lowercase(); |
| 834 | |
| 835 | if args.iterations < 1 { |
| 836 | return Err(vm.new_value_error("iteration value must be greater than 0.")); |
| 837 | } |
| 838 | let rounds = u32::try_from(args.iterations) |
| 839 | .map_err(|_| vm.new_overflow_error("iteration value is too great."))?; |
| 840 | |
| 841 | let dklen: usize = match args.dklen.into_option() { |
| 842 | Some(obj) if vm.is_none(&obj) => { |
| 843 | hash_digest_size(&name).ok_or_else(|| unsupported_hash(&name, vm))? |
| 844 | } |
| 845 | Some(obj) => { |
| 846 | let len: i64 = obj.try_into_value(vm)?; |
| 847 | if len < 1 { |
| 848 | return Err(vm.new_value_error("key length must be greater than 0.")); |
| 849 | } |
| 850 | usize::try_from(len) |
| 851 | .map_err(|_| vm.new_overflow_error("key length is too great."))? |
| 852 | } |
| 853 | None => hash_digest_size(&name).ok_or_else(|| unsupported_hash(&name, vm))?, |
| 854 | }; |
| 855 | |
| 856 | let password_buf = args.password.borrow_buf(); |
| 857 | let salt_buf = args.salt.borrow_buf(); |
| 858 | let mut dk = vec![0u8; dklen]; |
| 859 | |
| 860 | macro_rules! do_pbkdf2 { |
| 861 | ($hash_ty:ty) => {{ |
| 862 | pbkdf2::pbkdf2_hmac::<$hash_ty>(&password_buf, &salt_buf, rounds, &mut dk); |
| 863 | Ok(dk.into()) |
| 864 | }}; |
| 865 | } |
| 866 | |
| 867 | match name.as_str() { |
| 868 | "md5" => do_pbkdf2!(Md5), |
| 869 | "sha1" => do_pbkdf2!(Sha1), |
| 870 | "sha224" => do_pbkdf2!(Sha224), |
| 871 | "sha256" => do_pbkdf2!(Sha256), |
| 872 | "sha384" => do_pbkdf2!(Sha384), |
| 873 | "sha512" => do_pbkdf2!(Sha512), |
| 874 | "sha3_224" => do_pbkdf2!(Sha3_224), |
| 875 | "sha3_256" => do_pbkdf2!(Sha3_256), |
| 876 | "sha3_384" => do_pbkdf2!(Sha3_384), |
| 877 | "sha3_512" => do_pbkdf2!(Sha3_512), |
| 878 | _ => Err(unsupported_hash(&name, vm)), |
| 879 | } |
| 880 | } |
| 881 | |
| 882 | pub trait ThreadSafeDynDigest: DynClone + DynDigest + Sync + Send {} |
| 883 | impl<T> ThreadSafeDynDigest for T where T: DynClone + DynDigest + Sync + Send {} |
nothing calls this directly
no test coverage detected