Skip to content

Commit 638afbc

Browse files
Issue #33 fix different algorithms matching (#35)
* Fix bug in verification of presentation with key binding that uses different algorithm. Resolves #33 Signed-off-by: Aziz Mukhtorjonov <[email protected]> Co-authored-by: Abdulbois <[email protected]>
1 parent 526b22a commit 638afbc

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

src/verifier.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ impl SDJWTVerifier {
7373
verifier.verified_claims = verifier.extract_sd_claims()?;
7474

7575
if let (Some(expected_aud), Some(expected_nonce)) = (&expected_aud, &expected_nonce) {
76+
let sign_alg = verifier.sd_jwt_engine.unverified_input_key_binding_jwt
77+
.as_ref()
78+
.and_then(|value| {
79+
SDJWTCommon::decode_header_and_get_sign_algorithm(&value)
80+
});
81+
7682
verifier.verify_key_binding_jwt(
7783
expected_aud.to_owned(),
7884
expected_nonce.to_owned(),
@@ -391,6 +397,17 @@ mod tests {
391397
const PRIVATE_ISSUER_ED25519_PEM: &str = "-----BEGIN PRIVATE KEY-----\nMFECAQEwBQYDK2VwBCIEIF93k6rxZ8W38cm0rOwfGdH+YY3k10hP+7gd0falPLg0\ngSEAdW31QyWzfed4EPcw1rYuUa1QU+fXEL0HhdAfYZRkihc=\n-----END PRIVATE KEY-----\n";
392398
const PUBLIC_ISSUER_ED25519_PEM: &str = "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAdW31QyWzfed4EPcw1rYuUa1QU+fXEL0HhdAfYZRkihc=\n-----END PUBLIC KEY-----\n";
393399

400+
// EdDSA (Ed25519)
401+
const HOLDER_KEY_ED25519: &str = "-----BEGIN PRIVATE KEY-----\nMC4CAQAwBQYDK2VwBCIEIOeIDnHHMoPCUTiq206gR+FdCdNtc31SzF1nKX31hvhd\n-----END PRIVATE KEY-----";
402+
403+
const HOLDER_JWK_KEY_ED25519: &str = r#"{
404+
"alg": "EdDSA",
405+
"crv": "Ed25519",
406+
"kid": "52128f2e-900e-414e-81c3-0b5f86f0f7b3",
407+
"kty": "OKP",
408+
"x": "24QLWXJ18wtbg3k_MDGhGM17Xh39UftuxbwJZzRLzkA"
409+
}"#;
410+
394411
#[test]
395412
fn verify_full_presentation() {
396413
let user_claims = json!({
@@ -728,4 +745,75 @@ mod tests {
728745
.verified_claims;
729746
assert_eq!(user_claims, verified_claims);
730747
}
748+
#[test]
749+
fn verify_presentation_when_sd_jwt_uses_es256_and_key_binding_uses_eddsa() {
750+
751+
let user_claims = json!({
752+
"address": {
753+
"street_address": "Schulstr. 12",
754+
"locality": "Schulpforta",
755+
"region": "Sachsen-Anhalt",
756+
"country": "DE"
757+
},
758+
"exp": 1883000000,
759+
"iat": 1683000000,
760+
"iss": "https://example.com/issuer",
761+
"sub": "6c5c0a49-b589-431d-bae7-219122a9ec2c",
762+
763+
});
764+
765+
let private_issuer_bytes = PRIVATE_ISSUER_PEM.as_bytes();
766+
let issuer_key = EncodingKey::from_ec_pem(private_issuer_bytes).unwrap();
767+
768+
let mut issuer = SDJWTIssuer::new(issuer_key, Some("ES256".to_string()));
769+
770+
let sd_jwt = issuer.issue_sd_jwt(
771+
user_claims.clone(),
772+
ClaimsForSelectiveDisclosureStrategy::AllLevels,
773+
Some(serde_json::from_str(HOLDER_JWK_KEY_ED25519).unwrap()),
774+
false,
775+
SDJWTSerializationFormat::JSON, // Changed to Json format
776+
).unwrap();
777+
778+
let private_holder_bytes = HOLDER_KEY_ED25519.as_bytes();
779+
let holder_key = EncodingKey::from_ed_pem(private_holder_bytes).unwrap();
780+
781+
let nonce = Some(String::from("testNonce"));
782+
let aud = Some(String::from("testAud"));
783+
784+
let mut holder = SDJWTHolder::new(sd_jwt.clone(), SDJWTSerializationFormat::JSON).unwrap(); // Changed to Json format
785+
let presentation = holder.create_presentation(
786+
user_claims.as_object().unwrap().clone(),
787+
nonce.clone(),
788+
aud.clone(),
789+
Some(holder_key),
790+
Some("EdDSA".to_string())
791+
)
792+
.unwrap();
793+
let verified_claims = SDJWTVerifier::new(
794+
presentation,
795+
Box::new(|_, _| {
796+
let public_issuer_bytes = PUBLIC_ISSUER_PEM.as_bytes();
797+
DecodingKey::from_ec_pem(public_issuer_bytes).unwrap()
798+
}),
799+
aud.clone(),
800+
nonce.clone(),
801+
SDJWTSerializationFormat::JSON, // Changed to Json format
802+
)
803+
.unwrap()
804+
.verified_claims;
805+
806+
let claims_to_check = json!({
807+
"iss": user_claims["iss"].clone(),
808+
"iat": user_claims["iat"].clone(),
809+
"exp": user_claims["exp"].clone(),
810+
"cnf": {
811+
"jwk": serde_json::from_str::<Value>(HOLDER_JWK_KEY_ED25519).unwrap(),
812+
},
813+
"sub": user_claims["sub"].clone(),
814+
"address": user_claims["address"].clone(),
815+
});
816+
817+
assert_eq!(claims_to_check, verified_claims);
818+
}
731819
}

0 commit comments

Comments
 (0)