diff --git a/frost-core/src/frost.rs b/frost-core/src/frost.rs index fe9d8a2..52ab446 100644 --- a/frost-core/src/frost.rs +++ b/frost-core/src/frost.rs @@ -13,6 +13,7 @@ use std::{ collections::{BTreeMap, BTreeSet, HashMap}, fmt::{self, Debug}, + marker::PhantomData, }; use derive_getters::Getters; @@ -203,11 +204,40 @@ fn derive_interpolating_value( ) } +/// Helper that encodes the ciphersuite ID in structs. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +struct CiphersuiteHelper { + /// 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_attr(feature = "serde", serde(skip))] + phantom: PhantomData, +} + +impl Default for CiphersuiteHelper +where + C: Ciphersuite, +{ + fn default() -> Self { + Self { + ciphersuite: Default::default(), + phantom: Default::default(), + } + } +} + /// Generated by the coordinator of the signing operation and distributed to /// each signing party #[derive(Clone, Debug, PartialEq, Eq, Getters)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct SigningPackage { /// The set of commitments participants published in the first round of the /// protocol. @@ -225,16 +255,9 @@ 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: (), + #[cfg_attr(feature = "serde", serde(flatten))] + ciphersuite: CiphersuiteHelper, } impl SigningPackage @@ -251,7 +274,7 @@ where SigningPackage { signing_commitments, message: message.to_vec(), - ciphersuite: (), + ciphersuite: Default::default(), } } diff --git a/frost-core/src/frost/keys.rs b/frost-core/src/frost/keys.rs index 820b959..dbe0e65 100644 --- a/frost-core/src/frost/keys.rs +++ b/frost-core/src/frost/keys.rs @@ -23,7 +23,7 @@ use crate::{ #[cfg(feature = "serde")] use crate::{ElementSerialization, ScalarSerialization}; -use super::compute_lagrange_coefficient; +use super::{compute_lagrange_coefficient, CiphersuiteHelper}; pub mod dkg; pub mod repairable; @@ -349,7 +349,6 @@ where /// .into(), which under the hood also performs validation. #[derive(Clone, Debug, Zeroize, PartialEq, Eq, Getters)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct SecretShare { /// The participant identifier of this [`SecretShare`]. #[zeroize(skip)] @@ -360,16 +359,10 @@ pub struct SecretShare { /// 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: (), + #[zeroize(skip)] + #[cfg_attr(feature = "serde", serde(flatten))] + ciphersuite: CiphersuiteHelper, } impl SecretShare @@ -386,7 +379,7 @@ where identifier, value, commitment, - ciphersuite: (), + ciphersuite: Default::default(), } } @@ -503,7 +496,7 @@ pub fn split( PublicKeyPackage { signer_pubkeys, group_public, - ciphersuite: (), + ciphersuite: Default::default(), }, )) } @@ -556,7 +549,6 @@ fn evaluate_vss( /// [`KeyPackage`]s, which they store to later use during signing. #[derive(Clone, Debug, PartialEq, Eq, Getters, Zeroize)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct KeyPackage { /// Denotes the participant identifier each secret share key package is owned by. #[zeroize(skip)] @@ -570,16 +562,10 @@ pub struct KeyPackage { #[zeroize(skip)] pub(crate) group_public: 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: (), + #[zeroize(skip)] + #[cfg_attr(feature = "serde", serde(flatten))] + ciphersuite: CiphersuiteHelper, } impl KeyPackage @@ -598,7 +584,7 @@ where secret_share, public, group_public, - ciphersuite: (), + ciphersuite: Default::default(), } } } @@ -625,7 +611,7 @@ where secret_share: secret_share.value, public, group_public, - ciphersuite: (), + ciphersuite: Default::default(), }) } } @@ -636,7 +622,6 @@ where /// Used for verification purposes before publishing a signature. #[derive(Clone, Debug, PartialEq, Eq, Getters)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct PublicKeyPackage { /// The verifying shares for all participants. Used to validate signature /// shares they generate. @@ -644,16 +629,9 @@ pub struct PublicKeyPackage { /// The joint public key for the entire group. pub(crate) group_public: 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: (), + #[cfg_attr(feature = "serde", serde(flatten))] + ciphersuite: CiphersuiteHelper, } impl PublicKeyPackage @@ -668,7 +646,7 @@ where Self { signer_pubkeys, group_public, - ciphersuite: (), + ciphersuite: Default::default(), } } } @@ -769,7 +747,7 @@ pub(crate) fn generate_secret_shares( identifier: *id, value: SigningShare(value), commitment: commitment.clone(), - ciphersuite: (), + ciphersuite: Default::default(), }); } diff --git a/frost-core/src/frost/keys/dkg.rs b/frost-core/src/frost/keys/dkg.rs index c0250e9..74b51f9 100644 --- a/frost-core/src/frost/keys/dkg.rs +++ b/frost-core/src/frost/keys/dkg.rs @@ -50,29 +50,23 @@ pub mod round1 { use derive_getters::Getters; use zeroize::Zeroize; + use crate::frost::CiphersuiteHelper; + use super::*; /// The package that must be broadcast by each participant to all other participants /// between the first and second parts of the DKG protocol (round 1). #[derive(Clone, Debug, PartialEq, Eq, Getters)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] - #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct Package { /// 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: (), + #[cfg_attr(feature = "serde", serde(flatten))] + pub(super) ciphersuite: CiphersuiteHelper, } impl Package @@ -87,7 +81,7 @@ pub mod round1 { Self { commitment, proof_of_knowledge, - ciphersuite: (), + ciphersuite: Default::default(), } } } @@ -142,6 +136,8 @@ pub mod round2 { use derive_getters::Getters; use zeroize::Zeroize; + use crate::frost::CiphersuiteHelper; + use super::*; /// A package that must be sent by each participant to some other participants @@ -153,21 +149,13 @@ pub mod round2 { /// The package must be sent on an *confidential* and *authenticated* channel. #[derive(Clone, Debug, PartialEq, Eq, Getters)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] - #[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct Package { /// The secret share being sent. pub(crate) secret_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: (), + #[cfg_attr(feature = "serde", serde(flatten))] + pub(super) ciphersuite: CiphersuiteHelper, } impl Package @@ -178,7 +166,7 @@ pub mod round2 { pub fn new(secret_share: SigningShare) -> Self { Self { secret_share, - ciphersuite: (), + ciphersuite: Default::default(), } } } @@ -278,7 +266,7 @@ pub fn part1( let package = round1::Package { commitment, proof_of_knowledge: Signature { R: R_i, z: mu_i }, - ciphersuite: (), + ciphersuite: Default::default(), }; Ok((secret_package, package)) @@ -358,7 +346,7 @@ pub fn part2( ell, round2::Package { secret_share: SigningShare(value), - ciphersuite: (), + ciphersuite: Default::default(), }, ); } @@ -474,7 +462,7 @@ pub fn part3( identifier: round2_secret_package.identifier, value: f_ell_i, commitment: commitment.clone(), - ciphersuite: (), + ciphersuite: Default::default(), }; // Verify the share. We don't need the result. @@ -518,12 +506,12 @@ pub fn part3( secret_share: signing_share, public: verifying_key, group_public, - ciphersuite: (), + ciphersuite: Default::default(), }; let public_key_package = PublicKeyPackage { signer_pubkeys: all_verifying_keys, group_public, - ciphersuite: (), + ciphersuite: Default::default(), }; 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 50eeabb..cdc8bb8 100644 --- a/frost-core/src/frost/keys/repairable.rs +++ b/frost-core/src/frost/keys/repairable.rs @@ -124,6 +124,6 @@ pub fn repair_share_step_3( identifier, value: SigningShare(share), commitment: commitment.clone(), - ciphersuite: (), + ciphersuite: Default::default(), } } diff --git a/frost-core/src/frost/round1.rs b/frost-core/src/frost/round1.rs index 86c336d..024e85d 100644 --- a/frost-core/src/frost/round1.rs +++ b/frost-core/src/frost/round1.rs @@ -17,7 +17,7 @@ use crate::{frost, Ciphersuite, Element, Error, Field, Group, Scalar}; #[cfg(feature = "serde")] use crate::ElementSerialization; -use super::{keys::SigningShare, Identifier}; +use super::{keys::SigningShare, CiphersuiteHelper, Identifier}; /// A scalar that is a signing nonce. #[derive(Clone, PartialEq, Eq)] @@ -246,23 +246,15 @@ where /// SigningCommitment can be used for exactly *one* signature. #[derive(Copy, Clone, Debug, Eq, PartialEq, Getters)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[cfg_attr(feature = "serde", serde(deny_unknown_fields))] pub struct SigningCommitments { /// 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: (), + #[cfg_attr(feature = "serde", serde(flatten))] + ciphersuite: CiphersuiteHelper, } impl SigningCommitments @@ -274,7 +266,7 @@ where Self { hiding, binding, - ciphersuite: (), + ciphersuite: Default::default(), } } @@ -298,7 +290,7 @@ where Self { hiding: nonces.hiding.clone().into(), binding: nonces.binding.clone().into(), - ciphersuite: (), + ciphersuite: Default::default(), } } } diff --git a/frost-core/src/frost/round2.rs b/frost-core/src/frost/round2.rs index 2e38f30..eae3c0f 100644 --- a/frost-core/src/frost/round2.rs +++ b/frost-core/src/frost/round2.rs @@ -50,7 +50,6 @@ where /// shares into the joint signature. #[derive(Clone, Copy, Eq, PartialEq, Getters)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[cfg_attr(feature = "serde", serde(deny_unknown_fields))] #[cfg_attr(feature = "serde", serde(try_from = "SignatureShareSerialization"))] #[cfg_attr(feature = "serde", serde(into = "SignatureShareSerialization"))] pub struct SignatureShare { @@ -105,19 +104,11 @@ where #[cfg(feature = "serde")] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[cfg_attr(feature = "serde", serde(deny_unknown_fields))] struct SignatureShareSerialization { 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_attr(feature = "serde", serde(flatten))] + ciphersuite: CiphersuiteHelper, } #[cfg(feature = "serde")] @@ -140,7 +131,7 @@ where fn from(value: SignatureShare) -> Self { Self { share: SignatureShareHelper(value.share), - ciphersuite: (), + ciphersuite: Default::default(), } } } diff --git a/frost-ed25519/tests/serde_tests.rs b/frost-ed25519/tests/serde_tests.rs index f29f1ad..e70b435 100644 --- a/frost-ed25519/tests/serde_tests.rs +++ b/frost-ed25519/tests/serde_tests.rs @@ -47,6 +47,7 @@ fn check_signing_commitments_serialization() { let invalid_json = r#"{ "hiding": "5866666666666666666666666666666666666666666666666666666666666666", "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" + "ciphersuite": "FROST(Ed25519, SHA-512)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); @@ -54,23 +55,25 @@ fn check_signing_commitments_serialization() { let invalid_json = r#"{ "foo": "5866666666666666666666666666666666666666666666666666666666666666", "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" + "ciphersuite": "FROST(Ed25519, SHA-512)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "foo": "0000000000000000000000000000000000000000000000000000000000000000", "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022" + "ciphersuite": "FROST(Ed25519, SHA-512)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "hiding": "5866666666666666666666666666666666666666666666666666666666666666", "binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022", + "ciphersuite": "FROST(Ed25519, SHA-512)", "extra": 1 }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -141,7 +144,7 @@ fn check_signing_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "signing_commitments": { "2a00000000000000000000000000000000000000000000000000000000000000": { @@ -155,7 +158,7 @@ fn check_signing_package_serialization() { "ciphersuite": "FROST(Ed25519, SHA-512)" } "#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -191,13 +194,13 @@ fn check_signature_share_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "extra": 1, "ciphersuite": "FROST(Ed25519, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -256,7 +259,7 @@ fn check_secret_share_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "value": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", @@ -266,7 +269,7 @@ fn check_secret_share_serialization() { "extra": 1, "ciphersuite": "FROST(Ed25519, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -321,7 +324,7 @@ fn check_key_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "secret_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", @@ -330,7 +333,7 @@ fn check_key_package_serialization() { "extra_field": 1, "ciphersuite": "FROST(Ed25519, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -385,7 +388,7 @@ fn check_public_key_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "signer_pubkeys": { "2a00000000000000000000000000000000000000000000000000000000000000": "5866666666666666666666666666666666666666666666666666666666666666" @@ -394,7 +397,7 @@ fn check_public_key_package_serialization() { "extra": 1, "ciphersuite": "FROST(Ed25519, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -439,7 +442,7 @@ fn check_round1_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "commitment": [ "5866666666666666666666666666666666666666666666666666666666666666" @@ -448,7 +451,7 @@ fn check_round1_package_serialization() { "extra": 1, "ciphersuite": "FROST(Ed25519, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -484,11 +487,11 @@ fn check_round2_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "secret_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "extra": 1, "ciphersuite": "FROST(Ed25519, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } diff --git a/frost-ed448/tests/serde_tests.rs b/frost-ed448/tests/serde_tests.rs index 1ba91f7..69da690 100644 --- a/frost-ed448/tests/serde_tests.rs +++ b/frost-ed448/tests/serde_tests.rs @@ -47,6 +47,7 @@ fn check_signing_commitments_serialization() { let invalid_json = r#"{ "hiding": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" + "ciphersuite": "FROST(Ed448, SHAKE256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); @@ -54,23 +55,25 @@ fn check_signing_commitments_serialization() { let invalid_json = r#"{ "foo": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" + "ciphersuite": "FROST(Ed448, SHAKE256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "foo": "0000000000000000000000000000000000000000000000000000000000000000", "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80" + "ciphersuite": "FROST(Ed448, SHAKE256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "hiding": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900", "binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80", + "ciphersuite": "FROST(Ed448, SHAKE256)", "extra": 1 }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -141,7 +144,7 @@ fn check_signing_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "signing_commitments": { "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000": { @@ -155,7 +158,7 @@ fn check_signing_package_serialization() { "ciphersuite": "FROST(Ed448, SHAKE256)" } "#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -191,13 +194,13 @@ fn check_signature_share_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", "extra": 1, "ciphersuite": "FROST(Ed448, SHAKE256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -256,7 +259,7 @@ fn check_secret_share_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "value": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", @@ -266,7 +269,7 @@ fn check_secret_share_serialization() { "extra": 1, "ciphersuite": "FROST(Ed448, SHAKE256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -321,7 +324,7 @@ fn check_key_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "identifier": "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "secret_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", @@ -330,7 +333,7 @@ fn check_key_package_serialization() { "extra_field": 1, "ciphersuite": "FROST(Ed448, SHAKE256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -385,7 +388,7 @@ fn check_public_key_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "signer_pubkeys": { "2a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" @@ -394,7 +397,7 @@ fn check_public_key_package_serialization() { "extra": 1, "ciphersuite": "FROST(Ed448, SHAKE256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -439,7 +442,7 @@ fn check_round1_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "commitment": [ "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900" @@ -448,7 +451,7 @@ fn check_round1_package_serialization() { "extra": 1, "ciphersuite": "FROST(Ed448, SHAKE256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -484,11 +487,11 @@ fn check_round2_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "secret_share": "4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00", "extra": 1, "ciphersuite": "FROST(Ed448, SHAKE256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } diff --git a/frost-p256/tests/serde_tests.rs b/frost-p256/tests/serde_tests.rs index 5a791cf..ddae34e 100644 --- a/frost-p256/tests/serde_tests.rs +++ b/frost-p256/tests/serde_tests.rs @@ -47,6 +47,7 @@ fn check_signing_commitments_serialization() { let invalid_json = r#"{ "hiding": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" + "ciphersuite": "FROST(P-256, SHA-256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); @@ -54,23 +55,25 @@ fn check_signing_commitments_serialization() { let invalid_json = r#"{ "foo": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" + "ciphersuite": "FROST(P-256, SHA-256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "foo": "0000000000000000000000000000000000000000000000000000000000000000", "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978" + "ciphersuite": "FROST(P-256, SHA-256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "hiding": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", "binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978", + "ciphersuite": "FROST(P-256, SHA-256)", "extra": 1 }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -141,7 +144,7 @@ fn check_signing_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "signing_commitments": { "000000000000000000000000000000000000000000000000000000000000002a": { @@ -155,7 +158,7 @@ fn check_signing_package_serialization() { "ciphersuite": "FROST(P-256, SHA-256)" } "#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -191,13 +194,13 @@ fn check_signature_share_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", "extra": 1, "ciphersuite": "FROST(P-256, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -256,7 +259,7 @@ fn check_secret_share_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "value": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", @@ -266,7 +269,7 @@ fn check_secret_share_serialization() { "extra": 1, "ciphersuite": "FROST(P-256, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -321,7 +324,7 @@ fn check_key_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "secret_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", @@ -330,7 +333,7 @@ fn check_key_package_serialization() { "extra_field": 1, "ciphersuite": "FROST(P-256, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -385,7 +388,7 @@ fn check_public_key_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "signer_pubkeys": { "000000000000000000000000000000000000000000000000000000000000002a": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" @@ -394,7 +397,7 @@ fn check_public_key_package_serialization() { "extra": 1, "ciphersuite": "FROST(P-256, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -439,7 +442,7 @@ fn check_round1_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "commitment": [ "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296" @@ -448,7 +451,7 @@ fn check_round1_package_serialization() { "extra": 1, "ciphersuite": "FROST(P-256, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -484,11 +487,11 @@ fn check_round2_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "secret_share": "aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1", "extra": 1, "ciphersuite": "FROST(P-256, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } diff --git a/frost-ristretto255/tests/serde_tests.rs b/frost-ristretto255/tests/serde_tests.rs index d22da94..391b65d 100644 --- a/frost-ristretto255/tests/serde_tests.rs +++ b/frost-ristretto255/tests/serde_tests.rs @@ -47,6 +47,7 @@ fn check_signing_commitments_serialization() { let invalid_json = r#"{ "hiding": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" + "ciphersuite": "FROST(ristretto255, SHA-512)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); @@ -54,23 +55,25 @@ fn check_signing_commitments_serialization() { let invalid_json = r#"{ "foo": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" + "ciphersuite": "FROST(ristretto255, SHA-512)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "foo": "0000000000000000000000000000000000000000000000000000000000000000", "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919" + "ciphersuite": "FROST(ristretto255, SHA-512)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "hiding": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76", "binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919", + "ciphersuite": "FROST(ristretto255, SHA-512)", "extra": 1 }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -141,7 +144,7 @@ fn check_signing_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "signing_commitments": { "2a00000000000000000000000000000000000000000000000000000000000000": { @@ -155,7 +158,7 @@ fn check_signing_package_serialization() { "ciphersuite": "FROST(ristretto255, SHA-512)" } "#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -191,13 +194,13 @@ fn check_signature_share_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "extra": 1, "ciphersuite": "FROST(ristretto255, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -256,7 +259,7 @@ fn check_secret_share_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "value": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", @@ -266,7 +269,7 @@ fn check_secret_share_serialization() { "extra": 1, "ciphersuite": "FROST(ristretto255, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -321,7 +324,7 @@ fn check_key_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "identifier": "2a00000000000000000000000000000000000000000000000000000000000000", "secret_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", @@ -330,7 +333,7 @@ fn check_key_package_serialization() { "extra_field": 1, "ciphersuite": "FROST(ristretto255, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -385,7 +388,7 @@ fn check_public_key_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "signer_pubkeys": { "2a00000000000000000000000000000000000000000000000000000000000000": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" @@ -394,7 +397,7 @@ fn check_public_key_package_serialization() { "extra": 1, "ciphersuite": "FROST(ristretto255, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -439,7 +442,7 @@ fn check_round1_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "commitment": [ "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76" @@ -448,7 +451,7 @@ fn check_round1_package_serialization() { "extra": 1, "ciphersuite": "FROST(ristretto255, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -484,11 +487,11 @@ fn check_round2_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "secret_share": "498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a", "extra": 1, "ciphersuite": "FROST(ristretto255, SHA-512)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } diff --git a/frost-secp256k1/tests/serde_tests.rs b/frost-secp256k1/tests/serde_tests.rs index 7fa8237..7c1166e 100644 --- a/frost-secp256k1/tests/serde_tests.rs +++ b/frost-secp256k1/tests/serde_tests.rs @@ -47,6 +47,7 @@ fn check_signing_commitments_serialization() { let invalid_json = r#"{ "hiding": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" + "ciphersuite": "FROST(secp256k1, SHA-256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); @@ -54,23 +55,25 @@ fn check_signing_commitments_serialization() { let invalid_json = r#"{ "foo": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" + "ciphersuite": "FROST(secp256k1, SHA-256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); // Missing field let invalid_json = r#"{ - "foo": "0000000000000000000000000000000000000000000000000000000000000000", "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5" + "ciphersuite": "FROST(secp256k1, SHA-256)" }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "hiding": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5", + "ciphersuite": "FROST(secp256k1, SHA-256)", "extra": 1 }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -141,7 +144,7 @@ fn check_signing_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "signing_commitments": { "000000000000000000000000000000000000000000000000000000000000002a": { @@ -155,7 +158,7 @@ fn check_signing_package_serialization() { "ciphersuite": "FROST(secp256k1, SHA-256)" } "#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -191,13 +194,13 @@ fn check_signature_share_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", "extra": 1, "ciphersuite": "FROST(secp256k1, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -256,7 +259,7 @@ fn check_secret_share_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", @@ -266,7 +269,7 @@ fn check_secret_share_serialization() { "extra": 1, "ciphersuite": "FROST(secp256k1, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -321,7 +324,7 @@ fn check_key_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "identifier": "000000000000000000000000000000000000000000000000000000000000002a", "secret_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", @@ -330,7 +333,7 @@ fn check_key_package_serialization() { "extra_field": 1, "ciphersuite": "FROST(secp256k1, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -385,7 +388,7 @@ fn check_public_key_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "signer_pubkeys": { "000000000000000000000000000000000000000000000000000000000000002a": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" @@ -394,7 +397,7 @@ fn check_public_key_package_serialization() { "extra": 1, "ciphersuite": "FROST(secp256k1, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -439,7 +442,7 @@ fn check_round1_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "commitment": [ "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" @@ -448,7 +451,7 @@ fn check_round1_package_serialization() { "extra": 1, "ciphersuite": "FROST(secp256k1, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); } #[test] @@ -484,11 +487,11 @@ fn check_round2_package_serialization() { }"#; assert!(serde_json::from_str::(invalid_json).is_err()); - // Extra field + // Extra field is ignored let invalid_json = r#"{ "secret_share": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81", "extra": 1, "ciphersuite": "FROST(secp256k1, SHA-256)" }"#; - assert!(serde_json::from_str::(invalid_json).is_err()); + assert!(serde_json::from_str::(invalid_json).is_ok()); }