Skip to content

Commit a1b9611

Browse files
authored
Merge pull request #179 from IdentityPython/salt_length
Salt length
2 parents 2b735fe + b0f39a5 commit a1b9611

File tree

4 files changed

+46
-14
lines changed

4 files changed

+46
-14
lines changed

src/cryptojwt/jws/pss.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ class PSSSigner(Signer):
1414
def __init__(self, algorithm="SHA256"):
1515
if algorithm == "SHA256":
1616
self.hash_algorithm = hashes.SHA256
17+
self.salt_length = 32
1718
elif algorithm == "SHA384":
1819
self.hash_algorithm = hashes.SHA384
20+
self.salt_length = 48
1921
elif algorithm == "SHA512":
2022
self.hash_algorithm = hashes.SHA512
23+
self.salt_length = 64
2124
else:
2225
raise Unsupported(f"algorithm: {algorithm}")
2326

@@ -36,7 +39,7 @@ def sign(self, msg, key):
3639
digest,
3740
padding.PSS(
3841
mgf=padding.MGF1(self.hash_algorithm()),
39-
salt_length=padding.PSS.MAX_LENGTH,
42+
salt_length=self.salt_length,
4043
),
4144
utils.Prehashed(self.hash_algorithm()),
4245
)
@@ -48,7 +51,7 @@ def verify(self, msg, signature, key):
4851
4952
:param msg: The message
5053
:param sig: A signature
51-
:param key: A ec.EllipticCurvePublicKey to use for the verification.
54+
:param key: A rsa._RSAPublicKey to use for the verification.
5255
:raises: BadSignature if the signature can't be verified.
5356
:return: True
5457
"""
@@ -58,7 +61,7 @@ def verify(self, msg, signature, key):
5861
msg,
5962
padding.PSS(
6063
mgf=padding.MGF1(self.hash_algorithm()),
61-
salt_length=padding.PSS.MAX_LENGTH,
64+
salt_length=self.salt_length,
6265
),
6366
self.hash_algorithm(),
6467
)

src/cryptojwt/key_bundle.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,23 +1134,24 @@ def sort_func(kd1, kd2):
11341134

11351135
def order_key_defs(key_def):
11361136
"""
1137-
Sort a set of key definitions. A key definition that defines more then
1138-
one usage type are splitted into as many definitions as the number of
1137+
Sort a set of key definitions. A key definition that defines more than
1138+
one usage type are split into as many definitions as the number of
11391139
usage types specified. One key definition per usage type.
11401140
1141-
:param key_def: A set of key definitions
1141+
:param key_def: A set of key definitions. List of dictionaries
11421142
:return: The set of definitions as a sorted list
11431143
"""
11441144
_int = []
11451145
# First make sure all defs only reference one usage
11461146
for _def in key_def:
1147-
if len(_def["use"]) > 1:
1148-
for _use in _def["use"]:
1149-
_kd = _def.copy()
1150-
_kd["use"] = _use
1151-
_int.append(_kd)
1152-
else:
1153-
_int.append(_def)
1147+
if isinstance(_def, dict):
1148+
if len(_def["use"]) > 1:
1149+
for _use in _def["use"]:
1150+
_kd = _def.copy()
1151+
_kd["use"] = _use
1152+
_int.append(_kd)
1153+
else:
1154+
_int.append(_def)
11541155

11551156
_int.sort(key=cmp_to_key(sort_func))
11561157

src/cryptojwt/key_jar.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,9 @@ def _add_key(
492492
if _add_keys[0] not in keys:
493493
keys.append(_add_keys[0])
494494
elif allow_missing_kid:
495-
keys.extend(_add_keys)
495+
for _key in _add_keys:
496+
if _key and _key not in keys:
497+
keys.append(_key)
496498
elif no_kid_issuer:
497499
try:
498500
allowed_kids = no_kid_issuer[issuer_id]

tests/test_21_pss.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import json
2+
3+
import pytest
4+
5+
from cryptojwt.jwk.jwk import key_from_jwk_dict
6+
from cryptojwt.jws.jws import JWS
7+
import test_vector
8+
9+
10+
@pytest.mark.parametrize("alg", ["RS256", "RS384", "RS512", "PS256", "PS384", "PS512"])
11+
def test_jws_rsa_signer_and_verifier(alg):
12+
_jwk_dict = json.loads(test_vector.json_rsa_priv_key)
13+
_key = key_from_jwk_dict(_jwk_dict)
14+
_key.alg = alg
15+
_key.add_kid()
16+
17+
json_header_rsa = json.loads(test_vector.test_header_rsa)
18+
json_header_rsa["alg"] = alg
19+
20+
# Sign
21+
jws = JWS(msg=test_vector.test_payload, **json_header_rsa)
22+
signed_token = jws.sign_compact([_key])
23+
24+
# Verify
25+
verifier = JWS(alg=[alg])
26+
assert verifier.verify_compact(signed_token, [_key])

0 commit comments

Comments
 (0)