diff options
-rw-r--r-- | openpgp/src/crypto/mem.rs | 12 |
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 { |