summaryrefslogtreecommitdiff
path: root/src/bcrypt
diff options
context:
space:
mode:
authorPaul Kehrer <paul.l.kehrer@gmail.com>2015-06-11 22:53:44 -0500
committerPaul Kehrer <paul.l.kehrer@gmail.com>2015-06-11 22:53:44 -0500
commitfe0835805f96539ca1ac737513bb019ddbbfee03 (patch)
treeb113c6a1b45246c430123c9c57a0a10319b88540 /src/bcrypt
parentf3280bda0a560fbf4d401bd8edf89b974a97b39c (diff)
parent15cc4edec22c455f467fa97bb27aa6bbb9deffb4 (diff)
downloadpy-bcrypt-git-fe0835805f96539ca1ac737513bb019ddbbfee03.tar.gz
Merge pull request #43 from dstufft/cffi1.0
Migrate to using CFFI 1.0
Diffstat (limited to 'src/bcrypt')
-rw-r--r--src/bcrypt/__about__.py35
-rw-r--r--src/bcrypt/__init__.py65
2 files changed, 100 insertions, 0 deletions
diff --git a/src/bcrypt/__about__.py b/src/bcrypt/__about__.py
new file mode 100644
index 0000000..d526fe7
--- /dev/null
+++ b/src/bcrypt/__about__.py
@@ -0,0 +1,35 @@
+# Author:: Donald Stufft (<donald@stufft.io>)
+# Copyright:: Copyright (c) 2013 Donald Stufft
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import unicode_literals
+
+__all__ = [
+ "__title__", "__summary__", "__uri__", "__version__", "__author__",
+ "__email__", "__license__", "__copyright__",
+]
+
+__title__ = "bcrypt"
+__summary__ = "Modern password hashing for your software and your servers"
+__uri__ = "https://github.com/pyca/bcrypt/"
+
+__version__ = "1.1.1"
+
+__author__ = "Donald Stufft"
+__email__ = "donald@stufft.io"
+
+__license__ = "Apache License, Version 2.0"
+__copyright__ = "Copyright 2013 Donald Stufft"
diff --git a/src/bcrypt/__init__.py b/src/bcrypt/__init__.py
new file mode 100644
index 0000000..10f860b
--- /dev/null
+++ b/src/bcrypt/__init__.py
@@ -0,0 +1,65 @@
+# Author:: Donald Stufft (<donald@stufft.io>)
+# Copyright:: Copyright (c) 2013 Donald Stufft
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+from __future__ import absolute_import
+from __future__ import division
+
+import os
+
+import six
+
+from bcrypt import _bcrypt
+
+from .__about__ import (
+ __author__, __copyright__, __email__, __license__, __summary__, __title__,
+ __uri__, __version__,
+)
+
+
+__all__ = [
+ "__title__", "__summary__", "__uri__", "__version__", "__author__",
+ "__email__", "__license__", "__copyright__",
+ "gensalt", "hashpw",
+]
+
+
+def gensalt(rounds=12):
+ salt = os.urandom(16)
+ output = _bcrypt.ffi.new("unsigned char[]", 30)
+
+ retval = _bcrypt.lib.crypt_gensalt_rn(
+ b"$2a$", rounds, salt, len(salt), output, len(output),
+ )
+
+ if not retval:
+ raise ValueError("Invalid rounds")
+
+ return _bcrypt.ffi.string(output)
+
+
+def hashpw(password, salt):
+ if isinstance(password, six.text_type) or isinstance(salt, six.text_type):
+ raise TypeError("Unicode-objects must be encoded before hashing")
+
+ if b"\x00" in password:
+ raise ValueError("password may not contain NUL bytes")
+
+ hashed = _bcrypt.ffi.new("unsigned char[]", 128)
+ retval = _bcrypt.lib.crypt_rn(password, salt, hashed, len(hashed))
+
+ if not retval:
+ raise ValueError("Invalid salt")
+
+ return _bcrypt.ffi.string(hashed)