diff --git a/src/crypto/ecdh.rs b/src/crypto/ecdh.rs index 3490dcf3d..7b7d8c966 100644 --- a/src/crypto/ecdh.rs +++ b/src/crypto/ecdh.rs @@ -333,11 +333,11 @@ where Ok(( PublicParams::ECDH { curve: curve.clone(), - p: Mpi::from_raw_slice(public.to_sec1_bytes().as_ref()), + p: Mpi::from_slice(public.to_sec1_bytes().as_ref()), hash: curve.hash_algo()?, alg_sym: curve.sym_algo()?, }, - PlainSecretParams::ECDH(Mpi::from_raw_slice(secret.to_bytes().as_slice())), + PlainSecretParams::ECDH(Mpi::from_slice(secret.to_bytes().as_slice())), )) } @@ -483,7 +483,7 @@ pub fn encrypt( let encrypted_session_key = aes_kw::wrap(&z, &plain_padded)?; Ok(PkeskBytes::Ecdh { - public_point: Mpi::from_raw_slice(&encoded_public), + public_point: Mpi::from_slice(&encoded_public), encrypted_session_key, }) } diff --git a/src/crypto/ecdsa.rs b/src/crypto/ecdsa.rs index 6f5844cfb..6245bef52 100644 --- a/src/crypto/ecdsa.rs +++ b/src/crypto/ecdsa.rs @@ -111,12 +111,12 @@ pub fn generate_key( ECCCurve::P256 => { let secret = p256::SecretKey::random(&mut rng); let public = secret.public_key(); - let secret = Mpi::from_raw_slice(secret.to_bytes().as_slice()); + let secret = Mpi::from_slice(secret.to_bytes().as_slice()); Ok(( PublicParams::ECDSA(EcdsaPublicParams::P256 { key: public, - p: Mpi::from_raw_slice(public.to_encoded_point(false).as_bytes()), + p: Mpi::from_slice(public.to_encoded_point(false).as_bytes()), }), PlainSecretParams::ECDSA(secret), )) @@ -125,12 +125,12 @@ pub fn generate_key( ECCCurve::P384 => { let secret = p384::SecretKey::random(&mut rng); let public = secret.public_key(); - let secret = Mpi::from_raw_slice(secret.to_bytes().as_slice()); + let secret = Mpi::from_slice(secret.to_bytes().as_slice()); Ok(( PublicParams::ECDSA(EcdsaPublicParams::P384 { key: public, - p: Mpi::from_raw_slice(public.to_encoded_point(false).as_bytes()), + p: Mpi::from_slice(public.to_encoded_point(false).as_bytes()), }), PlainSecretParams::ECDSA(secret), )) @@ -139,12 +139,12 @@ pub fn generate_key( ECCCurve::P521 => { let secret = p521::SecretKey::random(&mut rng); let public = secret.public_key(); - let secret = Mpi::from_raw_slice(secret.to_bytes().as_slice()); + let secret = Mpi::from_slice(secret.to_bytes().as_slice()); Ok(( PublicParams::ECDSA(EcdsaPublicParams::P521 { key: public, - p: Mpi::from_raw_slice(public.to_encoded_point(false).as_bytes()), + p: Mpi::from_slice(public.to_encoded_point(false).as_bytes()), }), PlainSecretParams::ECDSA(secret), )) @@ -153,12 +153,12 @@ pub fn generate_key( ECCCurve::Secp256k1 => { let secret = k256::SecretKey::random(&mut rng); let public = secret.public_key(); - let secret = Mpi::from_raw_slice(secret.to_bytes().as_slice()); + let secret = Mpi::from_slice(secret.to_bytes().as_slice()); Ok(( PublicParams::ECDSA(EcdsaPublicParams::Secp256k1 { key: public, - p: Mpi::from_raw_slice(public.to_encoded_point(false).as_bytes()), + p: Mpi::from_slice(public.to_encoded_point(false).as_bytes()), }), PlainSecretParams::ECDSA(secret), )) diff --git a/src/crypto/eddsa.rs b/src/crypto/eddsa.rs index 31bb81fce..9cde47711 100644 --- a/src/crypto/eddsa.rs +++ b/src/crypto/eddsa.rs @@ -103,7 +103,7 @@ pub fn generate_key( q.extend_from_slice(&public.to_bytes()); // secret key - let p = Mpi::from_raw_slice(&secret.to_bytes()); + let p = Mpi::from_slice(&secret.to_bytes()); ( PublicParams::EdDSALegacy { diff --git a/src/crypto/rsa.rs b/src/crypto/rsa.rs index 3d9748df3..1a076d9c0 100644 --- a/src/crypto/rsa.rs +++ b/src/crypto/rsa.rs @@ -103,7 +103,7 @@ pub fn encrypt( let data = key.encrypt(&mut rng, Pkcs1v15Encrypt, plaintext)?; Ok(PkeskBytes::Rsa { - mpi: Mpi::from_raw_slice(&data[..]), + mpi: Mpi::from_slice(&data[..]), }) } diff --git a/src/packet/key/secret.rs b/src/packet/key/secret.rs index f94337567..f1670a065 100644 --- a/src/packet/key/secret.rs +++ b/src/packet/key/secret.rs @@ -302,7 +302,7 @@ impl SecretKeyT // strip leading zeros, to match parse results from MPIs let mpis = sig .iter() - .map(|v| Mpi::from_raw_slice(&v[..])) + .map(|v| Mpi::from_slice(&v[..])) .collect::>(); signature = Some(SignatureBytes::Mpis(mpis)); diff --git a/src/types/mpi.rs b/src/types/mpi.rs index cb914dbcb..0ed2563c6 100644 --- a/src/types/mpi.rs +++ b/src/types/mpi.rs @@ -21,11 +21,12 @@ const MAX_EXTERN_MPI_BITS: u32 = 16384; /// /// ```rust /// use pgp::types::mpi; +/// use pgp::types::MpiRef; /// /// // Decode the number `1`. /// assert_eq!( /// mpi(&[0x00, 0x01, 0x01][..]).unwrap(), -/// (&b""[..], (&[1][..]).into()) +/// (&b""[..], MpiRef::from_slice(&[1][..])) /// ); /// ``` pub fn mpi(input: &[u8]) -> IResult<&[u8], MpiRef<'_>> { @@ -43,7 +44,7 @@ pub fn mpi(input: &[u8]) -> IResult<&[u8], MpiRef<'_>> { Err(needed) => Err(nom::Err::Incomplete(needed)), Ok(index) => { let (rest, n) = number.take_split(index); - let n_stripped: MpiRef<'_> = strip_leading_zeros(n).into(); + let n_stripped: MpiRef<'_> = MpiRef::from_slice(strip_leading_zeros(n)); Ok((rest, n_stripped)) } @@ -73,12 +74,8 @@ impl Mpi { Mpi(v) } - pub fn from_slice(slice: &[u8]) -> Self { - Mpi(slice.to_vec()) - } - /// Strips leading zeros. - pub fn from_raw_slice(raw: &[u8]) -> Self { + pub fn from_slice(raw: &[u8]) -> Self { Mpi(strip_leading_zeros(raw).to_vec()) } @@ -109,7 +106,7 @@ impl<'a> std::ops::Deref for MpiRef<'a> { impl<'a> MpiRef<'a> { pub fn from_slice(slice: &'a [u8]) -> Self { - MpiRef(slice) + MpiRef(strip_leading_zeros(slice)) } pub fn to_owned(&self) -> Mpi { @@ -155,18 +152,6 @@ impl<'a> Serialize for MpiRef<'a> { } } -impl From<&[u8]> for Mpi { - fn from(other: &[u8]) -> Mpi { - Mpi::from_slice(other) - } -} - -impl<'a> From<&'a [u8]> for MpiRef<'a> { - fn from(other: &'a [u8]) -> MpiRef<'a> { - MpiRef::from_slice(other) - } -} - impl From> for Mpi { fn from(other: Vec) -> Mpi { Mpi(other) @@ -220,7 +205,7 @@ mod tests { // Decode the number `511` (`0x1FF` in hex). assert_eq!( mpi(&[0x00, 0x09, 0x01, 0xFF][..]).unwrap(), - (&b""[..], (&[0x01, 0xFF][..]).into()) + (&b""[..], MpiRef::from_slice(&[0x01, 0xFF][..])) ); // Decode the number `2^255 + 7`. @@ -232,11 +217,12 @@ mod tests { .unwrap(), ( &b""[..], - (&[ - 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0x07 - ][..]) - .into() + MpiRef::from_slice( + &[ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x07 + ][..] + ) ) ); } @@ -280,7 +266,7 @@ mod tests { MpiRef::from_slice(&bytes) .strip_trailing_zeroes() .as_bytes(), - &[0, 1, 2, 3, 4], + &[1, 2, 3, 4], ); let bytes = [1, 2, 0, 3, 4]; diff --git a/src/util.rs b/src/util.rs index ca3a1b962..635ee53eb 100644 --- a/src/util.rs +++ b/src/util.rs @@ -77,7 +77,7 @@ pub fn strip_leading_zeros(bytes: &[u8]) -> &[u8] { bytes .iter() .position(|b| b != &0) - .map_or(bytes, |offset| &bytes[offset..]) + .map_or(&[], |offset| &bytes[offset..]) } #[inline] @@ -239,4 +239,11 @@ mod tests { write_packet_length(12870, &mut res).unwrap(); assert_eq!(hex::encode(res), "ff00003246"); } + + #[test] + fn test_strip_leading_zeros_with_all_zeros() { + let buf = [0, 0, 0]; + let stripped = strip_leading_zeros(&buf); + assert_eq!(stripped, &[]); + } } diff --git a/tests/hsm-test.rs b/tests/hsm-test.rs index 0b729f5b7..c52367982 100644 --- a/tests/hsm-test.rs +++ b/tests/hsm-test.rs @@ -135,23 +135,17 @@ impl SecretKeyTrait for FakeHsm { let sig = self.sign_data.unwrap().1; // fake smartcard output let mpis = match self.public_key.algorithm() { - PublicKeyAlgorithm::RSA => vec![sig.into()], + PublicKeyAlgorithm::RSA => vec![Mpi::from_slice(sig)], PublicKeyAlgorithm::ECDSA => { let mid = sig.len() / 2; - vec![ - Mpi::from_raw_slice(&sig[..mid]), - Mpi::from_raw_slice(&sig[mid..]), - ] + vec![Mpi::from_slice(&sig[..mid]), Mpi::from_slice(&sig[mid..])] } PublicKeyAlgorithm::EdDSALegacy => { assert_eq!(sig.len(), 64); // FIXME: check curve; add error handling - vec![ - Mpi::from_raw_slice(&sig[..32]), - Mpi::from_raw_slice(&sig[32..]), - ] + vec![Mpi::from_slice(&sig[..32]), Mpi::from_slice(&sig[32..])] } _ => unimplemented!(),