Skip to content

Commit 490ebb0

Browse files
author
William Tisäter
committed
Skip passing cert into verify
1 parent 7c51434 commit 490ebb0

File tree

6 files changed

+45
-97
lines changed

6 files changed

+45
-97
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.0"
3+
version = "0.4.1"
44
edition = "2021"
55

66
[lib]

README.md

Lines changed: 21 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,23 @@ Rust powered Python package for signing data in S/MIME format
44

55
## Usage
66

7+
### Install
78
```
89
pip install rsmime
910
```
1011

12+
### Sign
1113
```py
1214
import rsmime
1315

1416
raw_data = b'data to sign'
1517

1618
try:
1719
signed_data = rsmime.sign('some.crt', 'some.key', raw_data)
18-
except rsmime.SignError as e:
20+
except (rsmime.SignError, rsmime.CertificateError) as e:
1921
print("Failed to sign:", e)
2022

21-
print(signed_data)
23+
print(signed_data.decode())
2224
```
2325

2426
```
@@ -28,54 +30,23 @@ Content-Type: application/x-pkcs7-mime; smime-type=signed-data; name="smime.p7m"
2830
Content-Transfer-Encoding: base64
2931
3032
MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0B
31-
BwGggCSABAxkYXRhIHRvIHNpZ24AAAAAAACgggaZMIIGlTCCBX2gAwIBAgIQBIEz
32-
UwwPu+XzT84yElfBUDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQGEwJVUzEVMBMG
33-
A1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBEaWdpQ2VydCBUTFMgUlNBIFNI
34-
QTI1NiAyMDIwIENBMTAeFw0yMjA0MDUwMDAwMDBaFw0yMzA0MDYyMzU5NTlaMEwx
35-
CzAJBgNVBAYTAlNFMRIwEAYDVQQHEwlTdG9ja2hvbG0xEjAQBgNVBAoTCVJhZGRs
36-
ZSBBQjEVMBMGA1UEAxMMaW50cmVjZXB0LnNlMIIBIjANBgkqhkiG9w0BAQEFAAOC
37-
AQ8AMIIBCgKCAQEAv2lTExs+cT2I2n/bKLm7aVv346rmlZSY4WriAU2XnCQPXGr0
38-
PCKQBTDStiJhqgoQ2tvG1Uit3AfypfVgyfiuI+xb78+C6iBZKjC6xsppHenFTmsW
39-
4mrwOfz2FnasQR/44S9wyk3Zf+rlKt4X9SQHLz+VTCTzhNa2R30v9mShXKxktNyl
40-
8B5/UskuVojzk1lDSOInpTN/wrcPmZrQLBHbzqYyZylDG3e7fSAVdcFiSYT6Ctbf
41-
RXLeamWt8/8P0EgGyPGcrdHXaXBbdbK5J2fIw0DC7+ULDQ5+jhXkZoL587FGXSlk
42-
VqwXtS8YD9Wigf2jwcXalecDjmSEvoq4p3LfWQIDAQABo4IDbjCCA2owHwYDVR0j
43-
BBgwFoAUt2ui6qiqhIx56rTaD5iyxZV2ufQwHQYDVR0OBBYEFGQ2AknqbgsOEyQc
44-
KOf9zKHG6PJcMBcGA1UdEQQQMA6CDGludHJlY2VwdC5zZTAOBgNVHQ8BAf8EBAMC
45-
BaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMIGPBgNVHR8EgYcwgYQw
46-
QKA+oDyGOmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRMU1JTQVNI
47-
QTI1NjIwMjBDQTEtNC5jcmwwQKA+oDyGOmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNv
48-
bS9EaWdpQ2VydFRMU1JTQVNIQTI1NjIwMjBDQTEtNC5jcmwwPgYDVR0gBDcwNTAz
49-
BgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20v
50-
Q1BTMH8GCCsGAQUFBwEBBHMwcTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln
51-
aWNlcnQuY29tMEkGCCsGAQUFBzAChj1odHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j
52-
b20vRGlnaUNlcnRUTFNSU0FTSEEyNTYyMDIwQ0ExLTEuY3J0MAkGA1UdEwQCMAAw
53-
ggGABgorBgEEAdZ5AgQCBIIBcASCAWwBagB2AOg+0No+9QY1MudXKLyJa8kD08vR
54-
EWvs62nhd31tBr1uAAABf/lXYlcAAAQDAEcwRQIgerFadnbRm9azVBblJQdBtj4I
55-
yUuBzNqSXB9BWevbItsCIQDkifi/JwsMneNFcnaD6imugY7MXRr5Wq+DG3H4PMUa
56-
hQB3ADXPGRu/sWxXvw+tTG1Cy7u2JyAmUeo/4SrvqAPDO9ZMAAABf/lXYk4AAAQD
57-
AEgwRgIhAJ0+Nhtn2KW5dz+rJazDqxPuXaBYXXGpt/WDWpC8KVivAiEAkVhB7/qK
58-
SoVLL8IhXy+5dXxtyUXc1qQsyVPiJDxesRsAdwCzc3cH4YRQ+GOG1gWp3BEJSnkt
59-
sWcMC4fc8AMOeTalmgAAAX/5V2KvAAAEAwBIMEYCIQCkhDiNatThkI3bjwd3Z+wG
60-
vvb2Gn82/Byn32ovxXN5OQIhALQK1/QmDCDzSv85v2gExprobh5PjcRDEoYOagcf
61-
NIwYMA0GCSqGSIb3DQEBCwUAA4IBAQC4F7oCzLopzWMmMdK9G0O8wSoddpGTmfty
62-
q+oPTfi1KFMThQIzOHHGSgnnU9hwhd4yrE7s5KDEcGrAIfmxcKWbmN7bEDjCFRPk
63-
s9PssDX2u4thoZHcBBWHXfPECy0rd0qKTY36wgNWMFoK+ygj1f+M6hv4YRvZl//G
64-
NBXx7oQq6rY8EyOwgrD7Eh5rCG09qNVoMnL+1dmP1gYl7otzTfpKCqlIrLyjW9h2
65-
Y7pmHOEuw+JJTVqVbdnGo/FRqR7EHcJVTbtclFeMo3pG6HuiE2A8QT6jM0SVsZQY
66-
2aWCq3AdAVfDEgn1thtnEi5uW5sPkACC8owZp1eub9AbrCS1fS/MMYICdTCCAnEC
67-
AQEwYzBPMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYD
68-
VQQDEyBEaWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMQIQBIEzUwwPu+Xz
69-
T84yElfBUDANBglghkgBZQMEAgEFAKCB5DAYBgkqhkiG9w0BCQMxCwYJKoZIhvcN
70-
AQcBMBwGCSqGSIb3DQEJBTEPFw0yMzEwMjQwOTI5NTRaMC8GCSqGSIb3DQEJBDEi
71-
BCAVcZKydtojzISrB4/IdVwFHF8EML9IAuVXGCIea3bHdzB5BgkqhkiG9w0BCQ8x
72-
bDBqMAsGCWCGSAFlAwQBKjALBglghkgBZQMEARYwCwYJYIZIAWUDBAECMAoGCCqG
73-
SIb3DQMHMA4GCCqGSIb3DQMCAgIAgDANBggqhkiG9w0DAgIBQDAHBgUrDgMCBzAN
74-
BggqhkiG9w0DAgIBKDANBgkqhkiG9w0BAQEFAASCAQBZO8T/pSfckmQtdm9gVz+K
75-
sgjumiVRMbJzuAGh9uS669cXAs6Qx4vJfJbfP7K+g1mZ3j4SYhHT20w0wbIUgGgQ
76-
AvyD2GOiCsaF0hM/JbVqfZUtGn9BK6aaFVYFG+cTgvSGF4F+IrCptymInP6Tt/3e
77-
NOGJxKsL7MiJvNhRTEP7NouD0FPOycHDDo22vB/Q8OD9/qkhAG+6gyvKjt7/zyj2
78-
OwPILgJ+UuQ4mKUGqhZD2qGC2XYG137zUwfnRJFjJpIjNtTXiD/kRe+b01xciCoA
33+
...
7934
SwxRisLtodx8YQ7VoOLFi9FNoia3SsJtCnu2hILeobjPTnPCAL+8N2bc22MX44mc
8035
AAAAAAAA
8136
```
37+
38+
### Verify
39+
```py
40+
import rsmime
41+
42+
try:
43+
raw_data = rsmime.verify(signed_data)
44+
except rsmime.VerifyError as e:
45+
print("Failed to verify:", e)
46+
47+
print(raw_data.decode())
48+
```
49+
50+
```
51+
data to sign
52+
```

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.0"
7+
version = "0.4.1"
88
classifiers = [
99
"License :: OSI Approved :: MIT License",
1010
"Development Status :: 3 - Alpha",

rsmime.pyi

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
class ReadCertificateError(Exception):
2-
...
3-
4-
class LoadCertificateError(Exception):
1+
class CertificateError(Exception):
52
...
63

74
class SignError(Exception):
85
...
96

7+
class VerifyError(Exception):
8+
...
9+
1010
def sign(cert_file: str, key_file: str, data_to_sign: bytes) -> bytes:
1111
...
1212

13-
def verify(cert_file: str, data_to_verify: bytes, throw_on_expiry: bool = False) -> bytes:
13+
def verify(data_to_verify: bytes, throw_on_expiry: bool = False) -> bytes:
1414
...

src/lib.rs

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,28 @@ use pyo3::exceptions::PyException;
1414
use pyo3::prelude::*;
1515
use pyo3::types::PyBytes;
1616

17-
create_exception!(rsmime, ReadCertificateError, PyException);
18-
create_exception!(rsmime, LoadCertificateError, PyException);
17+
create_exception!(rsmime, CertificateError, PyException);
1918
create_exception!(rsmime, SignError, PyException);
2019
create_exception!(rsmime, VerifyError, PyException);
2120

2221
fn _sign(cert_file: &str, key_file: &str, data_to_sign: &[u8]) -> PyResult<Vec<u8>> {
23-
let certs = Stack::new().expect("Failed to create stack");
22+
let certs = Stack::new().unwrap();
2423

2524
if data_to_sign.is_empty() {
2625
return Err(SignError::new_err("Cannot sign empty data"));
2726
}
2827

2928
let cert_data =
30-
std::fs::read(cert_file).map_err(|err| ReadCertificateError::new_err(err.to_string()))?;
29+
std::fs::read(cert_file).map_err(|err| CertificateError::new_err(err.to_string()))?;
3130
let key_data =
32-
std::fs::read(key_file).map_err(|err| ReadCertificateError::new_err(err.to_string()))?;
31+
std::fs::read(key_file).map_err(|err| CertificateError::new_err(err.to_string()))?;
3332

3433
let cert =
35-
X509::from_pem(&cert_data).map_err(|err| LoadCertificateError::new_err(err.to_string()))?;
34+
X509::from_pem(&cert_data).map_err(|err| CertificateError::new_err(err.to_string()))?;
3635
let rsa = Rsa::private_key_from_pem(&key_data)
37-
.map_err(|err| LoadCertificateError::new_err(err.to_string()))?;
36+
.map_err(|err| CertificateError::new_err(err.to_string()))?;
3837
let pkey =
39-
pkey::PKey::from_rsa(rsa).map_err(|err| LoadCertificateError::new_err(err.to_string()))?;
38+
pkey::PKey::from_rsa(rsa).map_err(|err| CertificateError::new_err(err.to_string()))?;
4039

4140
let pkcs7 = Pkcs7::sign(
4241
cert.as_ref(),
@@ -73,28 +72,18 @@ fn validate_expiry(certs: &StackRef<X509>) -> Result<(), Error> {
7372
Ok(())
7473
}
7574

76-
fn _verify(cert_file: &str, data_to_verify: &[u8], throw_on_expiry: bool) -> PyResult<Vec<u8>> {
77-
let cert_data =
78-
std::fs::read(cert_file).map_err(|err| ReadCertificateError::new_err(err.to_string()))?;
79-
let cert =
80-
X509::from_pem(&cert_data).map_err(|err| LoadCertificateError::new_err(err.to_string()))?;
81-
82-
let mut certs = Stack::new().expect("Failed to create stack");
83-
certs
84-
.push(cert)
85-
.map_err(|err| LoadCertificateError::new_err(err.to_string()))?;
86-
87-
let mut out: Vec<u8> = Vec::new();
75+
fn _verify(data_to_verify: &[u8], throw_on_expiry: bool) -> PyResult<Vec<u8>> {
76+
let certs = Stack::new().unwrap();
8877
let store = X509StoreBuilder::new().unwrap().build();
8978

90-
let x = Pkcs7::from_smime(data_to_verify);
91-
let x = x.map_err(|err| VerifyError::new_err(err.to_string()))?;
92-
let (pkcs7, _) = x;
79+
let (pkcs7, _) =
80+
Pkcs7::from_smime(data_to_verify).map_err(|err| VerifyError::new_err(err.to_string()))?;
9381

9482
if throw_on_expiry {
9583
validate_expiry(certs.as_ref()).map_err(|err| VerifyError::new_err(err.to_string()))?;
9684
}
9785

86+
let mut out: Vec<u8> = Vec::new();
9887
pkcs7
9988
.verify(
10089
certs.as_ref(),
@@ -117,29 +106,17 @@ fn sign(py: Python, cert_file: &str, key_file: &str, data_to_sign: Vec<u8>) -> P
117106
}
118107

119108
#[pyfunction]
120-
#[pyo3(signature = (cert_file, data_to_verify, *, throw_on_expiry = false))]
121-
fn verify(
122-
py: Python,
123-
cert_file: &str,
124-
data_to_verify: Vec<u8>,
125-
throw_on_expiry: bool,
126-
) -> PyResult<PyObject> {
127-
match _verify(cert_file, &data_to_verify, throw_on_expiry) {
109+
#[pyo3(signature = (data_to_verify, *, throw_on_expiry = false))]
110+
fn verify(py: Python, data_to_verify: Vec<u8>, throw_on_expiry: bool) -> PyResult<PyObject> {
111+
match _verify(&data_to_verify, throw_on_expiry) {
128112
Ok(data) => Ok(PyBytes::new(py, &data).into()),
129113
Err(err) => Err(err),
130114
}
131115
}
132116

133117
#[pymodule]
134118
fn rsmime(py: Python, m: &PyModule) -> PyResult<()> {
135-
m.add(
136-
"ReadCertificateError",
137-
py.get_type::<ReadCertificateError>(),
138-
)?;
139-
m.add(
140-
"LoadCertificateError",
141-
py.get_type::<LoadCertificateError>(),
142-
)?;
119+
m.add("CertificateError", py.get_type::<CertificateError>())?;
143120
m.add("SignError", py.get_type::<SignError>())?;
144121
m.add("VerifyError", py.get_type::<VerifyError>())?;
145122
m.add_function(wrap_pyfunction!(sign, m)?)?;

0 commit comments

Comments
 (0)