Skip to content

Commit 31ebbae

Browse files
chore: extend lint coverage to the fuzz and wasm paths (#410)
1 parent b92f3de commit 31ebbae

7 files changed

Lines changed: 162 additions & 30 deletions

File tree

‎.github/workflows/formatting/rust/action.yml‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ runs:
1111
shell: bash
1212
run: |
1313
rustup update
14+
rustup target add wasm32-unknown-unknown
1415
1516
- name: Check Format
1617
working-directory: ./
@@ -21,3 +22,15 @@ runs:
2122
working-directory: ./
2223
shell: bash
2324
run: cargo clippy --workspace --all-targets -- -D warnings
25+
26+
- name: Check Clippy (fuzz feature)
27+
working-directory: ./
28+
shell: bash
29+
run: cargo clippy --all-targets --features fuzz -- -D warnings
30+
31+
# The wbindgen deps live under [target.wasm32-unknown-unknown.dependencies],
32+
# so this feature only resolves against the wasm target.
33+
- name: Check Clippy (wasm bindings)
34+
working-directory: ./
35+
shell: bash
36+
run: cargo clippy --target wasm32-unknown-unknown --features wbindgen --all-targets -- -D warnings

‎fuzz/Cargo.toml‎

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,163 +20,286 @@ features = ["fuzz"]
2020
[[bin]]
2121
name = "ciphertext_deserialization"
2222
path = "fuzz_targets/ciphertext/ciphertext_deserialization.rs"
23+
test = false
24+
doc = false
25+
bench = false
2326

2427
[[bin]]
2528
name = "encrypt"
2629
path = "fuzz_targets/ciphertext/encrypt.rs"
30+
test = false
31+
doc = false
32+
bench = false
2733

2834
[[bin]]
2935
name = "encrypt_asymmetric"
3036
path = "fuzz_targets/ciphertext/encrypt_asymmetric.rs"
37+
test = false
38+
doc = false
39+
bench = false
3140

3241
[[bin]]
3342
name = "decrypt"
3443
path = "fuzz_targets/ciphertext/decrypt.rs"
44+
test = false
45+
doc = false
46+
bench = false
3547

3648
[[bin]]
3749
name = "decrypt_asymmetric"
3850
path = "fuzz_targets/ciphertext/decrypt_asymmetric.rs"
51+
test = false
52+
doc = false
53+
bench = false
3954

4055
[[bin]]
4156
name = "password_hash_deserialization"
4257
path = "fuzz_targets/password_hash/password_hash_deserialization.rs"
58+
test = false
59+
doc = false
60+
bench = false
4361

4462
[[bin]]
4563
name = "public_key_deserialization"
4664
path = "fuzz_targets/key/public_key_deserialization.rs"
65+
test = false
66+
doc = false
67+
bench = false
4768

4869
[[bin]]
4970
name = "private_key_deserialization"
5071
path = "fuzz_targets/key/private_key_deserialization.rs"
72+
test = false
73+
doc = false
74+
bench = false
5175

5276
[[bin]]
5377
name = "argon2parameters_deserialization"
5478
path = "fuzz_targets/key/argon2parameters_deserialization.rs"
79+
test = false
80+
doc = false
81+
bench = false
5582

5683
[[bin]]
5784
name = "mix_key_exchange"
5885
path = "fuzz_targets/key/mix_key_exchange.rs"
86+
test = false
87+
doc = false
88+
bench = false
5989

6090
[[bin]]
6191
name = "share_deserialization"
6292
path = "fuzz_targets/secret_sharing/share_deserialization.rs"
93+
test = false
94+
doc = false
95+
bench = false
6396

6497
[[bin]]
6598
name = "generate_shared_key"
6699
path = "fuzz_targets/secret_sharing/generate_shared_key.rs"
100+
test = false
101+
doc = false
102+
bench = false
67103

68104
[[bin]]
69105
name = "join_shares"
70106
path = "fuzz_targets/secret_sharing/join_shares.rs"
107+
test = false
108+
doc = false
109+
bench = false
71110

72111
[[bin]]
73112
name = "generate_key"
74113
path = "fuzz_targets/utils/generate_key.rs"
114+
test = false
115+
doc = false
116+
bench = false
75117

76118
[[bin]]
77119
name = "derive_key"
78120
path = "fuzz_targets/utils/derive_key.rs"
121+
test = false
122+
doc = false
123+
bench = false
79124

80125
[[bin]]
81126
name = "validate_header"
82127
path = "fuzz_targets/utils/validate_header.rs"
128+
test = false
129+
doc = false
130+
bench = false
83131

84132
[[bin]]
85133
name = "base64_encode"
86134
path = "fuzz_targets/utils/base64_encode.rs"
135+
test = false
136+
doc = false
137+
bench = false
87138

88139
[[bin]]
89140
name = "base64_encode_url"
90141
path = "fuzz_targets/utils/base64_encode_url.rs"
142+
test = false
143+
doc = false
144+
bench = false
91145

92146
[[bin]]
93147
name = "base64_decode"
94148
path = "fuzz_targets/utils/base64_decode.rs"
149+
test = false
150+
doc = false
151+
bench = false
95152

96153
[[bin]]
97154
name = "base64_decode_url"
98155
path = "fuzz_targets/utils/base64_decode_url.rs"
156+
test = false
157+
doc = false
158+
bench = false
99159

100160
[[bin]]
101161
name = "derive_key_argon2"
102162
path = "fuzz_targets/utils/derive_key_argon2.rs"
163+
test = false
164+
doc = false
165+
bench = false
103166

104167
[[bin]]
105168
name = "scrypt_simple"
106169
path = "fuzz_targets/utils/scrypt_simple.rs"
170+
test = false
171+
doc = false
172+
bench = false
107173

108174
[[bin]]
109175
name = "signature_deserialization"
110176
path = "fuzz_targets/signature/signature_deserialization.rs"
177+
test = false
178+
doc = false
179+
bench = false
111180

112181
[[bin]]
113182
name = "sign"
114183
path = "fuzz_targets/signature/sign.rs"
184+
test = false
185+
doc = false
186+
bench = false
115187

116188
[[bin]]
117189
name = "verify"
118190
path = "fuzz_targets/signature/verify.rs"
191+
test = false
192+
doc = false
193+
bench = false
119194

120195
[[bin]]
121196
name = "signing_keypair_deserialization"
122197
path = "fuzz_targets/signing_key/signing_keypair_deserialization.rs"
198+
test = false
199+
doc = false
200+
bench = false
123201

124202
[[bin]]
125203
name = "signing_public_key_deserialization"
126204
path = "fuzz_targets/signing_key/signing_public_key_deserialization.rs"
205+
test = false
206+
doc = false
207+
bench = false
127208

128209
[[bin]]
129210
name = "online_ciphertext_header_deserialization"
130211
path = "fuzz_targets/online_ciphertext/header_deserialization.rs"
212+
test = false
213+
doc = false
214+
bench = false
131215

132216
[[bin]]
133217
name = "online_encrypt_symmetric"
134218
path = "fuzz_targets/online_ciphertext/encrypt_symmetric.rs"
219+
test = false
220+
doc = false
221+
bench = false
135222

136223
[[bin]]
137224
name = "online_encrypt_asymmetric"
138225
path = "fuzz_targets/online_ciphertext/encrypt_asymmetric.rs"
226+
test = false
227+
doc = false
228+
bench = false
139229

140230
[[bin]]
141231
name = "online_decrypt_symmetric"
142232
path = "fuzz_targets/online_ciphertext/decrypt_symmetric.rs"
233+
test = false
234+
doc = false
235+
bench = false
143236

144237
[[bin]]
145238
name = "online_decrypt_asymmetric"
146239
path = "fuzz_targets/online_ciphertext/decrypt_asymmetric.rs"
240+
test = false
241+
doc = false
242+
bench = false
147243

148244
[[bin]]
149245
name = "encrypt_with_aad"
150246
path = "fuzz_targets/ciphertext/encrypt_with_aad.rs"
247+
test = false
248+
doc = false
249+
bench = false
151250

152251
[[bin]]
153252
name = "decrypt_with_aad"
154253
path = "fuzz_targets/ciphertext/decrypt_with_aad.rs"
254+
test = false
255+
doc = false
256+
bench = false
155257

156258
[[bin]]
157259
name = "encrypt_asymmetric_with_aad"
158260
path = "fuzz_targets/ciphertext/encrypt_asymmetric_with_aad.rs"
261+
test = false
262+
doc = false
263+
bench = false
159264

160265
[[bin]]
161266
name = "decrypt_asymmetric_with_aad"
162267
path = "fuzz_targets/ciphertext/decrypt_asymmetric_with_aad.rs"
268+
test = false
269+
doc = false
270+
bench = false
163271

164272
[[bin]]
165273
name = "generate_keypair"
166274
path = "fuzz_targets/key/generate_keypair.rs"
275+
test = false
276+
doc = false
277+
bench = false
167278

168279
[[bin]]
169280
name = "constant_time_equals"
170281
path = "fuzz_targets/utils/constant_time_equals.rs"
282+
test = false
283+
doc = false
284+
bench = false
171285

172286
[[bin]]
173287
name = "kdf_encrypted_data_deserialization"
174288
path = "fuzz_targets/derive_encrypt/kdf_encrypted_data_deserialization.rs"
289+
test = false
290+
doc = false
291+
bench = false
175292

176293
[[bin]]
177294
name = "derivation_parameters_deserialization"
178295
path = "fuzz_targets/key_derivation/derivation_parameters_deserialization.rs"
296+
test = false
297+
doc = false
298+
bench = false
179299

180300
[[bin]]
181301
name = "decrypt_with_password"
182302
path = "fuzz_targets/derive_encrypt/decrypt_with_password.rs"
303+
test = false
304+
doc = false
305+
bench = false

‎src/error.rs‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,6 @@ use hmac::digest::MacError;
1010

1111
pub type Result<T> = std::result::Result<T, Error>;
1212

13-
// Doesn't work because Result is a type alias, keeping the commented code just in case we revisit someday
14-
// impl<T, E> From<std::result::Result<T, E>> for Result<T>
15-
// where E: Into<Error> {
16-
// fn from(value: std::result::Result<T, E>) -> Self {
17-
// match value {
18-
// Ok(t) => Ok(t),
19-
// Err(e) => Err(e.into()),
20-
// }
21-
// }
22-
// }
23-
2413
/// This crate's error type.
2514
#[derive(Debug, IntoStaticStr, thiserror::Error)]
2615
pub enum Error {

‎src/password_hash/password_hash_v1.rs‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ impl PasswordHashV1 {
8585

8686
// Generate hash
8787
let mut hash = [0u8; 32];
88-
let _ = pbkdf2::<Hmac<Sha256>>(pass, &salt, iterations, &mut hash);
88+
pbkdf2::<Hmac<Sha256>>(pass, &salt, iterations, &mut hash)
89+
.expect("HMAC-SHA256 accepts keys of any length, so this cannot fail");
8990

9091
Ok(PasswordHashV1 {
9192
iterations,
@@ -96,7 +97,8 @@ impl PasswordHashV1 {
9697

9798
pub fn verify_password(&self, pass: &[u8]) -> bool {
9899
let mut res = Zeroizing::new(vec![0u8; 32]);
99-
let _ = pbkdf2::<Hmac<Sha256>>(pass, &self.salt, self.iterations, &mut res);
100+
pbkdf2::<Hmac<Sha256>>(pass, &self.salt, self.iterations, &mut res)
101+
.expect("HMAC-SHA256 accepts keys of any length, so this cannot fail");
100102

101103
res.ct_eq(&self.hash).into()
102104
}

‎src/utils.rs‎

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ pub(crate) fn random_bytes<const N: usize>() -> Result<Zeroizing<[u8; N]>> {
7373
/// ```
7474
pub fn derive_key_pbkdf2(key: &[u8], salt: &[u8], iterations: u32, length: usize) -> Vec<u8> {
7575
let mut new_key = vec![0u8; length];
76-
let _ = pbkdf2::<Hmac<Sha256>>(key, salt, iterations, &mut new_key);
76+
pbkdf2::<Hmac<Sha256>>(key, salt, iterations, &mut new_key)
77+
.expect("HMAC-SHA256 accepts keys of any length, so this cannot fail");
7778
new_key
7879
}
7980

@@ -103,16 +104,20 @@ pub fn derive_key_argon2(key: &[u8], parameters: &Argon2Parameters) -> Result<Ve
103104
/// # Returns
104105
/// `true` if the header is valid, `false` if it is not.
105106
/// # Example
107+
/// ```
106108
/// use devolutions_crypto::DataType;
107109
/// use devolutions_crypto::ciphertext::{encrypt, CiphertextVersion};
108110
/// use devolutions_crypto::utils::{generate_key, validate_header};
109111
///
110-
/// let key = generate_key(32);
111-
/// let ciphertext: `Vec<u8>` = encrypt(b"test", &key, CiphertextVersion::Latest).unwrap().into();
112+
/// let key = generate_key(32).expect("generate key shouldn't fail");
113+
/// let ciphertext: Vec<u8> = encrypt(b"test", &key, CiphertextVersion::Latest)
114+
/// .expect("encryption shouldn't fail")
115+
/// .into();
112116
///
113-
/// assert!(validate_header(&ciphertext, DataType::Ciphertext);
114-
/// assert!(!validate_header(&ciphertext, DataType::PasswordHash);
115-
/// assert!(!validate_header(&key, DataType::Ciphertext);
117+
/// assert!(validate_header(&ciphertext, DataType::Ciphertext));
118+
/// assert!(!validate_header(&ciphertext, DataType::PasswordHash));
119+
/// assert!(!validate_header(&key, DataType::Ciphertext));
120+
/// ```
116121
pub fn validate_header(data: &[u8], data_type: DataType) -> bool {
117122
use super::ciphertext::Ciphertext;
118123
use super::derive_encrypt::KdfEncryptedData;

0 commit comments

Comments
 (0)