@@ -598,6 +598,13 @@ impl MessageVerifier {
598598 . and_then ( |key| keyring. get_prepared ( key) ) ,
599599 } )
600600 . ok_or ( ImplementationError :: NoSuchKey ) ?;
601+ let parameters = & self . parsed . base . parameters ;
602+ if parameters. raw . get ( "alg" ) . is_some ( )
603+ && parameters. details . algorithm . as_ref ( ) != Some ( algorithm)
604+ && !matches ! ( prepared, PreparedKey :: Unsupported )
605+ {
606+ return Err ( ImplementationError :: AlgorithmMismatch ) ;
607+ }
601608 let generation = UtcDateTime :: now ( ) ;
602609 let ( base_representation, _) = self . parsed . base . into_ascii ( ) ?;
603610 let generation = ( UtcDateTime :: now ( ) - generation) . unsigned_abs ( ) ;
@@ -772,6 +779,31 @@ mod tests {
772779 assert ! ( matches!( err, ImplementationError :: ParsingError ( _) ) ) ;
773780 }
774781
782+ #[ test]
783+ fn test_verifying_checks_alg_against_key ( ) {
784+ // RFC 9421 Section 3.2, step 6.
785+ struct WithAlg ( & ' static str ) ;
786+ impl SignedMessage for WithAlg {
787+ fn lookup_component ( & self , name : & CoveredComponent ) -> Vec < String > {
788+ ( StandardTestVector { } )
789+ . lookup_component ( name)
790+ . into_iter ( )
791+ . map ( |value| value. replace ( r#";alg="ed25519""# , self . 0 ) )
792+ . collect ( )
793+ }
794+ }
795+ let keyring = keyring_with_test_key ( ) ;
796+ for alg in [ r#";alg="rsa-pss-sha512""# , r#";alg="foo""# ] {
797+ let verifier = MessageVerifier :: parse ( & WithAlg ( alg) , |( _, _) | true ) . unwrap ( ) ;
798+ let err = verifier. verify ( & keyring, None ) . unwrap_err ( ) ;
799+ assert ! ( matches!( err, ImplementationError :: AlgorithmMismatch ) ) ;
800+ }
801+ // Without `alg`, the key decides; the altered base then fails verification.
802+ let verifier = MessageVerifier :: parse ( & WithAlg ( "" ) , |( _, _) | true ) . unwrap ( ) ;
803+ let err = verifier. verify ( & keyring, None ) . unwrap_err ( ) ;
804+ assert ! ( matches!( err, ImplementationError :: FailedToVerify ( _) ) ) ;
805+ }
806+
775807 #[ test]
776808 fn test_verifying_unsupported_algorithm ( ) {
777809 let mut keyring = KeyRing :: default ( ) ;
0 commit comments