add default serialization format (#511)
* add default serialization format * remove SHORT_ID from Ciphersuite trait
This commit is contained in:
parent
9752182fa1
commit
d4b03ea7bf
|
@ -8,6 +8,7 @@
|
||||||
- [Signing](tutorial/signing.md)
|
- [Signing](tutorial/signing.md)
|
||||||
- [Distributed Key Generation](tutorial/dkg.md)
|
- [Distributed Key Generation](tutorial/dkg.md)
|
||||||
- [User Documentation](user.md)
|
- [User Documentation](user.md)
|
||||||
|
- [Serialization Format](user/serialization.md)
|
||||||
- [FROST with Zcash](zcash.md)
|
- [FROST with Zcash](zcash.md)
|
||||||
- [Technical Details](zcash/technical-details.md)
|
- [Technical Details](zcash/technical-details.md)
|
||||||
- [Ywallet Demo](zcash/ywallet-demo.md)
|
- [Ywallet Demo](zcash/ywallet-demo.md)
|
||||||
|
|
|
@ -20,9 +20,21 @@ generation or signing procedure.
|
||||||
|
|
||||||
FROST is a distributed protocol and thus it requires sending messages between
|
FROST is a distributed protocol and thus it requires sending messages between
|
||||||
participants. While the ZF FROST library does not handle communication, it can
|
participants. While the ZF FROST library does not handle communication, it can
|
||||||
help with serialization by activating the `serde` feature. When it is enabled,
|
help with serialization in the following ways:
|
||||||
you can use [serde](https://serde.rs/) to serialize any structure that needs
|
|
||||||
to be transmitted. Import example:
|
### Default byte-oriented serialization
|
||||||
|
|
||||||
|
With the `serialization` feature, which is enabled by default, all structs that
|
||||||
|
need to communicated will have `serialize()` and `deserialize()` methods. The
|
||||||
|
serialization format is described in [Serialization
|
||||||
|
Format](../user/serialization.md).
|
||||||
|
|
||||||
|
### serde
|
||||||
|
|
||||||
|
Alternatively, if you would like to user another format such as JSON, you can
|
||||||
|
enable the `serde` feature (which is *not* enabled by default). When it is
|
||||||
|
enabled, you can use [serde](https://serde.rs/) to serialize any structure that
|
||||||
|
needs to be transmitted. The importing would look like:
|
||||||
|
|
||||||
```
|
```
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
@ -33,5 +45,5 @@ Note that serde usage is optional. Applications can use different encodings, and
|
||||||
to support that, all structures that need to be transmitted have public getters
|
to support that, all structures that need to be transmitted have public getters
|
||||||
and `new()` methods allowing the application to encode and decode them as it
|
and `new()` methods allowing the application to encode and decode them as it
|
||||||
wishes. (Note that fields like `Scalar` and `Element` do have standard byte
|
wishes. (Note that fields like `Scalar` and `Element` do have standard byte
|
||||||
string encodings; the application can encode those byte strings as it wishes,
|
string encodings; the application can encode those byte strings as it wishes, as
|
||||||
as well the structure themselves and things like maps and lists.)
|
well the structure themselves and things like maps and lists.)
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
# Serialization Format
|
||||||
|
|
||||||
|
With the `serialization` feature, which is enabled by default, all structs that
|
||||||
|
need to communicated will have `serialize()` and `deserialize()` methods.
|
||||||
|
|
||||||
|
The format is basically the `serde` encoding of the structs using the
|
||||||
|
[`postcard`](https://docs.rs/postcard/latest/postcard/) crate.
|
||||||
|
|
||||||
|
- Integers are encoded in [varint
|
||||||
|
format](https://postcard.jamesmunns.com/wire-format#varint-encoded-integers)
|
||||||
|
- Fixed-size byte arrays are encoded as-is (e.g. scalars, elements)
|
||||||
|
- Note that the encoding of scalars and elements are defined by the
|
||||||
|
ciphersuites.
|
||||||
|
- Variable-size byte arrays are encoded with a length prefix (varint-encoded)
|
||||||
|
and the array as-is (e.g. the message)
|
||||||
|
- Maps are encoded as the varint-encoded item count, followed by concatenated
|
||||||
|
item encodings.
|
||||||
|
- Ciphersuite IDs are encoded as the 4-byte CRC-32 of the ID string.
|
||||||
|
- Structs are encoded as the concatenation of the encodings of its items.
|
||||||
|
|
||||||
|
For example, the following Signing Package:
|
||||||
|
|
||||||
|
- Commitments (map):
|
||||||
|
- Identifier (byte array): `2a00000000000000000000000000000000000000000000000000000000000000`
|
||||||
|
- Signing Commitments:
|
||||||
|
- Hiding (byte array): `e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76`
|
||||||
|
- Bindng (byte array): `6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919`
|
||||||
|
- Ciphersuite ID: `"FROST(ristretto255, SHA-512)"`
|
||||||
|
- Message (variable size byte array): `68656c6c6f20776f726c64` (`"hello world"` in UTF-8)
|
||||||
|
- Ciphersuite ID (4 bytes): `"FROST(ristretto255, SHA-512)"`
|
||||||
|
|
||||||
|
Is encoded as
|
||||||
|
|
||||||
|
```
|
||||||
|
012a000000000000000000000000000000000000000000000000000000000000
|
||||||
|
00e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d
|
||||||
|
766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b9
|
||||||
|
19e6811b690b68656c6c6f20776f726c64e6811b69
|
||||||
|
```
|
||||||
|
|
||||||
|
- `01`: the length of the map
|
||||||
|
- `2a00000000000000000000000000000000000000000000000000000000000000`: the identifier
|
||||||
|
- `e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76`: the hinding commitment
|
||||||
|
- `6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919`: the binding commitment
|
||||||
|
- `e6811b69`: the ciphersuite ID of the SigningCommitments, CRC-32 of "FROST(ristretto255, SHA-512)"
|
||||||
|
- `0b`: the length of the message
|
||||||
|
- `68656c6c6f20776f726c64`: the message
|
||||||
|
- `e6811b69`: the ciphersuite ID of the SigningPackage, CRC-32 of "FROST(ristretto255, SHA-512)"
|
||||||
|
|
||||||
|
```admonish note
|
||||||
|
The ciphersuite ID is encoded multiple times in this case because `SigningPackage` includes
|
||||||
|
`SigningCommitments`, which also need to be communicated in Round 1 and thus also encodes
|
||||||
|
its ciphersuite ID. This is the only instance where this happens.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Test Vectors
|
||||||
|
|
||||||
|
Check the
|
||||||
|
[`snapshots`](https://github.com/search?q=repo%3AZcashFoundation%2Ffrost+path%3Asnapshots&type=code)
|
||||||
|
files in each ciphersuite crate for test vectors.
|
|
@ -23,10 +23,12 @@ rustdoc-args = ["--cfg", "docsrs"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
byteorder = "1.4"
|
byteorder = "1.4"
|
||||||
|
const-crc32 = "1.2.0"
|
||||||
document-features = "0.2.7"
|
document-features = "0.2.7"
|
||||||
debugless-unwrap = "0.0.4"
|
debugless-unwrap = "0.0.4"
|
||||||
derive-getters = "0.3.0"
|
derive-getters = "0.3.0"
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
|
postcard = { version = "1.0.0", features = ["use-std"], optional = true }
|
||||||
rand_core = "0.6"
|
rand_core = "0.6"
|
||||||
serde = { version = "1.0.160", features = ["derive"], optional = true }
|
serde = { version = "1.0.160", features = ["derive"], optional = true }
|
||||||
serdect = { version = "0.2.0", optional = true }
|
serdect = { version = "0.2.0", optional = true }
|
||||||
|
@ -48,7 +50,7 @@ rand_chacha = "0.3"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = ["serialization"]
|
||||||
#! ## Features
|
#! ## Features
|
||||||
## Expose internal types, which do not have SemVer guarantees. This is an advanced
|
## Expose internal types, which do not have SemVer guarantees. This is an advanced
|
||||||
## feature which can be useful if you need to build a modified version of FROST.
|
## feature which can be useful if you need to build a modified version of FROST.
|
||||||
|
@ -58,6 +60,7 @@ internals = []
|
||||||
## can use `serde` to serialize structs with any encoder that supports
|
## can use `serde` to serialize structs with any encoder that supports
|
||||||
## `serde` (e.g. JSON with `serde_json`).
|
## `serde` (e.g. JSON with `serde_json`).
|
||||||
serde = ["dep:serde", "dep:serdect"]
|
serde = ["dep:serde", "dep:serdect"]
|
||||||
|
serialization = ["serde", "dep:postcard"]
|
||||||
# Exposes ciphersuite-generic tests for other crates to use
|
# Exposes ciphersuite-generic tests for other crates to use
|
||||||
test-impl = ["proptest", "serde_json", "criterion"]
|
test-impl = ["proptest", "serde_json", "criterion"]
|
||||||
|
|
||||||
|
|
|
@ -101,6 +101,12 @@ pub enum Error<C: Ciphersuite> {
|
||||||
/// The ciphersuite does not support deriving identifiers from strings.
|
/// The ciphersuite does not support deriving identifiers from strings.
|
||||||
#[error("The ciphersuite does not support deriving identifiers from strings.")]
|
#[error("The ciphersuite does not support deriving identifiers from strings.")]
|
||||||
IdentifierDerivationNotSupported,
|
IdentifierDerivationNotSupported,
|
||||||
|
/// Error serializing value.
|
||||||
|
#[error("Error serializing value.")]
|
||||||
|
SerializationError,
|
||||||
|
/// Error deserializing value.
|
||||||
|
#[error("Error deserializing value.")]
|
||||||
|
DeserializationError,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<C> Error<C>
|
impl<C> Error<C>
|
||||||
|
@ -147,6 +153,8 @@ where
|
||||||
| Error::UnknownIdentifier
|
| Error::UnknownIdentifier
|
||||||
| Error::IncorrectNumberOfIdentifiers
|
| Error::IncorrectNumberOfIdentifiers
|
||||||
| Error::IncorrectNumberOfCommitments
|
| Error::IncorrectNumberOfCommitments
|
||||||
|
| Error::SerializationError
|
||||||
|
| Error::DeserializationError
|
||||||
| Error::IdentifierDerivationNotSupported => None,
|
| Error::IdentifierDerivationNotSupported => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,8 @@ pub mod round1;
|
||||||
pub mod round2;
|
pub mod round2;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
scalar_mul::VartimeMultiscalarMul, Ciphersuite, Element, Error, Field, Group, Scalar,
|
scalar_mul::VartimeMultiscalarMul, Ciphersuite, Deserialize, Element, Error, Field, Group,
|
||||||
Signature, VerifyingKey,
|
Scalar, Serialize, Signature, VerifyingKey,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub use self::identifier::Identifier;
|
pub use self::identifier::Identifier;
|
||||||
|
@ -306,6 +306,22 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
impl<C> SigningPackage<C>
|
||||||
|
where
|
||||||
|
C: Ciphersuite + serde::Serialize + for<'de> serde::Deserialize<'de>,
|
||||||
|
{
|
||||||
|
/// Serialize the struct into a Vec.
|
||||||
|
pub fn serialize(&self) -> Result<Vec<u8>, Error<C>> {
|
||||||
|
Serialize::serialize(&self)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deserialize the struct from a slice of bytes.
|
||||||
|
pub fn deserialize(bytes: &[u8]) -> Result<Self, Error<C>> {
|
||||||
|
Deserialize::deserialize(bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The product of all signers' individual commitments, published as part of the
|
/// The product of all signers' individual commitments, published as part of the
|
||||||
/// final signature.
|
/// final signature.
|
||||||
#[derive(Clone, PartialEq, Eq)]
|
#[derive(Clone, PartialEq, Eq)]
|
||||||
|
|
|
@ -17,7 +17,8 @@ use rand_core::{CryptoRng, RngCore};
|
||||||
use zeroize::{DefaultIsZeroes, Zeroize};
|
use zeroize::{DefaultIsZeroes, Zeroize};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
frost::Identifier, Ciphersuite, Element, Error, Field, Group, Scalar, SigningKey, VerifyingKey,
|
frost::Identifier, Ciphersuite, Deserialize, Element, Error, Field, Group, Scalar, Serialize,
|
||||||
|
SigningKey, VerifyingKey,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
|
@ -425,6 +426,22 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
impl<C> SecretShare<C>
|
||||||
|
where
|
||||||
|
C: Ciphersuite + serde::Serialize + for<'de> serde::Deserialize<'de>,
|
||||||
|
{
|
||||||
|
/// Serialize the struct into a Vec.
|
||||||
|
pub fn serialize(&self) -> Result<Vec<u8>, Error<C>> {
|
||||||
|
Serialize::serialize(&self)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deserialize the struct from a slice of bytes.
|
||||||
|
pub fn deserialize(bytes: &[u8]) -> Result<Self, Error<C>> {
|
||||||
|
Deserialize::deserialize(bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The identifier list to use when generating key shares.
|
/// The identifier list to use when generating key shares.
|
||||||
pub enum IdentifierList<'a, C: Ciphersuite> {
|
pub enum IdentifierList<'a, C: Ciphersuite> {
|
||||||
/// Use the default values (1 to max_signers, inclusive).
|
/// Use the default values (1 to max_signers, inclusive).
|
||||||
|
@ -613,6 +630,22 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
impl<C> KeyPackage<C>
|
||||||
|
where
|
||||||
|
C: Ciphersuite + serde::Serialize + for<'de> serde::Deserialize<'de>,
|
||||||
|
{
|
||||||
|
/// Serialize the struct into a Vec.
|
||||||
|
pub fn serialize(&self) -> Result<Vec<u8>, Error<C>> {
|
||||||
|
Serialize::serialize(&self)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deserialize the struct from a slice of bytes.
|
||||||
|
pub fn deserialize(bytes: &[u8]) -> Result<Self, Error<C>> {
|
||||||
|
Deserialize::deserialize(bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<C> TryFrom<SecretShare<C>> for KeyPackage<C>
|
impl<C> TryFrom<SecretShare<C>> for KeyPackage<C>
|
||||||
where
|
where
|
||||||
C: Ciphersuite,
|
C: Ciphersuite,
|
||||||
|
@ -684,6 +717,22 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
impl<C> PublicKeyPackage<C>
|
||||||
|
where
|
||||||
|
C: Ciphersuite + serde::Serialize + for<'de> serde::Deserialize<'de>,
|
||||||
|
{
|
||||||
|
/// Serialize the struct into a Vec.
|
||||||
|
pub fn serialize(&self) -> Result<Vec<u8>, Error<C>> {
|
||||||
|
Serialize::serialize(&self)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deserialize the struct from a slice of bytes.
|
||||||
|
pub fn deserialize(bytes: &[u8]) -> Result<Self, Error<C>> {
|
||||||
|
Deserialize::deserialize(bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn validate_num_of_signers<C: Ciphersuite>(
|
fn validate_num_of_signers<C: Ciphersuite>(
|
||||||
min_signers: u16,
|
min_signers: u16,
|
||||||
max_signers: u16,
|
max_signers: u16,
|
||||||
|
|
|
@ -50,6 +50,8 @@ pub mod round1 {
|
||||||
use derive_getters::Getters;
|
use derive_getters::Getters;
|
||||||
use zeroize::Zeroize;
|
use zeroize::Zeroize;
|
||||||
|
|
||||||
|
use crate::{Deserialize, Serialize};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
/// The package that must be broadcast by each participant to all other participants
|
/// The package that must be broadcast by each participant to all other participants
|
||||||
|
@ -92,6 +94,22 @@ pub mod round1 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
impl<C> Package<C>
|
||||||
|
where
|
||||||
|
C: Ciphersuite + serde::Serialize + for<'de> serde::Deserialize<'de>,
|
||||||
|
{
|
||||||
|
/// Serialize the struct into a Vec.
|
||||||
|
pub fn serialize(&self) -> Result<Vec<u8>, Error<C>> {
|
||||||
|
Serialize::serialize(&self)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deserialize the struct from a slice of bytes.
|
||||||
|
pub fn deserialize(bytes: &[u8]) -> Result<Self, Error<C>> {
|
||||||
|
Deserialize::deserialize(bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The secret package that must be kept in memory by the participant
|
/// The secret package that must be kept in memory by the participant
|
||||||
/// between the first and second parts of the DKG protocol (round 1).
|
/// between the first and second parts of the DKG protocol (round 1).
|
||||||
///
|
///
|
||||||
|
@ -145,6 +163,8 @@ pub mod round2 {
|
||||||
use derive_getters::Getters;
|
use derive_getters::Getters;
|
||||||
use zeroize::Zeroize;
|
use zeroize::Zeroize;
|
||||||
|
|
||||||
|
use crate::{Deserialize, Serialize};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
/// A package that must be sent by each participant to some other participants
|
/// A package that must be sent by each participant to some other participants
|
||||||
|
@ -186,6 +206,22 @@ pub mod round2 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
impl<C> Package<C>
|
||||||
|
where
|
||||||
|
C: Ciphersuite + serde::Serialize + for<'de> serde::Deserialize<'de>,
|
||||||
|
{
|
||||||
|
/// Serialize the struct into a Vec.
|
||||||
|
pub fn serialize(&self) -> Result<Vec<u8>, Error<C>> {
|
||||||
|
Serialize::serialize(&self)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deserialize the struct from a slice of bytes.
|
||||||
|
pub fn deserialize(bytes: &[u8]) -> Result<Self, Error<C>> {
|
||||||
|
Deserialize::deserialize(bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The secret package that must be kept in memory by the participant
|
/// The secret package that must be kept in memory by the participant
|
||||||
/// between the second and third parts of the DKG protocol (round 2).
|
/// between the second and third parts of the DKG protocol (round 2).
|
||||||
///
|
///
|
||||||
|
|
|
@ -12,7 +12,7 @@ use hex::FromHex;
|
||||||
use rand_core::{CryptoRng, RngCore};
|
use rand_core::{CryptoRng, RngCore};
|
||||||
use zeroize::Zeroize;
|
use zeroize::Zeroize;
|
||||||
|
|
||||||
use crate::{frost, Ciphersuite, Element, Error, Field, Group, Scalar};
|
use crate::{frost, Ciphersuite, Deserialize, Element, Error, Field, Group, Scalar, Serialize};
|
||||||
|
|
||||||
#[cfg(feature = "serde")]
|
#[cfg(feature = "serde")]
|
||||||
use crate::ElementSerialization;
|
use crate::ElementSerialization;
|
||||||
|
@ -311,6 +311,22 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
impl<C> SigningCommitments<C>
|
||||||
|
where
|
||||||
|
C: Ciphersuite + serde::Serialize + for<'de> serde::Deserialize<'de>,
|
||||||
|
{
|
||||||
|
/// Serialize the struct into a Vec.
|
||||||
|
pub fn serialize(&self) -> Result<Vec<u8>, Error<C>> {
|
||||||
|
Serialize::serialize(&self)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deserialize the struct from a slice of bytes.
|
||||||
|
pub fn deserialize(bytes: &[u8]) -> Result<Self, Error<C>> {
|
||||||
|
Deserialize::deserialize(bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<C> From<&SigningNonces<C>> for SigningCommitments<C>
|
impl<C> From<&SigningNonces<C>> for SigningCommitments<C>
|
||||||
where
|
where
|
||||||
C: Ciphersuite,
|
C: Ciphersuite,
|
||||||
|
|
|
@ -116,7 +116,7 @@ where
|
||||||
where
|
where
|
||||||
S: serde::Serializer,
|
S: serde::Serializer,
|
||||||
{
|
{
|
||||||
serdect::slice::serialize_hex_lower_or_bin(&self.0.as_ref(), serializer)
|
serdect::array::serialize_hex_lower_or_bin(&self.0.as_ref(), serializer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,7 +129,14 @@ where
|
||||||
where
|
where
|
||||||
D: serde::Deserializer<'de>,
|
D: serde::Deserializer<'de>,
|
||||||
{
|
{
|
||||||
let bytes = serdect::slice::deserialize_hex_or_bin_vec(deserializer)?;
|
// Get size from the size of the zero scalar
|
||||||
|
let zero = <<C::Group as Group>::Field as Field>::zero();
|
||||||
|
let len = <<C::Group as Group>::Field as Field>::serialize(&zero)
|
||||||
|
.as_ref()
|
||||||
|
.len();
|
||||||
|
|
||||||
|
let mut bytes = vec![0u8; len];
|
||||||
|
serdect::array::deserialize_hex_or_bin(&mut bytes[..], deserializer)?;
|
||||||
let array = bytes
|
let array = bytes
|
||||||
.try_into()
|
.try_into()
|
||||||
.map_err(|_| serde::de::Error::custom("invalid byte length"))?;
|
.map_err(|_| serde::de::Error::custom("invalid byte length"))?;
|
||||||
|
@ -214,7 +221,7 @@ where
|
||||||
where
|
where
|
||||||
S: serde::Serializer,
|
S: serde::Serializer,
|
||||||
{
|
{
|
||||||
serdect::slice::serialize_hex_lower_or_bin(&self.0.as_ref(), serializer)
|
serdect::array::serialize_hex_lower_or_bin(&self.0.as_ref(), serializer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,7 +234,12 @@ where
|
||||||
where
|
where
|
||||||
D: serde::Deserializer<'de>,
|
D: serde::Deserializer<'de>,
|
||||||
{
|
{
|
||||||
let bytes = serdect::slice::deserialize_hex_or_bin_vec(deserializer)?;
|
// Get size from the size of the generator
|
||||||
|
let generator = <C::Group>::generator();
|
||||||
|
let len = <C::Group>::serialize(&generator).as_ref().len();
|
||||||
|
|
||||||
|
let mut bytes = vec![0u8; len];
|
||||||
|
serdect::array::deserialize_hex_or_bin(&mut bytes[..], deserializer)?;
|
||||||
let array = bytes
|
let array = bytes
|
||||||
.try_into()
|
.try_into()
|
||||||
.map_err(|_| serde::de::Error::custom("invalid byte length"))?;
|
.map_err(|_| serde::de::Error::custom("invalid byte length"))?;
|
||||||
|
@ -330,6 +342,15 @@ pub trait Ciphersuite: Copy + Clone + PartialEq + Debug {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The short 4-byte ID. Derived as the CRC-32 of the UTF-8
|
||||||
|
// encoded ID in big endian format.
|
||||||
|
const fn short_id<C>() -> [u8; 4]
|
||||||
|
where
|
||||||
|
C: Ciphersuite,
|
||||||
|
{
|
||||||
|
const_crc32::crc32(C::ID.as_bytes()).to_be_bytes()
|
||||||
|
}
|
||||||
|
|
||||||
/// A type refinement for the scalar field element representing the per-message _[challenge]_.
|
/// A type refinement for the scalar field element representing the per-message _[challenge]_.
|
||||||
///
|
///
|
||||||
/// [challenge]: https://www.ietf.org/archive/id/draft-irtf-cfrg-frost-14.html#name-signature-challenge-computa
|
/// [challenge]: https://www.ietf.org/archive/id/draft-irtf-cfrg-frost-14.html#name-signature-challenge-computa
|
||||||
|
@ -412,7 +433,13 @@ where
|
||||||
S: serde::Serializer,
|
S: serde::Serializer,
|
||||||
C: Ciphersuite,
|
C: Ciphersuite,
|
||||||
{
|
{
|
||||||
s.serialize_str(C::ID)
|
use serde::Serialize;
|
||||||
|
|
||||||
|
if s.is_human_readable() {
|
||||||
|
C::ID.serialize(s)
|
||||||
|
} else {
|
||||||
|
serde::Serialize::serialize(&short_id::<C>(), s)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Deserialize a placeholder ciphersuite field, checking if it's the ciphersuite ID string.
|
/// Deserialize a placeholder ciphersuite field, checking if it's the ciphersuite ID string.
|
||||||
|
@ -422,10 +449,55 @@ where
|
||||||
D: serde::Deserializer<'de>,
|
D: serde::Deserializer<'de>,
|
||||||
C: Ciphersuite,
|
C: Ciphersuite,
|
||||||
{
|
{
|
||||||
let s: &str = serde::de::Deserialize::deserialize(deserializer)?;
|
if deserializer.is_human_readable() {
|
||||||
if s != C::ID {
|
let s: &str = serde::de::Deserialize::deserialize(deserializer)?;
|
||||||
Err(serde::de::Error::custom("wrong ciphersuite"))
|
if s != C::ID {
|
||||||
|
Err(serde::de::Error::custom("wrong ciphersuite"))
|
||||||
|
} else {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Ok(())
|
let buffer: [u8; 4] = serde::de::Deserialize::deserialize(deserializer)?;
|
||||||
|
if buffer != short_id::<C>() {
|
||||||
|
Err(serde::de::Error::custom("wrong ciphersuite"))
|
||||||
|
} else {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default byte-oriented serialization for structs that need to be communicated.
|
||||||
|
//
|
||||||
|
// Note that we still manually implement these methods in each applicable type,
|
||||||
|
// instead of making these traits `pub` and asking users to import the traits.
|
||||||
|
// The reason is that ciphersuite traits would need to re-export these traits,
|
||||||
|
// parametrized with the ciphersuite, but trait aliases are not currently
|
||||||
|
// supported: <https://github.com/rust-lang/rust/issues/41517>
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
trait Serialize<C: Ciphersuite> {
|
||||||
|
/// Serialize the struct into a Vec.
|
||||||
|
fn serialize(&self) -> Result<Vec<u8>, Error<C>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
trait Deserialize<C: Ciphersuite> {
|
||||||
|
/// Deserialize the struct from a slice of bytes.
|
||||||
|
fn deserialize(bytes: &[u8]) -> Result<Self, Error<C>>
|
||||||
|
where
|
||||||
|
Self: std::marker::Sized;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
impl<T: serde::Serialize, C: Ciphersuite> Serialize<C> for T {
|
||||||
|
fn serialize(&self) -> Result<Vec<u8>, Error<C>> {
|
||||||
|
postcard::to_stdvec(self).map_err(|_| Error::SerializationError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serialization")]
|
||||||
|
impl<T: for<'de> serde::Deserialize<'de>, C: Ciphersuite> Deserialize<C> for T {
|
||||||
|
fn deserialize(bytes: &[u8]) -> Result<Self, Error<C>> {
|
||||||
|
postcard::from_bytes(bytes).map_err(|_| Error::DeserializationError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ criterion = "0.5"
|
||||||
frost-core = { path = "../frost-core", version = "0.6.0", features = ["test-impl"] }
|
frost-core = { path = "../frost-core", version = "0.6.0", features = ["test-impl"] }
|
||||||
frost-rerandomized = { path = "../frost-rerandomized", version = "0.6.0", features = ["test-impl"] }
|
frost-rerandomized = { path = "../frost-rerandomized", version = "0.6.0", features = ["test-impl"] }
|
||||||
ed25519-dalek = "2.0.0"
|
ed25519-dalek = "2.0.0"
|
||||||
|
insta = { version = "1.31.0", features = ["yaml"] }
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
proptest = "1.0"
|
proptest = "1.0"
|
||||||
|
@ -43,7 +44,8 @@ serde_json = "1.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
nightly = []
|
nightly = []
|
||||||
default = []
|
default = ["serialization"]
|
||||||
|
serialization = ["serde", "frost-core/serialization"]
|
||||||
#! ## Features
|
#! ## Features
|
||||||
## Enable `serde` support for types that need to be communicated. You
|
## Enable `serde` support for types that need to be communicated. You
|
||||||
## can use `serde` to serialize structs with any encoder that supports
|
## can use `serde` to serialize structs with any encoder that supports
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
#![cfg(feature = "serialization")]
|
||||||
|
|
||||||
|
mod helpers;
|
||||||
|
|
||||||
|
use frost_ed25519::{
|
||||||
|
keys::{
|
||||||
|
dkg::{round1, round2},
|
||||||
|
KeyPackage, PublicKeyPackage, SecretShare,
|
||||||
|
},
|
||||||
|
round1::SigningCommitments,
|
||||||
|
round2::SignatureShare,
|
||||||
|
SigningPackage,
|
||||||
|
};
|
||||||
|
|
||||||
|
use helpers::samples;
|
||||||
|
use insta::assert_snapshot;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signing_commitments_postcard_serialization() {
|
||||||
|
let commitments = samples::signing_commitments();
|
||||||
|
let bytes: Vec<_> = commitments.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
commitments,
|
||||||
|
SigningCommitments::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signing_package_postcard_serialization() {
|
||||||
|
let signing_package = samples::signing_package();
|
||||||
|
let bytes: Vec<_> = signing_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
signing_package,
|
||||||
|
SigningPackage::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signature_share_postcard_serialization() {
|
||||||
|
let signature_share = samples::signature_share();
|
||||||
|
let bytes = signature_share.serialize();
|
||||||
|
assert_snapshot!(hex::encode(bytes));
|
||||||
|
assert_eq!(signature_share, SignatureShare::deserialize(bytes).unwrap());
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn check_secret_share_postcard_serialization() {
|
||||||
|
let secret_share = samples::secret_share();
|
||||||
|
let bytes: Vec<_> = secret_share.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(secret_share, SecretShare::deserialize(&bytes).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_key_package_postcard_serialization() {
|
||||||
|
let key_package = samples::key_package();
|
||||||
|
let bytes: Vec<_> = key_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(key_package, KeyPackage::deserialize(&bytes).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_public_key_package_postcard_serialization() {
|
||||||
|
let public_key_package = samples::public_key_package();
|
||||||
|
let bytes: Vec<_> = public_key_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
public_key_package,
|
||||||
|
PublicKeyPackage::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_round1_package_postcard_serialization() {
|
||||||
|
let round1_package = samples::round1_package();
|
||||||
|
let bytes: Vec<_> = round1_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
round1_package,
|
||||||
|
round1::Package::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_round2_package_postcard_serialization() {
|
||||||
|
let round2_package = samples::round2_package();
|
||||||
|
let bytes: Vec<_> = round2_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
round2_package,
|
||||||
|
round2::Package::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed25519/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a5866666666666666666666666666666666666666666666666666666666666666586666666666666666666666666666666666666666666666666666666666666602ea38536e
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed25519/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
012a0000000000000000000000000000000000000000000000000000000000000058666666666666666666666666666666666666666666666666666666666666665866666666666666666666666666666666666666666666666666666666666666ea38536e
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed25519/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
015866666666666666666666666666666666666666666666666666666666666666405866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aea38536e
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed25519/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aea38536e
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed25519/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a015866666666666666666666666666666666666666666666666666666666666666ea38536e
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed25519/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(bytes)"
|
||||||
|
---
|
||||||
|
498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed25519/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
5866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022ea38536e
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed25519/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
012a000000000000000000000000000000000000000000000000000000000000005866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022ea38536e0b68656c6c6f20776f726c64ea38536e
|
|
@ -33,6 +33,7 @@ criterion = "0.5"
|
||||||
frost-core = { path = "../frost-core", version = "0.6.0", features = ["test-impl"] }
|
frost-core = { path = "../frost-core", version = "0.6.0", features = ["test-impl"] }
|
||||||
frost-rerandomized = { path = "../frost-rerandomized", version = "0.6.0", features = ["test-impl"] }
|
frost-rerandomized = { path = "../frost-rerandomized", version = "0.6.0", features = ["test-impl"] }
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
|
insta = { version = "1.31.0", features = ["yaml"] }
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
proptest = "1.0"
|
proptest = "1.0"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
|
@ -41,7 +42,8 @@ serde_json = "1.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
nightly = []
|
nightly = []
|
||||||
default = []
|
default = ["serialization"]
|
||||||
|
serialization = ["serde", "frost-core/serialization"]
|
||||||
#! ## Features
|
#! ## Features
|
||||||
## Enable `serde` support for types that need to be communicated. You
|
## Enable `serde` support for types that need to be communicated. You
|
||||||
## can use `serde` to serialize structs with any encoder that supports
|
## can use `serde` to serialize structs with any encoder that supports
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
#![cfg(feature = "serialization")]
|
||||||
|
|
||||||
|
mod helpers;
|
||||||
|
|
||||||
|
use frost_ed448::{
|
||||||
|
keys::{
|
||||||
|
dkg::{round1, round2},
|
||||||
|
KeyPackage, PublicKeyPackage, SecretShare,
|
||||||
|
},
|
||||||
|
round1::SigningCommitments,
|
||||||
|
round2::SignatureShare,
|
||||||
|
SigningPackage,
|
||||||
|
};
|
||||||
|
|
||||||
|
use helpers::samples;
|
||||||
|
use insta::assert_snapshot;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signing_commitments_postcard_serialization() {
|
||||||
|
let commitments = samples::signing_commitments();
|
||||||
|
let bytes: Vec<_> = commitments.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
commitments,
|
||||||
|
SigningCommitments::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signing_package_postcard_serialization() {
|
||||||
|
let signing_package = samples::signing_package();
|
||||||
|
let bytes: Vec<_> = signing_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
signing_package,
|
||||||
|
SigningPackage::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signature_share_postcard_serialization() {
|
||||||
|
let signature_share = samples::signature_share();
|
||||||
|
let bytes = signature_share.serialize();
|
||||||
|
assert_snapshot!(hex::encode(bytes));
|
||||||
|
assert_eq!(signature_share, SignatureShare::deserialize(bytes).unwrap());
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn check_secret_share_postcard_serialization() {
|
||||||
|
let secret_share = samples::secret_share();
|
||||||
|
let bytes: Vec<_> = secret_share.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(secret_share, SecretShare::deserialize(&bytes).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_key_package_postcard_serialization() {
|
||||||
|
let key_package = samples::key_package();
|
||||||
|
let bytes: Vec<_> = key_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(key_package, KeyPackage::deserialize(&bytes).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_public_key_package_postcard_serialization() {
|
||||||
|
let public_key_package = samples::public_key_package();
|
||||||
|
let bytes: Vec<_> = public_key_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
public_key_package,
|
||||||
|
PublicKeyPackage::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_round1_package_postcard_serialization() {
|
||||||
|
let round1_package = samples::round1_package();
|
||||||
|
let bytes: Vec<_> = round1_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
round1_package,
|
||||||
|
round1::Package::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_round2_package_postcard_serialization() {
|
||||||
|
let round2_package = samples::round2_package();
|
||||||
|
let bytes: Vec<_> = round2_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
round2_package,
|
||||||
|
round2::Package::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed448/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a0014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690002854361d9
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed448/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900854361d9
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed448/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
0114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69007214fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00854361d9
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed448/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00854361d9
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed448/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a000114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900854361d9
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed448/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(bytes)"
|
||||||
|
---
|
||||||
|
4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed448/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80854361d9
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ed448/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80854361d90b68656c6c6f20776f726c64854361d9
|
|
@ -33,6 +33,7 @@ sha2 = "0.10.2"
|
||||||
criterion = "0.5"
|
criterion = "0.5"
|
||||||
frost-core = { path = "../frost-core", version = "0.6.0", features = ["test-impl"] }
|
frost-core = { path = "../frost-core", version = "0.6.0", features = ["test-impl"] }
|
||||||
frost-rerandomized = { path = "../frost-rerandomized", version = "0.6.0", features = ["test-impl"] }
|
frost-rerandomized = { path = "../frost-rerandomized", version = "0.6.0", features = ["test-impl"] }
|
||||||
|
insta = { version = "1.31.0", features = ["yaml"] }
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
proptest = "1.0"
|
proptest = "1.0"
|
||||||
|
@ -42,7 +43,8 @@ serde_json = "1.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
nightly = []
|
nightly = []
|
||||||
default = []
|
default = ["serialization"]
|
||||||
|
serialization = ["serde", "frost-core/serialization"]
|
||||||
#! ## Features
|
#! ## Features
|
||||||
## Enable `serde` support for types that need to be communicated. You
|
## Enable `serde` support for types that need to be communicated. You
|
||||||
## can use `serde` to serialize structs with any encoder that supports
|
## can use `serde` to serialize structs with any encoder that supports
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
#![cfg(feature = "serialization")]
|
||||||
|
|
||||||
|
mod helpers;
|
||||||
|
|
||||||
|
use frost_p256::{
|
||||||
|
keys::{
|
||||||
|
dkg::{round1, round2},
|
||||||
|
KeyPackage, PublicKeyPackage, SecretShare,
|
||||||
|
},
|
||||||
|
round1::SigningCommitments,
|
||||||
|
round2::SignatureShare,
|
||||||
|
SigningPackage,
|
||||||
|
};
|
||||||
|
|
||||||
|
use helpers::samples;
|
||||||
|
use insta::assert_snapshot;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signing_commitments_postcard_serialization() {
|
||||||
|
let commitments = samples::signing_commitments();
|
||||||
|
let bytes: Vec<_> = commitments.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
commitments,
|
||||||
|
SigningCommitments::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signing_package_postcard_serialization() {
|
||||||
|
let signing_package = samples::signing_package();
|
||||||
|
let bytes: Vec<_> = signing_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
signing_package,
|
||||||
|
SigningPackage::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signature_share_postcard_serialization() {
|
||||||
|
let signature_share = samples::signature_share();
|
||||||
|
let bytes = signature_share.serialize();
|
||||||
|
assert_snapshot!(hex::encode(bytes));
|
||||||
|
assert_eq!(signature_share, SignatureShare::deserialize(bytes).unwrap());
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn check_secret_share_postcard_serialization() {
|
||||||
|
let secret_share = samples::secret_share();
|
||||||
|
let bytes: Vec<_> = secret_share.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(secret_share, SecretShare::deserialize(&bytes).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_key_package_postcard_serialization() {
|
||||||
|
let key_package = samples::key_package();
|
||||||
|
let bytes: Vec<_> = key_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(key_package, KeyPackage::deserialize(&bytes).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_public_key_package_postcard_serialization() {
|
||||||
|
let public_key_package = samples::public_key_package();
|
||||||
|
let bytes: Vec<_> = public_key_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
public_key_package,
|
||||||
|
PublicKeyPackage::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_round1_package_postcard_serialization() {
|
||||||
|
let round1_package = samples::round1_package();
|
||||||
|
let bytes: Vec<_> = round1_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
round1_package,
|
||||||
|
round1::Package::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_round2_package_postcard_serialization() {
|
||||||
|
let round2_package = samples::round2_package();
|
||||||
|
let bytes: Vec<_> = round2_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
round2_package,
|
||||||
|
round2::Package::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-p256/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296029bf7b2e7
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-p256/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
01000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2969bf7b2e7
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-p256/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
01036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29641036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e19bf7b2e7
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-p256/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e19bf7b2e7
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-p256/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e101036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2969bf7b2e7
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-p256/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(bytes)"
|
||||||
|
---
|
||||||
|
aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-p256/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699789bf7b2e7
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-p256/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
01000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699789bf7b2e70b68656c6c6f20776f726c649bf7b2e7
|
|
@ -29,7 +29,8 @@ rand_core = "0.6"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
nightly = []
|
nightly = []
|
||||||
default = []
|
default = ["serialization"]
|
||||||
|
serialization = ["serde", "frost-core/serialization"]
|
||||||
#! ## Features
|
#! ## Features
|
||||||
## Enable `serde` support for types that need to be communicated. You
|
## Enable `serde` support for types that need to be communicated. You
|
||||||
## can use `serde` to serialize structs with any encoder that supports
|
## can use `serde` to serialize structs with any encoder that supports
|
||||||
|
|
|
@ -29,8 +29,10 @@ sha2 = "0.10.2"
|
||||||
criterion = { version = "0.5", features = ["html_reports"] }
|
criterion = { version = "0.5", features = ["html_reports"] }
|
||||||
frost-core = { path = "../frost-core", version = "0.6.0", features = ["test-impl"] }
|
frost-core = { path = "../frost-core", version = "0.6.0", features = ["test-impl"] }
|
||||||
frost-rerandomized = { path = "../frost-rerandomized", version = "0.6.0", features = ["test-impl"] }
|
frost-rerandomized = { path = "../frost-rerandomized", version = "0.6.0", features = ["test-impl"] }
|
||||||
|
insta = { version = "1.31.0", features = ["yaml"] }
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
|
postcard = { version = "1.0.0", features = ["use-std"] }
|
||||||
proptest = "1.0"
|
proptest = "1.0"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
rand_chacha = "0.3"
|
rand_chacha = "0.3"
|
||||||
|
@ -38,7 +40,8 @@ serde_json = "1.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
nightly = []
|
nightly = []
|
||||||
default = []
|
default = ["serialization"]
|
||||||
|
serialization = ["serde", "frost-core/serialization"]
|
||||||
#! ## Features
|
#! ## Features
|
||||||
## Enable `serde` support for types that need to be communicated. You
|
## Enable `serde` support for types that need to be communicated. You
|
||||||
## can use `serde` to serialize structs with any encoder that supports
|
## can use `serde` to serialize structs with any encoder that supports
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
#![cfg(feature = "serialization")]
|
||||||
|
|
||||||
|
mod helpers;
|
||||||
|
|
||||||
|
use frost_ristretto255::{
|
||||||
|
keys::{
|
||||||
|
dkg::{round1, round2},
|
||||||
|
KeyPackage, PublicKeyPackage, SecretShare,
|
||||||
|
},
|
||||||
|
round1::SigningCommitments,
|
||||||
|
round2::SignatureShare,
|
||||||
|
SigningPackage,
|
||||||
|
};
|
||||||
|
|
||||||
|
use helpers::samples;
|
||||||
|
use insta::assert_snapshot;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signing_commitments_postcard_serialization() {
|
||||||
|
let commitments = samples::signing_commitments();
|
||||||
|
let bytes: Vec<_> = commitments.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
commitments,
|
||||||
|
SigningCommitments::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signing_package_postcard_serialization() {
|
||||||
|
let signing_package = samples::signing_package();
|
||||||
|
let bytes: Vec<_> = signing_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
signing_package,
|
||||||
|
SigningPackage::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signature_share_postcard_serialization() {
|
||||||
|
let signature_share = samples::signature_share();
|
||||||
|
let bytes = signature_share.serialize();
|
||||||
|
assert_snapshot!(hex::encode(bytes));
|
||||||
|
assert_eq!(signature_share, SignatureShare::deserialize(bytes).unwrap());
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn check_secret_share_postcard_serialization() {
|
||||||
|
let secret_share = samples::secret_share();
|
||||||
|
let bytes: Vec<_> = secret_share.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(secret_share, SecretShare::deserialize(&bytes).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_key_package_postcard_serialization() {
|
||||||
|
let key_package = samples::key_package();
|
||||||
|
let bytes: Vec<_> = key_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(key_package, KeyPackage::deserialize(&bytes).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_public_key_package_postcard_serialization() {
|
||||||
|
let public_key_package = samples::public_key_package();
|
||||||
|
let bytes: Vec<_> = public_key_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
public_key_package,
|
||||||
|
PublicKeyPackage::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_round1_package_postcard_serialization() {
|
||||||
|
let round1_package = samples::round1_package();
|
||||||
|
let bytes: Vec<_> = round1_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
round1_package,
|
||||||
|
round1::Package::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_round2_package_postcard_serialization() {
|
||||||
|
let round2_package = samples::round2_package();
|
||||||
|
let bytes: Vec<_> = round2_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
round2_package,
|
||||||
|
round2::Package::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ristretto255/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7602e6811b69
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ristretto255/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e6811b69
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ristretto255/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7640e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae6811b69
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ristretto255/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae6811b69
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ristretto255/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e6811b69
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ristretto255/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(bytes)"
|
||||||
|
---
|
||||||
|
498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ristretto255/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919e6811b69
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-ristretto255/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919e6811b690b68656c6c6f20776f726c64e6811b69
|
|
@ -32,6 +32,7 @@ sha2 = "0.10.2"
|
||||||
criterion = "0.5"
|
criterion = "0.5"
|
||||||
frost-core = { path = "../frost-core", version = "0.6.0", features = ["test-impl"] }
|
frost-core = { path = "../frost-core", version = "0.6.0", features = ["test-impl"] }
|
||||||
frost-rerandomized = { path = "../frost-rerandomized", version = "0.6.0", features = ["test-impl"] }
|
frost-rerandomized = { path = "../frost-rerandomized", version = "0.6.0", features = ["test-impl"] }
|
||||||
|
insta = { version = "1.31.0", features = ["yaml"] }
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
proptest = "1.0"
|
proptest = "1.0"
|
||||||
|
@ -41,7 +42,8 @@ serde_json = "1.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
nightly = []
|
nightly = []
|
||||||
default = []
|
default = ["serialization"]
|
||||||
|
serialization = ["serde", "frost-core/serialization"]
|
||||||
#! ## Features
|
#! ## Features
|
||||||
## Enable `serde` support for types that need to be communicated. You
|
## Enable `serde` support for types that need to be communicated. You
|
||||||
## can use `serde` to serialize structs with any encoder that supports
|
## can use `serde` to serialize structs with any encoder that supports
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
#![cfg(feature = "serialization")]
|
||||||
|
|
||||||
|
mod helpers;
|
||||||
|
|
||||||
|
use frost_secp256k1::{
|
||||||
|
keys::{
|
||||||
|
dkg::{round1, round2},
|
||||||
|
KeyPackage, PublicKeyPackage, SecretShare,
|
||||||
|
},
|
||||||
|
round1::SigningCommitments,
|
||||||
|
round2::SignatureShare,
|
||||||
|
SigningPackage,
|
||||||
|
};
|
||||||
|
|
||||||
|
use helpers::samples;
|
||||||
|
use insta::assert_snapshot;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signing_commitments_postcard_serialization() {
|
||||||
|
let commitments = samples::signing_commitments();
|
||||||
|
let bytes: Vec<_> = commitments.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
commitments,
|
||||||
|
SigningCommitments::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signing_package_postcard_serialization() {
|
||||||
|
let signing_package = samples::signing_package();
|
||||||
|
let bytes: Vec<_> = signing_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
signing_package,
|
||||||
|
SigningPackage::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_signature_share_postcard_serialization() {
|
||||||
|
let signature_share = samples::signature_share();
|
||||||
|
let bytes = signature_share.serialize();
|
||||||
|
assert_snapshot!(hex::encode(bytes));
|
||||||
|
assert_eq!(signature_share, SignatureShare::deserialize(bytes).unwrap());
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn check_secret_share_postcard_serialization() {
|
||||||
|
let secret_share = samples::secret_share();
|
||||||
|
let bytes: Vec<_> = secret_share.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(secret_share, SecretShare::deserialize(&bytes).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_key_package_postcard_serialization() {
|
||||||
|
let key_package = samples::key_package();
|
||||||
|
let bytes: Vec<_> = key_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(key_package, KeyPackage::deserialize(&bytes).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_public_key_package_postcard_serialization() {
|
||||||
|
let public_key_package = samples::public_key_package();
|
||||||
|
let bytes: Vec<_> = public_key_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
public_key_package,
|
||||||
|
PublicKeyPackage::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_round1_package_postcard_serialization() {
|
||||||
|
let round1_package = samples::round1_package();
|
||||||
|
let bytes: Vec<_> = round1_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
round1_package,
|
||||||
|
round1::Package::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn check_round2_package_postcard_serialization() {
|
||||||
|
let round2_package = samples::round2_package();
|
||||||
|
let bytes: Vec<_> = round2_package.serialize().unwrap();
|
||||||
|
assert_snapshot!(hex::encode(&bytes));
|
||||||
|
assert_eq!(
|
||||||
|
round2_package,
|
||||||
|
round2::Package::deserialize(&bytes).unwrap()
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-secp256k1/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b810279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802f49d8cce
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-secp256k1/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
01000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798f49d8cce
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-secp256k1/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798410279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81f49d8cce
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-secp256k1/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81f49d8cce
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-secp256k1/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798f49d8cce
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-secp256k1/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(bytes)"
|
||||||
|
---
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-secp256k1/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5f49d8cce
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
source: frost-secp256k1/tests/serialization_tests.rs
|
||||||
|
expression: "hex::encode(&bytes)"
|
||||||
|
---
|
||||||
|
01000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5f49d8cce0b68656c6c6f20776f726c64f49d8cce
|
|
@ -326,6 +326,7 @@ fn main() -> ExitCode {
|
||||||
"tests/recreation_tests.rs",
|
"tests/recreation_tests.rs",
|
||||||
"tests/rerandomized_tests.rs",
|
"tests/rerandomized_tests.rs",
|
||||||
"tests/serde_tests.rs",
|
"tests/serde_tests.rs",
|
||||||
|
"tests/serialization_tests.rs",
|
||||||
"tests/helpers/samples.rs",
|
"tests/helpers/samples.rs",
|
||||||
] {
|
] {
|
||||||
replaced |= copy_and_replace(
|
replaced |= copy_and_replace(
|
||||||
|
|
Loading…
Reference in New Issue