Skip to content

Commit 82aa8a8

Browse files
authored
Fix hashing of e.g. access tokens for algorithms utilizing SHA512 (#209)
With 1d97e0e proper support for `EdDsa` was introduced. However, I think these changes introduced a regression for SHA512 based algorithms in function `CoreJsonWebKey::hash_bytes`: If a SHA512 based algorithm is used, the `EdDSA` hashing algorithm is used, which is causing a `Unsupported signature algorithm: EdDSA key must specify `crv` new` error. This changeset introduces some tests on this behavior and fixes the according `match` statement.
1 parent 03b7157 commit 82aa8a8

2 files changed

Lines changed: 78 additions & 2 deletions

File tree

src/core/jwk/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,12 @@ impl JsonWebKey for CoreJsonWebKey {
368368
CoreJwsSigningAlgorithm::HmacSha512
369369
| CoreJwsSigningAlgorithm::RsaSsaPkcs1V15Sha512
370370
| CoreJwsSigningAlgorithm::RsaSsaPssSha512
371-
| CoreJwsSigningAlgorithm::EcdsaP521Sha512
372-
| CoreJwsSigningAlgorithm::EdDsa => match self.crv {
371+
| CoreJwsSigningAlgorithm::EcdsaP521Sha512 => {
372+
let mut hasher = Sha512::new();
373+
hasher.update(bytes);
374+
Ok(hasher.finalize().to_vec())
375+
}
376+
CoreJwsSigningAlgorithm::EdDsa => match self.crv {
373377
None => Err("EdDSA key must specify `crv`".to_string()),
374378
Some(CoreJsonCurveType::Ed25519) => {
375379
let mut hasher = Sha512::new();

src/core/jwk/tests.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,3 +1070,75 @@ fn test_jwks_same_kid_different_alg() {
10701070
assert_eq!(keys.len(), 0);
10711071
}
10721072
}
1073+
1074+
#[test]
1075+
fn test_hash_bytes_eddsa() {
1076+
let ed_key_json = "{
1077+
\"alg\": \"EdDSA\",
1078+
\"crv\": \"Ed25519\",
1079+
\"kty\": \"OKP\",
1080+
\"use\": \"sig\",
1081+
\"x\": \"vZ3CX884r0qNJ18pgXUTvFufK3ZmDzQfvMROJz6CLBc\"
1082+
}";
1083+
1084+
let key: CoreJsonWebKey = serde_json::from_str(ed_key_json).expect("deserialization failed");
1085+
1086+
let hash = key
1087+
.hash_bytes("justatest".as_bytes(), &CoreJwsSigningAlgorithm::EdDsa)
1088+
.expect("Hashing should succeed");
1089+
1090+
assert_eq!(
1091+
"2Kyc+bZQPseH8P3KAdKLu6D7stgxaNFXa/ckQX19RqZu9L65J0RmDlkULYCRExxRO77JW052i6r/+PK4rboICw==",
1092+
BASE64_STANDARD.encode(hash)
1093+
);
1094+
}
1095+
1096+
#[test]
1097+
fn test_hash_bytes_rsa() {
1098+
let rsa_key_json = "{
1099+
\"kty\": \"RSA\",
1100+
\"use\": \"sig\",
1101+
\"kid\": \"2011-04-29\",
1102+
\"n\": \"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhD\
1103+
R1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6C\
1104+
f0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1\
1105+
n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1\
1106+
jF44-csFCur-kEgU8awapJzKnqDKgw\",
1107+
\"e\": \"AQAB\"
1108+
}";
1109+
1110+
let key: CoreJsonWebKey = serde_json::from_str(rsa_key_json).expect("deserialization failed");
1111+
1112+
let hash = key
1113+
.hash_bytes(
1114+
"justatest".as_bytes(),
1115+
&CoreJwsSigningAlgorithm::RsaSsaPkcs1V15Sha256,
1116+
)
1117+
.expect("Hashing should succeed");
1118+
assert_eq!(
1119+
"erGZHWfaQ5DcuMr6dSkOJDb/4VcxpPazY9vMsVB8dLo=",
1120+
BASE64_STANDARD.encode(hash)
1121+
);
1122+
1123+
let hash = key
1124+
.hash_bytes(
1125+
"justatest".as_bytes(),
1126+
&CoreJwsSigningAlgorithm::RsaSsaPkcs1V15Sha384,
1127+
)
1128+
.expect("Hashing should succeed");
1129+
assert_eq!(
1130+
"JeQIV8/xLfKxSCCXuq7Hb/pIxnsjSZJM9+Dx23ah1oiEvra2q0Pm7eSS07gkl+Y2",
1131+
BASE64_STANDARD.encode(hash)
1132+
);
1133+
1134+
let hash = key
1135+
.hash_bytes(
1136+
"justatest".as_bytes(),
1137+
&CoreJwsSigningAlgorithm::RsaSsaPkcs1V15Sha512,
1138+
)
1139+
.expect("Hashing should succeed");
1140+
assert_eq!(
1141+
"2Kyc+bZQPseH8P3KAdKLu6D7stgxaNFXa/ckQX19RqZu9L65J0RmDlkULYCRExxRO77JW052i6r/+PK4rboICw==",
1142+
BASE64_STANDARD.encode(hash)
1143+
);
1144+
}

0 commit comments

Comments
 (0)