public override void Serialize(BEWriter writer) { var messageWriter = new BEWriter(); base.Serialize(messageWriter); var message = messageWriter.ToBytes(); var initVectorSource = message.Take(16).ToArray(); var initVector = Crypto.CreateDerivedInitVector(initVectorSource); var fragmentWriter = new BEWriter(); byte[] padding = Padding.CreatePaddingData( PaddingType.PKCS7, Fragment, alignment: payloadSizeAlignment ); fragmentWriter.Write(Fragment); fragmentWriter.Write(padding); var encryptedFragment = Crypto.EncryptWithoutPadding(fragmentWriter.ToBytes(), initVector); Header.Serialize(writer); writer.Write(encryptedFragment); var signature = Crypto.CalculateMessageSignature(writer.ToBytes()); writer.Write(signature); }
public override void Serialize(EndianWriter writer) { var protectedPayloadWriter = new EndianWriter(); SerializeProtectedPayload(protectedPayloadWriter); // length is before padding Header.ProtectedPayloadLength = (ushort)protectedPayloadWriter.Length; // padding is before encryption byte[] padding = Padding.CreatePaddingData( PaddingType.PKCS7, protectedPayloadWriter.Length, alignment: payloadSizeAlignment ); protectedPayloadWriter.Write(padding); // encrypt without adding padding to the encrypted value var encryptedPayload = Crypto.EncryptWithoutPadding(protectedPayloadWriter.ToBytes(), InitVector); base.Serialize(writer); writer.Write(encryptedPayload); var signature = Crypto.CalculateMessageSignature(writer.ToBytes()); writer.Write(signature); }
public static byte[] AssemblePacket(INanoPacket packet, NanoChannelContext context) { if (packet.Channel == NanoChannel.Unknown) { throw new NanoPackingException("AssemblePacket: INanoPacket.Channel is UNKNOWN"); } BEWriter packetWriter = new BEWriter(); BinaryWriter payloadWriter = new BinaryWriter(new MemoryStream()); packet.Serialize(payloadWriter); byte[] padding = Padding.CreatePaddingData( PaddingType.ANSI_X923, payloadWriter.ToBytes(), alignment: 4); payloadWriter.Write(padding); if (padding.Length > 0) { packet.Header.Padding = true; } packet.Header.ChannelId = context.GetChannelId(packet.Channel); packet.Header.Serialize(packetWriter); packetWriter.Write(payloadWriter.ToBytes()); return(packetWriter.ToBytes()); }
public void Serialize(BEWriter bw) { BinaryWriter payloadWriter = new BinaryWriter(new MemoryStream()); Payload.Serialize(payloadWriter); byte[] padding = Padding.CreatePaddingData( PaddingType.ANSI_X923, payloadWriter.ToBytes(), alignment: 4); payloadWriter.Write(padding); if (padding.Length > 0) { Header.Padding = true; } Header.Serialize(bw); bw.Write(payloadWriter.ToBytes()); }
public static byte[] AssemblePacket(INanoPacket packet, NanoChannelContext context) { if (packet.Channel == NanoChannel.Unknown) { throw new NanoPackingException("AssemblePacket: INanoPacket.Channel is UNKNOWN"); } // Serialize payload and append padding if needed byte[] payloadData = null; using (EndianWriter payloadWriter = new EndianWriter()) { packet.Serialize(payloadWriter); byte[] padding = Padding.CreatePaddingData( PaddingType.ANSI_X923, payloadWriter.ToBytes(), alignment: 4); // Append padding if (padding.Length > 0) { payloadWriter.Write(padding); packet.Header.Padding = true; } payloadData = payloadWriter.ToBytes(); } EndianWriter packetWriter = new EndianWriter(); packet.Header.ChannelId = context.GetChannelId(packet.Channel); // Serialize header packet.Header.Serialize(packetWriter); // Append payload to header packetWriter.Write(payloadData); return(packetWriter.ToBytes()); }
public byte[] Encrypt(byte[] data) { var writer = new BEWriter(); byte[] padding = Padding.CreatePaddingData( PaddingType.PKCS7, data, alignment: 16); writer.Write(data); writer.Write(padding); var paddedData = writer.ToBytes(); var output = new byte[paddedData.Length]; for (var i = 0; i < paddedData.Length; i += 16) { _clientCipher.ProcessBlock(paddedData, i, output, i); } return(output); }