@@ -560,6 +560,49 @@ mod tests {
560560 ) ;
561561 }
562562
563+ #[ test]
564+ fn cose_sign_verify_with_pem_imported_key ( ) {
565+ let original = EvpKey :: new ( KeyType :: EC ( WhichEC :: P256 ) ) . unwrap ( ) ;
566+
567+ let priv_pem = original. to_pem_private ( ) . unwrap ( ) ;
568+ let signing_key = EvpKey :: from_pem_private ( & priv_pem) . unwrap ( ) ;
569+
570+ let pub_pem = original. to_pem_public ( ) . unwrap ( ) ;
571+ let verification_key = EvpKey :: from_pem_public ( & pub_pem) . unwrap ( ) ;
572+
573+ let phdr_bytes = hex_decode ( TEST_PHDR ) ;
574+ let phdr = CborValue :: from_bytes ( & phdr_bytes) . unwrap ( ) ;
575+ let uhdr = CborValue :: Map ( vec ! [ ] ) ;
576+ let payload = b"signed with PEM-imported key" ;
577+
578+ let envelope =
579+ cose_sign1 ( & signing_key, phdr, uhdr, payload, false ) . unwrap ( ) ;
580+
581+ let parsed = CborValue :: from_bytes ( & envelope) . unwrap ( ) ;
582+ let inner = match parsed {
583+ CborValue :: Tagged { payload, .. } => * payload,
584+ _ => panic ! ( "not tagged" ) ,
585+ } ;
586+ let items = match inner {
587+ CborValue :: Array ( v) => v,
588+ _ => panic ! ( "not array" ) ,
589+ } ;
590+ let phdr_raw = match & items[ 0 ] {
591+ CborValue :: ByteString ( b) => b. clone ( ) ,
592+ _ => panic ! ( "phdr not bstr" ) ,
593+ } ;
594+ let sig_raw = match & items[ 3 ] {
595+ CborValue :: ByteString ( b) => b. clone ( ) ,
596+ _ => panic ! ( "sig not bstr" ) ,
597+ } ;
598+
599+ let alg = cose_alg ( & verification_key) . unwrap ( ) ;
600+ assert ! (
601+ cose_verify1( & verification_key, alg, & phdr_raw, payload, & sig_raw)
602+ . unwrap( )
603+ ) ;
604+ }
605+
563606 #[ cfg( feature = "pqc" ) ]
564607 mod pqc_tests {
565608 use super :: * ;
0 commit comments