Skip to content

Commit 6b2b169

Browse files
committed
Added Fernet encrypter.
1 parent cdc11da commit 6b2b169

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

src/cryptojwt/jwe/fernet.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import base64
2+
import os
3+
from typing import Optional
4+
from typing import Union
5+
6+
from cryptography.fernet import Fernet
7+
from cryptography.hazmat.primitives import hashes
8+
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
9+
10+
from cryptojwt import as_unicode
11+
from cryptojwt.jwe import Encrypter
12+
from cryptojwt.utils import as_bytes
13+
14+
15+
class FernetEncrypter(Encrypter):
16+
def __init__(self, password: str, salt: Optional[bytes] = ""):
17+
Encrypter.__init__(self)
18+
if not salt:
19+
salt = os.urandom(16)
20+
else:
21+
salt = as_bytes(salt)
22+
23+
kdf = PBKDF2HMAC(
24+
algorithm=hashes.SHA256(),
25+
length=32,
26+
salt=salt,
27+
iterations=390000)
28+
self.key = base64.urlsafe_b64encode(kdf.derive(as_bytes(password)))
29+
self.core = Fernet(self.key)
30+
31+
def encrypt(self, msg: Union[str, bytes], **kwargs) -> bytes:
32+
text = as_bytes(msg)
33+
# Padding to block size of AES
34+
if len(text) % 16:
35+
text += b" " * (16 - len(text) % 16)
36+
return self.core.encrypt(as_bytes(text))
37+
38+
def decrypt(self, msg: Union[str, bytes], **kwargs) -> bytes:
39+
dec_text = self.core.decrypt(as_bytes(msg))
40+
dec_text = dec_text.rstrip(b" ")
41+
return dec_text

src/cryptojwt/jws/jws.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def sign_compact(self, keys=None, protected=None, **kwargs):
116116
key, xargs, _alg = self.alg_keys(keys, "sig", protected)
117117

118118
if "typ" in self:
119-
xargs["typ"] = self["typ"]
119+
xargs["type"] = self["typ"]
120120

121121
_headers.update(xargs)
122122
jwt = JWSig(**_headers)

tests/test_07_jwe.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from cryptojwt.jwe.exception import NoSuitableEncryptionKey
2222
from cryptojwt.jwe.exception import UnsupportedBitLength
2323
from cryptojwt.jwe.exception import WrongEncryptionAlgorithm
24+
from cryptojwt.jwe.fernet import FernetEncrypter
2425
from cryptojwt.jwe.jwe import JWE
2526
from cryptojwt.jwe.jwe import factory
2627
from cryptojwt.jwe.jwe_ec import JWE_EC
@@ -643,3 +644,14 @@ def test_invalid():
643644
decrypter = JWE(plain, alg="A128KW", enc="A128CBC-HS256")
644645
with pytest.raises(BadSyntax):
645646
decrypter.decrypt("a.b.c.d.e", keys=[encryption_key])
647+
648+
649+
def test_fernet():
650+
encryption_key = SYMKey(use="enc", key="DukeofHazardpass", kid="some-key-id")
651+
652+
encrypter = FernetEncrypter(encryption_key.key)
653+
_token = encrypter.encrypt(plain)
654+
655+
decrypter = encrypter
656+
resp = decrypter.decrypt(_token)
657+
assert resp == plain

0 commit comments

Comments
 (0)