Skip to content

Commit d6a4819

Browse files
committed
fix: allow sha256, sha384, sha512 hash functions in thumbprint, via #30
1 parent 378f9e8 commit d6a4819

File tree

3 files changed

+12
-3
lines changed

3 files changed

+12
-3
lines changed

pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ dev-dependencies = [
5959
"ruff>=0.9.2",
6060
]
6161

62+
[tool.rye.scripts]
63+
test-cov = "pytest --cov --cov-report=html"
64+
6265
[tool.ruff]
6366
line-length = 120
6467

src/joserfc/rfc7517/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class BaseKey(t.Generic[NativePrivateKey, NativePublicKey], metaclass=ABCMeta):
8080
value_registry: t.ClassVar[KeyParameterRegistryDict]
8181
param_registry: t.ClassVar[KeyParameterRegistryDict] = JWK_PARAMETER_REGISTRY
8282
operation_registry: t.ClassVar[KeyOperationRegistryDict] = JWK_OPERATION_REGISTRY
83+
thumbprint_digest_method: t.ClassVar[t.Literal["sha256", "sha384", "sha512"]] = 'sha256'
8384

8485
def __init__(
8586
self,
@@ -159,7 +160,7 @@ def thumbprint(self) -> str:
159160
defined in RFC7638."""
160161
fields = [k for k in self.value_registry if self.value_registry[k].required]
161162
fields.append("kty")
162-
return thumbprint(self.dict_value, fields)
163+
return thumbprint(self.dict_value, fields, self.thumbprint_digest_method)
163164

164165
def as_dict(self, private: t.Optional[bool] = None, **params: t.Any) -> DictKey:
165166
"""Output this key to a JWK format (in dict). By default, it will return

src/joserfc/rfc7638/__init__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44
from ..util import to_bytes, json_dumps, urlsafe_b64encode
55

66

7-
def thumbprint(dict_value: t.Dict[str, t.Any], fields: t.List[str]) -> str:
7+
def thumbprint(
8+
dict_value: t.Dict[str, t.Any],
9+
fields: t.List[str],
10+
digest_method: t.Literal['sha256', 'sha384', 'sha512'] = 'sha256',
11+
) -> str:
812
sorted_fields = sorted(fields)
913

1014
data = OrderedDict()
1115
for k in sorted_fields:
1216
data[k] = dict_value[k]
1317

1418
json_data = json_dumps(data)
15-
digest_data = hashlib.sha256(to_bytes(json_data)).digest()
19+
hash_value = hashlib.new(digest_method, to_bytes(json_data))
20+
digest_data = hash_value.digest()
1621
return urlsafe_b64encode(digest_data).decode("utf-8")

0 commit comments

Comments
 (0)