void RTMFP::Encode(AESEngine& aesEncrypt,PacketWriter& packet) { if(aesEncrypt.type != AESEngine::EMPTY) { // paddingBytesLength=(0xffffffff-plainRequestLength+5)&0x0F int paddingBytesLength = (0xFFFFFFFF-packet.length()+5)&0x0F; // Padd the plain request with paddingBytesLength of value 0xff at the end packet.reset(packet.length()); string end(paddingBytesLength,(UInt8)0xFF); packet.writeRaw(end); } WriteCRC(packet); // Encrypt the resulted request aesEncrypt.process(packet.begin()+4,packet.begin()+4,packet.length()-4); }
void RTMFP::WriteCRC(PacketWriter& packet) { // Compute the CRC and add it at the beginning of the request PacketReader reader(packet.begin(),packet.length()); reader.next(6); UInt16 sum = CheckSum(reader); packet.reset(4);packet << sum; }
void FlowWriter::flush(PacketWriter& writer,UInt64 stage,UInt8 flags,bool header,BinaryReader& reader,UInt16 size) { if(_stageAck==0 && header) flags |= MESSAGE_HEADER; if(size==0) flags |= MESSAGE_ABANDONMENT; if(_closed && _messages.size()==1) // On LAST message flags |= MESSAGE_END; // TRACE("FlowWriter %u stage %u",id,stage); writer.write8(flags); if(header) { writer.write7BitLongValue(id); writer.write7BitLongValue(stage); writer.write7BitLongValue(stage-_stageAck); // signature if(_stageAck==0) { writer.writeString8(signature); // No write this in the case where it's a new flow! if(flowId>0) { writer.write8(1+Util::Get7BitValueSize(flowId)); // following size writer.write8(0x0a); // Unknown! writer.write7BitLongValue(flowId); } writer.write8(0); // marker of end for this part } } if(size>0) { reader.readRaw(writer.begin()+writer.position(),size); writer.next(size); } }
void RTMFP::Pack(PacketWriter& packet,UInt32 farId) { PacketReader reader(packet.begin(),packet.length()); reader.next(4); packet.reset(0); packet.write32(reader.read32()^reader.read32()^farId); }