using Invercargill; using Invercargill.Convert; namespace Pprf.Messages { public class Publish : AuthenticatedMessage { public string publication_string { get; set; } public Publish() { message_type = MessageType.PUBLISH; } public override void authenticate(MemberIdentity identity) { member_name = identity.name; var checksum = Util.string_checksum(publication_string); var auth = new BinaryData.from_byte_array(checksum); auth.append(identity.current_state_token); authentication = identity.sign_with_individual_signature(auth.to_array()); } public override bool verify(Ppub.Collection collection) { var member = collection.members.first_or_default(m => m.name == member_name); var auth = Sodium.Asymmetric.Signing.verify(authentication, member.public_keys.signing_key); if(auth == null) return false; var checksum = Util.string_checksum(publication_string); var compare = new BinaryData.from_byte_array(checksum); compare.append_byte_array(collection.current_state_token); return compare.equals(ate(auth)); } public override void deserialise (GLib.DataInputStream stream) throws Error { base.deserialise (stream); var data_len = stream.read_uint16(); if(data_len > 0) { publication_string = new BinaryData.from_bytes(stream.read_bytes (data_len)).to_raw_string(); } } public override uint64 calculate_size() { return base.calculate_size() + 2 + // Data length publication_string.data.length; } public override void serialise(DataOutputStream stream) throws Error { base.serialise(stream); var data_len = publication_string.data.length; stream.put_uint16((uint16)data_len); if(data_len > 0) { stream.put_string(publication_string); } } } }