summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openpgp/src/crypto/mem.rs12
1 files changed, 12 insertions, 0 deletions
diff --git a/openpgp/src/crypto/mem.rs b/openpgp/src/crypto/mem.rs
index dd63dfbd..c795c7e1 100644
--- a/openpgp/src/crypto/mem.rs
+++ b/openpgp/src/crypto/mem.rs
@@ -170,6 +170,18 @@ 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);
+
+ p
+ }
+}
+
impl Drop for Protected {
fn drop(&mut self) {
unsafe {