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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
import pytest
from jose import jwk
from jose.backends import AESKey, ECKey, HMACKey, RSAKey
from jose.backends.base import Key
from jose.exceptions import JWKError
hmac_key = {
"kty": "oct",
"kid": "018c0ae5-4d9b-471b-bfd6-eef314bc7037",
"use": "sig",
"alg": "HS256",
"k": "hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg",
}
rsa_key = {
"kty": "RSA",
"kid": "bilbo.baggins@hobbiton.example",
"use": "sig",
"n": "n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw",
"e": "AQAB",
}
ec_key = {
"kty": "EC",
"kid": "bilbo.baggins@hobbiton.example",
"use": "sig",
"crv": "P-521",
"x": "AHKZLLOsCOzz5cY97ewNUajB957y-C-U88c3v13nmGZx6sYl_oJXu9A5RkTKqjqvjyekWF-7ytDyRXYgCF5cj0Kt",
"y": "AdymlHvOiLxXkEhayXQnNCvDX4h9htZaCJN34kfmC6pV5OhQHiraVySsUdaQkAgDPrwQrJmbnX9cwlGfP-HqHZR1",
}
class TestJWK:
def test_interface(self):
key = jwk.Key("key", "ALG")
with pytest.raises(NotImplementedError):
key.sign("")
with pytest.raises(NotImplementedError):
key.verify("", "")
@pytest.mark.skipif(RSAKey is None, reason="RSA is not available")
def test_invalid_hash_alg(self):
with pytest.raises(JWKError):
key = HMACKey(hmac_key, "RS512")
with pytest.raises(JWKError):
key = RSAKey(rsa_key, "HS512")
with pytest.raises(JWKError):
key = ECKey(ec_key, "RS512") # noqa: F841
@pytest.mark.skipif(RSAKey is None, reason="RSA is not available")
def test_invalid_jwk(self):
with pytest.raises(JWKError):
key = HMACKey(rsa_key, "HS256")
with pytest.raises(JWKError):
key = RSAKey(hmac_key, "RS256")
with pytest.raises(JWKError):
key = ECKey(rsa_key, "ES256") # noqa: F841
@pytest.mark.skipif(RSAKey is None, reason="RSA is not available")
def test_RSAKey_errors(self):
rsa_key = {
"kty": "RSA",
"kid": "bilbo.baggins@hobbiton.example",
"use": "sig",
"n": "n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw",
"e": "AQAB",
}
with pytest.raises(JWKError):
key = RSAKey(rsa_key, "HS256")
rsa_key = {
"kty": "oct",
"kid": "bilbo.baggins@hobbiton.example",
"use": "sig",
"n": "n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw",
"e": "AQAB",
}
with pytest.raises(JWKError):
key = RSAKey(rsa_key, "RS256") # noqa: F841
def test_construct_from_jwk(self):
hmac_key = {
"kty": "oct",
"kid": "018c0ae5-4d9b-471b-bfd6-eef314bc7037",
"use": "sig",
"alg": "HS256",
"k": "hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg",
}
key = jwk.construct(hmac_key)
assert isinstance(key, jwk.Key)
def test_construct_EC_from_jwk(self):
key = ECKey(ec_key, algorithm="ES512")
assert isinstance(key, jwk.Key)
def test_construct_from_jwk_missing_alg(self):
hmac_key = {
"kty": "oct",
"kid": "018c0ae5-4d9b-471b-bfd6-eef314bc7037",
"use": "sig",
"k": "hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg",
}
with pytest.raises(JWKError):
key = jwk.construct(hmac_key)
with pytest.raises(JWKError):
key = jwk.construct("key", algorithm="NONEXISTENT") # noqa: F841
def test_get_key(self):
hs_key = jwk.get_key("HS256")
assert hs_key == HMACKey
assert issubclass(hs_key, Key)
if RSAKey is not None:
assert issubclass(jwk.get_key("RS256"), Key)
assert issubclass(jwk.get_key("ES256"), Key)
assert jwk.get_key("NONEXISTENT") is None
@pytest.mark.skipif(AESKey is None, reason="No AES provider")
def test_get_aes_key(self):
assert issubclass(jwk.get_key("A256CBC-HS512"), Key)
def test_register_key(self):
assert jwk.register_key("ALG", jwk.Key)
assert jwk.get_key("ALG") == jwk.Key
with pytest.raises(TypeError):
assert jwk.register_key("ALG", object)
|