Key Ceremony

The key ceremony is carried out between \(n\) trustees and a single coordinator. Its purpose is to ensure that the coordinator possesses an joint public key, and that each trustee possesses: - a private key - all the trustees’ public keys - a set of key shares that allow the trustee to, as a part of a group of at least \(k\) trustees, to decrypt a missing trustee’s share of a message encrypted with the aggregate public key.

Key Generation

  1. Each trustee generates a key pair, [1] producing a key-generated message.
  2. These \(n\) key-generated messages are passed to the coordinator. [2]
  3. The coordinator produces an all-keys-received message, [3] which must be passed back to each trustee. [4]
[1]KeyCeremony_Trustee_generate_key()
[2]KeyCeremony_Coordinator_receive_key_generated()
[3]KeyCeremony_Coordinator_all_keys_received()
[4]KeyCeremony_Trustee_generate_shares()

Share Generation

  1. Each trustee, having received an all-keys-received message, computes a key share for every trustee, and encrypts each key share with the corresponding trustee’s public key to produce a shares-generated message [5].
  2. These \(n\) shares-generated messages are passed to the coordinator [6].
  3. The coordinator produces a all-shares-received message, [7] which must be passed back to each trustee. [8]
[5]KeyCeremony_Trustee_generate_shares()
[6]KeyCeremony_Coordinator_receive_shares_generated()
[7]KeyCeremony_Coordinator_all_shares_received()
[8]KeyCeremony_Trustee_verify_shares()

Verification

  1. Each trustee, having received an all-shares-received message, decrypts its shares of the other trustees keys and verifies that they match the commitments in their public keys, producing a shares-verified message. [9]
  2. These \(n\) shares-verified messages are passed to the coordinator. [10]
  3. The coordinator produces a joint public key. [11]
[9]KeyCeremony_Trustee_verify_shares()
[10]KeyCeremony_Coordinator_receive_shares_verified()
[11]KeyCeremony_Coordinator_publish_joint_key()