mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-28 17:45:17 +00:00
181 lines
8.5 KiB
Protocol Buffer
181 lines
8.5 KiB
Protocol Buffer
|
syntax = "proto3";
|
|||
|
|
|||
|
package quilibrium.node.channel.pb;
|
|||
|
|
|||
|
option go_package = "source.quilibrium.com/quilibrium/monorepo/node/protobufs";
|
|||
|
|
|||
|
import "keys.proto";
|
|||
|
|
|||
|
// Describes a general channel envelope for a message.
|
|||
|
message P2PChannelEnvelope {
|
|||
|
// A general protocol identifier as a uint32 – this is expected to rarely
|
|||
|
// iterate, and should be uniquely identifying both protocol and version.
|
|||
|
// Pragmatically speaking, this implies that the least significant byte
|
|||
|
// specifies version (which should iterate most minimally), and the three most
|
|||
|
// significant bytes should specify protocol. Recipients SHOULD ignore
|
|||
|
// messages with incompatible protocol identifiers, but also SHOULD warn on
|
|||
|
// identifiers with versions higher than the supported protocol. A large
|
|||
|
// number of unsupported protocol messages may indicate spam/some other
|
|||
|
// attack, whereas a large number of unsupported protocol versions may
|
|||
|
// indicate an out of date client, respective to which side is the maximum of
|
|||
|
// the version number.
|
|||
|
uint32 protocol_identifier = 1;
|
|||
|
|
|||
|
// The encrypted message header. Message header encryption is mandatory –
|
|||
|
// P2P channels in some cases pre-empt the mixnet and leaky information from
|
|||
|
// unencrypted message headers could de-anonymize the recipient. It is thus
|
|||
|
// also mandatory at the protocol implementation level that header sizes are
|
|||
|
// consistent within a protocol so as to not leak metadata. An example of this
|
|||
|
// is in Double and Triple-Ratchet, where the sequence identifiers MUST be
|
|||
|
// encoded as fixed-length integers, as variable encoding can indicate a
|
|||
|
// message being in the first 256, 65,536, etc. if an exchange is highly
|
|||
|
// asymmetrical in sends/receives. This is especially critical in long
|
|||
|
// running protocols with a need for fixed length messages (see message_body
|
|||
|
// notes).
|
|||
|
MessageCiphertext message_header = 2;
|
|||
|
|
|||
|
// The encrypted message body. Message bodies are variable length – ciphertext
|
|||
|
// could range widely, however if this metadata is pertinent to determining
|
|||
|
// protocol state, such as knowing what round an encapsulated protocol is in,
|
|||
|
// or potentially what might be transferred over the protocol, protocol
|
|||
|
// implementers SHOULD utilize chunking and send fixed length messages.
|
|||
|
// Additionally, if rounds themselves are highly asymmetric or have
|
|||
|
// long-standing processing times that could dangerously leak information of
|
|||
|
// round state, implementers SHOULD defer protocol use to leverage the mixnet.
|
|||
|
// If this is not feasible, the implementation details are left up to the
|
|||
|
// exercise of the protocol author.
|
|||
|
MessageCiphertext message_body = 3;
|
|||
|
}
|
|||
|
|
|||
|
// Describes a general ciphertext payload.
|
|||
|
message MessageCiphertext {
|
|||
|
// The intialization vector used for encryption. While cipher specific,
|
|||
|
// typically this should be a unique value for every ciphertext. If this is
|
|||
|
// not the case for a protocol where it should be, this SHOULD be considered
|
|||
|
// an invalid message and warned, as it could either indicate compromise,
|
|||
|
// or a faulty cryptographic implementation – such as a faulty PKCS#11
|
|||
|
// implementation that has a code path to handle HSM vendors which mandate
|
|||
|
// zeroed IVs before passing into encryption methods, as they will update the
|
|||
|
// IV within the HSM through hardware-supplied entropy.
|
|||
|
bytes initialization_vector = 1;
|
|||
|
|
|||
|
// The raw ciphertext byte string. This will be cipher specific, however some
|
|||
|
// general attributes are expected to be followed. If there is a common
|
|||
|
// layout expected, such as AES-GCM having the GCM tag appended to the
|
|||
|
// ciphertext, please follow the common layout.
|
|||
|
bytes ciphertext = 2;
|
|||
|
|
|||
|
// The associated data byte string, if available. This will be highly protocol
|
|||
|
// specific, but SHOULD NOT leak metadata.
|
|||
|
bytes associated_data = 3;
|
|||
|
}
|
|||
|
|
|||
|
// Describes the announcement of a new proving key.
|
|||
|
message ProvingKeyAnnouncement {
|
|||
|
// The commitment to a Schnorr proof of the Identity Key. The commitment is
|
|||
|
// produced by taking a hash of the C and S components of the proof.
|
|||
|
bytes identity_commitment = 1;
|
|||
|
// The commitment to a Schnorr proof of the Signed Pre Key. The commitment is
|
|||
|
// produced by taking a hash of the C and S components of the proof.
|
|||
|
bytes prekey_commitment = 2;
|
|||
|
|
|||
|
oneof proving_key_signature {
|
|||
|
quilibrium.node.keys.pb.Ed448Signature proving_key_signature_ed448 = 3;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Represents a request for a proving key.
|
|||
|
message ProvingKeyRequest {
|
|||
|
bytes proving_key_bytes = 1;
|
|||
|
}
|
|||
|
|
|||
|
// Describes the aggregation of inclusion commitments for a given clock frame
|
|||
|
message InclusionAggregateProof {
|
|||
|
// The filter in which the inclusion proof was produced.
|
|||
|
bytes filter = 1;
|
|||
|
// The frame number in which the inclusion proof was added.
|
|||
|
uint64 frame_number = 2;
|
|||
|
// The collection of inclusion commitments, in order.
|
|||
|
repeated InclusionCommitment inclusion_commitments = 3;
|
|||
|
// The raw serialized proof, mirroring the type of commitment scheme used
|
|||
|
// within the inclusion proofs.
|
|||
|
bytes proof = 4;
|
|||
|
}
|
|||
|
|
|||
|
// Describes the commitment of a data's inclusion in a given clock frame
|
|||
|
message InclusionCommitment {
|
|||
|
// The filter in which the inclusion aggregate proof was produced.
|
|||
|
bytes filter = 1;
|
|||
|
// The frame number in which the inclusion aggregate proof was added.
|
|||
|
uint64 frame_number = 2;
|
|||
|
// The position of the data in the proof.
|
|||
|
uint32 position = 3;
|
|||
|
// The specific type url represented by the data.
|
|||
|
string type_url = 4;
|
|||
|
// The raw serialized data as incorporated into the inclusion proof. Due to
|
|||
|
// the non-deterministic nature of protobuf serialization, this data is an
|
|||
|
// opaque binary string so that inclusion proofs can be accurately assessed
|
|||
|
// between various node implementations, and retain forwards-compatibility
|
|||
|
// with additional properties in future revisions to types.
|
|||
|
bytes data = 5;
|
|||
|
// The raw serialized commitment. Similar to data, this commitment data is an
|
|||
|
// opaque binary string so that future commitment types can be added without
|
|||
|
// having to break the underlying inclusion structure.
|
|||
|
bytes commitment = 6;
|
|||
|
}
|
|||
|
|
|||
|
// Describes the announcement of both an identity key and signed pre key. This
|
|||
|
// is expected to be used for the initial announcement of a key bundle, and
|
|||
|
// subsequent full revocations if identity key and signed pre keys are both
|
|||
|
// suspected of/known to be compromised. Signatures under KeyBundleAnnouncement
|
|||
|
// are expected to be cross-signed, such that the signature on the identity key
|
|||
|
// is produced through the prover key, the signature on the signed pre key is
|
|||
|
// produced through the identity key. ProvingKeyAnnouncements may be repeated
|
|||
|
// whenever a key bundle update is expected – only the first proving key
|
|||
|
// announcement is retained in inclusion proofs, but the announcements
|
|||
|
// necessarily are required for key bundle updates, as they provide a commitment
|
|||
|
// to the updated keys' Schnorr proofs. An updated KeyBundleAnnouncement must
|
|||
|
// be captured in an inclusion proof before it may be used for communication
|
|||
|
// channels, and may only be used in communication channels once a lobby has
|
|||
|
// opened _after_ the inclusion proof. If a lobby is open during the time the
|
|||
|
// inclusion proof has been created, the announcement is not yet considered
|
|||
|
// valid.
|
|||
|
message KeyBundleAnnouncement {
|
|||
|
IdentityKey identity_key = 1;
|
|||
|
SignedPreKey signed_pre_key = 2;
|
|||
|
bytes proving_key_bytes = 3;
|
|||
|
}
|
|||
|
|
|||
|
// Describes the Identity Key and corresponding Schnorr proof. Schnorr proofs
|
|||
|
// are expected to mirror the EC parameters of the proving and identity key. If
|
|||
|
// they do not, validation will fail.
|
|||
|
message IdentityKey {
|
|||
|
// The C component of the Schnorr proof, serialized as big endian.
|
|||
|
bytes challenge = 1;
|
|||
|
// The S component of the Schnorr proof, serialized as big endian.
|
|||
|
bytes response = 2;
|
|||
|
// The Statement component of the Schnorr proof, serialized as an (compressed,
|
|||
|
// if possible) affine representation of the point.
|
|||
|
bytes statement = 3;
|
|||
|
|
|||
|
oneof identity_key_signature {
|
|||
|
quilibrium.node.keys.pb.Ed448Signature public_key_signature_ed448 = 4;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Describes the Signed Pre Key and corresponding Schnorr proof. Schnorr proofs
|
|||
|
// are expected to mirror the EC parameters of the identity and signed pre key.
|
|||
|
// If they do not, validation will fail.
|
|||
|
message SignedPreKey {
|
|||
|
// The C component of the Schnorr proof, serialized as big endian.
|
|||
|
bytes challenge = 1;
|
|||
|
// The S component of the Schnorr proof, serialized as big endian.
|
|||
|
bytes response = 2;
|
|||
|
// The Statement component of the Schnorr proof, serialized as an (compressed,
|
|||
|
// if possible) affine representation of the point.
|
|||
|
bytes statement = 3;
|
|||
|
|
|||
|
oneof signed_pre_key_signature {
|
|||
|
quilibrium.node.keys.pb.Ed448Signature public_key_signature_ed448 = 4;
|
|||
|
}
|
|||
|
}
|