Publish.vala 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using Invercargill;
  2. using Invercargill.Convert;
  3. namespace Pprf.Messages {
  4. public class Publish : AuthenticatedMessage {
  5. public string publication_string { get; set; }
  6. public Publish() {
  7. message_type = MessageType.PUBLISH;
  8. }
  9. public override void authenticate(MemberIdentity identity) {
  10. member_name = identity.name;
  11. var checksum = Util.string_checksum(publication_string);
  12. var auth = new BinaryData.from_byte_array(checksum);
  13. auth.append(identity.current_state_token);
  14. authentication = identity.sign_with_individual_signature(auth.to_array());
  15. }
  16. public override bool verify(Ppub.Collection collection) {
  17. var member = collection.members.first_or_default(m => m.name == member_name);
  18. var auth = Sodium.Asymmetric.Signing.verify(authentication, member.public_keys.signing_key);
  19. if(auth == null)
  20. return false;
  21. var checksum = Util.string_checksum(publication_string);
  22. var compare = new BinaryData.from_byte_array(checksum);
  23. compare.append_byte_array(collection.current_state_token);
  24. return compare.equals(ate(auth));
  25. }
  26. public override void deserialise (GLib.DataInputStream stream) throws Error {
  27. base.deserialise (stream);
  28. var data_len = stream.read_uint16();
  29. if(data_len > 0) {
  30. publication_string = new BinaryData.from_bytes(stream.read_bytes (data_len)).to_raw_string();
  31. }
  32. }
  33. public override uint64 calculate_size() {
  34. return base.calculate_size() +
  35. 2 + // Data length
  36. publication_string.data.length;
  37. }
  38. public override void serialise(DataOutputStream stream) throws Error {
  39. base.serialise(stream);
  40. var data_len = publication_string.data.length;
  41. stream.put_uint16((uint16)data_len);
  42. if(data_len > 0) {
  43. stream.put_string(publication_string);
  44. }
  45. }
  46. }
  47. }