Browse Source
Issue #27928: Add scrypt (password-based key derivation function) to hashlib module (requires OpenSSL 1.1.0).
Issue #27928: Add scrypt (password-based key derivation function) to hashlib module (requires OpenSSL 1.1.0).
6 changed files with 262 additions and 0 deletions
-
17Doc/library/hashlib.rst
-
6Lib/hashlib.py
-
47Lib/test/test_hashlib.py
-
3Misc/NEWS
-
129Modules/_hashopenssl.c
-
60Modules/clinic/_hashopenssl.c.h
@ -0,0 +1,60 @@ |
|||
/*[clinic input] |
|||
preserve |
|||
[clinic start generated code]*/ |
|||
|
|||
#if (OPENSSL_VERSION_NUMBER > 0x10100000L && !defined(OPENSSL_NO_SCRYPT) && !defined(LIBRESSL_VERSION_NUMBER)) |
|||
|
|||
PyDoc_STRVAR(_hashlib_scrypt__doc__, |
|||
"scrypt($module, /, password, *, salt=None, n=None, r=None, p=None,\n" |
|||
" maxmem=0, dklen=64)\n" |
|||
"--\n" |
|||
"\n" |
|||
"scrypt password-based key derivation function."); |
|||
|
|||
#define _HASHLIB_SCRYPT_METHODDEF \ |
|||
{"scrypt", (PyCFunction)_hashlib_scrypt, METH_VARARGS|METH_KEYWORDS, _hashlib_scrypt__doc__}, |
|||
|
|||
static PyObject * |
|||
_hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt, |
|||
PyObject *n_obj, PyObject *r_obj, PyObject *p_obj, |
|||
long maxmem, long dklen); |
|||
|
|||
static PyObject * |
|||
_hashlib_scrypt(PyObject *module, PyObject *args, PyObject *kwargs) |
|||
{ |
|||
PyObject *return_value = NULL; |
|||
static const char * const _keywords[] = {"password", "salt", "n", "r", "p", "maxmem", "dklen", NULL}; |
|||
static _PyArg_Parser _parser = {"y*|$y*O!O!O!ll:scrypt", _keywords, 0}; |
|||
Py_buffer password = {NULL, NULL}; |
|||
Py_buffer salt = {NULL, NULL}; |
|||
PyObject *n_obj = Py_None; |
|||
PyObject *r_obj = Py_None; |
|||
PyObject *p_obj = Py_None; |
|||
long maxmem = 0; |
|||
long dklen = 64; |
|||
|
|||
if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser, |
|||
&password, &salt, &PyLong_Type, &n_obj, &PyLong_Type, &r_obj, &PyLong_Type, &p_obj, &maxmem, &dklen)) { |
|||
goto exit; |
|||
} |
|||
return_value = _hashlib_scrypt_impl(module, &password, &salt, n_obj, r_obj, p_obj, maxmem, dklen); |
|||
|
|||
exit: |
|||
/* Cleanup for password */ |
|||
if (password.obj) { |
|||
PyBuffer_Release(&password); |
|||
} |
|||
/* Cleanup for salt */ |
|||
if (salt.obj) { |
|||
PyBuffer_Release(&salt); |
|||
} |
|||
|
|||
return return_value; |
|||
} |
|||
|
|||
#endif /* (OPENSSL_VERSION_NUMBER > 0x10100000L && !defined(OPENSSL_NO_SCRYPT) && !defined(LIBRESSL_VERSION_NUMBER)) */ |
|||
|
|||
#ifndef _HASHLIB_SCRYPT_METHODDEF |
|||
#define _HASHLIB_SCRYPT_METHODDEF |
|||
#endif /* !defined(_HASHLIB_SCRYPT_METHODDEF) */ |
|||
/*[clinic end generated code: output=8c5386789f77430a input=a9049054013a1b77]*/ |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue