public override void PacketHandler(N2HBinaryReader reader) { var marker = reader.ReadByte(); if (marker != 0x0b) { Logger.FATAL("Marker hand shake wrong:should be 0b and not {0}", marker); return; } var time = reader.ReadUInt16(); var id = reader.ReadByte(); var length = reader.ReadUInt16(); reader.Shrink(length); var pos = Writer.BaseStream.Position; Writer.BaseStream.Position += 3; var idResponse = PerformHandshake(id, reader, pos); if (idResponse > 0) { Writer.BaseStream.Position = pos; Writer.Write(idResponse); Writer.Write((short)(Writer.BaseStream.GetAvaliableByteCounts() - 2)); Flush(0x0b); } FarId = 0; }
public static bool ReadCRC(N2HBinaryReader packet) { // Check the first 2 CRC bytes packet.BaseStream.Position = 4; UInt16 sum = packet.ReadUInt16(); return (sum == CheckSum(packet.BaseStream)); }
public bool PeekUInt16(out ushort word) { word = Br.ReadUInt16(); return(SeekBehind(2)); }
public static bool Deserialize(Stream src, out VideoAvc dest) { dest = new VideoAvc(); if (src.GetAvaliableByteCounts() < 2) { Logger.FATAL("Not enough data"); return false; } var reader = new N2HBinaryReader(src); var _spsLength = reader.ReadUInt16(); if (src.GetAvaliableByteCounts() < _spsLength + 2 + 8) { Logger.FATAL("Not enough data"); return false; } var psps = reader.ReadBytes(_spsLength); var _ppsLength = reader.ReadUInt16(); if (src.GetAvaliableByteCounts() < _ppsLength + 2 + 8) { Logger.FATAL("Not enough data"); return false; } var ppps = reader.ReadBytes(_ppsLength); dest.Init(psps, ppps); dest._widthOverride = reader.ReadUInt32(); dest._heightOverride = reader.ReadUInt32(); return true; }
public override void PacketHandler(N2HBinaryReader reader) { if(Checked){ lock (Writer) { base.PacketHandler(reader); } return; } var marker = reader.ReadByte(); if (marker != 0x0b) { Logger.FATAL("Marker hand shake wrong:should be 0b and not {0:X}", marker); return; } var time = reader.ReadUInt16(); var type = reader.ReadByte(); var length = reader.ReadUInt16(); byte[] tag; Logger.Debug("handshake {0:X} len:{1}",type,length); switch (type) { case 0x70: tag = reader.ReadBytes(reader.ReadByte()); var cookieBytes = reader.ReadBytes(reader.ReadByte()); var targetCertificat = reader.ReadBytes((int)reader.BaseStream.GetAvaliableByteCounts()); var nonce = new byte[0]; _dh = RtmfpUtils.BeginDiffieHellman(ref nonce, true); Peer.Id = Target.Sha256.ComputeHash(nonce, 0, nonce.Length); HandShake38(cookieBytes, nonce); _handshake = () => HandShake38(cookieBytes, nonce); break; case 0x71: tag = reader.ReadBytes(reader.ReadByte()); var flag = reader.ReadByte(); var address = new IPEndPoint(new IPAddress(reader.ReadBytes(4)), reader.ReadInt16()); Target.Address.Port = address.Port; Logger.Debug("redirect to {0}",address.ToString()); Handler.FarProtocol.IOHandler.Socket.Connect(Target.Address); _handshake(); break; case 0x78: FarId = reader.ReadUInt32(); var targetNonce = reader.ReadBytes((int)reader.Read7BitLongValue()); var must58 = reader.ReadByte(); Debug.WriteLineIf(must58!=0x58,$"must58!{must58}"); var key = new byte[RtmfpUtils.KEY_SIZE]; Buffer.BlockCopy(targetNonce, targetNonce.Length - RtmfpUtils.KEY_SIZE, key, 0, RtmfpUtils.KEY_SIZE); var sharedSecret = _dh.CreateSharedKey(key); byte[] decryptKey; byte[] encryptKey; RtmfpUtils.ComputeAsymetricKeys(sharedSecret, _certificat, targetNonce, out encryptKey, out decryptKey); Checked = true; _handshakeTimeoutTimer.Stop(); AesEncrypt = new AESEngine(encryptKey, AESEngine.Direction.ENCRYPT); AesDecrypt = new AESEngine(decryptKey); PrevAesType = AESEngine.AESType.DEFAULT; Application = Handler.Application; Handler.CreateSession(Peer, null); break; default: break; } }