Skip to content

Commit

Permalink
change create_new_session to not require specific signers
Browse files Browse the repository at this point in the history
  • Loading branch information
conradoplg committed Feb 22, 2024
1 parent 601cc8a commit 0362e07
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 32 deletions.
18 changes: 9 additions & 9 deletions server/src/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ pub(crate) async fn create_new_session(
// Create new session object.
let id = Uuid::new_v4();
let session = Session {
identifiers: args.identifiers.iter().cloned().collect(),
num_signers: args.num_signers,
message_count: args.message_count,
state: SessionState::WaitingForCommitments {
commitments: Default::default(),
Expand All @@ -50,7 +50,7 @@ pub(crate) async fn get_session_info(
))?;

Ok(Json(GetSessionInfoOutput {
identifiers: session.identifiers.iter().copied().collect(),
num_signers: session.num_signers,
message_count: session.message_count,
}))
}
Expand All @@ -74,9 +74,6 @@ pub(crate) async fn send_commitments(

match &mut session.state {
SessionState::WaitingForCommitments { commitments } => {
if !session.identifiers.contains(&args.identifier) {
return Err(AppError(StatusCode::NOT_FOUND, eyre!("invalid identifier")));
}
if args.commitments.len() != session.message_count as usize {
return Err(AppError(
StatusCode::INTERNAL_SERVER_ERROR,
Expand All @@ -89,7 +86,7 @@ pub(crate) async fn send_commitments(
// poor networking connectivity leading to retries)
commitments.insert(args.identifier, args.commitments);
// If complete, advance to next state
if commitments.keys().cloned().collect::<BTreeSet<_>>() == session.identifiers {
if commitments.len() == session.num_signers as usize {
session.state = SessionState::CommitmentsReady {
commitments: commitments.clone(),
}
Expand Down Expand Up @@ -154,7 +151,7 @@ pub(crate) async fn send_signing_package(
))?;

match &mut session.state {
SessionState::CommitmentsReady { .. } => {
SessionState::CommitmentsReady { commitments } => {
if args.signing_package.len() != session.message_count as usize
|| args.randomizer.len() != session.message_count as usize
{
Expand All @@ -164,6 +161,7 @@ pub(crate) async fn send_signing_package(
));
}
session.state = SessionState::WaitingForSignatureShares {
identifiers: commitments.keys().cloned().collect(),
signing_package: args.signing_package,
signature_shares: Default::default(),
randomizer: args.randomizer,
Expand Down Expand Up @@ -194,6 +192,7 @@ pub(crate) async fn get_signing_package(

match &session.state {
SessionState::WaitingForSignatureShares {
identifiers: _,
signing_package,
signature_shares: _,
randomizer,
Expand Down Expand Up @@ -228,12 +227,13 @@ pub(crate) async fn send_signature_share(

match &mut session.state {
SessionState::WaitingForSignatureShares {
identifiers,
signing_package: _,
signature_shares,
randomizer: _,
aux_msg: _,
} => {
if !session.identifiers.contains(&args.identifier) {
if !identifiers.contains(&args.identifier) {
return Err(AppError(StatusCode::NOT_FOUND, eyre!("invalid identifier")));
}
if args.signature_share.len() != session.message_count as usize {
Expand All @@ -247,7 +247,7 @@ pub(crate) async fn send_signature_share(
// poor networking connectivity leading to retries)
signature_shares.insert(args.identifier, args.signature_share);
// If complete, advance to next state
if signature_shares.keys().cloned().collect::<BTreeSet<_>>() == session.identifiers {
if signature_shares.keys().cloned().collect::<BTreeSet<_>>() == *identifiers {
session.state = SessionState::SignatureSharesReady {
signature_shares: signature_shares.clone(),
};
Expand Down
7 changes: 6 additions & 1 deletion server/src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ pub enum SessionState {
/// SigningPackage ready to be fetched by participants. Waiting for
/// participants to send their signature shares.
WaitingForSignatureShares {
/// Identifiers of the participants that sent commitments in the
/// previous state.
identifiers: BTreeSet<frost::Identifier>,
/// SigningPackage sent by the coordinator to be sent to participants,
/// for each message being signed.
signing_package: Vec<frost::SigningPackage>,
Expand Down Expand Up @@ -56,8 +59,10 @@ impl Default for SessionState {

/// A particular signing session.
pub struct Session {
/// The number of signers in the session.
pub(crate) num_signers: u16,
/// The set of identifiers for the session.
pub(crate) identifiers: BTreeSet<frost::Identifier>,
// pub(crate) identifiers: BTreeSet<frost::Identifier>,
/// The number of messages being simultaneously signed.
pub(crate) message_count: u8,
/// The session state.
Expand Down
4 changes: 2 additions & 2 deletions server/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use reddsa::frost::redpallas as frost;

#[derive(Serialize, Deserialize)]
pub struct CreateNewSessionArgs {
pub identifiers: Vec<frost::Identifier>,
pub num_signers: u16,
pub message_count: u8,
}

Expand All @@ -23,7 +23,7 @@ pub struct GetSessionInfoArgs {

#[derive(Serialize, Deserialize)]
pub struct GetSessionInfoOutput {
pub identifiers: Vec<frost::Identifier>,
pub num_signers: u16,
pub message_count: u8,
}

Expand Down
27 changes: 7 additions & 20 deletions server/tests/integration_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ async fn test_main_router() -> Result<(), Box<dyn std::error::Error>> {
let res = server
.post("/create_new_session")
.json(&server::CreateNewSessionArgs {
identifiers: key_packages.keys().copied().collect::<Vec<_>>(),
num_signers: 2,
message_count: 2,
})
.await;
Expand All @@ -51,7 +51,7 @@ async fn test_main_router() -> Result<(), Box<dyn std::error::Error>> {

// Map to store the SigningNonces (for each message, for each participant)
let mut nonces_map = BTreeMap::<_, _>::new();
for (identifier, key_package) in key_packages.iter() {
for (identifier, key_package) in key_packages.iter().take(2) {
// As participant `identifier`

// Get the number of messages (the participants wouldn't know without
Expand Down Expand Up @@ -85,7 +85,9 @@ async fn test_main_router() -> Result<(), Box<dyn std::error::Error>> {
commitments: commitments_vec,
})
.await;
res.assert_status_ok();
if res.status_code() != 200 {
panic!("status code: {}; error: {}", res.status_code(), res.text());
}
}

// As the coordinator, get the commitments
Expand Down Expand Up @@ -127,7 +129,7 @@ async fn test_main_router() -> Result<(), Box<dyn std::error::Error>> {

// As each participant, get SigningPackages and generate the SignatureShares
// for each.
for (identifier, key_package) in key_packages.iter() {
for (identifier, key_package) in key_packages.iter().take(2) {
// As participant `identifier`

// Get SigningPackages
Expand Down Expand Up @@ -201,21 +203,6 @@ async fn test_main_router() -> Result<(), Box<dyn std::error::Error>> {
/// A better example on how to write client code.
#[tokio::test]
async fn test_http() -> Result<(), Box<dyn std::error::Error>> {
// Create test values
let mut rng = thread_rng();
let (shares, _pubkeys) =
frost::keys::generate_with_dealer(3, 2, frost::keys::IdentifierList::Default, &mut rng)
.unwrap();
let key_packages: BTreeMap<_, _> = shares
.iter()
.map(|(identifier, secret_share)| {
(
*identifier,
frost::keys::KeyPackage::try_from(secret_share.clone()).unwrap(),
)
})
.collect();

// Spawn server for testing
tokio::spawn(async move {
server::run(&Args {
Expand All @@ -235,7 +222,7 @@ async fn test_http() -> Result<(), Box<dyn std::error::Error>> {
let r = client
.post("http://127.0.0.1:2744/create_new_session")
.json(&server::CreateNewSessionArgs {
identifiers: key_packages.keys().copied().collect::<Vec<_>>(),
num_signers: 2,
message_count: 1,
})
.send()
Expand Down

0 comments on commit 0362e07

Please sign in to comment.