12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- 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);
- }
- }
- }
- }
|