summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2023-09-22 14:05:22 +0200
committerJustus Winter <justus@sequoia-pgp.org>2023-09-22 15:32:46 +0200
commitc6662d0a51868dca2d12a76f21670a890a045cbe (patch)
treebca1e78cee1c25500ef50c81151a5e495c3326b2
parentf05cddce877f2b36993a180cdf044172e6e3801b (diff)
openpgp: Deduplicate code.
-rw-r--r--openpgp/src/crypto/mem.rs19
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
}
}