MCPcopy Index your code
hub / github.com/RustPython/RustPython / pbkdf2_hmac

Function pbkdf2_hmac

crates/stdlib/src/hashlib.rs:832–880  ·  view source on GitHub ↗
(args: Pbkdf2HmacArgs, vm: &VirtualMachine)

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 10

hash_digest_sizeFunction · 0.85
unsupported_hashFunction · 0.85
to_lowercaseMethod · 0.80
into_optionMethod · 0.80
ok_or_elseMethod · 0.80
try_into_valueMethod · 0.80
ErrClass · 0.50
as_strMethod · 0.45
is_noneMethod · 0.45
borrow_bufMethod · 0.45

Tested by

no test coverage detected