diff --git a/book/src/user/serialization.md b/book/src/user/serialization.md index 2c58a75..70c5389 100644 --- a/book/src/user/serialization.md +++ b/book/src/user/serialization.md @@ -4,7 +4,8 @@ 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. +[`postcard`](https://docs.rs/postcard/latest/postcard/) crate. But since this is +an implementation detail, we describe the format as follows: - Integers are encoded in [varint format](https://postcard.jamesmunns.com/wire-format#varint-encoded-integers) @@ -15,37 +16,45 @@ The format is basically the `serde` encoding of the structs using the 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. +- Structs are encoded as the concatenation of the encodings of its items, with + a Header struct as the first item, which contains the format version (a u8) + and the ciphersuite ID. + - The format currently described is identified by the constant 0. + - Ciphersuite IDs are encoded as the 4-byte CRC-32 of the ID string (the + constant Ciphersuite::ID, which for default ciphersuites is the contextString + of the ciphersuite, per the FROST spec). For example, the following Signing Package: +- Header (map): + - Version (u8): 0 + - Ciphersuite ID (4 bytes): CRC-32 of `FROST-RISTRETTO255-SHA512-v1` - Commitments (map): - - Identifier (byte array): `2a00000000000000000000000000000000000000000000000000000000000000` - - Signing Commitments: - - Hiding (byte array): `e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76` - - Bindng (byte array): `6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919` - - Ciphersuite ID: `"FROST(ristretto255, SHA-512)"` + - Identifier (byte array): `2a00000000000000000000000000000000000000000000000000000000000000` + - Signing Commitments: + - Hiding (byte array): `e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76` + - Bindng (byte array): `6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919` + - Ciphersuite ID (4 bytes): CRC-32 of `FROST-RISTRETTO255-SHA512-v1` - 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 +00d76ecff5012a00000000000000000000000000000000000000000000000000 +00000000000000d76ecff5e2f2ae0a6abc4e71a884a961c500515f58e30b6aa5 +82dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b9 +01f8acadd3095c73a3b9190b68656c6c6f20776f726c64 ``` +- `00`: the version of the format +- `d76ecff5`: the ciphersuite ID of the SigningPackage; CRC-32 of `FROST-RISTRETTO255-SHA512-v1` - `01`: the length of the map - `2a00000000000000000000000000000000000000000000000000000000000000`: the identifier +- `d76ecff5`: the ciphersuite ID of the SigningCommitments; CRC-32 of `FROST-RISTRETTO255-SHA512-v1` - `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 diff --git a/frost-core/CHANGELOG.md b/frost-core/CHANGELOG.md index 13308e2..838ff4f 100644 --- a/frost-core/CHANGELOG.md +++ b/frost-core/CHANGELOG.md @@ -6,6 +6,14 @@ Entries are listed in reverse chronological order. ## 0.8.0 +* Both serde serialization and the default byte-oriented serialization now + include a version field (a u8) at the beginning which is always 0 for now. The + ciphersuite ID field was moved from the last field to the second field, after + the version. Both version and ciphersuite ID are now grouped into a "header" + struct, which affects self-describing formats like JSON. The ciphersuite ID + string was also changed for all ciphersuites: it is now equal to the + `contextString` of each ciphersuite per the FROST spec. + ## Released ## 0.7.0 diff --git a/frost-core/src/frost.rs b/frost-core/src/frost.rs index 137b549..4fee9e3 100644 --- a/frost-core/src/frost.rs +++ b/frost-core/src/frost.rs @@ -24,7 +24,7 @@ pub mod round2; use crate::{ scalar_mul::VartimeMultiscalarMul, Ciphersuite, Deserialize, Element, Error, Field, Group, - Scalar, Serialize, Signature, VerifyingKey, + Header, Scalar, Serialize, Signature, VerifyingKey, }; pub use self::identifier::Identifier; @@ -214,6 +214,9 @@ fn derive_interpolating_value( #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct SigningPackage { + /// Serialization header + #[getter(skip)] + pub(crate) header: Header, /// The set of commitments participants published in the first round of the /// protocol. signing_commitments: BTreeMap, round1::SigningCommitments>, @@ -229,17 +232,6 @@ pub struct SigningPackage { ) )] message: Vec, - /// Ciphersuite ID for serialization - #[cfg_attr( - feature = "serde", - serde(serialize_with = "crate::ciphersuite_serialize::<_, C>") - )] - #[cfg_attr( - feature = "serde", - serde(deserialize_with = "crate::ciphersuite_deserialize::<_, C>") - )] - #[getter(skip)] - ciphersuite: (), } impl SigningPackage @@ -254,9 +246,9 @@ where message: &[u8], ) -> SigningPackage { SigningPackage { + header: Header::default(), signing_commitments, message: message.to_vec(), - ciphersuite: (), } } diff --git a/frost-core/src/frost/keys.rs b/frost-core/src/frost/keys.rs index 5c5904c..54e54fd 100644 --- a/frost-core/src/frost/keys.rs +++ b/frost-core/src/frost/keys.rs @@ -17,8 +17,8 @@ use rand_core::{CryptoRng, RngCore}; use zeroize::{DefaultIsZeroes, Zeroize}; use crate::{ - frost::Identifier, Ciphersuite, Deserialize, Element, Error, Field, Group, Scalar, Serialize, - SigningKey, VerifyingKey, + frost::Identifier, Ciphersuite, Deserialize, Element, Error, Field, Group, Header, Scalar, + Serialize, SigningKey, VerifyingKey, }; #[cfg(feature = "serde")] @@ -352,6 +352,9 @@ where #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct SecretShare { + /// Serialization header + #[getter(skip)] + pub(crate) header: Header, /// The participant identifier of this [`SecretShare`]. #[zeroize(skip)] pub(crate) identifier: Identifier, @@ -360,17 +363,6 @@ pub struct SecretShare { #[zeroize(skip)] /// The commitments to be distributed among signers. pub(crate) commitment: VerifiableSecretSharingCommitment, - /// Ciphersuite ID for serialization - #[cfg_attr( - feature = "serde", - serde(serialize_with = "crate::ciphersuite_serialize::<_, C>") - )] - #[cfg_attr( - feature = "serde", - serde(deserialize_with = "crate::ciphersuite_deserialize::<_, C>") - )] - #[getter(skip)] - ciphersuite: (), } impl SecretShare @@ -384,10 +376,10 @@ where commitment: VerifiableSecretSharingCommitment, ) -> Self { SecretShare { + header: Header::default(), identifier, signing_share, commitment, - ciphersuite: (), } } @@ -520,9 +512,9 @@ pub fn split( Ok(( secret_shares_by_id, PublicKeyPackage { + header: Header::default(), verifying_shares, verifying_key, - ciphersuite: (), }, )) } @@ -577,6 +569,9 @@ fn evaluate_vss( #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct KeyPackage { + /// Serialization header + #[getter(skip)] + pub(crate) header: Header, /// Denotes the participant identifier each secret share key package is owned by. #[zeroize(skip)] pub(crate) identifier: Identifier, @@ -589,17 +584,6 @@ pub struct KeyPackage { #[zeroize(skip)] pub(crate) verifying_key: VerifyingKey, pub(crate) min_signers: u16, - /// Ciphersuite ID for serialization - #[cfg_attr( - feature = "serde", - serde(serialize_with = "crate::ciphersuite_serialize::<_, C>") - )] - #[cfg_attr( - feature = "serde", - serde(deserialize_with = "crate::ciphersuite_deserialize::<_, C>") - )] - #[getter(skip)] - ciphersuite: (), } impl KeyPackage @@ -615,12 +599,12 @@ where min_signers: u16, ) -> Self { Self { + header: Header::default(), identifier, signing_share, verifying_share, verifying_key, min_signers, - ciphersuite: (), } } } @@ -659,12 +643,12 @@ where let (verifying_share, verifying_key) = secret_share.verify()?; Ok(KeyPackage { + header: Header::default(), identifier: secret_share.identifier, signing_share: secret_share.signing_share, verifying_share, verifying_key, min_signers: secret_share.commitment.0.len() as u16, - ciphersuite: (), }) } } @@ -677,22 +661,14 @@ where #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct PublicKeyPackage { + /// Serialization header + #[getter(skip)] + pub(crate) header: Header, /// The verifying shares for all participants. Used to validate signature /// shares they generate. pub(crate) verifying_shares: HashMap, VerifyingShare>, /// The joint public key for the entire group. pub(crate) verifying_key: VerifyingKey, - /// Ciphersuite ID for serialization - #[cfg_attr( - feature = "serde", - serde(serialize_with = "crate::ciphersuite_serialize::<_, C>") - )] - #[cfg_attr( - feature = "serde", - serde(deserialize_with = "crate::ciphersuite_deserialize::<_, C>") - )] - #[getter(skip)] - ciphersuite: (), } impl PublicKeyPackage @@ -705,9 +681,9 @@ where verifying_key: VerifyingKey, ) -> Self { Self { + header: Header::default(), verifying_shares, verifying_key, - ciphersuite: (), } } } @@ -821,10 +797,10 @@ pub(crate) fn generate_secret_shares( let value = evaluate_polynomial(*id, &coefficients); secret_shares.push(SecretShare { + header: Header::default(), identifier: *id, signing_share: SigningShare(value), commitment: commitment.clone(), - ciphersuite: (), }); } diff --git a/frost-core/src/frost/keys/dkg.rs b/frost-core/src/frost/keys/dkg.rs index db4210d..2f62730 100644 --- a/frost-core/src/frost/keys/dkg.rs +++ b/frost-core/src/frost/keys/dkg.rs @@ -35,8 +35,8 @@ use std::{collections::HashMap, iter}; use rand_core::{CryptoRng, RngCore}; use crate::{ - frost::Identifier, Challenge, Ciphersuite, Element, Error, Field, Group, Scalar, Signature, - SigningKey, VerifyingKey, + frost::Identifier, Challenge, Ciphersuite, Element, Error, Field, Group, Header, Scalar, + Signature, SigningKey, VerifyingKey, }; use super::{ @@ -60,21 +60,13 @@ pub mod round1 { #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct Package { + /// Serialization header + #[getter(skip)] + pub(crate) header: Header, /// The public commitment from the participant (C_i) pub(crate) commitment: VerifiableSecretSharingCommitment, /// The proof of knowledge of the temporary secret (σ_i = (R_i, μ_i)) pub(crate) proof_of_knowledge: Signature, - /// Ciphersuite ID for serialization - #[cfg_attr( - feature = "serde", - serde(serialize_with = "crate::ciphersuite_serialize::<_, C>") - )] - #[cfg_attr( - feature = "serde", - serde(deserialize_with = "crate::ciphersuite_deserialize::<_, C>") - )] - #[getter(skip)] - pub(super) ciphersuite: (), } impl Package @@ -87,9 +79,9 @@ pub mod round1 { proof_of_knowledge: Signature, ) -> Self { Self { + header: Header::default(), commitment, proof_of_knowledge, - ciphersuite: (), } } } @@ -178,19 +170,11 @@ pub mod round2 { #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct Package { + /// Serialization header + #[getter(skip)] + pub(crate) header: Header, /// The secret share being sent. pub(crate) signing_share: SigningShare, - /// Ciphersuite ID for serialization - #[cfg_attr( - feature = "serde", - serde(serialize_with = "crate::ciphersuite_serialize::<_, C>") - )] - #[cfg_attr( - feature = "serde", - serde(deserialize_with = "crate::ciphersuite_deserialize::<_, C>") - )] - #[getter(skip)] - pub(super) ciphersuite: (), } impl Package @@ -200,8 +184,8 @@ pub mod round2 { /// Create a new [`Package`] instance. pub fn new(signing_share: SigningShare) -> Self { Self { + header: Header::default(), signing_share, - ciphersuite: (), } } } @@ -319,9 +303,9 @@ pub fn part1( max_signers, }; let package = round1::Package { + header: Header::default(), commitment, proof_of_knowledge: Signature { R: R_i, z: mu_i }, - ciphersuite: (), }; Ok((secret_package, package)) @@ -400,8 +384,8 @@ pub fn part2( round2_packages.insert( ell, round2::Package { + header: Header::default(), signing_share: SigningShare(value), - ciphersuite: (), }, ); } @@ -515,10 +499,10 @@ pub fn part3( // however the required components are in different places. // Build a temporary SecretShare so what we can call verify(). let secret_share = SecretShare { + header: Header::default(), identifier: round2_secret_package.identifier, signing_share: f_ell_i, commitment: commitment.clone(), - ciphersuite: (), }; // Verify the share. We don't need the result. @@ -559,17 +543,17 @@ pub fn part3( all_verifying_shares.insert(round2_secret_package.identifier, verifying_share); let key_package = KeyPackage { + header: Header::default(), identifier: round2_secret_package.identifier, signing_share, verifying_share, verifying_key, min_signers: round2_secret_package.min_signers, - ciphersuite: (), }; let public_key_package = PublicKeyPackage { + header: Header::default(), verifying_shares: all_verifying_shares, verifying_key, - ciphersuite: (), }; Ok((key_package, public_key_package)) diff --git a/frost-core/src/frost/keys/repairable.rs b/frost-core/src/frost/keys/repairable.rs index 0fbe0d3..7c56bfb 100644 --- a/frost-core/src/frost/keys/repairable.rs +++ b/frost-core/src/frost/keys/repairable.rs @@ -8,7 +8,7 @@ use std::collections::{BTreeSet, HashMap}; use crate::{ frost::{compute_lagrange_coefficient, Identifier}, - Ciphersuite, CryptoRng, Error, Field, Group, RngCore, Scalar, + Ciphersuite, CryptoRng, Error, Field, Group, Header, RngCore, Scalar, }; use super::{generate_coefficients, SecretShare, SigningShare, VerifiableSecretSharingCommitment}; @@ -121,9 +121,9 @@ pub fn repair_share_step_3( } SecretShare { + header: Header::default(), identifier, signing_share: SigningShare(share), commitment: commitment.clone(), - ciphersuite: (), } } diff --git a/frost-core/src/frost/round1.rs b/frost-core/src/frost/round1.rs index 670ab14..5feee2f 100644 --- a/frost-core/src/frost/round1.rs +++ b/frost-core/src/frost/round1.rs @@ -12,7 +12,9 @@ use hex::FromHex; use rand_core::{CryptoRng, RngCore}; use zeroize::Zeroize; -use crate::{frost, Ciphersuite, Deserialize, Element, Error, Field, Group, Scalar, Serialize}; +use crate::{ + frost, Ciphersuite, Deserialize, Element, Error, Field, Group, Header, Scalar, Serialize, +}; #[cfg(feature = "serde")] use crate::ElementSerialization; @@ -268,21 +270,13 @@ where #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct SigningCommitments { + /// Serialization header + #[getter(skip)] + pub(crate) header: Header, /// Commitment to the hiding [`Nonce`]. pub(crate) hiding: NonceCommitment, /// Commitment to the binding [`Nonce`]. pub(crate) binding: NonceCommitment, - /// Ciphersuite ID for serialization - #[cfg_attr( - feature = "serde", - serde(serialize_with = "crate::ciphersuite_serialize::<_, C>") - )] - #[cfg_attr( - feature = "serde", - serde(deserialize_with = "crate::ciphersuite_deserialize::<_, C>") - )] - #[getter(skip)] - ciphersuite: (), } impl SigningCommitments @@ -292,9 +286,9 @@ where /// Create new SigningCommitments pub fn new(hiding: NonceCommitment, binding: NonceCommitment) -> Self { Self { + header: Header::default(), hiding, binding, - ciphersuite: (), } } diff --git a/frost-core/src/frost/round2.rs b/frost-core/src/frost/round2.rs index 64a91e6..a9a3021 100644 --- a/frost-core/src/frost/round2.rs +++ b/frost-core/src/frost/round2.rs @@ -106,17 +106,9 @@ where #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] struct SignatureShareSerialization { + /// Serialization header + pub(crate) header: Header, share: SignatureShareHelper, - /// Ciphersuite ID for serialization - #[cfg_attr( - feature = "serde", - serde(serialize_with = "crate::ciphersuite_serialize::<_, C>") - )] - #[cfg_attr( - feature = "serde", - serde(deserialize_with = "crate::ciphersuite_deserialize::<_, C>") - )] - ciphersuite: (), } #[cfg(feature = "serde")] @@ -138,8 +130,8 @@ where { fn from(value: SignatureShare) -> Self { Self { + header: Header::default(), share: SignatureShareHelper(value.share), - ciphersuite: (), } } } diff --git a/frost-core/src/lib.rs b/frost-core/src/lib.rs index d01d615..57cab4b 100644 --- a/frost-core/src/lib.rs +++ b/frost-core/src/lib.rs @@ -13,6 +13,7 @@ use std::{ default::Default, fmt::Debug, + marker::PhantomData, ops::{Add, Mul, Sub}, }; @@ -38,6 +39,7 @@ pub use error::{Error, FieldError, GroupError}; pub use signature::Signature; pub use signing_key::SigningKey; pub use verifying_key::VerifyingKey; +use zeroize::Zeroize; /// A prime order finite field GF(q) over which all scalar values for our prime order group can be /// multiplied are defined. @@ -252,7 +254,10 @@ where /// /// [FROST ciphersuite]: https://www.ietf.org/archive/id/draft-irtf-cfrg-frost-14.html#name-ciphersuites pub trait Ciphersuite: Copy + Clone + PartialEq + Debug { - /// The ciphersuite ID string + /// The ciphersuite ID string. It should be equal to the contextString in + /// the spec. For new ciphersuites, this should be a string that identifies + /// the ciphersuite; it's recommended to use a similar format to the + /// ciphersuites in the FROST spec, e.g. "FROST-RISTRETTO255-SHA512-v1". const ID: &'static str; /// The prime order group (or subgroup) that this ciphersuite operates over. @@ -426,6 +431,43 @@ pub(crate) fn random_nonzero(rng: &mut R } } +#[derive(Copy, Clone, Debug, PartialEq, Eq, Zeroize)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "serde", serde(deny_unknown_fields))] +struct Header { + /// Format version + #[cfg_attr( + feature = "serde", + serde(deserialize_with = "crate::version_deserialize::<_>") + )] + version: u8, + /// Ciphersuite ID + #[cfg_attr( + feature = "serde", + serde(serialize_with = "crate::ciphersuite_serialize::<_, C>") + )] + #[cfg_attr( + feature = "serde", + serde(deserialize_with = "crate::ciphersuite_deserialize::<_, C>") + )] + ciphersuite: (), + #[serde(skip)] + phantom: PhantomData, +} + +impl Default for Header +where + C: Ciphersuite, +{ + fn default() -> Self { + Self { + version: Default::default(), + ciphersuite: Default::default(), + phantom: Default::default(), + } + } +} + /// Serialize a placeholder ciphersuite field with the ciphersuite ID string. #[cfg(feature = "serde")] pub(crate) fn ciphersuite_serialize(_: &(), s: S) -> Result @@ -466,6 +508,23 @@ where } } +/// Deserialize a version. For now, since there is a single version 0, +/// simply validate if it's 0. +#[cfg(feature = "serde")] +pub(crate) fn version_deserialize<'de, D>(deserializer: D) -> Result +where + D: serde::Deserializer<'de>, +{ + let version: u8 = serde::de::Deserialize::deserialize(deserializer)?; + if version != 0 { + Err(serde::de::Error::custom( + "wrong format version, only 0 supported", + )) + } else { + Ok(version) + } +} + // Default byte-oriented serialization for structs that need to be communicated. // // Note that we still manually implement these methods in each applicable type, diff --git a/frost-ed25519/src/lib.rs b/frost-ed25519/src/lib.rs index 4734308..a1212a6 100644 --- a/frost-ed25519/src/lib.rs +++ b/frost-ed25519/src/lib.rs @@ -160,7 +160,7 @@ const CONTEXT_STRING: &str = "FROST-ED25519-SHA512-v1"; pub struct Ed25519Sha512; impl Ciphersuite for Ed25519Sha512 { - const ID: &'static str = "FROST(Ed25519, SHA-512)"; + const ID: &'static str = CONTEXT_STRING; type Group = Ed25519Group; diff --git a/frost-ed25519/tests/serde_tests.rs b/frost-ed25519/tests/serde_tests.rs index 62cedc5..9f72279 100644 --- a/frost-ed25519/tests/serde_tests.rs +++ b/frost-ed25519/tests/serde_tests.rs @@ -25,9 +25,12 @@ fn check_signing_commitments_serialization() { assert!(commitments == decoded_commitments); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "hiding": "5866666666666666666666666666666666666666666666666666666666666666", - "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" }"#; let decoded_commitments: SigningCommitments = serde_json::from_str(json).unwrap(); assert!(commitments == decoded_commitments); @@ -37,21 +40,21 @@ fn check_signing_commitments_serialization() { // Wrong ciphersuite let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST(Wrong, SHA-512)" + }, "hiding": "5866666666666666666666666666666666666666666666666666666666666666", - "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022", - "ciphersuite": "FROST(Wrong, SHA-512)" + "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Invalid identifier - let invalid_json = r#"{ - "hiding": "5866666666666666666666666666666666666666666666666666666666666666", - "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" - }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); - // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "foo": "5866666666666666666666666666666666666666666666666666666666666666", "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" }"#; @@ -59,6 +62,10 @@ fn check_signing_commitments_serialization() { // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "foo": "0000000000000000000000000000000000000000000000000000000000000000", "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" }"#; @@ -66,6 +73,10 @@ fn check_signing_commitments_serialization() { // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST(Ed25519, SHA-512)" + }, "hiding": "5866666666666666666666666666666666666666666666666666666666666666", "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022", "extra": 1 @@ -87,72 +98,102 @@ fn check_signing_package_serialization() { assert!(serde_json::from_str::(invalid_json).is_err()); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "signing_commitments": { "2a00000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "hiding": "5866666666666666666666666666666666666666666666666666666666666666", - "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "message": "68656c6c6f20776f726c64" }"#; let decoded_signing_package: SigningPackage = serde_json::from_str(json).unwrap(); assert!(signing_package == decoded_signing_package); // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "signing_commitments": { "0000000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "hiding": "5866666666666666666666666666666666666666666666666666666666666666", - "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "signing_commitments": { "2a00000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "foo": "5866666666666666666666666666666666666666666666666666666666666666", - "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "signing_commitments": { "2a00000000000000000000000000000000000000000000000000000000000000": { - "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, + "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "signing_commitments": { "2a00000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "hiding": "5866666666666666666666666666666666666666666666666666666666666666", - "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" } }, "message": "68656c6c6f20776f726c64", - "extra": 1, - "ciphersuite": "FROST(Ed25519, SHA-512)" + "extra": 1 } "#; assert!(serde_json::from_str::(invalid_json).is_err()); @@ -169,8 +210,11 @@ fn check_signature_share_serialization() { assert!(signature_share == decoded_signature_share); let json = r#"{ - "share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, + "share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; let decoded_commitments: SignatureShare = serde_json::from_str(json).unwrap(); assert!(signature_share == decoded_commitments); @@ -180,22 +224,31 @@ fn check_signature_share_serialization() { // Invalid field let invalid_json = r#"{ - "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, + "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "ciphersuite": "FROST(Ed25519, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "extra": 1, - "ciphersuite": "FROST(Ed25519, SHA-512)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -211,12 +264,15 @@ fn check_secret_share_serialization() { assert!(secret_share == decoded_secret_share); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "commitment": [ "5866666666666666666666666666666666666666666666666666666666666666" - ], - "ciphersuite": "FROST(Ed25519, SHA-512)" + ] }"#; let decoded_secret_share: SecretShare = serde_json::from_str(json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -226,45 +282,57 @@ fn check_secret_share_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "identifier": "0000000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "commitment": [ "5866666666666666666666666666666666666666666666666666666666666666" - ], - "ciphersuite": "FROST(Ed25519, SHA-512)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "commitment": [ "5866666666666666666666666666666666666666666666666666666666666666" - ], - "ciphersuite": "FROST(Ed25519, SHA-512)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "commitment": [ "5866666666666666666666666666666666666666666666666666666666666666" - ], - "ciphersuite": "FROST(Ed25519, SHA-512)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "commitment": [ "5866666666666666666666666666666666666666666666666666666666666666" - ], + ] "extra": 1, - "ciphersuite": "FROST(Ed25519, SHA-512)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -280,12 +348,15 @@ fn check_key_package_serialization() { assert!(key_package == decoded_key_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "verifying_share": "5866666666666666666666666666666666666666666666666666666666666666", "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666", - "min_signers": 2, - "ciphersuite": "FROST(Ed25519, SHA-512)" + "min_signers": 2 }"#; let decoded_key_package: KeyPackage = serde_json::from_str(json).unwrap(); assert!(key_package == decoded_key_package); @@ -295,41 +366,68 @@ fn check_key_package_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "identifier": "0000000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "verifying_share": "5866666666666666666666666666666666666666666666666666666666666666", "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "min_signers": 2 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "verifying_share": "5866666666666666666666666666666666666666666666666666666666666666", - "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "verifying_share": "5866666666666666666666666666666666666666666666666666666666666666", - "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "verifying_share": "5866666666666666666666666666666666666666666666666666666666666666", "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666", - "extra_field": 1, - "ciphersuite": "FROST(Ed25519, SHA-512)" + "extra_field": 1 + }"#; + assert!(serde_json::from_str::(invalid_json).is_err()); + + // Invalid version + let invalid_json = r#"{ + "header": { + "version": 1, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, + "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", + "secret_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", + "public": "5866666666666666666666666666666666666666666666666666666666666666", + "group_public": "5866666666666666666666666666666666666666666666666666666666666666", + "min_signers": 2 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -345,11 +443,14 @@ fn check_public_key_package_serialization() { assert!(public_key_package == decoded_public_key_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "verifying_shares": { "2a00000000000000000000000000000000000000000000000000000000000000": "5866666666666666666666666666666666666666666666666666666666666666" }, - "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666" }"#; let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -359,41 +460,53 @@ fn check_public_key_package_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "verifying_shares": { "0000000000000000000000000000000000000000000000000000000000000000": "5866666666666666666666666666666666666666666666666666666666666666" }, - "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "verifying_shares": { "2a00000000000000000000000000000000000000000000000000000000000000": "5866666666666666666666666666666666666666666666666666666666666666" }, - "foo": "5866666666666666666666666666666666666666666666666666666666666666", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "foo": "5866666666666666666666666666666666666666666666666666666666666666" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "verifying_shares": { "2a00000000000000000000000000000000000000000000000000000000000000": "5866666666666666666666666666666666666666666666666666666666666666" - }, - "ciphersuite": "FROST(Ed25519, SHA-512)" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "verifying_shares": { "2a00000000000000000000000000000000000000000000000000000000000000": "5866666666666666666666666666666666666666666666666666666666666666" }, "verifying_key": "5866666666666666666666666666666666666666666666666666666666666666", - "extra": 1, - "ciphersuite": "FROST(Ed25519, SHA-512)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -409,11 +522,14 @@ fn check_round1_package_serialization() { assert!(round1_package == decoded_round1_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "commitment": [ "5866666666666666666666666666666666666666666666666666666666666666" ], - "proof_of_knowledge": "5866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "proof_of_knowledge": "5866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; let decoded_round1_package: round1::Package = serde_json::from_str(json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -423,31 +539,40 @@ fn check_round1_package_serialization() { // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "commitment": [ "5866666666666666666666666666666666666666666666666666666666666666" ], - "foo": "5866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "foo": "5866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "commitment": [ "5866666666666666666666666666666666666666666666666666666666666666" - ], - "ciphersuite": "FROST(Ed25519, SHA-512)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "commitment": [ "5866666666666666666666666666666666666666666666666666666666666666" ], "proof_of_knowledge": "5866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "extra": 1, - "ciphersuite": "FROST(Ed25519, SHA-512)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -463,8 +588,11 @@ fn check_round2_package_serialization() { assert!(round2_package == decoded_round2_package); let json = r#"{ - "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, + "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; let decoded_round2_package: round2::Package = serde_json::from_str(json).unwrap(); assert!(round2_package == decoded_round2_package); @@ -474,22 +602,31 @@ fn check_round2_package_serialization() { // Invalid field let invalid_json = r#"{ - "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(Ed25519, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, + "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "ciphersuite": "FROST(Ed25519, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED25519-SHA512-v1" + }, "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "extra": 1, - "ciphersuite": "FROST(Ed25519, SHA-512)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } diff --git a/frost-ed25519/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap b/frost-ed25519/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap index 2638eaa..d455441 100644 --- a/frost-ed25519/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap +++ b/frost-ed25519/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed25519/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a5866666666666666666666666666666666666666666666666666666666666666586666666666666666666666666666666666666666666666666666666666666602ea38536e +00b169f0da2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a5866666666666666666666666666666666666666666666666666666666666666586666666666666666666666666666666666666666666666666666666666666602 diff --git a/frost-ed25519/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap b/frost-ed25519/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap index 2e0e807..c49d473 100644 --- a/frost-ed25519/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap +++ b/frost-ed25519/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed25519/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -012a0000000000000000000000000000000000000000000000000000000000000058666666666666666666666666666666666666666666666666666666666666665866666666666666666666666666666666666666666666666666666666666666ea38536e +00b169f0da012a0000000000000000000000000000000000000000000000000000000000000058666666666666666666666666666666666666666666666666666666666666665866666666666666666666666666666666666666666666666666666666666666 diff --git a/frost-ed25519/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap b/frost-ed25519/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap index a25f947..a90202d 100644 --- a/frost-ed25519/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap +++ b/frost-ed25519/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed25519/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -015866666666666666666666666666666666666666666666666666666666666666405866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aea38536e +00b169f0da015866666666666666666666666666666666666666666666666666666666666666405866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a diff --git a/frost-ed25519/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap b/frost-ed25519/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap index 65e4605..b037048 100644 --- a/frost-ed25519/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap +++ b/frost-ed25519/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed25519/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aea38536e +00b169f0da498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a diff --git a/frost-ed25519/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap b/frost-ed25519/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap index a51399e..6d8a4de 100644 --- a/frost-ed25519/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap +++ b/frost-ed25519/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed25519/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a015866666666666666666666666666666666666666666666666666666666666666ea38536e +00b169f0da2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a015866666666666666666666666666666666666666666666666666666666666666 diff --git a/frost-ed25519/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap b/frost-ed25519/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap index 5d5abec..946d520 100644 --- a/frost-ed25519/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap +++ b/frost-ed25519/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed25519/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -5866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022ea38536e +00b169f0da5866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022 diff --git a/frost-ed25519/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap b/frost-ed25519/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap index 0aedfbf..cc6d30f 100644 --- a/frost-ed25519/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap +++ b/frost-ed25519/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed25519/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -012a000000000000000000000000000000000000000000000000000000000000005866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022ea38536e0b68656c6c6f20776f726c64ea38536e +00b169f0da012a0000000000000000000000000000000000000000000000000000000000000000b169f0da5866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd60220b68656c6c6f20776f726c64 diff --git a/frost-ed448/src/lib.rs b/frost-ed448/src/lib.rs index e0adf39..6cc4ee0 100644 --- a/frost-ed448/src/lib.rs +++ b/frost-ed448/src/lib.rs @@ -155,7 +155,7 @@ const CONTEXT_STRING: &str = "FROST-ED448-SHAKE256-v1"; pub struct Ed448Shake256; impl Ciphersuite for Ed448Shake256 { - const ID: &'static str = "FROST(Ed448, SHAKE256)"; + const ID: &'static str = CONTEXT_STRING; type Group = Ed448Group; diff --git a/frost-ed448/tests/serde_tests.rs b/frost-ed448/tests/serde_tests.rs index 95f7102..3b5c667 100644 --- a/frost-ed448/tests/serde_tests.rs +++ b/frost-ed448/tests/serde_tests.rs @@ -25,9 +25,12 @@ fn check_signing_commitments_serialization() { assert!(commitments == decoded_commitments); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "hiding": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" }"#; let decoded_commitments: SigningCommitments = serde_json::from_str(json).unwrap(); assert!(commitments == decoded_commitments); @@ -37,21 +40,21 @@ fn check_signing_commitments_serialization() { // Wrong ciphersuite let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST(Wrong, SHA-512)" + }, "hiding": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80", - "ciphersuite": "FROST(Wrong, SHA-512)" + "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Invalid identifier - let invalid_json = r#"{ - "hiding": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" - }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); - // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "foo": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" }"#; @@ -59,6 +62,10 @@ fn check_signing_commitments_serialization() { // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "foo": "0000000000000000000000000000000000000000000000000000000000000000", "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" }"#; @@ -66,6 +73,10 @@ fn check_signing_commitments_serialization() { // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST(Ed25519, SHA-512)" + }, "hiding": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80", "extra": 1 @@ -87,72 +98,102 @@ fn check_signing_package_serialization() { assert!(serde_json::from_str::(invalid_json).is_err()); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "signing_commitments": { "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "hiding": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "message": "68656c6c6f20776f726c64" }"#; let decoded_signing_package: SigningPackage = serde_json::from_str(json).unwrap(); assert!(signing_package == decoded_signing_package); // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "signing_commitments": { "0000000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "hiding": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "signing_commitments": { "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "foo": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "signing_commitments": { "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000": { - "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, + "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "signing_commitments": { "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "hiding": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" } }, "message": "68656c6c6f20776f726c64", - "extra": 1, - "ciphersuite": "FROST(Ed448, SHAKE256)" + "extra": 1 } "#; assert!(serde_json::from_str::(invalid_json).is_err()); @@ -169,8 +210,11 @@ fn check_signature_share_serialization() { assert!(signature_share == decoded_signature_share); let json = r#"{ - "share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, + "share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00" }"#; let decoded_commitments: SignatureShare = serde_json::from_str(json).unwrap(); assert!(signature_share == decoded_commitments); @@ -180,22 +224,31 @@ fn check_signature_share_serialization() { // Invalid field let invalid_json = r#"{ - "foo": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, + "foo": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "ciphersuite": "FROST(Ed448, SHAKE256)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", - "extra": 1, - "ciphersuite": "FROST(Ed448, SHAKE256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -211,12 +264,15 @@ fn check_secret_share_serialization() { assert!(secret_share == decoded_secret_share); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "signing_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", "commitment": [ "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" - ], - "ciphersuite": "FROST(Ed448, SHAKE256)" + ] }"#; let decoded_secret_share: SecretShare = serde_json::from_str(json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -226,45 +282,57 @@ fn check_secret_share_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "identifier": "0000000000000000000000000000000000000000000000000000000000000000", "signing_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", "commitment": [ "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" - ], - "ciphersuite": "FROST(Ed448, SHAKE256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "foo": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", "commitment": [ "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" - ], - "ciphersuite": "FROST(Ed448, SHAKE256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "commitment": [ "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" - ], - "ciphersuite": "FROST(Ed448, SHAKE256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "signing_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", "commitment": [ "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" - ], + ] "extra": 1, - "ciphersuite": "FROST(Ed448, SHAKE256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -280,12 +348,15 @@ fn check_key_package_serialization() { assert!(key_package == decoded_key_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "signing_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", "verifying_share": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "min_signers": 2, - "ciphersuite": "FROST(Ed448, SHAKE256)" + "min_signers": 2 }"#; let decoded_key_package: KeyPackage = serde_json::from_str(json).unwrap(); assert!(key_package == decoded_key_package); @@ -295,41 +366,68 @@ fn check_key_package_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "identifier": "0000000000000000000000000000000000000000000000000000000000000000", "signing_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", "verifying_share": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "min_signers": 2 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "foo": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", "verifying_share": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "verifying_share": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "signing_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", "verifying_share": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "extra_field": 1, - "ciphersuite": "FROST(Ed448, SHAKE256)" + "extra_field": 1 + }"#; + assert!(serde_json::from_str::(invalid_json).is_err()); + + // Invalid version + let invalid_json = r#"{ + "header": { + "version": 1, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, + "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "secret_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", + "public": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", + "group_public": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", + "min_signers": 2 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -345,11 +443,14 @@ fn check_public_key_package_serialization() { assert!(public_key_package == decoded_public_key_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "verifying_shares": { "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" }, - "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" }"#; let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -359,41 +460,53 @@ fn check_public_key_package_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "verifying_shares": { "0000000000000000000000000000000000000000000000000000000000000000": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" }, - "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "verifying_shares": { "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" }, - "foo": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "foo": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "verifying_shares": { "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" - }, - "ciphersuite": "FROST(Ed448, SHAKE256)" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "verifying_shares": { "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" }, "verifying_key": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", - "extra": 1, - "ciphersuite": "FROST(Ed448, SHAKE256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -409,11 +522,14 @@ fn check_round1_package_serialization() { assert!(round1_package == decoded_round1_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "commitment": [ "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" ], - "proof_of_knowledge": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "proof_of_knowledge": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00" }"#; let decoded_round1_package: round1::Package = serde_json::from_str(json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -423,31 +539,40 @@ fn check_round1_package_serialization() { // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "commitment": [ "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" ], - "foo": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "foo": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "commitment": [ "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" - ], - "ciphersuite": "FROST(Ed448, SHAKE256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "commitment": [ "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" ], "proof_of_knowledge": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", - "extra": 1, - "ciphersuite": "FROST(Ed448, SHAKE256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -463,8 +588,11 @@ fn check_round2_package_serialization() { assert!(round2_package == decoded_round2_package); let json = r#"{ - "signing_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, + "signing_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00" }"#; let decoded_round2_package: round2::Package = serde_json::from_str(json).unwrap(); assert!(round2_package == decoded_round2_package); @@ -474,22 +602,31 @@ fn check_round2_package_serialization() { // Invalid field let invalid_json = r#"{ - "foo": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", - "ciphersuite": "FROST(Ed448, SHAKE256)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, + "foo": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "ciphersuite": "FROST(Ed448, SHAKE256)" + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-ED448-SHAKE256-v1" + }, "signing_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", - "extra": 1, - "ciphersuite": "FROST(Ed448, SHAKE256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } diff --git a/frost-ed448/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap b/frost-ed448/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap index 54f5493..121d9d2 100644 --- a/frost-ed448/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap +++ b/frost-ed448/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed448/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a0014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690002854361d9 +005a064cfd2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a0014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690002 diff --git a/frost-ed448/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap b/frost-ed448/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap index 51ceb6a..aeafb83 100644 --- a/frost-ed448/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap +++ b/frost-ed448/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed448/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900854361d9 +005a064cfd012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900 diff --git a/frost-ed448/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap b/frost-ed448/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap index 6785b8c..3aeff28 100644 --- a/frost-ed448/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap +++ b/frost-ed448/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed448/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -0114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69007214fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00854361d9 +005a064cfd0114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69007214fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00 diff --git a/frost-ed448/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap b/frost-ed448/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap index ea33829..2d65694 100644 --- a/frost-ed448/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap +++ b/frost-ed448/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed448/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00854361d9 +005a064cfd4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00 diff --git a/frost-ed448/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap b/frost-ed448/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap index 309aeb2..5b9eb84 100644 --- a/frost-ed448/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap +++ b/frost-ed448/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed448/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a000114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900854361d9 +005a064cfd2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a000114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900 diff --git a/frost-ed448/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap b/frost-ed448/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap index 6028dc0..bf7f566 100644 --- a/frost-ed448/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap +++ b/frost-ed448/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed448/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80854361d9 +005a064cfd14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80 diff --git a/frost-ed448/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap b/frost-ed448/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap index 8c000a3..7cff6d1 100644 --- a/frost-ed448/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap +++ b/frost-ed448/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ed448/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80854361d90b68656c6c6f20776f726c64854361d9 +005a064cfd012a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a064cfd14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae800b68656c6c6f20776f726c64 diff --git a/frost-p256/src/lib.rs b/frost-p256/src/lib.rs index 6fe8c5f..914eecf 100644 --- a/frost-p256/src/lib.rs +++ b/frost-p256/src/lib.rs @@ -180,7 +180,7 @@ const CONTEXT_STRING: &str = "FROST-P256-SHA256-v1"; pub struct P256Sha256; impl Ciphersuite for P256Sha256 { - const ID: &'static str = "FROST(P-256, SHA-256)"; + const ID: &'static str = CONTEXT_STRING; type Group = P256Group; diff --git a/frost-p256/tests/serde_tests.rs b/frost-p256/tests/serde_tests.rs index 994c196..c147581 100644 --- a/frost-p256/tests/serde_tests.rs +++ b/frost-p256/tests/serde_tests.rs @@ -25,9 +25,12 @@ fn check_signing_commitments_serialization() { assert!(commitments == decoded_commitments); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "hiding": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978", - "ciphersuite": "FROST(P-256, SHA-256)" + "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" }"#; let decoded_commitments: SigningCommitments = serde_json::from_str(json).unwrap(); assert!(commitments == decoded_commitments); @@ -37,21 +40,21 @@ fn check_signing_commitments_serialization() { // Wrong ciphersuite let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST(Wrong, SHA-512)" + }, "hiding": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978", - "ciphersuite": "FROST(Wrong, SHA-512)" + "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Invalid identifier - let invalid_json = r#"{ - "hiding": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" - }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); - // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "foo": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" }"#; @@ -59,6 +62,10 @@ fn check_signing_commitments_serialization() { // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "foo": "0000000000000000000000000000000000000000000000000000000000000000", "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" }"#; @@ -66,6 +73,10 @@ fn check_signing_commitments_serialization() { // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST(Ed25519, SHA-512)" + }, "hiding": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978", "extra": 1 @@ -87,72 +98,102 @@ fn check_signing_package_serialization() { assert!(serde_json::from_str::(invalid_json).is_err()); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "signing_commitments": { "000000000000000000000000000000000000000000000000000000000000002a": { + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "hiding": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978", - "ciphersuite": "FROST(P-256, SHA-256)" + "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(P-256, SHA-256)" + "message": "68656c6c6f20776f726c64" }"#; let decoded_signing_package: SigningPackage = serde_json::from_str(json).unwrap(); assert!(signing_package == decoded_signing_package); // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "signing_commitments": { "0000000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "hiding": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978", - "ciphersuite": "FROST(P-256, SHA-256)" + "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(P-256, SHA-256)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "signing_commitments": { "000000000000000000000000000000000000000000000000000000000000002a": { + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "foo": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978", - "ciphersuite": "FROST(P-256, SHA-256)" + "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(P-256, SHA-256)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "signing_commitments": { "000000000000000000000000000000000000000000000000000000000000002a": { - "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978", - "ciphersuite": "FROST(P-256, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, + "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(P-256, SHA-256)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "signing_commitments": { "000000000000000000000000000000000000000000000000000000000000002a": { + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "hiding": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978", - "ciphersuite": "FROST(P-256, SHA-256)" + "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" } }, "message": "68656c6c6f20776f726c64", - "extra": 1, - "ciphersuite": "FROST(P-256, SHA-256)" + "extra": 1 } "#; assert!(serde_json::from_str::(invalid_json).is_err()); @@ -169,8 +210,11 @@ fn check_signature_share_serialization() { assert!(signature_share == decoded_signature_share); let json = r#"{ - "share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", - "ciphersuite": "FROST(P-256, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, + "share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1" }"#; let decoded_commitments: SignatureShare = serde_json::from_str(json).unwrap(); assert!(signature_share == decoded_commitments); @@ -180,22 +224,31 @@ fn check_signature_share_serialization() { // Invalid field let invalid_json = r#"{ - "foo": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", - "ciphersuite": "FROST(P-256, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, + "foo": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "ciphersuite": "FROST(P-256, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", - "extra": 1, - "ciphersuite": "FROST(P-256, SHA-256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -211,12 +264,15 @@ fn check_secret_share_serialization() { assert!(secret_share == decoded_secret_share); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "signing_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", "commitment": [ "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" - ], - "ciphersuite": "FROST(P-256, SHA-256)" + ] }"#; let decoded_secret_share: SecretShare = serde_json::from_str(json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -226,45 +282,57 @@ fn check_secret_share_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "identifier": "0000000000000000000000000000000000000000000000000000000000000000", "signing_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", "commitment": [ "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" - ], - "ciphersuite": "FROST(P-256, SHA-256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "foo": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", "commitment": [ "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" - ], - "ciphersuite": "FROST(P-256, SHA-256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "commitment": [ "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" - ], - "ciphersuite": "FROST(P-256, SHA-256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "signing_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", "commitment": [ "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" - ], + ] "extra": 1, - "ciphersuite": "FROST(P-256, SHA-256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -280,12 +348,15 @@ fn check_key_package_serialization() { assert!(key_package == decoded_key_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "signing_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", "verifying_share": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "min_signers": 2, - "ciphersuite": "FROST(P-256, SHA-256)" + "min_signers": 2 }"#; let decoded_key_package: KeyPackage = serde_json::from_str(json).unwrap(); assert!(key_package == decoded_key_package); @@ -295,41 +366,68 @@ fn check_key_package_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "identifier": "0000000000000000000000000000000000000000000000000000000000000000", "signing_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", "verifying_share": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "ciphersuite": "FROST(P-256, SHA-256)" + "min_signers": 2 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "foo": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", "verifying_share": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "ciphersuite": "FROST(P-256, SHA-256)" + "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "verifying_share": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "ciphersuite": "FROST(P-256, SHA-256)" + "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "signing_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", "verifying_share": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "extra_field": 1, - "ciphersuite": "FROST(P-256, SHA-256)" + "extra_field": 1 + }"#; + assert!(serde_json::from_str::(invalid_json).is_err()); + + // Invalid version + let invalid_json = r#"{ + "header": { + "version": 1, + "ciphersuite": "FROST-P256-SHA256-v1" + }, + "identifier": "000000000000000000000000000000000000000000000000000000000000002a", + "secret_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", + "public": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", + "group_public": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", + "min_signers": 2 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -345,11 +443,14 @@ fn check_public_key_package_serialization() { assert!(public_key_package == decoded_public_key_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "verifying_shares": { "000000000000000000000000000000000000000000000000000000000000002a": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" }, - "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "ciphersuite": "FROST(P-256, SHA-256)" + "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" }"#; let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -359,41 +460,53 @@ fn check_public_key_package_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "verifying_shares": { "0000000000000000000000000000000000000000000000000000000000000000": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" }, - "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "ciphersuite": "FROST(P-256, SHA-256)" + "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "verifying_shares": { "000000000000000000000000000000000000000000000000000000000000002a": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" }, - "foo": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "ciphersuite": "FROST(P-256, SHA-256)" + "foo": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "verifying_shares": { "000000000000000000000000000000000000000000000000000000000000002a": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" - }, - "ciphersuite": "FROST(P-256, SHA-256)" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "verifying_shares": { "000000000000000000000000000000000000000000000000000000000000002a": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" }, "verifying_key": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "extra": 1, - "ciphersuite": "FROST(P-256, SHA-256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -409,11 +522,14 @@ fn check_round1_package_serialization() { assert!(round1_package == decoded_round1_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "commitment": [ "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" ], - "proof_of_knowledge": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", - "ciphersuite": "FROST(P-256, SHA-256)" + "proof_of_knowledge": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1" }"#; let decoded_round1_package: round1::Package = serde_json::from_str(json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -423,31 +539,40 @@ fn check_round1_package_serialization() { // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "commitment": [ "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" ], - "foo": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", - "ciphersuite": "FROST(P-256, SHA-256)" + "foo": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "commitment": [ "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" - ], - "ciphersuite": "FROST(P-256, SHA-256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "commitment": [ "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" ], "proof_of_knowledge": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", - "extra": 1, - "ciphersuite": "FROST(P-256, SHA-256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -463,8 +588,11 @@ fn check_round2_package_serialization() { assert!(round2_package == decoded_round2_package); let json = r#"{ - "signing_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", - "ciphersuite": "FROST(P-256, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, + "signing_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1" }"#; let decoded_round2_package: round2::Package = serde_json::from_str(json).unwrap(); assert!(round2_package == decoded_round2_package); @@ -474,22 +602,31 @@ fn check_round2_package_serialization() { // Invalid field let invalid_json = r#"{ - "foo": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", - "ciphersuite": "FROST(P-256, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, + "foo": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "ciphersuite": "FROST(P-256, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-P256-SHA256-v1" + }, "signing_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", - "extra": 1, - "ciphersuite": "FROST(P-256, SHA-256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } diff --git a/frost-p256/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap b/frost-p256/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap index b876705..aa3f38d 100644 --- a/frost-p256/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap +++ b/frost-p256/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-p256/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296029bf7b2e7 +00a132f0c9000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602 diff --git a/frost-p256/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap b/frost-p256/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap index f7d9a94..4a003db 100644 --- a/frost-p256/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap +++ b/frost-p256/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-p256/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -01000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2969bf7b2e7 +00a132f0c901000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296 diff --git a/frost-p256/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap b/frost-p256/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap index 4b45ec7..49ac805 100644 --- a/frost-p256/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap +++ b/frost-p256/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-p256/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -01036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29641036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e19bf7b2e7 +00a132f0c901036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29641036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1 diff --git a/frost-p256/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap b/frost-p256/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap index 722deee..7717480 100644 --- a/frost-p256/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap +++ b/frost-p256/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-p256/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e19bf7b2e7 +00a132f0c9aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1 diff --git a/frost-p256/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap b/frost-p256/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap index 8fb3a3b..7cdab3f 100644 --- a/frost-p256/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap +++ b/frost-p256/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-p256/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e101036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2969bf7b2e7 +00a132f0c9000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e101036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296 diff --git a/frost-p256/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap b/frost-p256/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap index f615363..ec42c6c 100644 --- a/frost-p256/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap +++ b/frost-p256/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-p256/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699789bf7b2e7 +00a132f0c9036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978 diff --git a/frost-p256/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap b/frost-p256/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap index 0bd2d33..3105997 100644 --- a/frost-p256/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap +++ b/frost-p256/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-p256/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -01000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699789bf7b2e70b68656c6c6f20776f726c649bf7b2e7 +00a132f0c901000000000000000000000000000000000000000000000000000000000000002a00a132f0c9036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780b68656c6c6f20776f726c64 diff --git a/frost-ristretto255/src/lib.rs b/frost-ristretto255/src/lib.rs index 32c1e6e..35ebb1e 100644 --- a/frost-ristretto255/src/lib.rs +++ b/frost-ristretto255/src/lib.rs @@ -146,7 +146,7 @@ const CONTEXT_STRING: &str = "FROST-RISTRETTO255-SHA512-v1"; pub struct Ristretto255Sha512; impl Ciphersuite for Ristretto255Sha512 { - const ID: &'static str = "FROST(ristretto255, SHA-512)"; + const ID: &'static str = CONTEXT_STRING; type Group = RistrettoGroup; diff --git a/frost-ristretto255/tests/serde_tests.rs b/frost-ristretto255/tests/serde_tests.rs index de14a3b..faf1769 100644 --- a/frost-ristretto255/tests/serde_tests.rs +++ b/frost-ristretto255/tests/serde_tests.rs @@ -25,9 +25,12 @@ fn check_signing_commitments_serialization() { assert!(commitments == decoded_commitments); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "hiding": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" }"#; let decoded_commitments: SigningCommitments = serde_json::from_str(json).unwrap(); assert!(commitments == decoded_commitments); @@ -37,21 +40,21 @@ fn check_signing_commitments_serialization() { // Wrong ciphersuite let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST(Wrong, SHA-512)" + }, "hiding": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919", - "ciphersuite": "FROST(Wrong, SHA-512)" + "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Invalid identifier - let invalid_json = r#"{ - "hiding": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" - }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); - // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "foo": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" }"#; @@ -59,6 +62,10 @@ fn check_signing_commitments_serialization() { // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "foo": "0000000000000000000000000000000000000000000000000000000000000000", "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" }"#; @@ -66,6 +73,10 @@ fn check_signing_commitments_serialization() { // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST(Ed25519, SHA-512)" + }, "hiding": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919", "extra": 1 @@ -87,72 +98,102 @@ fn check_signing_package_serialization() { assert!(serde_json::from_str::(invalid_json).is_err()); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "signing_commitments": { "2a00000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "hiding": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "message": "68656c6c6f20776f726c64" }"#; let decoded_signing_package: SigningPackage = serde_json::from_str(json).unwrap(); assert!(signing_package == decoded_signing_package); // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "signing_commitments": { "0000000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "hiding": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "signing_commitments": { "2a00000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "foo": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "signing_commitments": { "2a00000000000000000000000000000000000000000000000000000000000000": { - "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, + "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "signing_commitments": { "2a00000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "hiding": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" } }, "message": "68656c6c6f20776f726c64", - "extra": 1, - "ciphersuite": "FROST(ristretto255, SHA-512)" + "extra": 1 } "#; assert!(serde_json::from_str::(invalid_json).is_err()); @@ -169,8 +210,11 @@ fn check_signature_share_serialization() { assert!(signature_share == decoded_signature_share); let json = r#"{ - "share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, + "share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; let decoded_commitments: SignatureShare = serde_json::from_str(json).unwrap(); assert!(signature_share == decoded_commitments); @@ -180,22 +224,31 @@ fn check_signature_share_serialization() { // Invalid field let invalid_json = r#"{ - "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, + "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "ciphersuite": "FROST(ristretto255, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "extra": 1, - "ciphersuite": "FROST(ristretto255, SHA-512)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -211,12 +264,15 @@ fn check_secret_share_serialization() { assert!(secret_share == decoded_secret_share); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "commitment": [ "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" - ], - "ciphersuite": "FROST(ristretto255, SHA-512)" + ] }"#; let decoded_secret_share: SecretShare = serde_json::from_str(json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -226,45 +282,57 @@ fn check_secret_share_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "identifier": "0000000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "commitment": [ "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" - ], - "ciphersuite": "FROST(ristretto255, SHA-512)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "commitment": [ "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" - ], - "ciphersuite": "FROST(ristretto255, SHA-512)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "commitment": [ "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" - ], - "ciphersuite": "FROST(ristretto255, SHA-512)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "commitment": [ "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" - ], + ] "extra": 1, - "ciphersuite": "FROST(ristretto255, SHA-512)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -280,12 +348,15 @@ fn check_key_package_serialization() { assert!(key_package == decoded_key_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "verifying_share": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "min_signers": 2, - "ciphersuite": "FROST(ristretto255, SHA-512)" + "min_signers": 2 }"#; let decoded_key_package: KeyPackage = serde_json::from_str(json).unwrap(); assert!(key_package == decoded_key_package); @@ -295,41 +366,68 @@ fn check_key_package_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "identifier": "0000000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "verifying_share": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "min_signers": 2 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "verifying_share": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "verifying_share": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "verifying_share": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "extra_field": 1, - "ciphersuite": "FROST(ristretto255, SHA-512)" + "extra_field": 1 + }"#; + assert!(serde_json::from_str::(invalid_json).is_err()); + + // Invalid version + let invalid_json = r#"{ + "header": { + "version": 1, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, + "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", + "secret_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", + "public": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", + "group_public": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", + "min_signers": 2 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -345,11 +443,14 @@ fn check_public_key_package_serialization() { assert!(public_key_package == decoded_public_key_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "verifying_shares": { "2a00000000000000000000000000000000000000000000000000000000000000": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" }, - "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" }"#; let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -359,41 +460,53 @@ fn check_public_key_package_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "verifying_shares": { "0000000000000000000000000000000000000000000000000000000000000000": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" }, - "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "verifying_shares": { "2a00000000000000000000000000000000000000000000000000000000000000": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" }, - "foo": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "foo": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "verifying_shares": { "2a00000000000000000000000000000000000000000000000000000000000000": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" - }, - "ciphersuite": "FROST(ristretto255, SHA-512)" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "verifying_shares": { "2a00000000000000000000000000000000000000000000000000000000000000": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" }, "verifying_key": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", - "extra": 1, - "ciphersuite": "FROST(ristretto255, SHA-512)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -409,11 +522,14 @@ fn check_round1_package_serialization() { assert!(round1_package == decoded_round1_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "commitment": [ "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" ], - "proof_of_knowledge": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "proof_of_knowledge": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; let decoded_round1_package: round1::Package = serde_json::from_str(json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -423,31 +539,40 @@ fn check_round1_package_serialization() { // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "commitment": [ "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" ], - "foo": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "foo": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "commitment": [ "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" - ], - "ciphersuite": "FROST(ristretto255, SHA-512)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "commitment": [ "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" ], "proof_of_knowledge": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "extra": 1, - "ciphersuite": "FROST(ristretto255, SHA-512)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -463,8 +588,11 @@ fn check_round2_package_serialization() { assert!(round2_package == decoded_round2_package); let json = r#"{ - "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, + "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; let decoded_round2_package: round2::Package = serde_json::from_str(json).unwrap(); assert!(round2_package == decoded_round2_package); @@ -474,22 +602,31 @@ fn check_round2_package_serialization() { // Invalid field let invalid_json = r#"{ - "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "ciphersuite": "FROST(ristretto255, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, + "foo": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "ciphersuite": "FROST(ristretto255, SHA-512)" + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-RISTRETTO255-SHA512-v1" + }, "signing_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", - "extra": 1, - "ciphersuite": "FROST(ristretto255, SHA-512)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } diff --git a/frost-ristretto255/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap b/frost-ristretto255/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap index a465e77..a3f2cde 100644 --- a/frost-ristretto255/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap +++ b/frost-ristretto255/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ristretto255/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7602e6811b69 +00d76ecff52a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7602 diff --git a/frost-ristretto255/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap b/frost-ristretto255/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap index 6784926..1945e89 100644 --- a/frost-ristretto255/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap +++ b/frost-ristretto255/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ristretto255/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e6811b69 +00d76ecff5012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76 diff --git a/frost-ristretto255/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap b/frost-ristretto255/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap index 7591b84..a11b343 100644 --- a/frost-ristretto255/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap +++ b/frost-ristretto255/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ristretto255/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7640e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae6811b69 +00d76ecff501e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7640e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a diff --git a/frost-ristretto255/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap b/frost-ristretto255/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap index 100829c..4e674fe 100644 --- a/frost-ristretto255/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap +++ b/frost-ristretto255/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ristretto255/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae6811b69 +00d76ecff5498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a diff --git a/frost-ristretto255/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap b/frost-ristretto255/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap index d49ee75..ca95f42 100644 --- a/frost-ristretto255/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap +++ b/frost-ristretto255/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ristretto255/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e6811b69 +00d76ecff52a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76 diff --git a/frost-ristretto255/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap b/frost-ristretto255/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap index e608308..30f7285 100644 --- a/frost-ristretto255/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap +++ b/frost-ristretto255/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ristretto255/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919e6811b69 +00d76ecff5e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919 diff --git a/frost-ristretto255/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap b/frost-ristretto255/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap index 9808c46..e923087 100644 --- a/frost-ristretto255/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap +++ b/frost-ristretto255/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-ristretto255/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919e6811b690b68656c6c6f20776f726c64e6811b69 +00d76ecff5012a0000000000000000000000000000000000000000000000000000000000000000d76ecff5e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b9190b68656c6c6f20776f726c64 diff --git a/frost-secp256k1/src/lib.rs b/frost-secp256k1/src/lib.rs index 22fb4c1..092294e 100644 --- a/frost-secp256k1/src/lib.rs +++ b/frost-secp256k1/src/lib.rs @@ -180,7 +180,7 @@ const CONTEXT_STRING: &str = "FROST-secp256k1-SHA256-v1"; pub struct Secp256K1Sha256; impl Ciphersuite for Secp256K1Sha256 { - const ID: &'static str = "FROST(secp256k1, SHA-256)"; + const ID: &'static str = CONTEXT_STRING; type Group = Secp256K1Group; diff --git a/frost-secp256k1/tests/serde_tests.rs b/frost-secp256k1/tests/serde_tests.rs index 533b7f5..82a0735 100644 --- a/frost-secp256k1/tests/serde_tests.rs +++ b/frost-secp256k1/tests/serde_tests.rs @@ -25,9 +25,12 @@ fn check_signing_commitments_serialization() { assert!(commitments == decoded_commitments); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "hiding": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" }"#; let decoded_commitments: SigningCommitments = serde_json::from_str(json).unwrap(); assert!(commitments == decoded_commitments); @@ -37,21 +40,21 @@ fn check_signing_commitments_serialization() { // Wrong ciphersuite let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST(Wrong, SHA-512)" + }, "hiding": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", - "ciphersuite": "FROST(Wrong, SHA-512)" + "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Invalid identifier - let invalid_json = r#"{ - "hiding": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" - }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); - // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "foo": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" }"#; @@ -59,6 +62,10 @@ fn check_signing_commitments_serialization() { // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "foo": "0000000000000000000000000000000000000000000000000000000000000000", "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" }"#; @@ -66,6 +73,10 @@ fn check_signing_commitments_serialization() { // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST(Ed25519, SHA-512)" + }, "hiding": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", "extra": 1 @@ -87,72 +98,102 @@ fn check_signing_package_serialization() { assert!(serde_json::from_str::(invalid_json).is_err()); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "signing_commitments": { "000000000000000000000000000000000000000000000000000000000000002a": { + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "hiding": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "message": "68656c6c6f20776f726c64" }"#; let decoded_signing_package: SigningPackage = serde_json::from_str(json).unwrap(); assert!(signing_package == decoded_signing_package); // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "signing_commitments": { "0000000000000000000000000000000000000000000000000000000000000000": { + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "hiding": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "signing_commitments": { "000000000000000000000000000000000000000000000000000000000000002a": { + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "foo": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "signing_commitments": { "000000000000000000000000000000000000000000000000000000000000002a": { - "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, + "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" } }, - "message": "68656c6c6f20776f726c64", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "message": "68656c6c6f20776f726c64" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "signing_commitments": { "000000000000000000000000000000000000000000000000000000000000002a": { + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "hiding": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" } }, "message": "68656c6c6f20776f726c64", - "extra": 1, - "ciphersuite": "FROST(secp256k1, SHA-256)" + "extra": 1 } "#; assert!(serde_json::from_str::(invalid_json).is_err()); @@ -169,8 +210,11 @@ fn check_signature_share_serialization() { assert!(signature_share == decoded_signature_share); let json = r#"{ - "share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, + "share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81" }"#; let decoded_commitments: SignatureShare = serde_json::from_str(json).unwrap(); assert!(signature_share == decoded_commitments); @@ -180,22 +224,31 @@ fn check_signature_share_serialization() { // Invalid field let invalid_json = r#"{ - "foo": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, + "foo": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "ciphersuite": "FROST(secp256k1, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", - "extra": 1, - "ciphersuite": "FROST(secp256k1, SHA-256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -211,12 +264,15 @@ fn check_secret_share_serialization() { assert!(secret_share == decoded_secret_share); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "signing_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", "commitment": [ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" - ], - "ciphersuite": "FROST(secp256k1, SHA-256)" + ] }"#; let decoded_secret_share: SecretShare = serde_json::from_str(json).unwrap(); assert!(secret_share == decoded_secret_share); @@ -226,45 +282,57 @@ fn check_secret_share_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "identifier": "0000000000000000000000000000000000000000000000000000000000000000", "signing_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", "commitment": [ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" - ], - "ciphersuite": "FROST(secp256k1, SHA-256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "foo": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", "commitment": [ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" - ], - "ciphersuite": "FROST(secp256k1, SHA-256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "commitment": [ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" - ], - "ciphersuite": "FROST(secp256k1, SHA-256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "signing_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", "commitment": [ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" - ], + ] "extra": 1, - "ciphersuite": "FROST(secp256k1, SHA-256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -280,12 +348,15 @@ fn check_key_package_serialization() { assert!(key_package == decoded_key_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "signing_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", "verifying_share": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "min_signers": 2, - "ciphersuite": "FROST(secp256k1, SHA-256)" + "min_signers": 2 }"#; let decoded_key_package: KeyPackage = serde_json::from_str(json).unwrap(); assert!(key_package == decoded_key_package); @@ -295,41 +366,68 @@ fn check_key_package_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "identifier": "0000000000000000000000000000000000000000000000000000000000000000", "signing_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", "verifying_share": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "min_signers": 2 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "foo": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", "verifying_share": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "verifying_share": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "signing_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", "verifying_share": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "extra_field": 1, - "ciphersuite": "FROST(secp256k1, SHA-256)" + "extra_field": 1 + }"#; + assert!(serde_json::from_str::(invalid_json).is_err()); + + // Invalid version + let invalid_json = r#"{ + "header": { + "version": 1, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, + "identifier": "000000000000000000000000000000000000000000000000000000000000002a", + "secret_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", + "public": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "group_public": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "min_signers": 2 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -345,11 +443,14 @@ fn check_public_key_package_serialization() { assert!(public_key_package == decoded_public_key_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "verifying_shares": { "000000000000000000000000000000000000000000000000000000000000002a": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" }, - "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" }"#; let decoded_public_key_package: PublicKeyPackage = serde_json::from_str(json).unwrap(); assert!(public_key_package == decoded_public_key_package); @@ -359,41 +460,53 @@ fn check_public_key_package_serialization() { // Invalid identifier let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "verifying_shares": { "0000000000000000000000000000000000000000000000000000000000000000": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" }, - "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "verifying_shares": { "000000000000000000000000000000000000000000000000000000000000002a": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" }, - "foo": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "foo": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "verifying_shares": { "000000000000000000000000000000000000000000000000000000000000002a": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" - }, - "ciphersuite": "FROST(secp256k1, SHA-256)" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "verifying_shares": { "000000000000000000000000000000000000000000000000000000000000002a": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" }, "verifying_key": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "extra": 1, - "ciphersuite": "FROST(secp256k1, SHA-256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -409,11 +522,14 @@ fn check_round1_package_serialization() { assert!(round1_package == decoded_round1_package); let json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "commitment": [ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" ], - "proof_of_knowledge": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "proof_of_knowledge": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81" }"#; let decoded_round1_package: round1::Package = serde_json::from_str(json).unwrap(); assert!(round1_package == decoded_round1_package); @@ -423,31 +539,40 @@ fn check_round1_package_serialization() { // Invalid field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "commitment": [ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" ], - "foo": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "foo": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "commitment": [ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" - ], - "ciphersuite": "FROST(secp256k1, SHA-256)" + ] }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "commitment": [ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" ], "proof_of_knowledge": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", - "extra": 1, - "ciphersuite": "FROST(secp256k1, SHA-256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } @@ -463,8 +588,11 @@ fn check_round2_package_serialization() { assert!(round2_package == decoded_round2_package); let json = r#"{ - "signing_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, + "signing_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81" }"#; let decoded_round2_package: round2::Package = serde_json::from_str(json).unwrap(); assert!(round2_package == decoded_round2_package); @@ -474,22 +602,31 @@ fn check_round2_package_serialization() { // Invalid field let invalid_json = r#"{ - "foo": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", - "ciphersuite": "FROST(secp256k1, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, + "foo": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "ciphersuite": "FROST(secp256k1, SHA-256)" + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + } }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Extra field let invalid_json = r#"{ + "header": { + "version": 0, + "ciphersuite": "FROST-secp256k1-SHA256-v1" + }, "signing_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", - "extra": 1, - "ciphersuite": "FROST(secp256k1, SHA-256)" + "extra": 1 }"#; assert!(serde_json::from_str::(invalid_json).is_err()); } diff --git a/frost-secp256k1/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap b/frost-secp256k1/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap index 41fcac1..0e66805 100644 --- a/frost-secp256k1/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap +++ b/frost-secp256k1/tests/snapshots/serialization_tests__check_key_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-secp256k1/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b810279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802f49d8cce +00eed6b1b1000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b810279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802 diff --git a/frost-secp256k1/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap b/frost-secp256k1/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap index d40a685..227aa8c 100644 --- a/frost-secp256k1/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap +++ b/frost-secp256k1/tests/snapshots/serialization_tests__check_public_key_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-secp256k1/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -01000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798f49d8cce +00eed6b1b101000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 diff --git a/frost-secp256k1/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap b/frost-secp256k1/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap index b17b34f..1e22915 100644 --- a/frost-secp256k1/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap +++ b/frost-secp256k1/tests/snapshots/serialization_tests__check_round1_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-secp256k1/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798410279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81f49d8cce +00eed6b1b1010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798410279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81 diff --git a/frost-secp256k1/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap b/frost-secp256k1/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap index 3d368a8..592a716 100644 --- a/frost-secp256k1/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap +++ b/frost-secp256k1/tests/snapshots/serialization_tests__check_round2_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-secp256k1/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81f49d8cce +00eed6b1b1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81 diff --git a/frost-secp256k1/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap b/frost-secp256k1/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap index fd4d21c..2e0b0a0 100644 --- a/frost-secp256k1/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap +++ b/frost-secp256k1/tests/snapshots/serialization_tests__check_secret_share_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-secp256k1/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798f49d8cce +00eed6b1b1000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 diff --git a/frost-secp256k1/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap b/frost-secp256k1/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap index c2211e1..f4f2696 100644 --- a/frost-secp256k1/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap +++ b/frost-secp256k1/tests/snapshots/serialization_tests__check_signing_commitments_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-secp256k1/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5f49d8cce +00eed6b1b10279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5 diff --git a/frost-secp256k1/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap b/frost-secp256k1/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap index 75efedd..a4c3b17 100644 --- a/frost-secp256k1/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap +++ b/frost-secp256k1/tests/snapshots/serialization_tests__check_signing_package_postcard_serialization.snap @@ -2,4 +2,4 @@ source: frost-secp256k1/tests/serialization_tests.rs expression: "hex::encode(&bytes)" --- -01000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5f49d8cce0b68656c6c6f20776f726c64f49d8cce +00eed6b1b101000000000000000000000000000000000000000000000000000000000000002a00eed6b1b10279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee50b68656c6c6f20776f726c64 diff --git a/gencode/src/main.rs b/gencode/src/main.rs index d30caf1..2a55dc4 100644 --- a/gencode/src/main.rs +++ b/gencode/src/main.rs @@ -211,6 +211,7 @@ fn main() -> ExitCode { "Ristretto group", "Ristretto", "FROST(ristretto255, SHA-512)", + "FROST-RISTRETTO255-SHA512-v1", "ristretto255_sha512", "ristretto255", "", @@ -244,6 +245,7 @@ fn main() -> ExitCode { "P-256 curve", "P256", "FROST(P-256, SHA-256)", + "FROST-P256-SHA256-v1", "p256_sha256", "p256", "

", @@ -256,6 +258,7 @@ fn main() -> ExitCode { "Ed25519 curve", "Ed25519", "FROST(Ed25519, SHA-512)", + "FROST-ED25519-SHA512-v1", "ed25519_sha512", "ed25519", "", @@ -268,6 +271,7 @@ fn main() -> ExitCode { "Ed448 curve", "Ed448", "FROST(Ed448, SHAKE256)", + "FROST-ED448-SHAKE256-v1", "ed448_shake256", "ed448", "", @@ -280,6 +284,7 @@ fn main() -> ExitCode { "secp256k1 curve", "Secp256K1", "FROST(secp256k1, SHA-256)", + "FROST-secp256k1-SHA256-v1", "secp256k1_sha256", "secp256k1", "",