blob: 15071718eef3ea8e276aa0fe492fcbd26fe1f721 [file] [log] [blame]
Alex Gaynor2b21b122013-10-31 09:39:25 -07001import base64
Alex Gaynorfb8adfc2013-10-31 14:16:24 -07002import calendar
3import json
4import os
5
6import iso8601
7
8import pytest
Alex Gaynor2b21b122013-10-31 09:39:25 -07009
Alex Gaynorde36e902013-10-31 10:10:44 -070010import six
11
Alex Gaynor38f34552013-10-31 14:50:00 -070012from cryptography.fernet import Fernet, InvalidToken
Alex Gaynor2b21b122013-10-31 09:39:25 -070013
14
Alex Gaynor38f34552013-10-31 14:50:00 -070015def json_parametrize(keys, fname):
16 path = os.path.join(os.path.dirname(__file__), "vectors", "fernet", fname)
Alex Gaynorfb8adfc2013-10-31 14:16:24 -070017 with open(path) as f:
18 data = json.load(f)
19 return pytest.mark.parametrize(keys, [
20 tuple([entry[k] for k in keys])
21 for entry in data
22 ])
Alex Gaynor2b21b122013-10-31 09:39:25 -070023
Alex Gaynorfb8adfc2013-10-31 14:16:24 -070024
25class TestFernet(object):
26 @json_parametrize(
Alex Gaynor38f34552013-10-31 14:50:00 -070027 ("secret", "now", "iv", "src", "token"), "generate.json",
Alex Gaynorfb8adfc2013-10-31 14:16:24 -070028 )
29 def test_generate(self, secret, now, iv, src, token):
30 f = Fernet(base64.urlsafe_b64decode(secret.encode("ascii")))
31 actual_token = f._encrypt_from_parts(
32 src.encode("ascii"),
33 calendar.timegm(iso8601.parse_date(now).utctimetuple()),
34 b"".join(map(six.int2byte, iv))
Alex Gaynor5e87dfd2013-10-31 09:46:03 -070035 )
Alex Gaynorfb8adfc2013-10-31 14:16:24 -070036 assert actual_token == token
37
38 @json_parametrize(
Alex Gaynor38f34552013-10-31 14:50:00 -070039 ("secret", "now", "src", "ttl_sec", "token"), "verify.json",
Alex Gaynorfb8adfc2013-10-31 14:16:24 -070040 )
41 def test_verify(self, secret, now, src, ttl_sec, token):
42 f = Fernet(base64.urlsafe_b64decode(secret.encode("ascii")))
43 payload = f.decrypt(
44 token.encode("ascii"),
45 ttl=ttl_sec,
46 current_time=calendar.timegm(iso8601.parse_date(now).utctimetuple())
47 )
48 assert payload == src
Alex Gaynor38f34552013-10-31 14:50:00 -070049
50 @json_parametrize(("secret", "token", "now", "ttl_sec"), "invalid.json")
51 def test_invalid(self, secret, token, now, ttl_sec):
52 f = Fernet(base64.urlsafe_b64decode(secret.encode("ascii")))
53 with pytest.raises(InvalidToken):
54 f.decrypt(
55 token.encode("ascii"),
56 ttl=ttl_sec,
57 current_time=calendar.timegm(iso8601.parse_date(now).utctimetuple())
58 )
59
60 def test_unicode(self):
61 f = Fernet(b"\x00" * 32)
62 with pytest.raises(TypeError):
63 f.encrypt(six.u(""))
64 with pytest.raises(TypeError):
65 f.decrypt(six.u(""))