Skip to content

Commit 4b469ea

Browse files
authored
Ensure CI covers examples and unit tests, fix clippy findings (#191)
While reviewing #188 I wanted to confirm that example code was being built in CI. It turns out that it wasn't. Similarly we haven't been running `clippy` against test code, and so there was a number of findings to address. This branch updates CI to: * Remove `--all`. This is a deprecated alias for `--workspace`, and `--workspace` is the default for a directory containing a workspace so it can be omitted. * Use `--all-targets` whenever we run `cargo check`, `cargo test` or `cargo clippy`. This ensures coverage for both examples and unit tests. In order for the `cargo clippy ... --all-targets` to succeed this branch addresses each of the findings that were present. I've done this with a separate commit per class of finding to make it easier to review. In one case (7bfe0ef) I allowed the finding instead of fixing it since it seemed like the choice of digit groupings was done intentionally.
1 parent 0318d2f commit 4b469ea

File tree

8 files changed

+72
-73
lines changed

8 files changed

+72
-73
lines changed

.github/workflows/ci.yml

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ jobs:
3838
uses: dtolnay/rust-toolchain@stable
3939
with:
4040
components: clippy
41-
- run: cargo clippy --all-features
42-
- run: cargo clippy --no-default-features
41+
- run: cargo clippy --all-features --all-targets
42+
- run: cargo clippy --no-default-features --all-targets
4343

4444
rustdoc:
4545
name: Documentation
@@ -57,7 +57,7 @@ jobs:
5757
with:
5858
toolchain: ${{ matrix.toolchain }}
5959
- name: cargo doc (all features)
60-
run: cargo doc --all --all-features --document-private-items
60+
run: cargo doc --all-features --document-private-items
6161
env:
6262
RUSTDOCFLAGS: ${{ matrix.rust_channel == 'nightly' && '-Dwarnings --cfg=docsrs' || '-Dwarnings' }}
6363

@@ -89,14 +89,14 @@ jobs:
8989
uses: dtolnay/rust-toolchain@stable
9090
- run: echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append
9191
- run: vcpkg install openssl:x64-windows-static-md
92-
- name: Run cargo check --all
93-
run: cargo check --all
92+
- name: Run cargo check
93+
run: cargo check --all-targets
9494
- name: Run the tests
95-
run: cargo test --all
95+
run: cargo test --all-targets
9696
- name: Run the tests with x509-parser enabled
97-
run: cargo test --verbose --features x509-parser
97+
run: cargo test --verbose --features x509-parser --all-targets
9898
- name: Run the tests with no default features enabled
99-
run: cargo test --verbose --no-default-features
99+
run: cargo test --verbose --no-default-features --all-targets
100100

101101
build:
102102
strategy:
@@ -128,14 +128,14 @@ jobs:
128128
uses: dtolnay/rust-toolchain@master
129129
with:
130130
toolchain: ${{ matrix.toolchain }}
131-
- name: Run cargo check --all
132-
run: cargo check --all
131+
- name: Run cargo check
132+
run: cargo check --all-targets
133133
- name: Run the tests
134-
run: cargo test --all
134+
run: cargo test --all-targets
135135
- name: Run the tests with x509-parser enabled
136-
run: cargo test --verbose --features x509-parser
136+
run: cargo test --verbose --features x509-parser --all-targets
137137
- name: Run the tests with no default features enabled
138-
run: cargo test --verbose --no-default-features
138+
run: cargo test --verbose --no-default-features --all-targets
139139

140140
coverage:
141141
name: Measure coverage

rcgen/examples/rsa-irc-openssl.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
#![allow(clippy::complexity, clippy::style, clippy::pedantic)]
2-
31
fn main() -> Result<(), Box<dyn std::error::Error>> {
42
use rcgen::{date_time_ymd, Certificate, CertificateParams, DistinguishedName};
3+
use std::fmt::Write;
54
use std::fs;
65

76
let mut params: CertificateParams = Default::default();
8-
params.not_before = date_time_ymd(2021, 05, 19);
9-
params.not_after = date_time_ymd(4096, 01, 01);
7+
params.not_before = date_time_ymd(2021, 5, 19);
8+
params.not_after = date_time_ymd(4096, 1, 1);
109
params.distinguished_name = DistinguishedName::new();
1110

1211
params.alg = &rcgen::PKCS_RSA_SHA256;
@@ -20,18 +19,18 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
2019
let pem_serialized = cert.serialize_pem()?;
2120
let pem = pem::parse(&pem_serialized)?;
2221
let der_serialized = pem.contents();
23-
let hash = ring::digest::digest(&ring::digest::SHA512, &der_serialized);
24-
let hash_hex: String = hash.as_ref().iter().map(|b| format!("{b:02x}")).collect();
22+
let hash = ring::digest::digest(&ring::digest::SHA512, der_serialized);
23+
let hash_hex = hash.as_ref().iter().fold(String::new(), |mut output, b| {
24+
let _ = write!(output, "{b:02x}");
25+
output
26+
});
2527
println!("sha-512 fingerprint: {hash_hex}");
2628
println!("{pem_serialized}");
2729
println!("{}", cert.serialize_private_key_pem());
2830
std::fs::create_dir_all("certs/")?;
29-
fs::write("certs/cert.pem", &pem_serialized.as_bytes())?;
30-
fs::write("certs/cert.der", &der_serialized)?;
31-
fs::write(
32-
"certs/key.pem",
33-
&cert.serialize_private_key_pem().as_bytes(),
34-
)?;
35-
fs::write("certs/key.der", &cert.serialize_private_key_der())?;
31+
fs::write("certs/cert.pem", pem_serialized.as_bytes())?;
32+
fs::write("certs/cert.der", der_serialized)?;
33+
fs::write("certs/key.pem", cert.serialize_private_key_pem().as_bytes())?;
34+
fs::write("certs/key.der", cert.serialize_private_key_der())?;
3635
Ok(())
3736
}

rcgen/examples/rsa-irc.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
#![allow(clippy::complexity, clippy::style, clippy::pedantic)]
2-
31
fn main() -> Result<(), Box<dyn std::error::Error>> {
42
use rand::rngs::OsRng;
53
use rsa::pkcs8::EncodePrivateKey;
64
use rsa::RsaPrivateKey;
75

86
use rcgen::{date_time_ymd, Certificate, CertificateParams, DistinguishedName};
7+
use std::fmt::Write;
98
use std::fs;
109

1110
let mut params: CertificateParams = Default::default();
12-
params.not_before = date_time_ymd(2021, 05, 19);
13-
params.not_after = date_time_ymd(4096, 01, 01);
11+
params.not_before = date_time_ymd(2021, 5, 19);
12+
params.not_after = date_time_ymd(4096, 1, 1);
1413
params.distinguished_name = DistinguishedName::new();
1514

1615
params.alg = &rcgen::PKCS_RSA_SHA256;
@@ -26,18 +25,18 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
2625
let pem_serialized = cert.serialize_pem()?;
2726
let pem = pem::parse(&pem_serialized)?;
2827
let der_serialized = pem.contents();
29-
let hash = ring::digest::digest(&ring::digest::SHA512, &der_serialized);
30-
let hash_hex: String = hash.as_ref().iter().map(|b| format!("{:02x}", b)).collect();
28+
let hash = ring::digest::digest(&ring::digest::SHA512, der_serialized);
29+
let hash_hex = hash.as_ref().iter().fold(String::new(), |mut output, b| {
30+
let _ = write!(output, "{b:02x}");
31+
output
32+
});
3133
println!("sha-512 fingerprint: {hash_hex}");
3234
println!("{pem_serialized}");
3335
println!("{}", cert.serialize_private_key_pem());
3436
std::fs::create_dir_all("certs/")?;
35-
fs::write("certs/cert.pem", &pem_serialized.as_bytes())?;
36-
fs::write("certs/cert.der", &der_serialized)?;
37-
fs::write(
38-
"certs/key.pem",
39-
&cert.serialize_private_key_pem().as_bytes(),
40-
)?;
41-
fs::write("certs/key.der", &cert.serialize_private_key_der())?;
37+
fs::write("certs/cert.pem", pem_serialized.as_bytes())?;
38+
fs::write("certs/cert.der", der_serialized)?;
39+
fs::write("certs/key.pem", cert.serialize_private_key_pem().as_bytes())?;
40+
fs::write("certs/key.der", cert.serialize_private_key_der())?;
4241
Ok(())
4342
}

rcgen/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1869,7 +1869,7 @@ mod tests {
18691869
fn test_not_windows_line_endings() {
18701870
let cert = Certificate::from_params(CertificateParams::default()).unwrap();
18711871
let pem = cert.serialize_pem().expect("Failed to serialize pem");
1872-
assert!(!pem.contains("\r"));
1872+
assert!(!pem.contains('\r'));
18731873
}
18741874
}
18751875

rcgen/tests/botan.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,22 @@ mod util;
1313
fn default_params() -> CertificateParams {
1414
let mut params = util::default_params();
1515
// Botan has a sanity check that enforces a maximum expiration date
16-
params.not_after = rcgen::date_time_ymd(3016, 01, 01);
16+
params.not_after = rcgen::date_time_ymd(3016, 1, 1);
1717
params
1818
}
1919

20-
fn check_cert<'a, 'b>(cert_der: &[u8], cert: &'a Certificate) {
20+
fn check_cert(cert_der: &[u8], cert: &Certificate) {
2121
println!("{}", cert.serialize_pem().unwrap());
2222
check_cert_ca(cert_der, cert, cert_der);
2323
}
2424

25-
fn check_cert_ca<'a, 'b>(cert_der: &[u8], _cert: &'a Certificate, ca_der: &[u8]) {
25+
fn check_cert_ca(cert_der: &[u8], _cert: &Certificate, ca_der: &[u8]) {
2626
println!(
2727
"botan version: {}",
2828
botan::Version::current().unwrap().string
2929
);
30-
let trust_anchor = botan::Certificate::load(&ca_der).unwrap();
31-
let end_entity_cert = botan::Certificate::load(&cert_der).unwrap();
30+
let trust_anchor = botan::Certificate::load(ca_der).unwrap();
31+
let end_entity_cert = botan::Certificate::load(cert_der).unwrap();
3232

3333
// Set time to Jan 10, 2004
3434
const REFERENCE_TIME: Option<u64> = Some(0x40_00_00_00);
@@ -161,7 +161,7 @@ fn test_botan_separate_ca() {
161161
.distinguished_name
162162
.push(DnType::CommonName, "Dev domain");
163163
// Botan has a sanity check that enforces a maximum expiration date
164-
params.not_after = rcgen::date_time_ymd(3016, 01, 01);
164+
params.not_after = rcgen::date_time_ymd(3016, 1, 1);
165165

166166
let cert = Certificate::from_params(params).unwrap();
167167
let cert_der = cert.serialize_der_with_signer(&ca_cert).unwrap();
@@ -195,7 +195,7 @@ fn test_botan_imported_ca() {
195195
.distinguished_name
196196
.push(DnType::CommonName, "Dev domain");
197197
// Botan has a sanity check that enforces a maximum expiration date
198-
params.not_after = rcgen::date_time_ymd(3016, 01, 01);
198+
params.not_after = rcgen::date_time_ymd(3016, 1, 1);
199199
let cert = Certificate::from_params(params).unwrap();
200200
let cert_der = cert.serialize_der_with_signer(&imported_ca_cert).unwrap();
201201

@@ -232,7 +232,7 @@ fn test_botan_imported_ca_with_printable_string() {
232232
.distinguished_name
233233
.push(DnType::CommonName, "Dev domain");
234234
// Botan has a sanity check that enforces a maximum expiration date
235-
params.not_after = rcgen::date_time_ymd(3016, 01, 01);
235+
params.not_after = rcgen::date_time_ymd(3016, 1, 1);
236236
let cert = Certificate::from_params(params).unwrap();
237237
let cert_der = cert.serialize_der_with_signer(&imported_ca_cert).unwrap();
238238

@@ -259,7 +259,7 @@ fn test_botan_crl_parse() {
259259
ee.is_ca = IsCa::NoCa;
260260
ee.serial_number = Some(SerialNumber::from(99999));
261261
// Botan has a sanity check that enforces a maximum expiration date
262-
ee.not_after = rcgen::date_time_ymd(3016, 01, 01);
262+
ee.not_after = rcgen::date_time_ymd(3016, 1, 1);
263263
let ee = Certificate::from_params(ee).unwrap();
264264
let ee_der = ee.serialize_der_with_signer(&issuer).unwrap();
265265
let botan_ee = botan::Certificate::load(ee_der.as_ref()).unwrap();

rcgen/tests/generic.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ mod test_x509_custom_ext {
127127
.get_extension_unique(&test_oid)
128128
.expect("invalid extensions")
129129
.expect("missing custom extension");
130-
assert_eq!(favorite_drink_ext.critical, true);
130+
assert!(favorite_drink_ext.critical);
131131
assert_eq!(favorite_drink_ext.value, test_ext);
132132

133133
// Generate a CSR with the custom extension, parse it with x509-parser.
@@ -154,7 +154,7 @@ mod test_x509_custom_ext {
154154
.iter()
155155
.find(|ext| ext.oid == test_oid)
156156
.expect("missing requested custom extension");
157-
assert_eq!(custom_ext.critical, true);
157+
assert!(custom_ext.critical);
158158
assert_eq!(custom_ext.value, test_ext);
159159
}
160160
}
@@ -223,7 +223,7 @@ mod test_x509_parser_crl {
223223
// TODO: x509-parser does not yet parse the CRL issuing DP extension for further examination.
224224

225225
// We should be able to verify the CRL signature with the issuer.
226-
assert!(x509_crl.verify_signature(&x509_issuer.public_key()).is_ok());
226+
assert!(x509_crl.verify_signature(x509_issuer.public_key()).is_ok());
227227
}
228228
}
229229

rcgen/tests/openssl.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ fn verify_cert_basic(cert: &Certificate) {
2020
let cert_pem = cert.serialize_pem().unwrap();
2121
println!("{cert_pem}");
2222

23-
let x509 = X509::from_pem(&cert_pem.as_bytes()).unwrap();
23+
let x509 = X509::from_pem(cert_pem.as_bytes()).unwrap();
2424
let mut builder = X509StoreBuilder::new().unwrap();
2525
builder.add_cert(x509.clone()).unwrap();
2626

2727
let store: X509Store = builder.build();
2828
let mut ctx = X509StoreContext::new().unwrap();
2929
let mut stack = Stack::new().unwrap();
3030
stack.push(x509.clone()).unwrap();
31-
ctx.init(&store, &x509, &stack.as_ref(), |ctx| {
31+
ctx.init(&store, &x509, stack.as_ref(), |ctx| {
3232
ctx.verify_cert().unwrap();
3333
Ok(())
3434
})
@@ -79,7 +79,7 @@ impl Read for PipeEnd {
7979
fn read(&mut self, mut buf: &mut [u8]) -> ioResult<usize> {
8080
let inner = self.inner.borrow_mut();
8181
let r_sl = &inner.0[1 - self.end_idx][self.read_pos..];
82-
if r_sl.len() == 0 {
82+
if r_sl.is_empty() {
8383
return Err(Error::new(ErrorKind::WouldBlock, "oh no!"));
8484
}
8585
let r = buf.len().min(r_sl.len());
@@ -101,9 +101,9 @@ fn verify_cert_ca(cert_pem: &str, key: &[u8], ca_cert_pem: &str) {
101101
println!("{cert_pem}");
102102
println!("{ca_cert_pem}");
103103

104-
let x509 = X509::from_pem(&cert_pem.as_bytes()).unwrap();
104+
let x509 = X509::from_pem(cert_pem.as_bytes()).unwrap();
105105

106-
let ca_x509 = X509::from_pem(&ca_cert_pem.as_bytes()).unwrap();
106+
let ca_x509 = X509::from_pem(ca_cert_pem.as_bytes()).unwrap();
107107

108108
let mut builder = X509StoreBuilder::new().unwrap();
109109
builder.add_cert(ca_x509).unwrap();
@@ -113,7 +113,7 @@ fn verify_cert_ca(cert_pem: &str, key: &[u8], ca_cert_pem: &str) {
113113
let srv = SslMethod::tls_server();
114114
let mut ssl_srv_ctx = SslAcceptor::mozilla_modern(srv).unwrap();
115115
//let key = cert.serialize_private_key_der();
116-
let pkey = PKey::private_key_from_der(&key).unwrap();
116+
let pkey = PKey::private_key_from_der(key).unwrap();
117117
ssl_srv_ctx.set_private_key(&pkey).unwrap();
118118

119119
ssl_srv_ctx.set_certificate(&x509).unwrap();
@@ -168,7 +168,7 @@ fn verify_csr(cert: &Certificate) {
168168
let key = cert.serialize_private_key_der();
169169
let pkey = PKey::private_key_from_der(&key).unwrap();
170170

171-
let req = X509Req::from_pem(&csr.as_bytes()).unwrap();
171+
let req = X509Req::from_pem(csr.as_bytes()).unwrap();
172172
req.verify(&pkey).unwrap();
173173
}
174174

@@ -241,6 +241,7 @@ fn test_openssl_25519_v1_given() {
241241
// Now verify the certificate as well as CSR,
242242
// but only on OpenSSL >= 1.1.1
243243
// On prior versions, only do basic verification
244+
#[allow(clippy::unusual_byte_groupings)]
244245
if openssl::version::number() >= 0x1_01_01_00_f {
245246
verify_cert(&cert);
246247
verify_csr(&cert);

0 commit comments

Comments
 (0)