Skip to content

Commit f9213c1

Browse files
authored
Merge pull request #197 from jschlyter/feature/symkey_init
Improve SYMKey init (allow setting k and/or key)
2 parents 8aba046 + 5566e4d commit f9213c1

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

src/cryptojwt/jwk/hmac.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ def __init__(
5959
if isinstance(self.k, str):
6060
self.k = self.k.encode("utf-8")
6161
self.key = b64d(bytes(self.k))
62+
elif self.key and not self.k:
63+
self.k = b64e(self.key)
64+
65+
if self.k and self.key:
66+
_k_bytes = self.k.encode("utf-8") if isinstance(self.k, str) else self.k
67+
if _k_bytes != b64e(self.key):
68+
raise JWKException("k and key don't match")
6269

6370
if len(self.key) < 16:
6471
raise UnsupportedAlgorithm("client_secret too short, it should be at least 16 digits")

tests/test_02_jwk.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99
import pytest
1010
from cryptography.hazmat.primitives.asymmetric import ec, ed25519, rsa
1111

12-
from cryptojwt.exception import DeSerializationNotPossible, UnsupportedAlgorithm, WrongUsage
12+
from cryptojwt.exception import (
13+
DeSerializationNotPossible,
14+
JWKException,
15+
UnsupportedAlgorithm,
16+
WrongUsage,
17+
)
1318
from cryptojwt.jwk import JWK, certificate_fingerprint, pem_hash, pems_to_x5c
1419
from cryptojwt.jwk.ec import ECKey, new_ec_key
1520
from cryptojwt.jwk.hmac import SYMKey, new_sym_key, sha256_digest
@@ -656,6 +661,29 @@ def test_dump_load():
656661
assert key.use == "sig"
657662

658663

664+
def test_key_init():
665+
# init with only key
666+
secret1 = os.urandom(16)
667+
k1 = SYMKey(key=secret1, alg="HS256")
668+
assert k1.k == b64e(secret1)
669+
670+
# init with only k (base64 encoded key)
671+
secret2 = os.urandom(16)
672+
k2 = SYMKey(k=b64e(secret2), alg="HS256")
673+
assert k2.key == secret2
674+
675+
# init with different key and k should fail
676+
secret3a = os.urandom(16)
677+
secret3b = os.urandom(16)
678+
with pytest.raises(JWKException):
679+
_ = SYMKey(k=b64e(secret3a), key=secret3b, alg="HS256")
680+
681+
# init with both matching (k as str) - should succeed
682+
secret4 = os.urandom(16)
683+
k4 = SYMKey(k=b64e(secret4).decode("utf-8"), key=secret4, alg="HS256")
684+
assert k4.k == b64e(secret4) or bytes(k4.k, encoding="utf-8") == b64e(secret4)
685+
686+
659687
def test_key_ops():
660688
sk = SYMKey(
661689
key="df34db91c16613deba460752522d28f6ebc8a73d0d9185836270c26b",

0 commit comments

Comments
 (0)