@@ -18,7 +18,12 @@ create_exception!(rsmime, CertificateError, PyException);
1818create_exception ! ( rsmime, SignError , PyException ) ;
1919create_exception ! ( rsmime, VerifyError , PyException ) ;
2020
21- fn _sign ( cert_file : & str , key_file : & str , data_to_sign : & [ u8 ] ) -> PyResult < Vec < u8 > > {
21+ fn _sign (
22+ cert_file : & str ,
23+ key_file : & str ,
24+ data_to_sign : & [ u8 ] ,
25+ detached : bool ,
26+ ) -> PyResult < Vec < u8 > > {
2227 let certs = Stack :: new ( ) . unwrap ( ) ;
2328
2429 if data_to_sign. is_empty ( ) {
@@ -37,16 +42,22 @@ fn _sign(cert_file: &str, key_file: &str, data_to_sign: &[u8]) -> PyResult<Vec<u
3742 let pkey =
3843 pkey:: PKey :: from_rsa ( rsa) . map_err ( |err| CertificateError :: new_err ( err. to_string ( ) ) ) ?;
3944
45+ let flags = if detached {
46+ Pkcs7Flags :: DETACHED
47+ } else {
48+ Pkcs7Flags :: empty ( )
49+ } ;
50+
4051 let pkcs7 = Pkcs7 :: sign (
4152 cert. as_ref ( ) ,
4253 pkey. as_ref ( ) ,
4354 certs. as_ref ( ) ,
4455 data_to_sign,
45- Pkcs7Flags :: empty ( ) ,
56+ flags ,
4657 )
4758 . map_err ( |err| SignError :: new_err ( err. to_string ( ) ) ) ?;
4859 let out = pkcs7
49- . to_smime ( data_to_sign, Pkcs7Flags :: empty ( ) )
60+ . to_smime ( data_to_sign, flags )
5061 . map_err ( |err| SignError :: new_err ( err. to_string ( ) ) ) ?;
5162
5263 Ok ( out)
@@ -76,19 +87,20 @@ fn _verify(data_to_verify: &[u8], throw_on_expiry: bool) -> PyResult<Vec<u8>> {
7687 let certs = Stack :: new ( ) . unwrap ( ) ;
7788 let store = X509StoreBuilder :: new ( ) . unwrap ( ) . build ( ) ;
7889
79- let ( pkcs7, _ ) =
90+ let ( pkcs7, indata ) =
8091 Pkcs7 :: from_smime ( data_to_verify) . map_err ( |err| VerifyError :: new_err ( err. to_string ( ) ) ) ?;
8192
8293 if throw_on_expiry {
8394 validate_expiry ( certs. as_ref ( ) ) . map_err ( |err| VerifyError :: new_err ( err. to_string ( ) ) ) ?;
8495 }
8596
8697 let mut out: Vec < u8 > = Vec :: new ( ) ;
98+
8799 pkcs7
88100 . verify (
89101 certs. as_ref ( ) ,
90102 store. as_ref ( ) ,
91- None ,
103+ indata . as_deref ( ) ,
92104 Some ( out. as_mut ( ) ) ,
93105 Pkcs7Flags :: NOVERIFY ,
94106 )
@@ -98,8 +110,15 @@ fn _verify(data_to_verify: &[u8], throw_on_expiry: bool) -> PyResult<Vec<u8>> {
98110}
99111
100112#[ pyfunction]
101- fn sign ( py : Python , cert_file : & str , key_file : & str , data_to_sign : Vec < u8 > ) -> PyResult < PyObject > {
102- match _sign ( cert_file, key_file, & data_to_sign) {
113+ #[ pyo3( signature = ( cert_file, key_file, data_to_sign, * , detached = false ) ) ]
114+ fn sign (
115+ py : Python ,
116+ cert_file : & str ,
117+ key_file : & str ,
118+ data_to_sign : Vec < u8 > ,
119+ detached : bool ,
120+ ) -> PyResult < PyObject > {
121+ match _sign ( cert_file, key_file, & data_to_sign, detached) {
103122 Ok ( data) => Ok ( PyBytes :: new ( py, & data) . into ( ) ) ,
104123 Err ( err) => Err ( err) ,
105124 }
0 commit comments