Source code for pyeudiw.trust.handler.direct_trust_sd_jwt_vc
from pyeudiw.tools.utils import cacheable_get_http_url, get_http_url
from pyeudiw.trust.handler._direct_trust_jwk import _DirectTrustJwkHandler
from pyeudiw.trust.model.trust_source import TrustSourceData
from cryptojwt.jwk.jwk import key_from_jwk_dict
from .commons import DEFAULT_HTTPC_PARAMS, DEFAULT_OPENID4VCI_METADATA_ENDPOINT
DEFAULT_SDJWTVC_METADATA_ENDPOINT = "/.well-known/jwt-vc-issuer"
"""Default endpoint where issuer keys used for sd-jwt vc are exposed.
For further reference, see https://www.ietf.org/archive/id/draft-ietf-oauth-sd-jwt-vc-06.html#name-jwt-vc-issuer-metadata
"""
[docs]
class DirectTrustSdJwtVc(_DirectTrustJwkHandler):
"""DirectTrustSdJwtVc is specialization of _DirectTrustJwkHandler
used in the context of sd-jwt for verifiable credentials.
"""
def __init__(
self,
httpc_params: dict = DEFAULT_HTTPC_PARAMS,
jwk_endpoint: str = DEFAULT_SDJWTVC_METADATA_ENDPOINT,
metadata_endpoint: str = DEFAULT_OPENID4VCI_METADATA_ENDPOINT,
cache_ttl: int = 0,
jwks: list[dict] | None = None,
client_id: str = None,
):
super().__init__(
httpc_params=httpc_params,
jwk_endpoint=jwk_endpoint,
cache_ttl=cache_ttl,
jwks=jwks,
client_id=client_id,
)
self.metadata_endpoint = metadata_endpoint
[docs]
def get_metadata(
self, issuer: str, trust_source: TrustSourceData
) -> TrustSourceData:
"""
Fetches the public metadata of an issuer by interrogating a given
endpoint. The endpoint must yield information in a format that
can be transalted to a meaning dictionary (such as json)
:returns: a dictionary of metadata information
"""
url = build_metadata_issuer_endpoint(issuer, self.metadata_endpoint)
if self.cache_ttl == 0:
metadata = get_http_url(
url, self.httpc_params, self.http_async_calls
)[0].json()
else:
metadata = cacheable_get_http_url(
self.cache_ttl, url, self.httpc_params, self.http_async_calls
).json()
if "jwks" in metadata and "keys" in metadata["jwks"]:
metadata["jwks"]["keys"] = [key_from_jwk_dict(jwk).serialize(private=False) for jwk in metadata["jwks"]["keys"]]
trust_source.metadata = metadata
return trust_source
# TODO: do you really think that this should be stay here?
[docs]
def build_metadata_issuer_endpoint(issuer_id: str, endpoint_component: str) -> str:
return f"{issuer_id.rstrip('/')}/{endpoint_component.lstrip('/')}"