aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Gaynor <alex.gaynor@gmail.com>2013-10-30 14:16:13 -0700
committerAlex Gaynor <alex.gaynor@gmail.com>2013-10-30 14:16:13 -0700
commit02fad008d3e99a49871144b56a692c2237a0d396 (patch)
tree55d76e02136cb46d5e8b795af13487719719903a
parentd5e9c8ddf0e644a740945a29cfa486ba25426300 (diff)
downloadcryptography-02fad008d3e99a49871144b56a692c2237a0d396.tar.gz
cryptography-02fad008d3e99a49871144b56a692c2237a0d396.tar.bz2
cryptography-02fad008d3e99a49871144b56a692c2237a0d396.zip
Started implementating encryption for fernet
-rw-r--r--cryptography/fernet.py36
1 files changed, 36 insertions, 0 deletions
diff --git a/cryptography/fernet.py b/cryptography/fernet.py
new file mode 100644
index 00000000..a0996afc
--- /dev/null
+++ b/cryptography/fernet.py
@@ -0,0 +1,36 @@
+import base64
+import os
+import struct
+import time
+
+from cryptography.hazmat.primitives import padding, hashes
+from cryptography.hazmat.primitives.hmac import HMAC
+from cryptography.hazmat.primitives.block import BlockCipher, ciphers, modes
+
+
+class Fernet(object):
+ def __init__(self, key):
+ super(Fernet, self).__init__()
+ self.signing_key = key[:16]
+ self.encryption_key = key[16:]
+
+ def encrypt(self, data):
+ current_time = int(time.time())
+ iv = os.urandom(16)
+ return self._encrypt_from_parts(data, current_time, iv)
+
+ def _encrypt_from_parts(self, data, current_time, iv):
+ padder = padding.PKCS7(ciphers.AES.block_size).padder()
+ padded_data = padder.update(data) + padder.finalize()
+ encryptor = BlockCipher(ciphers.AES(self.encryption_key), modes.CBC(iv)).encryptor()
+ ciphertext = encryptor.update(padded_data) + encryptor.finalize()
+
+ h = HMAC(self.signing_key, digestmod=hashes.SHA256)
+ h.update(b"\x80")
+ h.update(struct.pack(">Q", current_time))
+ h.update(iv)
+ h.update(ciphertext)
+ hmac = h.digest()
+ return base64.urlsafe_b64encode(
+ b"\x80" + struct.pack(">Q", current_time) + iv + ciphertext + hmac
+ )