From fdd3ad314957da4330340d0ac80c1141d5916bc6 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Tue, 23 Oct 2018 18:28:27 -0700 Subject: [PATCH] watchtower/wtwire/state_update: sends encrypted blobs --- watchtower/wtwire/state_update.go | 88 +++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 watchtower/wtwire/state_update.go diff --git a/watchtower/wtwire/state_update.go b/watchtower/wtwire/state_update.go new file mode 100644 index 00000000..ab51ed38 --- /dev/null +++ b/watchtower/wtwire/state_update.go @@ -0,0 +1,88 @@ +package wtwire + +import "io" + +// StateUpdate transmits an encrypted state update from the client to the +// watchtower. Each state update is tied to particular session, identified by +// the client's brontine key used to make the request. +type StateUpdate struct { + // SeqNum is a 1-indexed, monotonically incrementing sequence number. + // This number represents to the client's expected sequence number when + // sending updates sent to the watchtower. This value must always be + // less or equal than the negotiated MaxUpdates for the session, and + // greater than the LastApplied sent in the same message. + SeqNum uint16 + + // LastApplied echos the LastApplied value returned from watchtower, + // allowing the tower to detect faulty clients. This allow provides a + // feedback mechanism for the tower if updates are allowed to stream in + // an async fashion. + LastApplied uint16 + + // IsComplete is 1 if the watchtower should close the connection after + // responding, and 0 otherwise. + IsComplete uint8 + + // Hint is the 16-byte prefix of the revoked commitment transaction ID + // for which the encrypted blob can exact justice. + Hint [16]byte + + // EncryptedBlob is the serialized ciphertext containing all necessary + // information to sweep the commitment transaction corresponding to the + // Hint. The ciphertext is to be encrypted using the full transaction ID + // of the revoked commitment transaction. + // + // The plaintext MUST be encoded using the negotiated Version for + // this session. In addition, the signatures must be computed over a + // sweep transaction honoring the decided SweepFeeRate, RewardRate, and + // (possibly) reward address returned in the SessionInitReply. + EncryptedBlob []byte +} + +// A compile time check to ensure StateUpdate implements the wtwire.Message +// interface. +var _ Message = (*StateUpdate)(nil) + +// Decode deserializes a serialized StateUpdate message stored in the passed +// io.Reader observing the specified protocol version. +// +// This is part of the wtwire.Message interface. +func (m *StateUpdate) Decode(r io.Reader, pver uint32) error { + return ReadElements(r, + &m.SeqNum, + &m.LastApplied, + &m.IsComplete, + &m.Hint, + &m.EncryptedBlob, + ) +} + +// Encode serializes the target StateUpdate into the passed io.Writer +// observing the protocol version specified. +// +// This is part of the wtwire.Message interface. +func (m *StateUpdate) Encode(w io.Writer, pver uint32) error { + return WriteElements(w, + m.SeqNum, + m.LastApplied, + m.IsComplete, + m.Hint, + m.EncryptedBlob, + ) +} + +// MsgType returns the integer uniquely identifying this message type on the +// wire. +// +// This is part of the wtwire.Message interface. +func (m *StateUpdate) MsgType() MessageType { + return MsgStateUpdate +} + +// MaxPayloadLength returns the maximum allowed payload size for a StateUpdate +// complete message observing the specified protocol version. +// +// This is part of the wtwire.Message interface. +func (m *StateUpdate) MaxPayloadLength(uint32) uint32 { + return MaxMessagePayload +}