diff options
author | Justus Winter <justus@sequoia-pgp.org> | 2019-05-20 14:59:57 +0200 |
---|---|---|
committer | Justus Winter <justus@sequoia-pgp.org> | 2019-05-20 15:15:26 +0200 |
commit | 3beec3766a6f87348d1ef733e63a9fdf6d96b141 (patch) | |
tree | 09868dc1c85f27c59a0e78d74987a346e2c49891 | |
parent | 4d54935cb721991627da6f82790fb5ff2c6cae5b (diff) |
openpgp: Optimize key derivation.
-rw-r--r-- | openpgp/src/crypto/s2k.rs | 14 |
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); |