byte[] ConvertToEncryptedMessage(NewCamdMessage message)
        {
            _logger.Debug($"Prepare message headers for {Name}");
            var prepareData = new List <byte>();

            prepareData.Add((byte)(message.MessageId >> 8));
            prepareData.Add((byte)(message.MessageId & 0xFF));
            prepareData.Add((byte)(message.ServiceId >> 8));
            prepareData.Add((byte)(message.ServiceId & 0xFF));
            prepareData.Add((byte)(message.ProviderId >> 16));
            prepareData.Add((byte)((message.ProviderId >> 8) & 0xFF));
            prepareData.Add((byte)(message.ProviderId & 0xFF));
            prepareData.Add(0);
            prepareData.Add(0);
            prepareData.Add(0);

            _logger.Debug($"Correct message headers for {Name}");
            message.Data[0] = (byte)message.Type;
            message.Data[1] = (byte)((message.Data[1] & 240) | (((message.Data.Length - 3) >> 8) & 255));
            message.Data[2] = (byte)((message.Data.Length - 3) & 255);
            _logger.Debug($"Copy {message.Data.Length} bytes into the buffer for {Name}");
            prepareData.AddRange(message.Data);
            //Fill up
            while (prepareData.Count % 8 != 7)
            {
                prepareData.Add(0);
            }

            _logger.Debug($"Encrypt data before sending to {Name}");

            var padding = new byte[8];

            _random.NextBytes(padding);

            //fill up bytes with padding data at the end
            var bufferLen        = prepareData.Count;
            var paddingLen       = (8 - ((bufferLen - 2) % 8)) % 8;
            var prepareDataArray = prepareData.ToArray();

            Buffer.BlockCopy(padding, 0, prepareDataArray, bufferLen - paddingLen, paddingLen);
            prepareData = prepareDataArray.ToList();
            //Add checksum
            prepareData.Add(XorSum(prepareData.ToArray()));

            var ivec = new byte[8];

            _random.NextBytes(ivec);

            var dataToEncrypt = prepareData.ToArray();
            var encrypted     = _crypto.Encrypt(dataToEncrypt, _keyblock, ivec).ToList();

            var dataToSend = new List <byte>();

            dataToSend.Add((byte)((encrypted.Count + ivec.Length) >> 8));
            dataToSend.Add((byte)((encrypted.Count + ivec.Length) & 0xFF));
            dataToSend.AddRange(encrypted);
            dataToSend.AddRange(ivec);

            return(dataToSend.ToArray());
        }
Beispiel #2
0
#pragma warning disable CA1822 // Mark members as static
        public void EncryptAndDecrypt()
#pragma warning restore CA1822 // Mark members as static
        {
            const string Unencoded = "Foo";

            byte[] encoded = EncryptionHelpers.Encrypt(
                Encoding.UTF8.GetBytes(Unencoded));

            string decoded = Encoding.UTF8.GetString(
                EncryptionHelpers.Decrypt(encoded));

            Assert.Equal(Unencoded, decoded);
        }