public static DmpPingPacket DecodeAndVerify(byte[] udpData, InviteSession session) { var reader = BinaryProcedures.CreateBinaryReader(udpData, 1); var r = new DmpPingPacket(); r.DirectChannelToken32 = DirectChannelToken32.Decode(reader); r.PingRequestId32 = reader.ReadUInt32(); var flags = reader.ReadByte(); if ((flags & FlagsMask_MustBeZero) != 0) { throw new NotImplementedException(); } if ((flags & Flags_PublicEcdheKeySet) != 0) { r.PublicEcdheKey = EcdhPublicKey.Decode(reader); } r.PingPongHMAC = HMAC.Decode(reader); // verify DirectChannelToken32 if (!r.DirectChannelToken32.Equals(session.LocalSessionDescription.DirectChannelToken32)) { throw new BadSignatureException("invalid DMP PING DirectChannelToken32 136"); } // verify PingPongHMAC if (r.PingPongHMAC.Equals( session.GetPingPongHMAC(r.GetSignedFieldsForPingPongHMAC) ) == false) { throw new BadSignatureException("invalid DMP PING PingPongHMAC 1237"); } return(r); }
public static MessageStartPacket Decode(byte[] udpData) { var r = new MessageStartPacket(); r.DecodedUdpData = udpData; var reader = BinaryProcedures.CreateBinaryReader(udpData, 1); r.DirectChannelToken32 = DirectChannelToken32.Decode(reader); r.MessageId32 = reader.ReadUInt32(); var flags = reader.ReadByte(); if ((flags & FlagsMask_MustBeZero) != 0) { throw new NotImplementedException(); } r.MessageTimestamp64 = reader.ReadInt64(); r.EncryptedMessageData = BinaryProcedures.DecodeByteArray65536(reader); r.MessageHMAC = HMAC.Decode(reader); return(r); }
public static DmpPongPacket Decode(byte[] udpData) { var reader = BinaryProcedures.CreateBinaryReader(udpData, 1); var r = new DmpPongPacket(); r.DirectChannelToken32 = DirectChannelToken32.Decode(reader); r.PingRequestId32 = reader.ReadUInt32(); var flags = reader.ReadByte(); if ((flags & FlagsMask_MustBeZero) != 0) { throw new NotImplementedException(); } if ((flags & Flags_PublicEcdheKeySet) != 0) { r.PublicEcdheKey = EcdhPublicKey.Decode(reader); } r.PingPongHMAC = HMAC.Decode(reader); return(r); }