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:
parent
eee505a49e
commit
4ba88c0210
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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: (),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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: (),
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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: (),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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: (),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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: (),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed25519/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a5866666666666666666666666666666666666666666666666666666666666666586666666666666666666666666666666666666666666666666666666666666602ea38536e
|
||||
00b169f0da2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a5866666666666666666666666666666666666666666666666666666666666666586666666666666666666666666666666666666666666666666666666666666602
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed25519/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
012a0000000000000000000000000000000000000000000000000000000000000058666666666666666666666666666666666666666666666666666666666666665866666666666666666666666666666666666666666666666666666666666666ea38536e
|
||||
00b169f0da012a0000000000000000000000000000000000000000000000000000000000000058666666666666666666666666666666666666666666666666666666666666665866666666666666666666666666666666666666666666666666666666666666
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed25519/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
015866666666666666666666666666666666666666666666666666666666666666405866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aea38536e
|
||||
00b169f0da015866666666666666666666666666666666666666666666666666666666666666405866666666666666666666666666666666666666666666666666666666666666498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed25519/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0aea38536e
|
||||
00b169f0da498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed25519/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a015866666666666666666666666666666666666666666666666666666666666666ea38536e
|
||||
00b169f0da2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a015866666666666666666666666666666666666666666666666666666666666666
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed25519/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
5866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022ea38536e
|
||||
00b169f0da5866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed25519/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
012a000000000000000000000000000000000000000000000000000000000000005866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd6022ea38536e0b68656c6c6f20776f726c64ea38536e
|
||||
00b169f0da012a0000000000000000000000000000000000000000000000000000000000000000b169f0da5866666666666666666666666666666666666666666666666666666666666666c9a3f86aae465f0e56513864510f3997561fa2c9e85ea21dc2292309f3cd60220b68656c6c6f20776f726c64
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed448/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a0014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690002854361d9
|
||||
005a064cfd2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a0014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690002
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed448/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900854361d9
|
||||
005a064cfd012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f690014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed448/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
0114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69007214fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00854361d9
|
||||
005a064cfd0114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69007214fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f69004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed448/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00854361d9
|
||||
005a064cfd4d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a00
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed448/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a000114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900854361d9
|
||||
005a064cfd2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d83e51cb78150c2380ad9b3a18148166024e4c9db3cdf82466d3153aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2a000114fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed448/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80854361d9
|
||||
005a064cfd14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ed448/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
012a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae80854361d90b68656c6c6f20776f726c64854361d9
|
||||
005a064cfd012a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a064cfd14fa30f25b790898adc8d74e2c13bdfdc4397ce61cffd33ad7c2a0051e9c78874098a36c7373ea4b62c7c9563720768824bcb66e71463f6900ed8693eacdfbeada6ba0cdd1beb2bcbb98302a3a8365650db8c4d88a726de3b7d74d8835a0d76e03b0c2865020d659b38d04d74a63e905ae800b68656c6c6f20776f726c64
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-p256/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296029bf7b2e7
|
||||
00a132f0c9000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-p256/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
01000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2969bf7b2e7
|
||||
00a132f0c901000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-p256/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
01036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29641036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e19bf7b2e7
|
||||
00a132f0c901036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29641036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-p256/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e19bf7b2e7
|
||||
00a132f0c9aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-p256/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e101036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2969bf7b2e7
|
||||
00a132f0c9000000000000000000000000000000000000000000000000000000000000002aaaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e101036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-p256/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699789bf7b2e7
|
||||
00a132f0c9036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-p256/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
01000000000000000000000000000000000000000000000000000000000000002a036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699789bf7b2e70b68656c6c6f20776f726c649bf7b2e7
|
||||
00a132f0c901000000000000000000000000000000000000000000000000000000000000002a00a132f0c9036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296037cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780b68656c6c6f20776f726c64
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ristretto255/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7602e6811b69
|
||||
00d76ecff52a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7602
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ristretto255/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e6811b69
|
||||
00d76ecff5012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ristretto255/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7640e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae6811b69
|
||||
00d76ecff501e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d7640e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ristretto255/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0ae6811b69
|
||||
00d76ecff5498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ristretto255/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
2a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76e6811b69
|
||||
00d76ecff52a00000000000000000000000000000000000000000000000000000000000000498d4e9311420c903913a56c94a694b8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a01e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d76
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ristretto255/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919e6811b69
|
||||
00d76ecff5e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-ristretto255/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
012a00000000000000000000000000000000000000000000000000000000000000e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b919e6811b690b68656c6c6f20776f726c64e6811b69
|
||||
00d76ecff5012a0000000000000000000000000000000000000000000000000000000000000000d76ecff5e2f2ae0a6abc4e71a884a961c500515f58e30b6aa582dd8db6a65945e08d2d766a493210f7499cd17fecb510ae0cea23a110e8d5b901f8acadd3095c73a3b9190b68656c6c6f20776f726c64
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-secp256k1/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b810279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802f49d8cce
|
||||
00eed6b1b1000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b810279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-secp256k1/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
01000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798f49d8cce
|
||||
00eed6b1b101000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817980279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-secp256k1/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798410279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81f49d8cce
|
||||
00eed6b1b1010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798410279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-secp256k1/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81f49d8cce
|
||||
00eed6b1b1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-secp256k1/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798f49d8cce
|
||||
00eed6b1b1000000000000000000000000000000000000000000000000000000000000002aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b81010279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-secp256k1/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5f49d8cce
|
||||
00eed6b1b10279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5
|
||||
|
|
|
@ -2,4 +2,4 @@
|
|||
source: frost-secp256k1/tests/serialization_tests.rs
|
||||
expression: "hex::encode(&bytes)"
|
||||
---
|
||||
01000000000000000000000000000000000000000000000000000000000000002a0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5f49d8cce0b68656c6c6f20776f726c64f49d8cce
|
||||
00eed6b1b101000000000000000000000000000000000000000000000000000000000000002a00eed6b1b10279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee50b68656c6c6f20776f726c64
|
||||
|
|
|
@ -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>",
|
||||
|
|
Loading…
Reference in New Issue