summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2019-05-20 14:59:57 +0200
committerJustus Winter <justus@sequoia-pgp.org>2019-05-20 15:15:26 +0200
commit3beec3766a6f87348d1ef733e63a9fdf6d96b141 (patch)
tree09868dc1c85f27c59a0e78d74987a346e2c49891
parent4d54935cb721991627da6f82790fb5ff2c6cae5b (diff)
openpgp: Optimize key derivation.
-rw-r--r--openpgp/src/crypto/s2k.rs14
1 files changed, 11 insertions, 3 deletions
diff --git a/openpgp/src/crypto/s2k.rs b/openpgp/src/crypto/s2k.rs
index 2f2fc8a4..24d4dfb2 100644
--- a/openpgp/src/crypto/s2k.rs
+++ b/openpgp/src/crypto/s2k.rs
@@ -109,14 +109,22 @@ impl S2K {
hash.update(&string);
},
&S2K::Iterated { ref salt, hash_bytes, .. } => {
- let octs_per_iter = salt.len() + string.len();
+ // Unroll the processing loop N times.
+ const N: usize = 16;
+ let data_len = salt.len() + string.len();
+ let octs_per_iter = N * data_len;
let mut data: SessionKey =
vec![0u8; octs_per_iter].into();
let full = hash_bytes as usize / octs_per_iter;
let tail = hash_bytes as usize - (full * octs_per_iter);
- data[0..salt.len()].clone_from_slice(salt);
- data[salt.len()..].clone_from_slice(string);
+ for i in 0..N {
+ let o = data_len * i;
+ data[o..o + salt.len()]
+ .clone_from_slice(salt);
+ data[o + salt.len()..o + data_len]
+ .clone_from_slice(string);
+ }
for _ in 0..full {
hash.update(&data);