Skip to content

Commit 5236302

Browse files
committed
fix: enc_alg_supported, enc_enc_supported
1 parent 74547b8 commit 5236302

File tree

4 files changed

+51
-6
lines changed

4 files changed

+51
-6
lines changed

pyeudiw/openid4vp/authorization_response.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
AuthorizeResponsePayload,
1414
ResponseMode,
1515
)
16+
from pyeudiw.jwt.utils import decode_jwt_header
1617

1718

1819
_S = TypeVar('_S', str, list[str])
@@ -117,8 +118,15 @@ class DirectPostJwtJweParser(AuthorizationResponseParser):
117118
https://openid.net/specs/openid-4-verifiable-presentations-1_0.html#name-response-mode-direct_postjw
118119
"""
119120

120-
def __init__(self, jwe_decryptor: JWEHelper):
121+
def __init__(
122+
self,
123+
jwe_decryptor: JWEHelper,
124+
enc_alg_supported: list[str] = [],
125+
enc_enc_supported: list[str] = []
126+
) -> None:
121127
self.jwe_decryptor = jwe_decryptor
128+
self.enc_alg_supported = enc_alg_supported
129+
self.enc_enc_supported = enc_enc_supported
122130

123131
def parse_and_validate(
124132
self, context: satosa.context.Context
@@ -131,6 +139,19 @@ def parse_and_validate(
131139
raise AuthRespParsingException(
132140
"invalid data in direct_post.jwt request body", e
133141
)
142+
143+
header = decode_jwt_header(resp_data.response)
144+
145+
if not header.get("alg") in self.enc_alg_supported:
146+
raise AuthRespValidationException(
147+
"invalid data in direct_post.jwt: alg not supported"
148+
)
149+
150+
if not header.get("enc") in self.enc_enc_supported:
151+
raise AuthRespValidationException(
152+
"invalid data in direct_post.jwt: enc not supported"
153+
)
154+
134155
try:
135156
payload = self.jwe_decryptor.decrypt(resp_data.response)
136157
except JWEDecryptionError as e:

pyeudiw/satosa/default/response_handler.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,11 @@ def _parse_authorization_response(
341341
return parser.parse_and_validate(context)
342342
case ResponseMode.direct_post_jwt:
343343
jwe_decrypter = JWEHelper(self.config["metadata_jwks"])
344-
parser = DirectPostJwtJweParser(jwe_decrypter)
344+
parser = DirectPostJwtJweParser(
345+
jwe_decrypter,
346+
self.config["jwt"].get("enc_alg_supported", []),
347+
self.config["jwt"].get("enc_enc_supported", [])
348+
)
345349
return parser.parse_and_validate(context)
346350
case ResponseMode.error:
347351
return ErrorResponsePayload(**context.request)

pyeudiw/tests/openid4vp/test_authorization_response.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
AuthRespParsingException,
1212
AuthRespValidationException,
1313
)
14+
from pyeudiw.tests.settings import CONFIG
1415

1516

1617
@pytest.fixture
@@ -115,7 +116,7 @@ def test_direct_post_response_bad_parse_case():
115116

116117
def test_direct_post_jwt_jwe_parser_good_case(jwe_helper):
117118

118-
parser = DirectPostJwtJweParser(jwe_helper)
119+
parser = DirectPostJwtJweParser(jwe_helper, CONFIG["jwt"].get("enc_alg_supported", []), CONFIG["jwt"].get("enc_enc_supported", []))
119120

120121
ctx = satosa.context.Context()
121122
ctx.request_method = "POST"
@@ -144,7 +145,7 @@ def test_direct_post_jwt_jwe_parser_good_case(jwe_helper):
144145

145146
def test_direct_post_jwt_jwe_parser_bad_parse_case(jwe_helper):
146147
# case 0: bad method
147-
parser = DirectPostJwtJweParser(jwe_helper)
148+
parser = DirectPostJwtJweParser(jwe_helper, CONFIG["jwt"].get("enc_alg_supported", []), CONFIG["jwt"].get("enc_enc_supported", []))
148149

149150
ctx = satosa.context.Context()
150151
ctx.request_method = "GET"
@@ -192,7 +193,7 @@ def test_direct_post_jwt_jwe_parser_bad_parse_case(jwe_helper):
192193

193194

194195
def test_direct_post_jwt_jwe_parser_bad_validation_case(jwe_helper):
195-
parser = DirectPostJwtJweParser(jwe_helper)
196+
parser = DirectPostJwtJweParser(jwe_helper, CONFIG["jwt"].get("enc_alg_supported", []), CONFIG["jwt"].get("enc_enc_supported", []))
196197

197198
wrong_public_key = {
198199
"kid": "ybmSufrnl3Cu6OrNcsOF_g95g5zShf2aKpg59PMcMm8",

pyeudiw/tests/settings.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,26 @@
8282
"expiration_time": 120,
8383
"logo_path": "pyeudiw/tests/satosa/static/logo.png",
8484
},
85-
"jwt": {"default_sig_alg": "ES256", "default_exp": 6},
85+
"jwt": {
86+
"default_sig_alg": "ES256",
87+
"default_exp": 6,
88+
"enc_alg_supported": [
89+
"RSA-OAEP",
90+
"RSA-OAEP-256",
91+
"ECDH-ES",
92+
"ECDH-ES+A128KW",
93+
"ECDH-ES+A192KW",
94+
"ECDH-ES+A256KW"
95+
],
96+
"enc_enc_supported": [
97+
"A128CBC-HS256",
98+
"A192CBC-HS384",
99+
"A256CBC-HS512",
100+
"A128GCM",
101+
"A192GCM",
102+
"A256GCM",
103+
],
104+
},
86105
"authorization": {
87106
"url_scheme": "haip", # haip://
88107
"scopes": ["pid-sd-jwt:unique_id+given_name+family_name"],

0 commit comments

Comments
 (0)