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);
        }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 4
0
        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());
        }
Exemplo n.º 5
0
        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());
        }
Exemplo n.º 6
0
        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);
        }