/// <param name="newConnectionAtResponderToRequesterNullable"> /// direct P2P stream from N to A /// if newConnectionAtResponderToRequesterNullable is specified, the procedure /// verifies RequesterHMAC, decrypts endpoint of A (ToRequesterTxParametersEncrypted), initializes P2P stream /// </param> public static RegisterAck2Packet Decode_OptionallyVerify_InitializeP2pStreamAtResponder(Logger logger, byte[] registerAckPacketData, RegisterRequestPacket reqNullable, RegisterAck1Packet ack1Nullable, ConnectionToNeighbor newConnectionAtResponderToRequesterNullable ) { var reader = BinaryProcedures.CreateBinaryReader(registerAckPacketData, 1); var ack = new RegisterAck2Packet(); ack.DecodedUdpPayloadData = registerAckPacketData; ack.Flags = reader.ReadByte(); if ((ack.Flags & FlagsMask_MustBeZero) != 0) { throw new NotImplementedException(); } if ((ack.Flags & Flag_AtoEP) == 0) { ack.NeighborToken32 = NeighborToken32.Decode(reader); } ack.ReqTimestamp64 = reader.ReadInt64(); ack.RequesterRegistrationId = RegistrationId.Decode(reader); if (reqNullable != null) { ack.AssertMatchToSyn(reqNullable); } ack.ToRequesterTxParametersEncrypted = reader.ReadBytes(ToRequesterTxParametersEncryptedLength); if (newConnectionAtResponderToRequesterNullable != null) { newConnectionAtResponderToRequesterNullable.Decrypt_ack2_ToRequesterTxParametersEncrypted_AtResponder_InitializeP2pStream(logger, reqNullable, ack1Nullable, ack); } ack.RequesterSignature = RegistrationSignature.Decode(reader); if (newConnectionAtResponderToRequesterNullable != null) { if (reqNullable == null) { throw new ArgumentException(); } if (ack1Nullable == null) { throw new ArgumentException(); } if (!ack.RequesterSignature.Verify(newConnectionAtResponderToRequesterNullable.Engine.CryptoLibrary, w => { reqNullable.GetSharedSignedFields(w, true); ack1Nullable.GetSharedSignedFields(w, true, true); ack.GetSharedSignedFields(w, false, true); }, reqNullable.RequesterRegistrationId)) { throw new BadSignatureException("invalid REGISTER ACK2 RequesterSignature 6106"); } } ack.ReqP2pSeq16 = RequestP2pSequenceNumber16.Decode(reader); if ((ack.Flags & Flag_AtoEP) == 0) { ack.NeighborHMAC = HMAC.Decode(reader); // is verified by Filter } return(ack); }
public static void GetResponderRegistrationConfirmationSignatureFields(BinaryWriter writer, RegisterRequestPacket req, RegisterAck1Packet ack1, RegisterAck2Packet ack2) { req.GetSharedSignedFields(writer, true); ack1.GetSharedSignedFields(writer, true, true); ack2.GetSharedSignedFields(writer, true, true); writer.Write(ResponderRegistrationConfirmationSignature_MagicNumber); }