static PyObject * bcrypt_hashpw(PyObject *self, PyObject *args, PyObject *kw_args) { static char *keywords[] = { "password", "salt", NULL }; char *password = NULL, *salt = NULL; char *ret; char *password_copy; char *salt_copy; if (!PyArg_ParseTupleAndKeywords(args, kw_args, "ss:hashpw", keywords, &password, &salt)) return NULL; password_copy = strdup(password); salt_copy = strdup(salt); Py_BEGIN_ALLOW_THREADS; ret = pybc_bcrypt(password_copy, salt_copy); Py_END_ALLOW_THREADS; bzero(password_copy, strlen(password_copy)); free(password_copy); bzero(salt_copy, strlen(salt_copy)); free(salt_copy); if ((ret == NULL) || strcmp(ret, ":") == 0) { PyErr_SetString(PyExc_ValueError, "Invalid salt"); return NULL; } return PyString_FromString(ret); }
SEXP R_hashpw(SEXP password_, SEXP salt_){ if(!isString(password_) || !isString(salt_)) error("Password and salt arguments must be strings"); const char *password = CHAR(STRING_ELT(password_, 0)); const char *salt = CHAR(STRING_ELT(salt_, 0)); int password_len = LENGTH(STRING_ELT(password_, 0)); int salt_len = LENGTH(STRING_ELT(salt_, 0)); if (password_len < 0 || password_len > 65535) error("unsupported password length"); if (salt_len < 0 || salt_len > 65535) error("unsupported salt length"); char hashed[128]; int ret = pybc_bcrypt(password, salt, hashed, sizeof(hashed)); if (ret != 0 || strlen(hashed) < 32) error("Invalid salt"); return mkString(hashed); }