add version field to serialization at the beginning; move ciphersuite after it (#540)

* add version field into a Header field along with the ciphersuite ID

* Change Ciphersuite ID to be the contextString from the spec

* Apply suggestions from code review

Co-authored-by: natalie <n.l.eskinazi@gmail.com>

---------

Co-authored-by: natalie <n.l.eskinazi@gmail.com>
This commit is contained in:
Conrado Gouvea 2023-09-20 12:40:01 -03:00 committed by GitHub
parent eee505a49e
commit 4ba88c0210
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
55 changed files with 1281 additions and 577 deletions

View File

@ -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

View File

@ -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

View File

@ -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<C: Ciphersuite>(
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
pub struct SigningPackage<C: Ciphersuite> {
/// Serialization header
#[getter(skip)]
pub(crate) header: Header<C>,
/// The set of commitments participants published in the first round of the
/// protocol.
signing_commitments: BTreeMap<Identifier<C>, round1::SigningCommitments<C>>,
@ -229,17 +232,6 @@ pub struct SigningPackage<C: Ciphersuite> {
)
)]
message: Vec<u8>,
/// 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<C> SigningPackage<C>
@ -254,9 +246,9 @@ where
message: &[u8],
) -> SigningPackage<C> {
SigningPackage {
header: Header::default(),
signing_commitments,
message: message.to_vec(),
ciphersuite: (),
}
}

View File

@ -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<C: Ciphersuite> {
/// Serialization header
#[getter(skip)]
pub(crate) header: Header<C>,
/// The participant identifier of this [`SecretShare`].
#[zeroize(skip)]
pub(crate) identifier: Identifier<C>,
@ -360,17 +363,6 @@ pub struct SecretShare<C: Ciphersuite> {
#[zeroize(skip)]
/// The commitments to be distributed among signers.
pub(crate) commitment: VerifiableSecretSharingCommitment<C>,
/// 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<C> SecretShare<C>
@ -384,10 +376,10 @@ where
commitment: VerifiableSecretSharingCommitment<C>,
) -> Self {
SecretShare {
header: Header::default(),
identifier,
signing_share,
commitment,
ciphersuite: (),
}
}
@ -520,9 +512,9 @@ pub fn split<C: Ciphersuite, R: RngCore + CryptoRng>(
Ok((
secret_shares_by_id,
PublicKeyPackage {
header: Header::default(),
verifying_shares,
verifying_key,
ciphersuite: (),
},
))
}
@ -577,6 +569,9 @@ fn evaluate_vss<C: Ciphersuite>(
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
pub struct KeyPackage<C: Ciphersuite> {
/// Serialization header
#[getter(skip)]
pub(crate) header: Header<C>,
/// Denotes the participant identifier each secret share key package is owned by.
#[zeroize(skip)]
pub(crate) identifier: Identifier<C>,
@ -589,17 +584,6 @@ pub struct KeyPackage<C: Ciphersuite> {
#[zeroize(skip)]
pub(crate) verifying_key: VerifyingKey<C>,
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<C> KeyPackage<C>
@ -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<C: Ciphersuite> {
/// Serialization header
#[getter(skip)]
pub(crate) header: Header<C>,
/// The verifying shares for all participants. Used to validate signature
/// shares they generate.
pub(crate) verifying_shares: HashMap<Identifier<C>, VerifyingShare<C>>,
/// The joint public key for the entire group.
pub(crate) verifying_key: VerifyingKey<C>,
/// 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<C> PublicKeyPackage<C>
@ -705,9 +681,9 @@ where
verifying_key: VerifyingKey<C>,
) -> Self {
Self {
header: Header::default(),
verifying_shares,
verifying_key,
ciphersuite: (),
}
}
}
@ -821,10 +797,10 @@ pub(crate) fn generate_secret_shares<C: Ciphersuite>(
let value = evaluate_polynomial(*id, &coefficients);
secret_shares.push(SecretShare {
header: Header::default(),
identifier: *id,
signing_share: SigningShare(value),
commitment: commitment.clone(),
ciphersuite: (),
});
}

View File

@ -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<C: Ciphersuite> {
/// Serialization header
#[getter(skip)]
pub(crate) header: Header<C>,
/// The public commitment from the participant (C_i)
pub(crate) commitment: VerifiableSecretSharingCommitment<C>,
/// The proof of knowledge of the temporary secret (σ_i = (R_i, μ_i))
pub(crate) proof_of_knowledge: Signature<C>,
/// 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<C> Package<C>
@ -87,9 +79,9 @@ pub mod round1 {
proof_of_knowledge: Signature<C>,
) -> 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<C: Ciphersuite> {
/// Serialization header
#[getter(skip)]
pub(crate) header: Header<C>,
/// The secret share being sent.
pub(crate) signing_share: SigningShare<C>,
/// 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<C> Package<C>
@ -200,8 +184,8 @@ pub mod round2 {
/// Create a new [`Package`] instance.
pub fn new(signing_share: SigningShare<C>) -> Self {
Self {
header: Header::default(),
signing_share,
ciphersuite: (),
}
}
}
@ -319,9 +303,9 @@ pub fn part1<C: Ciphersuite, R: RngCore + CryptoRng>(
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<C: Ciphersuite>(
round2_packages.insert(
ell,
round2::Package {
header: Header::default(),
signing_share: SigningShare(value),
ciphersuite: (),
},
);
}
@ -515,10 +499,10 @@ pub fn part3<C: Ciphersuite>(
// 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<C: Ciphersuite>(
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))

View File

@ -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<C: Ciphersuite>(
}
SecretShare {
header: Header::default(),
identifier,
signing_share: SigningShare(share),
commitment: commitment.clone(),
ciphersuite: (),
}
}

View File

@ -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<C: Ciphersuite> {
/// Serialization header
#[getter(skip)]
pub(crate) header: Header<C>,
/// Commitment to the hiding [`Nonce`].
pub(crate) hiding: NonceCommitment<C>,
/// Commitment to the binding [`Nonce`].
pub(crate) binding: NonceCommitment<C>,
/// 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<C> SigningCommitments<C>
@ -292,9 +286,9 @@ where
/// Create new SigningCommitments
pub fn new(hiding: NonceCommitment<C>, binding: NonceCommitment<C>) -> Self {
Self {
header: Header::default(),
hiding,
binding,
ciphersuite: (),
}
}

View File

@ -106,17 +106,9 @@ where
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(deny_unknown_fields))]
struct SignatureShareSerialization<C: Ciphersuite> {
/// Serialization header
pub(crate) header: Header<C>,
share: SignatureShareHelper<C>,
/// 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<C>) -> Self {
Self {
header: Header::default(),
share: SignatureShareHelper(value.share),
ciphersuite: (),
}
}
}

View File

@ -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<C: Ciphersuite, R: RngCore + CryptoRng>(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<C: Ciphersuite> {
/// 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<C>,
}
impl<C> Default for Header<C>
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, C>(_: &(), s: S) -> Result<S::Ok, S::Error>
@ -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<u8, D::Error>
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,

View File

@ -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;

View File

@ -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::<SigningCommitments>(invalid_json).is_err());
// Invalid identifier
let invalid_json = r#"{
"hiding": "5866666666666666666666666666666666666666666666666666666666666666",
"binding": "c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022"
}"#;
assert!(serde_json::from_str::<SigningCommitments>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SignatureShare>(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::<SignatureShare>(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::<SignatureShare>(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::<SecretShare>(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::<SecretShare>(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::<SecretShare>(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::<SecretShare>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<round1::Package>(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::<round1::Package>(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::<round1::Package>(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::<round2::Package>(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::<round2::Package>(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::<round2::Package>(invalid_json).is_err());
}

View File

@ -2,4 +2,4 @@
source: frost-ed25519/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a5866666666666666666666666666666666666666666666666666666666666666586666666666666666666666666666666666666666666666666666666666666602ea38536e
00b169f0da2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a5866666666666666666666666666666666666666666666666666666666666666586666666666666666666666666666666666666666666666666666666666666602

View File

@ -2,4 +2,4 @@
source: frost-ed25519/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
012a0000000000000000000000000000000000000000000000000000000000000058666666666666666666666666666666666666666666666666666666666666665866666666666666666666666666666666666666666666666666666666666666ea38536e
00b169f0da012a0000000000000000000000000000000000000000000000000000000000000058666666666666666666666666666666666666666666666666666666666666665866666666666666666666666666666666666666666666666666666666666666

View File

@ -2,4 +2,4 @@
source: frost-ed25519/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
015866666666666666666666666666666666666666666666666666666666666666405866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aea38536e
00b169f0da015866666666666666666666666666666666666666666666666666666666666666405866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a

View File

@ -2,4 +2,4 @@
source: frost-ed25519/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aea38536e
00b169f0da498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a

View File

@ -2,4 +2,4 @@
source: frost-ed25519/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a015866666666666666666666666666666666666666666666666666666666666666ea38536e
00b169f0da2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a015866666666666666666666666666666666666666666666666666666666666666

View File

@ -2,4 +2,4 @@
source: frost-ed25519/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
5866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022ea38536e
00b169f0da5866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022

View File

@ -2,4 +2,4 @@
source: frost-ed25519/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
012a000000000000000000000000000000000000000000000000000000000000005866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022ea38536e0b68656c6c6f20776f726c64ea38536e
00b169f0da012a0000000000000000000000000000000000000000000000000000000000000000b169f0da5866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd60220b68656c6c6f20776f726c64

View File

@ -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;

View File

@ -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::<SigningCommitments>(invalid_json).is_err());
// Invalid identifier
let invalid_json = r#"{
"hiding": "14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900",
"binding": "ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80"
}"#;
assert!(serde_json::from_str::<SigningCommitments>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SignatureShare>(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::<SignatureShare>(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::<SignatureShare>(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::<SecretShare>(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::<SecretShare>(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::<SecretShare>(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::<SecretShare>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<round1::Package>(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::<round1::Package>(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::<round1::Package>(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::<round2::Package>(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::<round2::Package>(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::<round2::Package>(invalid_json).is_err());
}

View File

@ -2,4 +2,4 @@
source: frost-ed448/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a0014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690002854361d9
005a064cfd2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a0014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690002

View File

@ -2,4 +2,4 @@
source: frost-ed448/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900854361d9
005a064cfd012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900

View File

@ -2,4 +2,4 @@
source: frost-ed448/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
0114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69007214fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00854361d9
005a064cfd0114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69007214fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00

View File

@ -2,4 +2,4 @@
source: frost-ed448/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00854361d9
005a064cfd4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00

View File

@ -2,4 +2,4 @@
source: frost-ed448/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a000114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900854361d9
005a064cfd2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a000114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900

View File

@ -2,4 +2,4 @@
source: frost-ed448/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80854361d9
005a064cfd14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80

View File

@ -2,4 +2,4 @@
source: frost-ed448/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80854361d90b68656c6c6f20776f726c64854361d9
005a064cfd012a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a064cfd14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae800b68656c6c6f20776f726c64

View File

@ -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;

View File

@ -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::<SigningCommitments>(invalid_json).is_err());
// Invalid identifier
let invalid_json = r#"{
"hiding": "036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
"binding": "037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978"
}"#;
assert!(serde_json::from_str::<SigningCommitments>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SignatureShare>(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::<SignatureShare>(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::<SignatureShare>(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::<SecretShare>(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::<SecretShare>(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::<SecretShare>(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::<SecretShare>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<round1::Package>(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::<round1::Package>(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::<round1::Package>(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::<round2::Package>(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::<round2::Package>(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::<round2::Package>(invalid_json).is_err());
}

View File

@ -2,4 +2,4 @@
source: frost-p256/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296029bf7b2e7
00a132f0c9000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602

View File

@ -2,4 +2,4 @@
source: frost-p256/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
01000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2969bf7b2e7
00a132f0c901000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296

View File

@ -2,4 +2,4 @@
source: frost-p256/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
01036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29641036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e19bf7b2e7
00a132f0c901036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29641036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1

View File

@ -2,4 +2,4 @@
source: frost-p256/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e19bf7b2e7
00a132f0c9aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1

View File

@ -2,4 +2,4 @@
source: frost-p256/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e101036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2969bf7b2e7
00a132f0c9000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e101036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296

View File

@ -2,4 +2,4 @@
source: frost-p256/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699789bf7b2e7
00a132f0c9036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978

View File

@ -2,4 +2,4 @@
source: frost-p256/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
01000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699789bf7b2e70b68656c6c6f20776f726c649bf7b2e7
00a132f0c901000000000000000000000000000000000000000000000000000000000000002a00a132f0c9036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780b68656c6c6f20776f726c64

View File

@ -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;

View File

@ -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::<SigningCommitments>(invalid_json).is_err());
// Invalid identifier
let invalid_json = r#"{
"hiding": "e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76",
"binding": "6a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919"
}"#;
assert!(serde_json::from_str::<SigningCommitments>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SignatureShare>(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::<SignatureShare>(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::<SignatureShare>(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::<SecretShare>(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::<SecretShare>(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::<SecretShare>(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::<SecretShare>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<round1::Package>(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::<round1::Package>(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::<round1::Package>(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::<round2::Package>(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::<round2::Package>(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::<round2::Package>(invalid_json).is_err());
}

View File

@ -2,4 +2,4 @@
source: frost-ristretto255/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7602e6811b69
00d76ecff52a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7602

View File

@ -2,4 +2,4 @@
source: frost-ristretto255/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e6811b69
00d76ecff5012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76

View File

@ -2,4 +2,4 @@
source: frost-ristretto255/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7640e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae6811b69
00d76ecff501e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7640e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a

View File

@ -2,4 +2,4 @@
source: frost-ristretto255/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae6811b69
00d76ecff5498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a

View File

@ -2,4 +2,4 @@
source: frost-ristretto255/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e6811b69
00d76ecff52a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76

View File

@ -2,4 +2,4 @@
source: frost-ristretto255/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919e6811b69
00d76ecff5e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919

View File

@ -2,4 +2,4 @@
source: frost-ristretto255/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919e6811b690b68656c6c6f20776f726c64e6811b69
00d76ecff5012a0000000000000000000000000000000000000000000000000000000000000000d76ecff5e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b9190b68656c6c6f20776f726c64

View File

@ -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;

View File

@ -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::<SigningCommitments>(invalid_json).is_err());
// Invalid identifier
let invalid_json = r#"{
"hiding": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
"binding": "02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5"
}"#;
assert!(serde_json::from_str::<SigningCommitments>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SigningPackage>(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::<SignatureShare>(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::<SignatureShare>(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::<SignatureShare>(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::<SecretShare>(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::<SecretShare>(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::<SecretShare>(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::<SecretShare>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<KeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<PublicKeyPackage>(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::<round1::Package>(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::<round1::Package>(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::<round1::Package>(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::<round2::Package>(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::<round2::Package>(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::<round2::Package>(invalid_json).is_err());
}

View File

@ -2,4 +2,4 @@
source: frost-secp256k1/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b810279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802f49d8cce
00eed6b1b1000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b810279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802

View File

@ -2,4 +2,4 @@
source: frost-secp256k1/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
01000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798f49d8cce
00eed6b1b101000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798

View File

@ -2,4 +2,4 @@
source: frost-secp256k1/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798410279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81f49d8cce
00eed6b1b1010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798410279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81

View File

@ -2,4 +2,4 @@
source: frost-secp256k1/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81f49d8cce
00eed6b1b1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81

View File

@ -2,4 +2,4 @@
source: frost-secp256k1/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798f49d8cce
00eed6b1b1000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798

View File

@ -2,4 +2,4 @@
source: frost-secp256k1/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5f49d8cce
00eed6b1b10279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5

View File

@ -2,4 +2,4 @@
source: frost-secp256k1/tests/serialization_tests.rs
expression: "hex::encode(&bytes)"
---
01000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5f49d8cce0b68656c6c6f20776f726c64f49d8cce
00eed6b1b101000000000000000000000000000000000000000000000000000000000000002a00eed6b1b10279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee50b68656c6c6f20776f726c64

View File

@ -211,6 +211,7 @@ fn main() -> ExitCode {
"Ristretto group",
"Ristretto",
"FROST(ristretto255, SHA-512)",
"FROST-RISTRETTO255-SHA512-v1",
"ristretto255_sha512",
"ristretto255",
"<R>",
@ -244,6 +245,7 @@ fn main() -> ExitCode {
"P-256 curve",
"P256",
"FROST(P-256, SHA-256)",
"FROST-P256-SHA256-v1",
"p256_sha256",
"p256",
"<P>",
@ -256,6 +258,7 @@ fn main() -> ExitCode {
"Ed25519 curve",
"Ed25519",
"FROST(Ed25519, SHA-512)",
"FROST-ED25519-SHA512-v1",
"ed25519_sha512",
"ed25519",
"<E>",
@ -268,6 +271,7 @@ fn main() -> ExitCode {
"Ed448 curve",
"Ed448",
"FROST(Ed448, SHAKE256)",
"FROST-ED448-SHAKE256-v1",
"ed448_shake256",
"ed448",
"<E>",
@ -280,6 +284,7 @@ fn main() -> ExitCode {
"secp256k1 curve",
"Secp256K1",
"FROST(secp256k1, SHA-256)",
"FROST-secp256k1-SHA256-v1",
"secp256k1_sha256",
"secp256k1",
"<S>",