mirror of
https://github.com/saymrwulf/curve25519-dalek-source.git
synced 2026-09-08 21:00:40 +00:00
Fix serde / no_std incompatibility
Co-authored-by: ryan kurte <ryan@kurte.nz> Co-authored-by: Vlad Semenov <semenov.vlad.by@gmail.com>
This commit is contained in:
parent
9577d1e322
commit
2931c688eb
5 changed files with 66 additions and 28 deletions
3
.github/workflows/rust.yml
vendored
3
.github/workflows/rust.yml
vendored
|
|
@ -82,8 +82,7 @@ jobs:
|
||||||
- uses: taiki-e/install-action@cargo-hack
|
- uses: taiki-e/install-action@cargo-hack
|
||||||
# No default features build
|
# No default features build
|
||||||
- run: cargo build --target thumbv7em-none-eabi --release --no-default-features
|
- run: cargo build --target thumbv7em-none-eabi --release --no-default-features
|
||||||
# TODO: serde pending PR#288
|
- run: cargo hack build --target thumbv7em-none-eabi --release --each-feature --exclude-features default,std
|
||||||
- run: cargo hack build --target thumbv7em-none-eabi --release --each-feature --exclude-features default,std,serde
|
|
||||||
|
|
||||||
bench:
|
bench:
|
||||||
name: Check that benchmarks compile
|
name: Check that benchmarks compile
|
||||||
|
|
|
||||||
10
Cargo.lock
generated
10
Cargo.lock
generated
|
|
@ -299,7 +299,6 @@ dependencies = [
|
||||||
"rand",
|
"rand",
|
||||||
"rand_core",
|
"rand_core",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_bytes",
|
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2",
|
"sha2",
|
||||||
"signature",
|
"signature",
|
||||||
|
|
@ -694,15 +693,6 @@ dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "serde_bytes"
|
|
||||||
version = "0.11.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "718dc5fff5b36f99093fc49b280cfc96ce6fc824317783bff5a1fed0c7a64819"
|
|
||||||
dependencies = [
|
|
||||||
"serde",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.152"
|
version = "1.0.152"
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,6 @@ sha2 = { version = "0.10", default-features = false }
|
||||||
merlin = { version = "3", default-features = false, optional = true }
|
merlin = { version = "3", default-features = false, optional = true }
|
||||||
rand_core = { version = "0.6.4", default-features = false, optional = true }
|
rand_core = { version = "0.6.4", default-features = false, optional = true }
|
||||||
serde = { version = "1.0", default-features = false, optional = true }
|
serde = { version = "1.0", default-features = false, optional = true }
|
||||||
serde_bytes = { version = "0.11", optional = true }
|
|
||||||
zeroize = { version = "1.5", default-features = false, optional = true }
|
zeroize = { version = "1.5", default-features = false, optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
|
@ -68,5 +67,5 @@ legacy_compatibility = []
|
||||||
pkcs8 = ["ed25519/pkcs8"]
|
pkcs8 = ["ed25519/pkcs8"]
|
||||||
pem = ["alloc", "ed25519/pem", "pkcs8"]
|
pem = ["alloc", "ed25519/pem", "pkcs8"]
|
||||||
rand_core = ["dep:rand_core"]
|
rand_core = ["dep:rand_core"]
|
||||||
serde = ["dep:serde", "serde_bytes", "ed25519/serde"]
|
serde = ["dep:serde", "ed25519/serde"]
|
||||||
zeroize = ["dep:zeroize", "curve25519-dalek/zeroize"]
|
zeroize = ["dep:zeroize", "curve25519-dalek/zeroize"]
|
||||||
|
|
|
||||||
|
|
@ -15,12 +15,8 @@ use ed25519::pkcs8;
|
||||||
#[cfg(any(test, feature = "rand_core"))]
|
#[cfg(any(test, feature = "rand_core"))]
|
||||||
use rand_core::CryptoRngCore;
|
use rand_core::CryptoRngCore;
|
||||||
|
|
||||||
#[cfg(feature = "serde")]
|
|
||||||
use serde::de::Error as SerdeError;
|
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
#[cfg(feature = "serde")]
|
|
||||||
use serde_bytes::{ByteBuf as SerdeByteBuf, Bytes as SerdeBytes};
|
|
||||||
|
|
||||||
use sha2::Sha512;
|
use sha2::Sha512;
|
||||||
|
|
||||||
|
|
@ -634,7 +630,7 @@ impl Serialize for SigningKey {
|
||||||
where
|
where
|
||||||
S: Serializer,
|
S: Serializer,
|
||||||
{
|
{
|
||||||
SerdeBytes::new(&self.secret_key).serialize(serializer)
|
serializer.serialize_bytes(&self.secret_key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -644,8 +640,37 @@ impl<'d> Deserialize<'d> for SigningKey {
|
||||||
where
|
where
|
||||||
D: Deserializer<'d>,
|
D: Deserializer<'d>,
|
||||||
{
|
{
|
||||||
let bytes = <SerdeByteBuf>::deserialize(deserializer)?;
|
struct SigningKeyVisitor;
|
||||||
Self::try_from(bytes.as_ref()).map_err(SerdeError::custom)
|
|
||||||
|
impl<'de> serde::de::Visitor<'de> for SigningKeyVisitor {
|
||||||
|
type Value = SigningKey;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
|
||||||
|
write!(formatter, concat!("An ed25519 signing (private) key"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_borrowed_bytes<E: serde::de::Error>(
|
||||||
|
self,
|
||||||
|
bytes: &'de [u8],
|
||||||
|
) -> Result<Self::Value, E> {
|
||||||
|
SigningKey::try_from(bytes.as_ref()).map_err(E::custom)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
||||||
|
where
|
||||||
|
A: serde::de::SeqAccess<'de>,
|
||||||
|
{
|
||||||
|
let mut bytes = [0u8; 32];
|
||||||
|
for i in 0..32 {
|
||||||
|
bytes[i] = seq
|
||||||
|
.next_element()?
|
||||||
|
.ok_or_else(|| serde::de::Error::invalid_length(i, &"expected 32 bytes"))?;
|
||||||
|
}
|
||||||
|
SigningKey::try_from(bytes).map_err(serde::de::Error::custom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_bytes(SigningKeyVisitor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,12 +27,8 @@ use sha2::Sha512;
|
||||||
#[cfg(feature = "pkcs8")]
|
#[cfg(feature = "pkcs8")]
|
||||||
use ed25519::pkcs8;
|
use ed25519::pkcs8;
|
||||||
|
|
||||||
#[cfg(feature = "serde")]
|
|
||||||
use serde::de::Error as SerdeError;
|
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
#[cfg(feature = "serde")]
|
|
||||||
use serde_bytes::{ByteBuf as SerdeByteBuf, Bytes as SerdeBytes};
|
|
||||||
|
|
||||||
#[cfg(feature = "digest")]
|
#[cfg(feature = "digest")]
|
||||||
use crate::context::Context;
|
use crate::context::Context;
|
||||||
|
|
@ -542,7 +538,7 @@ impl Serialize for VerifyingKey {
|
||||||
where
|
where
|
||||||
S: Serializer,
|
S: Serializer,
|
||||||
{
|
{
|
||||||
SerdeBytes::new(self.as_bytes()).serialize(serializer)
|
serializer.serialize_bytes(&self.as_bytes()[..])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -552,7 +548,36 @@ impl<'d> Deserialize<'d> for VerifyingKey {
|
||||||
where
|
where
|
||||||
D: Deserializer<'d>,
|
D: Deserializer<'d>,
|
||||||
{
|
{
|
||||||
let bytes = <SerdeByteBuf>::deserialize(deserializer)?;
|
struct VerifyingKeyVisitor;
|
||||||
VerifyingKey::try_from(bytes.as_ref()).map_err(SerdeError::custom)
|
|
||||||
|
impl<'de> serde::de::Visitor<'de> for VerifyingKeyVisitor {
|
||||||
|
type Value = VerifyingKey;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
|
||||||
|
write!(formatter, concat!("An ed25519 verifying (public) key"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_borrowed_bytes<E: serde::de::Error>(
|
||||||
|
self,
|
||||||
|
bytes: &'de [u8],
|
||||||
|
) -> Result<Self::Value, E> {
|
||||||
|
VerifyingKey::try_from(bytes.as_ref()).map_err(E::custom)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
||||||
|
where
|
||||||
|
A: serde::de::SeqAccess<'de>,
|
||||||
|
{
|
||||||
|
let mut bytes = [0u8; 32];
|
||||||
|
for i in 0..32 {
|
||||||
|
bytes[i] = seq
|
||||||
|
.next_element()?
|
||||||
|
.ok_or_else(|| serde::de::Error::invalid_length(i, &"expected 32 bytes"))?;
|
||||||
|
}
|
||||||
|
VerifyingKey::try_from(&bytes[..]).map_err(serde::de::Error::custom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_bytes(VerifyingKeyVisitor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue