File: test_json.py

package info (click to toggle)
joserfc 1.6.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,480 kB
  • sloc: python: 8,096; makefile: 18
file content (90 lines) | stat: -rw-r--r-- 3,470 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from unittest import TestCase
from joserfc import jwe
from joserfc.jwe import GeneralJSONEncryption, FlattenedJSONEncryption
from joserfc.jwk import KeySet, RSAKey, ECKey, OctKey
from joserfc.errors import (
    DecodeError,
    ConflictAlgorithmError,
    InvalidKeyTypeError,
)


class TestJWEJSON(TestCase):
    rsa_key = RSAKey.generate_key()
    ec_key = ECKey.generate_key()

    def test_multiple_recipients_with_key(self):
        obj = GeneralJSONEncryption({"enc": "A128CBC-HS256"}, b"i")
        obj.add_recipient({"alg": "RSA-OAEP"}, self.rsa_key)
        obj.add_recipient({"alg": "ECDH-ES+A128KW"}, self.ec_key)
        value = jwe.encrypt_json(obj, None)
        self.assertIn("recipients", value)
        self.assertEqual(len(value["recipients"]), 2)

    def test_multiple_recipients_without_key(self):
        key1 = RSAKey.generate_key(parameters={"kid": "rsa"})
        key2 = ECKey.generate_key(parameters={"kid": "ec"})
        obj = GeneralJSONEncryption({"enc": "A128CBC-HS256"}, b"i")
        obj.add_recipient({"alg": "RSA-OAEP", "kid": "rsa"})
        obj.add_recipient({"alg": "ECDH-ES+A128KW", "kid": "ec"})
        value = jwe.encrypt_json(obj, KeySet([key1, key2]))
        self.assertIn("recipients", value)
        self.assertEqual(len(value["recipients"]), 2)

    def test_multiple_recipients_with_direct_mode(self):
        obj = GeneralJSONEncryption({"enc": "A128CBC-HS256"}, b"i")
        obj.add_recipient({"alg": "dir"}, OctKey.generate_key())
        obj.add_recipient({"alg": "RSA-OAEP"}, self.rsa_key)
        self.assertRaises(
            ConflictAlgorithmError,
            jwe.encrypt_json,
            obj,
            None,
        )

    def test_with_aad(self):
        obj = GeneralJSONEncryption({"enc": "A128CBC-HS256"}, b"i", aad=b"foo")
        obj.add_recipient({"alg": "RSA-OAEP"}, self.rsa_key)
        value = jwe.encrypt_json(obj, None)
        obj1 = jwe.decrypt_json(value, self.rsa_key)
        self.assertEqual(obj1.aad, b"foo")

    def test_decode_multiple_recipients(self):
        obj = GeneralJSONEncryption({"enc": "A128CBC-HS256"}, b"i")
        obj.add_recipient({"alg": "RSA-OAEP"}, self.rsa_key)
        obj.add_recipient({"alg": "ECDH-ES+A128KW"}, self.ec_key)
        value = jwe.encrypt_json(obj, None)
        self.assertRaises(
            InvalidKeyTypeError,
            jwe.decrypt_json,
            value,
            self.rsa_key,
        )
        registry = jwe.JWERegistry(verify_all_recipients=False)
        obj1 = jwe.decrypt_json(value, self.rsa_key, registry=registry)
        self.assertEqual(obj1.plaintext, b"i")

        key3 = OctKey.generate_key()
        self.assertRaises(
            DecodeError,
            jwe.decrypt_json,
            value,
            key3,
            registry=registry,
        )

    def test_flattened_encryption(self):
        key = OctKey.generate_key(128)
        protected = {"enc": "A128CBC-HS256"}
        plaintext = b"hello world"
        obj0 = FlattenedJSONEncryption(protected, plaintext)
        obj0.add_recipient({"alg": "A128KW"})
        value = jwe.encrypt_json(obj0, key)
        obj1 = jwe.decrypt_json(value, key)
        self.assertEqual(obj1.plaintext, plaintext)

        obj2 = FlattenedJSONEncryption(protected, plaintext)
        obj2.add_recipient({"alg": "A128KW"}, key)
        value = jwe.encrypt_json(obj0, None)
        obj3 = jwe.decrypt_json(value, key)
        self.assertEqual(obj3.plaintext, plaintext)