public static InviteRequestPacket Decode_VerifyNeighborHMAC(byte[] udpData, ConnectionToNeighbor receivedFromNeighbor) { var r = new InviteRequestPacket(); r.DecodedUdpPayloadData = udpData; var reader = PacketProcedures.CreateBinaryReader(udpData, 1); var flags = reader.ReadByte(); if ((flags & FlagsMask_MustBeZero) != 0) { throw new NotImplementedException(); } r.NeighborToken32 = NeighborToken32.Decode(reader); if (receivedFromNeighbor.LocalNeighborToken32.Equals(r.NeighborToken32) == false) { throw new UnmatchedFieldsException(); } r.ReqTimestamp32S = reader.ReadUInt32(); r.RequesterRegistrationId = RegistrationId.Decode(reader); r.ResponderRegistrationId = RegistrationId.Decode(reader); r.RequesterEcdhePublicKey = EcdhPublicKey.Decode(reader); r.RequesterRegistrationSignature = RegistrationSignature.Decode(reader); r.NumberOfHopsRemaining = reader.ReadByte(); r.ReqP2pSeq16 = RequestP2pSequenceNumber16.Decode(reader); r.NeighborHMAC = HMAC.Decode(reader); if (r.NeighborHMAC.Equals(receivedFromNeighbor.GetNeighborHMAC(r.GetSignedFieldsForNeighborHMAC)) == false) { throw new BadSignatureException("invalid INVITE REQ NeighborHMAC 5902"); } return(r); }
/// <summary> /// creates a scanner that finds CFM that matches to REQ /// the scanner will verify CFM.NeighborHMAC /// </summary> /// <param name="connectionToNeighbor"> /// peer that responds with CFM /// </param> public static LowLevelUdpResponseScanner GetScanner(Logger logger, InviteRequestPacket req, ConnectionToNeighbor connectionToNeighbor) { PacketProcedures.CreateBinaryWriter(out var ms, out var w); w.Write((byte)PacketTypes.InviteCfm); w.Write((byte)0); // flags connectionToNeighbor.LocalNeighborToken32.Encode(w); w.Write(req.ReqTimestamp32S); req.RequesterRegistrationId.Encode(w); req.ResponderRegistrationId.Encode(w); var r = new LowLevelUdpResponseScanner { ResponseFirstBytes = ms.ToArray(), IgnoredByteAtOffset1 = 1 // ignore flags }; r.OptionalFilter = (responseData) => { if (connectionToNeighbor.IsDisposed) { logger.WriteToLog_needsAttention("ignoring CFM: connection is disposed"); return(false); } var cfm = Decode(responseData); if (cfm.NeighborHMAC.Equals(connectionToNeighbor.GetNeighborHMAC(cfm.GetSignedFieldsForNeighborHMAC)) == false) { logger.WriteToLog_attacks("ignoring CFM: received NeighborHMAC is invalid"); return(false); } return(true); }; return(r); }