Skip to content

Commit 8e0f72f

Browse files
committed
fix: federation jwks for signing EC
1 parent ed38dfa commit 8e0f72f

3 files changed

Lines changed: 33 additions & 6 deletions

File tree

pyeudiw/satosa/frontends/openid4vci/endpoints/metadata_endpoint.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ def __init__(
3636
config.get("trust", {}).get("federation", {}).get("config", {})
3737
)
3838
super().__init__(config, internal_attributes, base_url, name)
39-
self.metadata_jwks = config.get("metadata_jwks", [])
4039
self.federation_jwks = self.federation_config.get("federation_jwks", [])
4140

4241
def _ensure_credential_issuer(
@@ -106,15 +105,15 @@ def entity_configuration(self) -> str:
106105
"""
107106

108107
data = self.entity_configuration_as_dict
109-
_jwk = self.metadata_jwks[0]
110-
jwshelper = JWSHelper(self.federation_jwks)
108+
_jwk = self.federation_jwks[0]
109+
jwshelper = JWSHelper(_jwk)
111110
return jwshelper.sign(
112111
protected={
113112
"alg": self.federation_config.get("default_sig_alg"),
113+
"kid": _jwk["kid"],
114114
"typ": "entity-statement+jwt",
115115
},
116116
plain_dict=data,
117-
kid_in_header=True
118117
)
119118

120119
def endpoint(self, context: Context) -> Response:

pyeudiw/tests/satosa/frontends/openid4vci/endpoints/test_metadata_endpoint.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import pytest
55
from satosa.context import Context
66

7+
from pyeudiw.jwk import JWK
8+
from pyeudiw.jwt.exceptions import JWSVerificationError
9+
from pyeudiw.jwt.jws_helper import JWSHelper
710
from pyeudiw.jwt.utils import base64_urldecode
811
from pyeudiw.satosa.frontends.openid4vci.endpoints.metadata_endpoint import (
912
MetadataHandler,
@@ -16,6 +19,7 @@
1619
MOCK_CREDENTIAL_CONFIGURATIONS,
1720
MOCK_CREDENTIAL_STORAGE_CONFIG,
1821
MOCK_ENDPOINTS_CONFIG,
22+
MOCK_FEDERATION_JWKS_CONFIG,
1923
MOCK_INTERNAL_ATTRIBUTES,
2024
MOCK_JWT_CONFIG,
2125
MOCK_METADATA_JWKS_CONFIG,
@@ -172,9 +176,20 @@ def test_endpoint_returns_jwt(metadata_handler, context):
172176
jwt_parts = response.message.split(".")
173177
header = json.loads(base64_urldecode(jwt_parts[0]))
174178
assert header["alg"] == "ES256"
175-
assert header["kid"] == MOCK_PYEUDIW_FRONTEND_CONFIG["metadata_jwks"][0]["kid"]
179+
assert header["kid"] == MOCK_FEDERATION_JWKS_CONFIG[0]["kid"]
176180
assert header["typ"] == "entity-statement+jwt"
177181

182+
federation_public_keys = [
183+
JWK(k).as_public_dict() for k in MOCK_FEDERATION_JWKS_CONFIG
184+
]
185+
JWSHelper(federation_public_keys).verify(response.message)
186+
187+
metadata_public_keys = [
188+
JWK(k).as_public_dict() for k in MOCK_METADATA_JWKS_CONFIG
189+
]
190+
with pytest.raises(JWSVerificationError):
191+
JWSHelper(metadata_public_keys).verify(response.message)
192+
178193
payload = json.loads(base64_urldecode(jwt_parts[1]))
179194
_assert_metadata(
180195
MOCK_PYEUDIW_FRONTEND_CONFIG,

pyeudiw/tests/satosa/frontends/openid4vci/mock_openid4vci.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,25 @@
3030
}
3131
]
3232

33+
MOCK_FEDERATION_JWKS_CONFIG = [
34+
{
35+
"kty": "EC",
36+
"d": "bp6MRMWoigS7NWYSgttPh3vG-smWbn10nUt3mozW4z0",
37+
"use": "sig",
38+
"crv": "P-256",
39+
"kid": "DTPMAB4HYvbzjqHDA_7JA558_N7SARKtfwlba1gDUgc",
40+
"x": "fqN7TJfZdx2idFkWKw3jxCshRDNpWpQ-Sntj-Vj6fiA",
41+
"y": "tpS6deZDQFKOmYS8BAZgpcaEzy72kZBdE7OabBnKQo4",
42+
"alg": "ES256",
43+
}
44+
]
45+
3346
MOCK_TRUST_CONFIG = {
3447
"federation": {
3548
"config": {
3649
"entity_configuration_exp": 600,
3750
"default_sig_alg": "ES256",
38-
"federation_jwks": MOCK_METADATA_JWKS_CONFIG,
51+
"federation_jwks": MOCK_FEDERATION_JWKS_CONFIG,
3952
"authority_hints": [],
4053
}
4154
}

0 commit comments

Comments
 (0)