Skip to content

Commit 1d95397

Browse files
committed
feat: new unit test + fixes
1 parent f836ea0 commit 1d95397

File tree

4 files changed

+32
-3
lines changed

4 files changed

+32
-3
lines changed

pyeudiw/jwk/parse.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import base64
21
from cryptojwt.jwk.ec import import_ec_key, ECKey
32
from cryptojwt.jwk.rsa import RSAKey, import_rsa_key
43
from ssl import DER_cert_to_PEM_cert
@@ -7,6 +6,8 @@
76
from pyeudiw.jwk.exceptions import InvalidJwk
87
from typing import Optional
98

9+
from pyeudiw.x509.verify import B64DER_cert_to_DER_cert
10+
1011
def _parse_rsa_key(pem: str) -> Optional[JWK]:
1112
try:
1213
public_key = import_rsa_key(pem)
@@ -71,7 +72,7 @@ def parse_b64der(b64der: str) -> JWK:
7172
"""
7273
Parse a (public) key from a Base64 encoded DER certificate.
7374
"""
74-
der = base64.b64decode(b64der)
75+
der = B64DER_cert_to_DER_cert(b64der)
7576
return parse_certificate(der)
7677

7778

pyeudiw/satosa/default/request_handler.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,11 @@ def request_endpoint(self, context: Context, *args) -> Response:
7171
trust_params = self.trust_evaluator.get_jwt_header_trust_parameters(issuer=self.client_id)
7272
_protected_jwt_headers.update(trust_params)
7373

74-
helper = JWSHelper(self.config["metadata_jwks"])
74+
if ("x5c" in _protected_jwt_headers) or ("kid" in _protected_jwt_headers):
75+
# let helper decide which key best fit the given header, otherise use default hich is the first confgiured key
76+
helper = JWSHelper(self.config["metadata_jwks"])
77+
else:
78+
helper = JWSHelper(self.default_metadata_private_jwk)
7579

7680
try:
7781
request_object_jwt = helper.sign(

pyeudiw/tests/jwt/test_sign_verify.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
from cryptography.hazmat.primitives.asymmetric import ec
2+
from cryptojwt.jwk.ec import ECKey
13
import pytest
24

35
from pyeudiw.jwt.jws_helper import DEFAULT_TOKEN_TIME_TOLERANCE, JWSHelper
46
from pyeudiw.jwt.utils import decode_jwt_header
7+
import pyeudiw.tests.x509.test_x509 as test_x509
58
from pyeudiw.tools.utils import iat_now
9+
from pyeudiw.x509.verify import DER_cert_to_B64DER_cert
610

711

812
class TestJWSHeperSelectSigningKey:
@@ -49,6 +53,19 @@ def test_JWSHelper_select_signing_key_infer_kid(self, sign_jwks):
4953
k = signer._select_signing_key(({"kid": exp_k["kid"]}, {}))
5054
assert k == exp_k
5155

56+
def test_JWSHelper_select_signing_key_infer_kid(self, sign_jwks: list[dict]):
57+
new_private_ec_key = ec.generate_private_key(ec.SECP256R1())
58+
x509_der_chain = test_x509.gen_chain(leaf_private_key=new_private_ec_key)
59+
x5c = [DER_cert_to_B64DER_cert(der) for der in x509_der_chain]
60+
new_ec_jwk = ECKey()
61+
new_ec_jwk.load_key(new_private_ec_key)
62+
exp_key: dict = new_ec_jwk.serialize(private=True)
63+
sign_jwks.append(exp_key)
64+
65+
signer = JWSHelper(sign_jwks)
66+
obt_key = signer._select_signing_key(({"x5c": x5c}, {}))
67+
assert exp_key == obt_key
68+
5269
def test_JWSHelper_select_signing_key_unique(self, sign_jwks):
5370
signer = JWSHelper(sign_jwks[0])
5471
exp_k = sign_jwks[0]

pyeudiw/x509/verify.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ def verify_x509_attestation_chain(x5c: list[bytes]) -> bool:
9595
return _verify_x509_certificate_chain(pems)
9696

9797

98+
def DER_cert_to_B64DER_cert(cert: bytes) -> str:
99+
"""
100+
Encode in Base64 a DER certificate.
101+
"""
102+
return base64.b64encode(cert).decode()
103+
104+
98105
def PEM_cert_to_B64DER_cert(cert: str) -> str:
99106
"""
100107
Takes a certificate in ANSII PEM format and returns the base64

0 commit comments

Comments
 (0)