Skip to content

Commit 05625ad

Browse files
author
William Tisäter
committed
Allow to sign detached messages
1 parent 369011a commit 05625ad

File tree

5 files changed

+30
-11
lines changed

5 files changed

+30
-11
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rsmime"
3-
version = "0.4.1"
3+
version = "0.4.2"
44
edition = "2021"
55

66
[lib]

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "maturin"
44

55
[project]
66
name = "rsmime"
7-
version = "0.4.1"
7+
version = "0.4.2"
88
description = "Rust powered package for signing data in S/MIME format"
99
classifiers = [
1010
"License :: OSI Approved :: MIT License",

rsmime.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class SignError(Exception):
77
class VerifyError(Exception):
88
...
99

10-
def sign(cert_file: str, key_file: str, data_to_sign: bytes) -> bytes:
10+
def sign(cert_file: str, key_file: str, data_to_sign: bytes, *, detached: bool = False) -> bytes:
1111
...
1212

1313
def verify(data_to_verify: bytes, throw_on_expiry: bool = False) -> bytes:

src/lib.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ create_exception!(rsmime, CertificateError, PyException);
1818
create_exception!(rsmime, SignError, PyException);
1919
create_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

Comments
 (0)