@@ -73,6 +73,12 @@ impl SDJWTVerifier {
73
73
verifier. verified_claims = verifier. extract_sd_claims ( ) ?;
74
74
75
75
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
+
76
82
verifier. verify_key_binding_jwt (
77
83
expected_aud. to_owned ( ) ,
78
84
expected_nonce. to_owned ( ) ,
@@ -391,6 +397,17 @@ mod tests {
391
397
const PRIVATE_ISSUER_ED25519_PEM : & str = "-----BEGIN PRIVATE KEY-----\n MFECAQEwBQYDK2VwBCIEIF93k6rxZ8W38cm0rOwfGdH+YY3k10hP+7gd0falPLg0\n gSEAdW31QyWzfed4EPcw1rYuUa1QU+fXEL0HhdAfYZRkihc=\n -----END PRIVATE KEY-----\n " ;
392
398
const PUBLIC_ISSUER_ED25519_PEM : & str = "-----BEGIN PUBLIC KEY-----\n MCowBQYDK2VwAyEAdW31QyWzfed4EPcw1rYuUa1QU+fXEL0HhdAfYZRkihc=\n -----END PUBLIC KEY-----\n " ;
393
399
400
+ // EdDSA (Ed25519)
401
+ const HOLDER_KEY_ED25519 : & str = "-----BEGIN PRIVATE KEY-----\n MC4CAQAwBQYDK2VwBCIEIOeIDnHHMoPCUTiq206gR+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
+
394
411
#[ test]
395
412
fn verify_full_presentation ( ) {
396
413
let user_claims = json ! ( {
@@ -728,4 +745,75 @@ mod tests {
728
745
. verified_claims ;
729
746
assert_eq ! ( user_claims, verified_claims) ;
730
747
}
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
+ }
731
819
}
0 commit comments