diff options
author | Justus Winter <justus@sequoia-pgp.org> | 2023-09-22 14:05:22 +0200 |
---|---|---|
committer | Justus Winter <justus@sequoia-pgp.org> | 2023-09-22 15:32:46 +0200 |
commit | c6662d0a51868dca2d12a76f21670a890a045cbe (patch) | |
tree | bca1e78cee1c25500ef50c81151a5e495c3326b2 | |
parent | f05cddce877f2b36993a180cdf044172e6e3801b (diff) |
openpgp: Deduplicate code.
-rw-r--r-- | openpgp/src/crypto/mem.rs | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/openpgp/src/crypto/mem.rs b/openpgp/src/crypto/mem.rs index 8540776b..aaec1da6 100644 --- a/openpgp/src/crypto/mem.rs +++ b/openpgp/src/crypto/mem.rs @@ -163,6 +163,13 @@ pub(crate) fn zero_stack<const N: usize, T>(v: T) -> T { v } +/// Very carefully copies the slice. +/// +/// The obvious `to.copy_from_slice(from);` indeed leaks secrets. +pub(crate) fn careful_memcpy(from: &[u8], to: &mut [u8]) { + from.iter().zip(to.iter_mut()).for_each(|(f, t)| *t = *f); +} + impl From<Box<[u8]>> for Protected { fn from(v: Box<[u8]>) -> Self { Protected(Box::leak(v)) @@ -172,11 +179,7 @@ impl From<Box<[u8]>> for Protected { impl From<&[u8]> for Protected { fn from(v: &[u8]) -> Self { let mut p = Protected::new(v.len()); - - // Very carefully copy the slice. The obvious - // `p.copy_from_slice(v);` indeed leaks secrets. - v.iter().zip(p.iter_mut()).for_each(|(f, t)| *t = *f); - + careful_memcpy(v, &mut p); p } } @@ -184,11 +187,7 @@ impl From<&[u8]> for Protected { impl<const N: usize> From<[u8; N]> for Protected { fn from(v: [u8; N]) -> Self { let mut p = Protected::new(v.len()); - - // Very carefully copy the slice. The obvious - // `p.copy_from_slice(v);` indeed leaks secrets. - v.iter().zip(p.iter_mut()).for_each(|(f, t)| *t = *f); - + careful_memcpy(&v, &mut p); p } } |