Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}