6 from ctypes import c_char_p, c_int, c_void_p, create_string_buffer
7 from ctypescrypto import libcrypto
8 from ctypescrypto.digest import DigestType
9 from ctypescrypto.exception import LibCryptoError
13 def pbkdf2(password, salt, outlen, digesttype="sha1", iterations=2000):
15 Interface to PKCS5_PBKDF2_HMAC function
18 @param password - password to derive key from
19 @param salt - random salt to use for key derivation
20 @param outlen - number of bytes to derive
21 @param digesttype - name of digest to use to use (default sha1)
22 @param iterations - number of iterations to use
24 @returns outlen bytes of key material derived from password and salt
26 dgst = DigestType(digesttype)
27 out = create_string_buffer(outlen)
28 res = libcrypto.PKCS5_PBKDF2_HMAC(password, len(password), salt, len(salt),
29 iterations, dgst.digest, outlen, out)
31 raise LibCryptoError("error computing PBKDF2")
34 libcrypto.PKCS5_PBKDF2_HMAC.argtypes = (c_char_p, c_int, c_char_p, c_int, c_int,
35 c_void_p, c_int, c_char_p)
36 libcrypto.PKCS5_PBKDF2_HMAC.restupe = c_int